diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index 764c49d64..000000000 --- a/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Question -about: Ask a question -title: "[QUESTION]: " -labels: question -assignees: '' - ---- - -Please do not create issues for questions. Use the [discussion forum](https://github.com/Netflix/conductor/discussions) instead! diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 03a851e4e..f974f195c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,12 +37,12 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | - ./gradlew build -x :conductor-contribs:test --scan + ./gradlew build --scan - name: Build and Publish snapshot if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' run: | echo "Running build for commit ${{ github.sha }}" - ./gradlew build -x :conductor-contribs:test snapshot --scan + ./gradlew build snapshot --scan env: NETFLIX_OSS_SIGNING_KEY: ${{ secrets.ORG_SIGNING_KEY }} NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 66e70b57d..e8d5a5ca0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -30,7 +30,7 @@ jobs: ${{ runner.os }}-gradle- - name: Publish candidate if: startsWith(github.ref, 'refs/tags/v') && contains(github.ref, '-rc.') - run: ./gradlew -x :conductor-contribs:test -Prelease.useLastTag=true candidate --scan + run: ./gradlew -Prelease.useLastTag=true candidate --scan env: NETFLIX_OSS_SONATYPE_USERNAME: ${{ secrets.ORG_SONATYPE_USERNAME }} NETFLIX_OSS_SONATYPE_PASSWORD: ${{ secrets.ORG_SONATYPE_PASSWORD }} @@ -40,7 +40,7 @@ jobs: NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }} - name: Publish release if: startsWith(github.ref, 'refs/tags/v') && (!contains(github.ref, '-rc.')) - run: ./gradlew -x :conductor-contribs:test -Prelease.useLastTag=true final --scan + run: ./gradlew -Prelease.useLastTag=true final --scan env: NETFLIX_OSS_SONATYPE_USERNAME: ${{ secrets.ORG_SONATYPE_USERNAME }} NETFLIX_OSS_SONATYPE_PASSWORD: ${{ secrets.ORG_SONATYPE_PASSWORD }} @@ -48,3 +48,14 @@ jobs: NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }} NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }} NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }} + - name: Publish tag to community repo + if: startsWith(github.ref, 'refs/tags/v') + run: | + export TAG=$(git describe --tags --abbrev=0) + echo "Current release version is $TAG" + echo "Triggering community build" + curl \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: Bearer ${{ secrets.COMMUNITY_REPO_TRIGGER }}" \ + -X POST https://api.github.com/repos/Netflix/conductor-community/dispatches \ + -d '{"event_type": "publish_build","client_payload": {"tag":"'"$TAG"'"}}' diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index f5b0d073e..db3a8b1e2 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -10,9 +10,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - name: Set up JDK 1.8 + - name: Set up Zulu JDK 11 uses: actions/setup-java@v3 with: - java-version: 1.8 + distribution: 'zulu' + java-version: '11' - name: Update Gradle Wrapper uses: gradle-update/update-gradle-wrapper-action@v1 diff --git a/README.md b/README.md index 2f47e9082..fc9bf387b 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,13 @@ The latest version is [![Github release](https://img.shields.io/github/v/release [2.31.8](https://github.com/Netflix/conductor/releases/tag/v2.31.8) is the **final** release of `2.31` branch. As of Feb 2022, `1.x` & `2.x` versions are no longer supported. +## Community Contributions +The modules contributed by the community are housed at [conductor-community](https://github.com/Netflix/conductor-community). Compatible versions of the community modules are released simultaneously with releases of the main modules. + +[Discussion Forum](https://github.com/Netflix/conductor/discussions) Please use the forum for questions and discussing ideas and join the community. + +[Access here other Conductor related projects made by the community!](/RELATED.md) - Backup tool, Cron like workflow starter, Docker containers... + ## Getting Started - Building & Running Conductor ### Docker The easiest way to get started is with Docker containers. Please follow the instructions [here](https://github.com/Netflix/conductor/tree/main/docker). The server and UI can also be built from source separately. @@ -53,28 +60,27 @@ To run the UI on the bundled development server, run `yarn run start`. Navigate ## Published Artifacts Binaries are available from [Netflix OSS Maven](https://artifacts.netflix.net/netflixoss/com/netflix/conductor/) repository, or the [Maven Central Repository](https://search.maven.org/search?q=g:com.netflix.conductor). -| Artifact | Description | -| ----------- | --------------- | -| conductor-common | Common models used by various conductor modules | -| conductor-core | Core Conductor module | -| conductor-redis-persistence | Persistence and queue using Redis/Dynomite | -| conductor-cassandra-persistence | Persistence using Cassandra | -| conductor-mysql-persistence | Persistence and queue using MySQL | -| conductor-postgres-persistence | Persistence and queue using Postgres | -| conductor-es6-persistence | Indexing using Elasticsearch 6.X | -| conductor-rest | Spring MVC resources for the core services | -| conductor-ui | node.js based UI for Conductor | -| conductor-contribs | Optional contrib package that holds extended workflow tasks and support for SQS, AMQP, etc| -| conductor-client | Java client for Conductor that includes helpers for running worker tasks | -| conductor-client-spring | Client starter kit for Spring | -| conductor-server | Spring Boot Web Application | -| conductor-azureblob-storage | External payload storage implementation using AzureBlob | -| conductor-redis-lock | Workflow execution lock implementation using Redis | -| conductor-zookeeper-lock | Workflow execution lock implementation using Zookeeper | -| conductor-grpc | Protobuf models used by the server and client | -| conductor-grpc-client | gRPC server Application | -| conductor-grpc-server | gRPC client to interact with the gRPC server | -| conductor-test-harness | Integration and regression tests | +| Artifact | Description | +|---------------------------------|-------------------------------------------------------------------------------------------------| +| conductor-common | Common models used by various conductor modules | +| conductor-core | Core Conductor module | +| conductor-redis-persistence | Persistence and queue using Redis/Dynomite | +| conductor-cassandra-persistence | Persistence using Cassandra | +| conductor-es6-persistence | Indexing using Elasticsearch 6.X | +| conductor-rest | Spring MVC resources for the core services | +| conductor-ui | node.js based UI for Conductor | +| conductor-client | Java client for Conductor that includes helpers for running worker tasks | +| conductor-client-spring | Client starter kit for Spring | +| conductor-server | Spring Boot Web Application | +| conductor-redis-lock | Workflow execution lock implementation using Redis | +| conductor-awss3-storage | External payload storage implementation using AWS S3 | +| conductor-awssqs-event-queue | Event queue implementation using AWS SQS | +| conductor-http-task | Workflow system task implementation to send make requests | +| conductor-json-jq-task | Workflow system task implementation to evaluate JSON using [jq](https://stedolan.github.io/jq/) | +| conductor-grpc | Protobuf models used by the server and client | +| conductor-grpc-client | gRPC server Application | +| conductor-grpc-server | gRPC client to interact with the gRPC server | +| conductor-test-harness | Integration and regression tests | ## Database Requirements @@ -86,11 +92,6 @@ Binaries are available from [Netflix OSS Maven](https://artifacts.netflix.net/ne * JDK 11+ * UI requires Node 14 to build. Earlier Node versions may work but is untested. -## Community -[Discussion Forum](https://github.com/Netflix/conductor/discussions) Please use the forum for questions and discussing ideas and join the community. - -[Access here other Conductor related projects made by the community!](/RELATED.md) - Backup tool, Cron like workflow starter, Docker containers... - ## Get Support Conductor is maintained by Media Workflow Infrastructure team at Netflix. Use github issue tracking for filing issues and [Discussion Forum](https://github.com/Netflix/conductor/discussions) for any other questions, ideas or support requests. diff --git a/RELATED.md b/RELATED.md index 19ad4ef6b..6e433a056 100644 --- a/RELATED.md +++ b/RELATED.md @@ -1,5 +1,15 @@ # Community projects related to Conductor +## Client SDKs + +Further, all of the (non-Java) SDKs have a new GitHub home: the Conductor SDK repository is your new source for Conductor SDKs: + +* [Golang](https://github.com/conductor-sdk/conductor-go) +* [Python](https://github.com/conductor-sdk/conductor-python) +* [C#](https://github.com/conductor-sdk/conductor-csharp) +* [Clojure](https://github.com/conductor-sdk/conductor-clojure) + +All contributions on the above client sdks can be made on [Conductor SDK](https://github.com/conductor-sdk) repository. ## Microservices operations @@ -61,4 +71,4 @@ Docker image published to [Docker Hub](https://hub.docker.com/repository/docker/ * We should have a central dedicate service that can do scheduling for us and provide a trigger to a microservices at expected time. * It offers an additional module `io.github.jas34.scheduledwf.config.ScheduledWfServerModule` built on the existing core of conductor and does not require deployment of any additional service. -For more details refer: [Schedule Conductor Workflows](https://jas34.github.io/scheduledwf) and [Capability In Conductor To Schedule Workflows](https://github.com/Netflix/conductor/discussions/2256) \ No newline at end of file +For more details refer: [Schedule Conductor Workflows](https://jas34.github.io/scheduledwf) and [Capability In Conductor To Schedule Workflows](https://github.com/Netflix/conductor/discussions/2256) diff --git a/annotations-processor/build.gradle b/annotations-processor/build.gradle index c9ed9093c..9d1a9bfbf 100644 --- a/annotations-processor/build.gradle +++ b/annotations-processor/build.gradle @@ -8,7 +8,7 @@ dependencies { api 'com.google.guava:guava:31.1-jre' api 'com.squareup:javapoet:1.13.+' api 'com.github.jknack:handlebars:4.3.+' - api 'com.google.protobuf:protobuf-java:3.20.0' + api 'com.google.protobuf:protobuf-java:3.20.1' api 'javax.annotation:javax.annotation-api:1.3.2' api gradleApi() diff --git a/annotations-processor/dependencies.lock b/annotations-processor/dependencies.lock index 70596b712..d9e9d81c2 100644 --- a/annotations-processor/dependencies.lock +++ b/annotations-processor/dependencies.lock @@ -12,7 +12,7 @@ "locked": "31.1-jre" }, "com.google.protobuf:protobuf-java": { - "locked": "3.20.0" + "locked": "3.20.1" }, "com.netflix.conductor:conductor-annotations": { "project": true @@ -87,7 +87,7 @@ "locked": "31.1-jre" }, "com.google.protobuf:protobuf-java": { - "locked": "3.20.0" + "locked": "3.20.1" }, "com.netflix.conductor:conductor-annotations": { "project": true @@ -137,7 +137,7 @@ "locked": "31.1-jre" }, "com.google.protobuf:protobuf-java": { - "locked": "3.20.0" + "locked": "3.20.1" }, "com.netflix.conductor:conductor-annotations": { "project": true @@ -181,7 +181,7 @@ "locked": "31.1-jre" }, "com.google.protobuf:protobuf-java": { - "locked": "3.20.0" + "locked": "3.20.1" }, "com.netflix.conductor:conductor-annotations": { "project": true diff --git a/awss3-storage/README.md b/awss3-storage/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/mysql-persistence/build.gradle b/awss3-storage/build.gradle similarity index 51% rename from mysql-persistence/build.gradle rename to awss3-storage/build.gradle index 11cd9eb07..adda2bb42 100644 --- a/mysql-persistence/build.gradle +++ b/awss3-storage/build.gradle @@ -1,5 +1,5 @@ /* - * Copyright 2021 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -16,25 +16,6 @@ dependencies { implementation project(':conductor-core') compileOnly 'org.springframework.boot:spring-boot-starter' - // SBMTODO: remove guava dep - implementation "com.google.guava:guava:${revGuava}" - - implementation "com.fasterxml.jackson.core:jackson-databind" - implementation "com.fasterxml.jackson.core:jackson-core" - + implementation "com.amazonaws:aws-java-sdk-s3:${revAwsSdk}" implementation "org.apache.commons:commons-lang3" - - implementation "mysql:mysql-connector-java" - implementation "org.springframework.boot:spring-boot-starter-jdbc" - implementation "org.flywaydb:flyway-core" - - testImplementation "org.testcontainers:mysql:${revTestContainer}" - - testImplementation project(':conductor-core').sourceSets.test.output - testImplementation project(':conductor-common').sourceSets.test.output -} - -test { - //the MySQL unit tests must run within the same JVM to share the same embedded DB - maxParallelForks = 1 } diff --git a/awss3-storage/dependencies.lock b/awss3-storage/dependencies.lock new file mode 100644 index 000000000..5eb67b482 --- /dev/null +++ b/awss3-storage/dependencies.lock @@ -0,0 +1,1432 @@ +{ + "annotationProcessor": { + "org.springframework.boot:spring-boot-configuration-processor": { + "locked": "2.3.12.RELEASE" + } + }, + "compileClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-s3": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10" + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + }, + "runtimeClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-s3": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-io:commons-io": { + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + }, + "testCompileClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-s3": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10" + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + }, + "testRuntimeClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.amazonaws:aws-java-sdk-s3": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-io:commons-io": { + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + } +} \ No newline at end of file diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Configuration.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java similarity index 77% rename from contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Configuration.java rename to awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java index a52ec750c..a188c8504 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Configuration.java +++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.storage.config; +package com.netflix.conductor.s3.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -18,7 +18,8 @@ import org.springframework.context.annotation.Configuration; import com.netflix.conductor.common.utils.ExternalPayloadStorage; -import com.netflix.conductor.contribs.storage.S3PayloadStorage; +import com.netflix.conductor.core.utils.IDGenerator; +import com.netflix.conductor.s3.storage.S3PayloadStorage; @Configuration @EnableConfigurationProperties(S3Properties.class) @@ -26,7 +27,8 @@ public class S3Configuration { @Bean - public ExternalPayloadStorage s3ExternalPayloadStorage(S3Properties properties) { - return new S3PayloadStorage(properties); + public ExternalPayloadStorage s3ExternalPayloadStorage( + IDGenerator idGenerator, S3Properties properties) { + return new S3PayloadStorage(idGenerator, properties); } } diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java similarity index 95% rename from contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java rename to awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java index fc7f5ebf4..94a515f72 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java +++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.storage.config; +package com.netflix.conductor.s3.config; import java.time.Duration; import java.time.temporal.ChronoUnit; diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/storage/S3PayloadStorage.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java similarity index 88% rename from contribs/src/main/java/com/netflix/conductor/contribs/storage/S3PayloadStorage.java rename to awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java index e79bb6ebc..86e57e685 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/storage/S3PayloadStorage.java +++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.storage; +package com.netflix.conductor.s3.storage; import java.io.InputStream; import java.net.URISyntaxException; @@ -22,19 +22,15 @@ import com.netflix.conductor.common.run.ExternalStorageLocation; import com.netflix.conductor.common.utils.ExternalPayloadStorage; -import com.netflix.conductor.contribs.storage.config.S3Properties; import com.netflix.conductor.core.exception.ApplicationException; import com.netflix.conductor.core.utils.IDGenerator; +import com.netflix.conductor.s3.config.S3Properties; import com.amazonaws.HttpMethod; import com.amazonaws.SdkClientException; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; -import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest; -import com.amazonaws.services.s3.model.GetObjectRequest; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.PutObjectRequest; -import com.amazonaws.services.s3.model.S3Object; +import com.amazonaws.services.s3.model.*; /** * An implementation of {@link ExternalPayloadStorage} using AWS S3 for storing large JSON payload @@ -50,11 +46,13 @@ public class S3PayloadStorage implements ExternalPayloadStorage { private static final Logger LOGGER = LoggerFactory.getLogger(S3PayloadStorage.class); private static final String CONTENT_TYPE = "application/json"; + private final IDGenerator idGenerator; private final AmazonS3 s3Client; private final String bucketName; private final long expirationSec; - public S3PayloadStorage(S3Properties properties) { + public S3PayloadStorage(IDGenerator idGenerator, S3Properties properties) { + this.idGenerator = idGenerator; bucketName = properties.getBucketName(); expirationSec = properties.getSignedUrlExpirationDuration().getSeconds(); String region = properties.getRegion(); @@ -101,7 +99,10 @@ public ExternalStorageLocation getLocation( .toASCIIString()); return externalStorageLocation; } catch (SdkClientException e) { - String msg = "Error communicating with S3"; + String msg = + String.format( + "Error communicating with S3 - operation:%s, payloadType: %s, path: %s", + operation, payloadType, path); LOGGER.error(msg, e); throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); } catch (URISyntaxException e) { @@ -130,7 +131,9 @@ public void upload(String path, InputStream payload, long payloadSize) { new PutObjectRequest(bucketName, path, payload, objectMetadata); s3Client.putObject(request); } catch (SdkClientException e) { - String msg = "Error communicating with S3"; + String msg = + String.format( + "Error uploading to S3 - path:%s, payloadSize: %d", path, payloadSize); LOGGER.error(msg, e); throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); } @@ -149,7 +152,7 @@ public InputStream download(String path) { S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucketName, path)); return s3Object.getObjectContent(); } catch (SdkClientException e) { - String msg = "Error communicating with S3"; + String msg = String.format("Error downloading from S3 - path:%s", path); LOGGER.error(msg, e); throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); } @@ -171,7 +174,7 @@ private String getObjectKey(PayloadType payloadType) { stringBuilder.append("task/output/"); break; } - stringBuilder.append(IDGenerator.generate()).append(".json"); + stringBuilder.append(idGenerator.generate()).append(".json"); return stringBuilder.toString(); } } diff --git a/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 000000000..d8c1f34e5 --- /dev/null +++ b/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,13 @@ +{ + "hints": [ + { + "name": "conductor.external-payload-storage.type", + "values": [ + { + "value": "s3", + "description": "Use AWS S3 as the external payload storage." + } + ] + } + ] +} diff --git a/awssqs-event-queue/README.md b/awssqs-event-queue/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/awssqs-event-queue/build.gradle b/awssqs-event-queue/build.gradle new file mode 100644 index 000000000..a795acf2c --- /dev/null +++ b/awssqs-event-queue/build.gradle @@ -0,0 +1,16 @@ +dependencies { + implementation project(':conductor-common') + implementation project(':conductor-core') + compileOnly 'org.springframework.boot:spring-boot-starter' + + implementation "org.apache.commons:commons-lang3" + // SBMTODO: remove guava dep + implementation "com.google.guava:guava:${revGuava}" + + implementation "com.amazonaws:aws-java-sdk-sqs:${revAwsSdk}" + + implementation "io.reactivex:rxjava:${revRxJava}" + + testImplementation 'org.springframework.boot:spring-boot-starter' + testImplementation project(':conductor-common').sourceSets.test.output +} \ No newline at end of file diff --git a/awssqs-event-queue/dependencies.lock b/awssqs-event-queue/dependencies.lock new file mode 100644 index 000000000..bd0c01d09 --- /dev/null +++ b/awssqs-event-queue/dependencies.lock @@ -0,0 +1,1542 @@ +{ + "annotationProcessor": { + "org.springframework.boot:spring-boot-configuration-processor": { + "locked": "2.3.12.RELEASE" + } + }, + "compileClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.amazonaws:aws-java-sdk-sqs": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "30.0-jre" + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.2.2" + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10" + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + }, + "runtimeClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.amazonaws:aws-java-sdk-sqs": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "30.0-jre" + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-io:commons-io": { + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + }, + "testCompileClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.amazonaws:aws-java-sdk-sqs": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "30.0-jre" + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.2.2" + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10" + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + }, + "testRuntimeClasspath": { + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.amazonaws:aws-java-sdk-sqs": { + "locked": "1.11.86" + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "30.0-jre" + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-io:commons-io": { + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + } + } +} \ No newline at end of file diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueConfiguration.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java similarity index 96% rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueConfiguration.java rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java index 001250211..2ee425e7c 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueConfiguration.java +++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.queue.sqs.config; +package com.netflix.conductor.sqs.config; import java.util.HashMap; import java.util.Map; @@ -22,11 +22,11 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import com.netflix.conductor.contribs.queue.sqs.SQSObservableQueue.Builder; import com.netflix.conductor.core.config.ConductorProperties; import com.netflix.conductor.core.events.EventQueueProvider; import com.netflix.conductor.core.events.queue.ObservableQueue; import com.netflix.conductor.model.TaskModel.Status; +import com.netflix.conductor.sqs.eventqueue.SQSObservableQueue.Builder; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.services.sqs.AmazonSQSClient; diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProperties.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProperties.java similarity index 97% rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProperties.java rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProperties.java index ef2292099..7ce5a3e5d 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProperties.java +++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProperties.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.queue.sqs.config; +package com.netflix.conductor.sqs.config; import java.time.Duration; import java.time.temporal.ChronoUnit; diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProvider.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProvider.java similarity index 92% rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProvider.java rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProvider.java index b7f500180..5ad88dc69 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/config/SQSEventQueueProvider.java +++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.queue.sqs.config; +package com.netflix.conductor.sqs.config; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -19,9 +19,9 @@ import org.slf4j.LoggerFactory; import org.springframework.lang.NonNull; -import com.netflix.conductor.contribs.queue.sqs.SQSObservableQueue.Builder; import com.netflix.conductor.core.events.EventQueueProvider; import com.netflix.conductor.core.events.queue.ObservableQueue; +import com.netflix.conductor.sqs.eventqueue.SQSObservableQueue; import com.amazonaws.services.sqs.AmazonSQSClient; import rx.Scheduler; @@ -56,7 +56,7 @@ public ObservableQueue getQueue(String queueURI) { return queues.computeIfAbsent( queueURI, q -> - new Builder() + new SQSObservableQueue.Builder() .withBatchSize(this.batchSize) .withClient(client) .withPollTimeInMS(this.pollTimeInMS) diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueue.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueue.java similarity index 98% rename from contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueue.java rename to awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueue.java index e4603791d..a65cff1d9 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueue.java +++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueue.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.queue.sqs; +package com.netflix.conductor.sqs.eventqueue; import java.util.ArrayList; import java.util.Collections; @@ -52,7 +52,6 @@ import com.amazonaws.services.sqs.model.SendMessageBatchRequestEntry; import com.amazonaws.services.sqs.model.SendMessageBatchResult; import com.amazonaws.services.sqs.model.SetQueueAttributesResult; -import com.google.common.annotations.VisibleForTesting; import rx.Observable; import rx.Observable.OnSubscribe; import rx.Scheduler; @@ -238,7 +237,6 @@ public SQSObservableQueue build() { } // Private methods - @VisibleForTesting String getOrCreateQueue() { List queueUrls = listQueues(queueName); if (queueUrls == null || queueUrls.isEmpty()) { @@ -310,7 +308,6 @@ private void publishMessages(List messages) { LOGGER.debug("send result: {} for SQS queue: {}", result.getFailed().toString(), queueName); } - @VisibleForTesting List receiveMessages() { try { ReceiveMessageRequest receiveMessageRequest = @@ -339,7 +336,6 @@ List receiveMessages() { return new ArrayList<>(); } - @VisibleForTesting OnSubscribe getOnSubscribe() { return subscriber -> { Observable interval = Observable.interval(pollTimeInMS, TimeUnit.MILLISECONDS); diff --git a/awssqs-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/awssqs-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 000000000..2cc76ff65 --- /dev/null +++ b/awssqs-event-queue/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,27 @@ +{ + "properties": [ + { + "name": "conductor.event-queues.sqs.enabled", + "type": "java.lang.Boolean", + "description": "Enable the use of AWS SQS implementation to provide queues for consuming events.", + "sourceType": "com.netflix.conductor.sqs.config.SQSEventQueueConfiguration" + }, + { + "name": "conductor.default-event-queue.type", + "type": "java.lang.String", + "description": "The default event queue type to listen on for the WAIT task.", + "sourceType": "com.netflix.conductor.sqs.config.SQSEventQueueConfiguration" + } + ], + "hints": [ + { + "name": "conductor.default-event-queue.type", + "values": [ + { + "value": "sqs", + "description": "Use AWS SQS as the event queue to listen on for the WAIT task." + } + ] + } + ] +} \ No newline at end of file diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/DefaultEventQueueProcessorTest.java b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/DefaultEventQueueProcessorTest.java similarity index 99% rename from contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/DefaultEventQueueProcessorTest.java rename to awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/DefaultEventQueueProcessorTest.java index 8c0d2f728..ab7be3118 100644 --- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/DefaultEventQueueProcessorTest.java +++ b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/DefaultEventQueueProcessorTest.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.queue.sqs; +package com.netflix.conductor.sqs.eventqueue; import java.util.HashMap; import java.util.LinkedList; diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueueTest.java b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueueTest.java similarity index 97% rename from contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueueTest.java rename to awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueueTest.java index 789a90f87..be0e92fdc 100644 --- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/sqs/SQSObservableQueueTest.java +++ b/awssqs-event-queue/src/test/java/com/netflix/conductor/sqs/eventqueue/SQSObservableQueueTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.queue.sqs; +package com.netflix.conductor.sqs.eventqueue; import java.util.Collections; import java.util.LinkedList; diff --git a/azureblob-storage/README.md b/azureblob-storage/README.md deleted file mode 100644 index 33a39349c..000000000 --- a/azureblob-storage/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Azure Blob External Storage Module - -This module use azure blob to store and retrieve workflows/tasks input/output payload that -went over the thresholds defined in properties named `conductor.[workflow|task].[input|output].payload.threshold.kb`. - -**Warning** Azure Java SDK use libs already present inside `conductor` like `jackson` and `netty`. -You may encounter deprecated issues, or conflicts and need to adapt the code if the module is not maintained along with `conductor`. -It has only been tested with **v12.2.0**. - -## Configuration - -### Usage - -Cf. Documentation [External Payload Storage](https://netflix.github.io/conductor/externalpayloadstorage/#azure-blob-storage) - -### Example - -```properties -conductor.additional.modules=com.netflix.conductor.azureblob.AzureBlobModule -es.set.netty.runtime.available.processors=false - -workflow.external.payload.storage=AZURE_BLOB -workflow.external.payload.storage.azure_blob.connection_string=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;EndpointSuffix=localhost -workflow.external.payload.storage.azure_blob.signedurlexpirationseconds=360 -``` - -## Testing - -You can use [Azurite](https://github.com/Azure/Azurite) to simulate an Azure Storage. - -### Troubleshoots - -* When using **es5 persistance** you will receive an `java.lang.IllegalStateException` because the Netty lib will call `setAvailableProcessors` two times. To resolve this issue you need to set the following system property - -``` -es.set.netty.runtime.available.processors=false -``` - -If you want to change the default HTTP client of azure sdk, you can use `okhttp` instead of `netty`. -For that you need to add the following [dependency](https://github.com/Azure/azure-sdk-for-java/tree/master/sdk/storage/azure-storage-blob#default-http-client). - -``` -com.azure:azure-core-http-okhttp:${compatible version} -``` diff --git a/azureblob-storage/build.gradle b/azureblob-storage/build.gradle deleted file mode 100644 index 3b85566a1..000000000 --- a/azureblob-storage/build.gradle +++ /dev/null @@ -1,8 +0,0 @@ -dependencies { - implementation project(':conductor-common') - implementation project(':conductor-core') - compileOnly 'org.springframework.boot:spring-boot-starter' - - implementation "com.azure:azure-storage-blob:${revAzureStorageBlobSdk}" - implementation "org.apache.commons:commons-lang3" -} diff --git a/azureblob-storage/dependencies.lock b/azureblob-storage/dependencies.lock deleted file mode 100644 index d223b2a53..000000000 --- a/azureblob-storage/dependencies.lock +++ /dev/null @@ -1,396 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" - } - }, - "compileClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - } - }, - "runtimeClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - } - }, - "testCompileClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - } - }, - "testRuntimeClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - } - } -} \ No newline at end of file diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobConfiguration.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobConfiguration.java deleted file mode 100644 index b36d29972..000000000 --- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.azureblob.config; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.azureblob.storage.AzureBlobPayloadStorage; -import com.netflix.conductor.common.utils.ExternalPayloadStorage; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(AzureBlobProperties.class) -@ConditionalOnProperty(name = "conductor.external-payload-storage.type", havingValue = "azureblob") -public class AzureBlobConfiguration { - - @Bean - public ExternalPayloadStorage azureBlobExternalPayloadStorage(AzureBlobProperties properties) { - return new AzureBlobPayloadStorage(properties); - } -} diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java deleted file mode 100644 index 9a1f4fbf9..000000000 --- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.azureblob.config; - -import java.time.Duration; -import java.time.temporal.ChronoUnit; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.convert.DurationUnit; - -@ConfigurationProperties("conductor.external-payload-storage.azureblob") -public class AzureBlobProperties { - - /** The connection string to be used to connect to Azure Blob storage */ - private String connectionString = null; - - /** The name of the container where the payloads will be stored */ - private String containerName = "conductor-payloads"; - - /** The endpoint to be used to connect to Azure Blob storage */ - private String endpoint = null; - - /** The sas token to be used for authenticating requests */ - private String sasToken = null; - - /** The time for which the shared access signature is valid */ - @DurationUnit(ChronoUnit.SECONDS) - private Duration signedUrlExpirationDuration = Duration.ofSeconds(5); - - /** The path at which the workflow inputs will be stored */ - private String workflowInputPath = "workflow/input/"; - - /** The path at which the workflow outputs will be stored */ - private String workflowOutputPath = "workflow/output/"; - - /** The path at which the task inputs will be stored */ - private String taskInputPath = "task/input/"; - - /** The path at which the task outputs will be stored */ - private String taskOutputPath = "task/output/"; - - public String getConnectionString() { - return connectionString; - } - - public void setConnectionString(String connectionString) { - this.connectionString = connectionString; - } - - public String getContainerName() { - return containerName; - } - - public void setContainerName(String containerName) { - this.containerName = containerName; - } - - public String getEndpoint() { - return endpoint; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - public String getSasToken() { - return sasToken; - } - - public void setSasToken(String sasToken) { - this.sasToken = sasToken; - } - - public Duration getSignedUrlExpirationDuration() { - return signedUrlExpirationDuration; - } - - public void setSignedUrlExpirationDuration(Duration signedUrlExpirationDuration) { - this.signedUrlExpirationDuration = signedUrlExpirationDuration; - } - - public String getWorkflowInputPath() { - return workflowInputPath; - } - - public void setWorkflowInputPath(String workflowInputPath) { - this.workflowInputPath = workflowInputPath; - } - - public String getWorkflowOutputPath() { - return workflowOutputPath; - } - - public void setWorkflowOutputPath(String workflowOutputPath) { - this.workflowOutputPath = workflowOutputPath; - } - - public String getTaskInputPath() { - return taskInputPath; - } - - public void setTaskInputPath(String taskInputPath) { - this.taskInputPath = taskInputPath; - } - - public String getTaskOutputPath() { - return taskOutputPath; - } - - public void setTaskOutputPath(String taskOutputPath) { - this.taskOutputPath = taskOutputPath; - } -} diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java deleted file mode 100644 index ea9e1aeb4..000000000 --- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.azureblob.storage; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.UncheckedIOException; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.azureblob.config.AzureBlobProperties; -import com.netflix.conductor.common.run.ExternalStorageLocation; -import com.netflix.conductor.common.utils.ExternalPayloadStorage; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.core.utils.IDGenerator; - -import com.azure.core.exception.UnexpectedLengthException; -import com.azure.core.util.Context; -import com.azure.storage.blob.BlobContainerClient; -import com.azure.storage.blob.BlobContainerClientBuilder; -import com.azure.storage.blob.models.BlobHttpHeaders; -import com.azure.storage.blob.models.BlobStorageException; -import com.azure.storage.blob.sas.BlobSasPermission; -import com.azure.storage.blob.sas.BlobServiceSasSignatureValues; -import com.azure.storage.blob.specialized.BlockBlobClient; -import com.azure.storage.common.Utility; -import com.azure.storage.common.implementation.credentials.SasTokenCredential; - -/** - * An implementation of {@link ExternalPayloadStorage} using Azure Blob for storing large JSON - * payload data. - * - * @see Azure Java SDK - */ -public class AzureBlobPayloadStorage implements ExternalPayloadStorage { - - private static final Logger LOGGER = LoggerFactory.getLogger(AzureBlobPayloadStorage.class); - private static final String CONTENT_TYPE = "application/json"; - - private final String workflowInputPath; - private final String workflowOutputPath; - private final String taskInputPath; - private final String taskOutputPath; - - private final BlobContainerClient blobContainerClient; - private final long expirationSec; - private final SasTokenCredential sasTokenCredential; - - public AzureBlobPayloadStorage(AzureBlobProperties properties) { - workflowInputPath = properties.getWorkflowInputPath(); - workflowOutputPath = properties.getWorkflowOutputPath(); - taskInputPath = properties.getTaskInputPath(); - taskOutputPath = properties.getTaskOutputPath(); - expirationSec = properties.getSignedUrlExpirationDuration().getSeconds(); - String connectionString = properties.getConnectionString(); - String containerName = properties.getContainerName(); - String endpoint = properties.getEndpoint(); - String sasToken = properties.getSasToken(); - - BlobContainerClientBuilder blobContainerClientBuilder = new BlobContainerClientBuilder(); - if (connectionString != null) { - blobContainerClientBuilder.connectionString(connectionString); - sasTokenCredential = null; - } else if (endpoint != null) { - blobContainerClientBuilder.endpoint(endpoint); - if (sasToken != null) { - sasTokenCredential = SasTokenCredential.fromSasTokenString(sasToken); - blobContainerClientBuilder.sasToken(sasTokenCredential.getSasToken()); - } else { - sasTokenCredential = null; - } - } else { - String msg = "Missing property for connectionString OR endpoint"; - LOGGER.error(msg); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg); - } - blobContainerClient = blobContainerClientBuilder.containerName(containerName).buildClient(); - } - - /** - * @param operation the type of {@link Operation} to be performed - * @param payloadType the {@link PayloadType} that is being accessed - * @return a {@link ExternalStorageLocation} object which contains the pre-signed URL and the - * azure blob name for the json payload - */ - @Override - public ExternalStorageLocation getLocation( - Operation operation, PayloadType payloadType, String path) { - try { - ExternalStorageLocation externalStorageLocation = new ExternalStorageLocation(); - - String objectKey; - if (StringUtils.isNotBlank(path)) { - objectKey = path; - } else { - objectKey = getObjectKey(payloadType); - } - externalStorageLocation.setPath(objectKey); - - BlockBlobClient blockBlobClient = - blobContainerClient.getBlobClient(objectKey).getBlockBlobClient(); - String blobUrl = Utility.urlDecode(blockBlobClient.getBlobUrl()); - - if (sasTokenCredential != null) { - blobUrl = blobUrl + "?" + sasTokenCredential.getSasToken(); - } else { - BlobSasPermission blobSASPermission = new BlobSasPermission(); - if (operation.equals(Operation.READ)) { - blobSASPermission.setReadPermission(true); - } else if (operation.equals(Operation.WRITE)) { - blobSASPermission.setWritePermission(true); - blobSASPermission.setCreatePermission(true); - } - BlobServiceSasSignatureValues blobServiceSasSignatureValues = - new BlobServiceSasSignatureValues( - OffsetDateTime.now(ZoneOffset.UTC).plusSeconds(expirationSec), - blobSASPermission); - blobUrl = - blobUrl + "?" + blockBlobClient.generateSas(blobServiceSasSignatureValues); - } - - externalStorageLocation.setUri(blobUrl); - return externalStorageLocation; - } catch (BlobStorageException e) { - String msg = "Error communicating with Azure"; - LOGGER.error(msg, e); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); - } - } - - /** - * Uploads the payload to the given azure blob name. It is expected that the caller retrieves - * the blob name using {@link #getLocation(Operation, PayloadType, String)} before making this - * call. - * - * @param path the name of the blob to be uploaded - * @param payload an {@link InputStream} containing the json payload which is to be uploaded - * @param payloadSize the size of the json payload in bytes - */ - @Override - public void upload(String path, InputStream payload, long payloadSize) { - try { - BlockBlobClient blockBlobClient = - blobContainerClient.getBlobClient(path).getBlockBlobClient(); - BlobHttpHeaders blobHttpHeaders = new BlobHttpHeaders().setContentType(CONTENT_TYPE); - blockBlobClient.uploadWithResponse( - payload, - payloadSize, - blobHttpHeaders, - null, - null, - null, - null, - null, - Context.NONE); - } catch (BlobStorageException | UncheckedIOException | UnexpectedLengthException e) { - String msg = "Error communicating with Azure"; - LOGGER.error(msg, e); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); - } - } - - /** - * Downloads the payload stored in an azure blob. - * - * @param path the path of the blob - * @return an input stream containing the contents of the object Caller is expected to close the - * input stream. - */ - @Override - public InputStream download(String path) { - try { - BlockBlobClient blockBlobClient = - blobContainerClient.getBlobClient(path).getBlockBlobClient(); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - // Avoid another call to the api to get the blob size - // ByteArrayOutputStream outputStream = new - // ByteArrayOutputStream(blockBlobClient.getProperties().value().blobSize()); - blockBlobClient.download(outputStream); - return new ByteArrayInputStream(outputStream.toByteArray()); - } catch (BlobStorageException | UncheckedIOException | NullPointerException e) { - String msg = "Error communicating with Azure"; - LOGGER.error(msg, e); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); - } - } - - /** - * Build path on external storage. Copied from S3PayloadStorage. - * - * @param payloadType the {@link PayloadType} which will determine the base path of the object - * @return External Storage path - */ - private String getObjectKey(PayloadType payloadType) { - StringBuilder stringBuilder = new StringBuilder(); - switch (payloadType) { - case WORKFLOW_INPUT: - stringBuilder.append(workflowInputPath); - break; - case WORKFLOW_OUTPUT: - stringBuilder.append(workflowOutputPath); - break; - case TASK_INPUT: - stringBuilder.append(taskInputPath); - break; - case TASK_OUTPUT: - stringBuilder.append(taskOutputPath); - break; - } - stringBuilder.append(IDGenerator.generate()).append(".json"); - return stringBuilder.toString(); - } -} diff --git a/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java b/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java deleted file mode 100644 index 5ce1bb49c..000000000 --- a/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.azureblob.storage; - -import java.time.Duration; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -import com.netflix.conductor.azureblob.config.AzureBlobProperties; -import com.netflix.conductor.common.run.ExternalStorageLocation; -import com.netflix.conductor.common.utils.ExternalPayloadStorage; -import com.netflix.conductor.core.exception.ApplicationException; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class AzureBlobPayloadStorageTest { - - private AzureBlobProperties properties; - - @Before - public void setUp() { - properties = mock(AzureBlobProperties.class); - when(properties.getConnectionString()).thenReturn(null); - when(properties.getContainerName()).thenReturn("conductor-payloads"); - when(properties.getEndpoint()).thenReturn(null); - when(properties.getSasToken()).thenReturn(null); - when(properties.getSignedUrlExpirationDuration()).thenReturn(Duration.ofSeconds(5)); - when(properties.getWorkflowInputPath()).thenReturn("workflow/input/"); - when(properties.getWorkflowOutputPath()).thenReturn("workflow/output/"); - when(properties.getTaskInputPath()).thenReturn("task/input"); - when(properties.getTaskOutputPath()).thenReturn("task/output/"); - } - - /** Dummy credentials Azure SDK doesn't work with Azurite since it cleans parameters */ - private final String azuriteConnectionString = - "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;EndpointSuffix=localhost"; - - @Rule public ExpectedException expectedException = ExpectedException.none(); - - @Test - public void testNoStorageAccount() { - expectedException.expect(ApplicationException.class); - new AzureBlobPayloadStorage(properties); - } - - @Test - public void testUseConnectionString() { - when(properties.getConnectionString()).thenReturn(azuriteConnectionString); - new AzureBlobPayloadStorage(properties); - } - - @Test - public void testUseEndpoint() { - String azuriteEndpoint = "http://127.0.0.1:10000/"; - when(properties.getEndpoint()).thenReturn(azuriteEndpoint); - new AzureBlobPayloadStorage(properties); - } - - @Test - public void testGetLocationFixedPath() { - when(properties.getConnectionString()).thenReturn(azuriteConnectionString); - AzureBlobPayloadStorage azureBlobPayloadStorage = new AzureBlobPayloadStorage(properties); - String path = "somewhere"; - ExternalStorageLocation externalStorageLocation = - azureBlobPayloadStorage.getLocation( - ExternalPayloadStorage.Operation.READ, - ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT, - path); - assertNotNull(externalStorageLocation); - assertEquals(path, externalStorageLocation.getPath()); - assertNotNull(externalStorageLocation.getUri()); - } - - private void testGetLocation( - AzureBlobPayloadStorage azureBlobPayloadStorage, - ExternalPayloadStorage.Operation operation, - ExternalPayloadStorage.PayloadType payloadType, - String expectedPath) { - ExternalStorageLocation externalStorageLocation = - azureBlobPayloadStorage.getLocation(operation, payloadType, null); - assertNotNull(externalStorageLocation); - assertNotNull(externalStorageLocation.getPath()); - assertTrue(externalStorageLocation.getPath().startsWith(expectedPath)); - assertNotNull(externalStorageLocation.getUri()); - assertTrue(externalStorageLocation.getUri().contains(expectedPath)); - } - - @Test - public void testGetAllLocations() { - when(properties.getConnectionString()).thenReturn(azuriteConnectionString); - AzureBlobPayloadStorage azureBlobPayloadStorage = new AzureBlobPayloadStorage(properties); - - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.READ, - ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT, - properties.getWorkflowInputPath()); - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.READ, - ExternalPayloadStorage.PayloadType.WORKFLOW_OUTPUT, - properties.getWorkflowOutputPath()); - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.READ, - ExternalPayloadStorage.PayloadType.TASK_INPUT, - properties.getTaskInputPath()); - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.READ, - ExternalPayloadStorage.PayloadType.TASK_OUTPUT, - properties.getTaskOutputPath()); - - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.WRITE, - ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT, - properties.getWorkflowInputPath()); - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.WRITE, - ExternalPayloadStorage.PayloadType.WORKFLOW_OUTPUT, - properties.getWorkflowOutputPath()); - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.WRITE, - ExternalPayloadStorage.PayloadType.TASK_INPUT, - properties.getTaskInputPath()); - testGetLocation( - azureBlobPayloadStorage, - ExternalPayloadStorage.Operation.WRITE, - ExternalPayloadStorage.PayloadType.TASK_OUTPUT, - properties.getTaskOutputPath()); - } -} diff --git a/build.gradle b/build.gradle index accc0186f..358563031 100644 --- a/build.gradle +++ b/build.gradle @@ -138,6 +138,7 @@ allprojects { testLogging { events = ["SKIPPED", "FAILED"] exceptionFormat = "full" + displayGranularity = 1 showStandardStreams = false } } @@ -154,9 +155,9 @@ allprojects { jacocoTestReport { reports { - html.enabled = true - xml.enabled = true - csv.enabled = false + html.required = true + xml.required = true + csv.required = false } } diff --git a/cassandra-persistence/dependencies.lock b/cassandra-persistence/dependencies.lock index 12a8fb9b8..9cd49a6e1 100644 --- a/cassandra-persistence/dependencies.lock +++ b/cassandra-persistence/dependencies.lock @@ -1,27 +1,147 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { "com.datastax.cassandra:cassandra-driver-core": { "locked": "3.10.2" }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.google.guava:guava": { + "locked": "19.0", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, "com.netflix.conductor:conductor-core": { "project": true }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -32,8 +152,124 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.ow2.asm:asm": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "io.dropwizard.metrics:metrics-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "runtimeClasspath": { @@ -41,389 +277,2038 @@ "locked": "3.10.2" }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ + "locked": "2.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "com.github.jnr:jnr-ffi", + "net.minidev:accessors-smart", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "io.dropwizard.metrics:metrics-core", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "testCompileClasspath": { "com.datastax.cassandra:cassandra-driver-core": { - "locked": "3.10.2" + "locked": "3.10.2", + "transitive": [ + "org.testcontainers:cassandra" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.github.docker-java:docker-java-api" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.google.guava:guava": { + "locked": "19.0", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "com.github.jnr:jnr-ffi", + "net.minidev:accessors-smart", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "io.dropwizard.metrics:metrics-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring", + "org.testcontainers:spock" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.testcontainers:cassandra": { "locked": "1.15.3" }, + "org.testcontainers:database-commons": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:cassandra" + ] + }, "org.testcontainers:spock": { "locked": "1.15.3" + }, + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:database-commons", + "org.testcontainers:spock" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "com.beust:jcommander": { + "locked": "1.72", + "transitive": [ + "org.testng:testng" + ] + }, "com.datastax.cassandra:cassandra-driver-core": { - "locked": "3.10.2" + "locked": "3.10.2", + "transitive": [ + "org.testcontainers:cassandra" + ] }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.github.docker-java:docker-java-api", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-handler" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant-junit", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-antlr": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-junit": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant", + "org.codehaus.groovy:groovy-ant" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovydoc" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "com.github.jnr:jnr-ffi", + "net.minidev:accessors-smart", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "io.dropwizard.metrics:metrics-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring", + "org.testcontainers:spock" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.testcontainers:cassandra": { "locked": "1.15.3" }, + "org.testcontainers:database-commons": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:cassandra" + ] + }, "org.testcontainers:spock": { "locked": "1.15.3" + }, + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:database-commons", + "org.testcontainers:spock" + ] + }, + "org.testng:testng": { + "locked": "6.13.1", + "transitive": [ + "org.codehaus.groovy:groovy-testng" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java index 4341186d7..f8184f4b5 100644 --- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java +++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraExecutionDAO.java @@ -12,12 +12,7 @@ */ package com.netflix.conductor.cassandra.dao; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; import org.slf4j.Logger; @@ -28,7 +23,6 @@ import com.netflix.conductor.cassandra.util.Statements; import com.netflix.conductor.common.metadata.events.EventExecution; import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.common.utils.RetryUtil; import com.netflix.conductor.core.exception.ApplicationException; import com.netflix.conductor.core.exception.ApplicationException.Code; import com.netflix.conductor.dao.ConcurrentExecutionLimitDAO; @@ -37,25 +31,12 @@ import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.datastax.driver.core.BatchStatement; -import com.datastax.driver.core.PreparedStatement; -import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.Row; -import com.datastax.driver.core.Session; +import com.datastax.driver.core.*; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; -import static com.netflix.conductor.cassandra.util.Constants.DEFAULT_SHARD_ID; -import static com.netflix.conductor.cassandra.util.Constants.DEFAULT_TOTAL_PARTITIONS; -import static com.netflix.conductor.cassandra.util.Constants.ENTITY_KEY; -import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_TASK; -import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_WORKFLOW; -import static com.netflix.conductor.cassandra.util.Constants.PAYLOAD_KEY; -import static com.netflix.conductor.cassandra.util.Constants.TASK_ID_KEY; -import static com.netflix.conductor.cassandra.util.Constants.TOTAL_PARTITIONS_KEY; -import static com.netflix.conductor.cassandra.util.Constants.TOTAL_TASKS_KEY; -import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_ID_KEY; +import static com.netflix.conductor.cassandra.util.Constants.*; @Trace public class CassandraExecutionDAO extends CassandraBaseDAO @@ -746,19 +727,11 @@ public void addTaskToLimit(TaskModel task) { try { recordCassandraDaoRequests( "addTaskToLimit", task.getTaskType(), task.getWorkflowType()); - new RetryUtil<>() - .retryOnException( - () -> - session.execute( - updateTaskDefLimitStatement.bind( - UUID.fromString(task.getWorkflowInstanceId()), - task.getTaskDefName(), - UUID.fromString(task.getTaskId()))), - null, - null, - 3, - "Adding to task_def_limit", - "addTaskToLimit"); + session.execute( + updateTaskDefLimitStatement.bind( + UUID.fromString(task.getWorkflowInstanceId()), + task.getTaskDefName(), + UUID.fromString(task.getTaskId()))); } catch (Exception e) { Monitors.error(CLASS_NAME, "addTaskToLimit"); String errorMsg = @@ -775,18 +748,9 @@ public void removeTaskFromLimit(TaskModel task) { try { recordCassandraDaoRequests( "removeTaskFromLimit", task.getTaskType(), task.getWorkflowType()); - new RetryUtil<>() - .retryOnException( - () -> - session.execute( - deleteTaskDefLimitStatement.bind( - task.getTaskDefName(), - UUID.fromString(task.getTaskId()))), - null, - null, - 3, - "Deleting from task_def_limit", - "removeTaskFromLimit"); + session.execute( + deleteTaskDefLimitStatement.bind( + task.getTaskDefName(), UUID.fromString(task.getTaskId()))); } catch (Exception e) { Monitors.error(CLASS_NAME, "removeTaskFromLimit"); String errorMsg = diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java index 10bbe2dd5..0187034b5 100644 --- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java +++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraMetadataDAO.java @@ -24,10 +24,12 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import org.apache.commons.lang3.tuple.ImmutablePair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.netflix.conductor.annotations.Trace; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.cassandra.config.CassandraProperties; import com.netflix.conductor.cassandra.util.Statements; import com.netflix.conductor.common.metadata.tasks.TaskDef; @@ -42,7 +44,6 @@ import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.annotations.VisibleForTesting; import static com.netflix.conductor.cassandra.util.Constants.TASK_DEFINITION_KEY; import static com.netflix.conductor.cassandra.util.Constants.TASK_DEFS_KEY; @@ -292,8 +293,8 @@ public List getAllWorkflowDefs() { row -> { String defNameVersion = row.getString(WORKFLOW_DEF_NAME_VERSION_KEY); - String[] tokens = defNameVersion.split(INDEX_DELIMITER); - return getWorkflowDef(tokens[0], Integer.parseInt(tokens[1])) + var nameVersion = getWorkflowNameAndVersion(defNameVersion); + return getWorkflowDef(nameVersion.getLeft(), nameVersion.getRight()) .orElse(null); }) .filter(Objects::nonNull) @@ -404,4 +405,27 @@ private String insertOrUpdateTaskDef(TaskDef taskDef) { String getWorkflowDefIndexValue(String name, int version) { return name + INDEX_DELIMITER + version; } + + @VisibleForTesting + ImmutablePair getWorkflowNameAndVersion(String nameVersionStr) { + int lastIndexOfDelimiter = nameVersionStr.lastIndexOf(INDEX_DELIMITER); + + if (lastIndexOfDelimiter == -1) { + throw new IllegalStateException( + nameVersionStr + + " is not in the 'workflowName" + + INDEX_DELIMITER + + "version' pattern."); + } + + String workflowName = nameVersionStr.substring(0, lastIndexOfDelimiter); + String versionStr = nameVersionStr.substring(lastIndexOfDelimiter + 1); + + try { + return new ImmutablePair<>(workflowName, Integer.parseInt(versionStr)); + } catch (NumberFormatException e) { + throw new IllegalStateException( + versionStr + " in " + nameVersionStr + " is not a valid number."); + } + } } diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java index a6ea12253..38eff7d84 100644 --- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java +++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java @@ -289,7 +289,9 @@ public String getDeleteTaskDefStatement() { // ExecutionDAO // Insert Statements - /** @return cql query statement to insert a new workflow into the "workflows" table */ + /** + * @return cql query statement to insert a new workflow into the "workflows" table + */ public String getInsertWorkflowStatement() { return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOWS) .value(WORKFLOW_ID_KEY, bindMarker()) @@ -302,7 +304,9 @@ public String getInsertWorkflowStatement() { .getQueryString(); } - /** @return cql query statement to insert a new task into the "workflows" table */ + /** + * @return cql query statement to insert a new task into the "workflows" table + */ public String getInsertTaskStatement() { return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOWS) .value(WORKFLOW_ID_KEY, bindMarker()) @@ -340,7 +344,9 @@ public String getSelectTotalStatement() { .getQueryString(); } - /** @return cql query statement to retrieve a task from the "workflows" table */ + /** + * @return cql query statement to retrieve a task from the "workflows" table + */ public String getSelectTaskStatement() { return QueryBuilder.select(PAYLOAD_KEY) .from(keyspace, TABLE_WORKFLOWS) @@ -414,7 +420,9 @@ public String getSelectAllEventExecutionsForMessageFromEventExecutionsStatement( // Update Statements - /** @return cql query statement to update a workflow in the "workflows" table */ + /** + * @return cql query statement to update a workflow in the "workflows" table + */ public String getUpdateWorkflowStatement() { return QueryBuilder.update(keyspace, TABLE_WORKFLOWS) .with(set(PAYLOAD_KEY, bindMarker())) @@ -461,7 +469,9 @@ public String getUpdateTaskLookupStatement() { .getQueryString(); } - /** @return cql query statement to add a new task_id to the "task_def_limit" table */ + /** + * @return cql query statement to add a new task_id to the "task_def_limit" table + */ public String getUpdateTaskDefLimitStatement() { return QueryBuilder.update(keyspace, TABLE_TASK_DEF_LIMIT) .with(set(WORKFLOW_ID_KEY, bindMarker())) @@ -470,7 +480,9 @@ public String getUpdateTaskDefLimitStatement() { .getQueryString(); } - /** @return cql query statement to update an event execution in the "event_executions" table */ + /** + * @return cql query statement to update an event execution in the "event_executions" table + */ public String getUpdateEventExecutionStatement() { return QueryBuilder.update(keyspace, TABLE_EVENT_EXECUTIONS) .using(QueryBuilder.ttl(bindMarker())) @@ -483,7 +495,9 @@ public String getUpdateEventExecutionStatement() { // Delete statements - /** @return cql query statement to delete a workflow from the "workflows" table */ + /** + * @return cql query statement to delete a workflow from the "workflows" table + */ public String getDeleteWorkflowStatement() { return QueryBuilder.delete() .from(keyspace, TABLE_WORKFLOWS) @@ -503,7 +517,9 @@ public String getDeleteTaskLookupStatement() { .getQueryString(); } - /** @return cql query statement to delete a task from the "workflows" table */ + /** + * @return cql query statement to delete a task from the "workflows" table + */ public String getDeleteTaskStatement() { return QueryBuilder.delete() .from(keyspace, TABLE_WORKFLOWS) @@ -514,7 +530,9 @@ public String getDeleteTaskStatement() { .getQueryString(); } - /** @return cql query statement to delete a task_id from the "task_def_limit" table */ + /** + * @return cql query statement to delete a task_id from the "task_def_limit" table + */ public String getDeleteTaskDefLimitStatement() { return QueryBuilder.delete() .from(keyspace, TABLE_TASK_DEF_LIMIT) @@ -523,7 +541,9 @@ public String getDeleteTaskDefLimitStatement() { .getQueryString(); } - /** @return cql query statement to delete an event execution from the "event_execution" table */ + /** + * @return cql query statement to delete an event execution from the "event_execution" table + */ public String getDeleteEventExecutionsStatement() { return QueryBuilder.delete() .from(keyspace, TABLE_EVENT_EXECUTIONS) @@ -536,7 +556,9 @@ public String getDeleteEventExecutionsStatement() { // EventHandlerDAO // Insert Statements - /** @return cql query statement to insert an event handler into the "event_handlers" table */ + /** + * @return cql query statement to insert an event handler into the "event_handlers" table + */ public String getInsertEventHandlerStatement() { return QueryBuilder.insertInto(keyspace, TABLE_EVENT_HANDLERS) .value(HANDLERS_KEY, HANDLERS_KEY) diff --git a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy index 2a3b81c39..8500d9552 100644 --- a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy +++ b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraExecutionDAOSpec.groovy @@ -24,6 +24,7 @@ import com.netflix.conductor.model.WorkflowModel import spock.lang.Subject import static com.netflix.conductor.common.metadata.events.EventExecution.Status.COMPLETED +import static com.netflix.conductor.common.metadata.events.EventExecution.Status.IN_PROGRESS import static com.netflix.conductor.core.exception.ApplicationException.Code.INVALID_INPUT class CassandraExecutionDAOSpec extends CassandraSpec { @@ -65,7 +66,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec { def "workflow CRUD"() { given: - String workflowId = IDGenerator.generate() + String workflowId = new IDGenerator().generate() WorkflowDef workflowDef = new WorkflowDef() workflowDef.name = "def1" workflowDef.setVersion(1) @@ -118,15 +119,15 @@ class CassandraExecutionDAOSpec extends CassandraSpec { def "create tasks and verify methods that read tasks and workflow"() { given: 'we create a workflow' - String workflowId = IDGenerator.generate() + String workflowId = new IDGenerator().generate() WorkflowDef workflowDef = new WorkflowDef(name: 'def1', version: 1) WorkflowModel workflow = new WorkflowModel(workflowDefinition: workflowDef, workflowId: workflowId, input: new HashMap(), status: WorkflowModel.Status.RUNNING, createTime: System.currentTimeMillis()) executionDAO.createWorkflow(workflow) and: 'create tasks for this workflow' - TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) - TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) - TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) + TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) + TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) + TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) def taskList = [task1, task2, task3] @@ -190,15 +191,15 @@ class CassandraExecutionDAOSpec extends CassandraSpec { def "verify tasks are updated"() { given: 'we create a workflow' - String workflowId = IDGenerator.generate() + String workflowId = new IDGenerator().generate() WorkflowDef workflowDef = new WorkflowDef(name: 'def1', version: 1) WorkflowModel workflow = new WorkflowModel(workflowDefinition: workflowDef, workflowId: workflowId, input: new HashMap(), status: WorkflowModel.Status.RUNNING, createTime: System.currentTimeMillis()) executionDAO.createWorkflow(workflow) and: 'create tasks for this workflow' - TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) - TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) - TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) + TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) + TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) + TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) and: 'add the tasks to the datastore' executionDAO.createTasks([task1, task2, task3]) @@ -228,15 +229,15 @@ class CassandraExecutionDAOSpec extends CassandraSpec { def "verify tasks are removed"() { given: 'we create a workflow' - String workflowId = IDGenerator.generate() + String workflowId = new IDGenerator().generate() WorkflowDef workflowDef = new WorkflowDef(name: 'def1', version: 1) WorkflowModel workflow = new WorkflowModel(workflowDefinition: workflowDef, workflowId: workflowId, input: new HashMap(), status: WorkflowModel.Status.RUNNING, createTime: System.currentTimeMillis()) executionDAO.createWorkflow(workflow) and: 'create tasks for this workflow' - TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) - TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) - TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: IDGenerator.generate()) + TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) + TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) + TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate()) and: 'add the tasks to the datastore' executionDAO.createTasks([task1, task2, task3]) @@ -278,7 +279,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec { def "CRUD on task def limit"() { given: String taskDefName = "test_task_def" - String taskId = IDGenerator.generate() + String taskId = new IDGenerator().generate() TaskDef taskDef = new TaskDef(concurrentExecLimit: 1) WorkflowTask workflowTask = new WorkflowTask(taskDefinition: taskDef) @@ -287,7 +288,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec { TaskModel task = new TaskModel() task.taskDefName = taskDefName task.taskId = taskId - task.workflowInstanceId = IDGenerator.generate() + task.workflowInstanceId = new IDGenerator().generate() task.setWorkflowTask(workflowTask) task.setTaskType("test_task") task.setWorkflowType("test_workflow") @@ -295,8 +296,8 @@ class CassandraExecutionDAOSpec extends CassandraSpec { TaskModel newTask = new TaskModel() newTask.setTaskDefName(taskDefName) - newTask.setTaskId(IDGenerator.generate()) - newTask.setWorkflowInstanceId(IDGenerator.generate()) + newTask.setTaskId(new IDGenerator().generate()) + newTask.setWorkflowInstanceId(new IDGenerator().generate()) newTask.setWorkflowTask(workflowTask) newTask.setTaskType("test_task") newTask.setWorkflowType("test_workflow") @@ -349,8 +350,8 @@ class CassandraExecutionDAOSpec extends CassandraSpec { ex && ex.code == INVALID_INPUT and: 'verify that a non-existing generated id returns null' - executionDAO.getTask(IDGenerator.generate()) == null - executionDAO.getWorkflow(IDGenerator.generate(), true) == null + executionDAO.getTask(new IDGenerator().generate()) == null + executionDAO.getWorkflow(new IDGenerator().generate(), true) == null } def "CRUD on event execution"() throws Exception { @@ -387,6 +388,7 @@ class CassandraExecutionDAOSpec extends CassandraSpec { then: // fetch executions eventExecutionList != null && eventExecutionList.size() == 2 + eventExecutionList[0].status == IN_PROGRESS eventExecutionList[1].status == COMPLETED when: // sleep for 5 seconds (TTL) diff --git a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy index 5c06efe55..afca61fa7 100644 --- a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy +++ b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraMetadataDAOSpec.groovy @@ -69,7 +69,7 @@ class CassandraMetadataDAOSpec extends CassandraSpec { defOptional.get() == workflowDef when: // modify the definition - workflowDef.setOwnerEmail("junit@test.com") + workflowDef.setOwnerEmail("test@junit.com") metadataDAO.updateWorkflowDef(workflowDef) defOptional = metadataDAO.getWorkflowDef(name, higherVersion) @@ -138,4 +138,39 @@ class CassandraMetadataDAOSpec extends CassandraSpec { // fetch deleted task def metadataDAO.getTaskDef(task2Name) == null } + + def "parse index string"() { + expect: + def pair = metadataDAO.getWorkflowNameAndVersion(nameVersionStr) + pair.left == workflowName + pair.right == version + + where: + nameVersionStr << ['name/1', 'namespace/name/3', '/namespace/name_with_lodash/2', 'name//4', 'name-with$%/895'] + workflowName << ['name', 'namespace/name', '/namespace/name_with_lodash', 'name/', 'name-with$%'] + version << [1, 3, 2, 4, 895] + } + + def "parse index string - incorrect values"() { + when: + metadataDAO.getWorkflowNameAndVersion("name_with_no_version") + + then: + def ex = thrown(IllegalStateException.class) + println(ex.message) + + when: + metadataDAO.getWorkflowNameAndVersion("name_with_no_version/") + + then: + ex = thrown(IllegalStateException.class) + println(ex.message) + + when: + metadataDAO.getWorkflowNameAndVersion("name/non_number_version") + + then: + ex = thrown(IllegalStateException.class) + println(ex.message) + } } diff --git a/client-spring/dependencies.lock b/client-spring/dependencies.lock index d272aed8c..7a115e442 100644 --- a/client-spring/dependencies.lock +++ b/client-spring/dependencies.lock @@ -1,10 +1,73 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.guava:guava": { + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.netflix.conductor:conductor-client": { "project": true }, @@ -14,11 +77,115 @@ "com.netflix.eureka:eureka-client": { "locked": "1.10.10" }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey:jersey-client": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -29,162 +196,675 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.netflix.servo:servo-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } }, "runtimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ + "locked": "1.11.86", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" + ] + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-client": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "project": true + ] }, "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ + "locked": "1.10.10", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.conductor:conductor-client", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.4.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] }, "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-client", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } }, "testCompileClasspath": { + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.guava:guava": { + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.netflix.conductor:conductor-client": { "project": true }, @@ -194,192 +874,1134 @@ "com.netflix.eureka:eureka-client": { "locked": "1.10.10" }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey:jersey-client": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.servo:servo-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } }, "testRuntimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ + "locked": "1.11.86", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" + ] + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-client": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "project": true + ] }, "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ + "locked": "1.10.10", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.conductor:conductor-client", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.netflix-commons:netflix-infix" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.4.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] }, "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-client", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } } } \ No newline at end of file diff --git a/client/build.gradle b/client/build.gradle index 1a5ba7f2e..285ac6ceb 100644 --- a/client/build.gradle +++ b/client/build.gradle @@ -18,8 +18,6 @@ configurations.all { dependencies { implementation project(':conductor-common') - // SBMTODO: remove guava dep - implementation "com.google.guava:guava:${revGuava}" implementation "com.sun.jersey:jersey-client:${revJersey}" diff --git a/client/dependencies.lock b/client/dependencies.lock index 01ac2df2e..518650069 100644 --- a/client/dependencies.lock +++ b/client/dependencies.lock @@ -1,21 +1,110 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "com.amazonaws:aws-java-sdk-core": { "locked": "1.11.86" }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.13.2" + "locked": "2.11.4" + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.13.2" + "locked": "2.11.4" + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -23,23 +112,139 @@ "com.netflix.eureka:eureka-client": { "locked": "1.10.10" }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.netflix.spectator:spectator-api": { "locked": "0.122.0" }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.sun.jersey:jersey-client": { - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { "locked": "2.7" }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -51,56 +256,224 @@ "locked": "2.17.1" }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.netflix.servo:servo-core", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } }, "pmd": { + "com.beust:jcommander": { + "locked": "1.48", + "transitive": [ + "net.sourceforge.pmd:pmd-core" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "net.sourceforge.pmd:pmd-core" + ] + }, + "commons-io:commons-io": { + "locked": "2.6", + "transitive": [ + "net.sourceforge.pmd:pmd-core", + "net.sourceforge.pmd:pmd-java" + ] + }, + "net.sourceforge.pmd:pmd-core": { + "locked": "6.39.0", + "transitive": [ + "net.sourceforge.pmd:pmd-java" + ] + }, "net.sourceforge.pmd:pmd-java": { "locked": "6.39.0" + }, + "net.sourceforge.saxon:saxon": { + "locked": "9.1.0.8", + "transitive": [ + "net.sourceforge.pmd:pmd-core", + "net.sourceforge.pmd:pmd-java" + ] + }, + "org.antlr:antlr4-runtime": { + "locked": "4.7.2", + "transitive": [ + "net.sourceforge.pmd:pmd-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "net.sourceforge.pmd:pmd-core", + "net.sourceforge.pmd:pmd-java" + ] + }, + "org.ow2.asm:asm": { + "locked": "9.2", + "transitive": [ + "net.sourceforge.pmd:pmd-core", + "net.sourceforge.pmd:pmd-java" + ] } }, "runtimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "com.amazonaws:aws-java-sdk-core": { "locked": "1.11.86" }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.13.2" + "locked": "2.11.4" }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.13.2" + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { + "locked": "2.11.4" + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -108,88 +481,485 @@ "com.netflix.eureka:eureka-client": { "locked": "1.10.10" }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, "com.netflix.spectator:spectator-api": { "locked": "0.122.0" }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.sun.jersey:jersey-client": { - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { "locked": "2.7" }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] + }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.4.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } }, "spotbugs": { "com.github.spotbugs:spotbugs": { "locked": "4.4.1" + }, + "com.github.spotbugs:spotbugs-annotations": { + "locked": "4.4.1", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.github.spotbugs:spotbugs-annotations" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "jaxen:jaxen": { + "locked": "1.2.0", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "net.jcip:jcip-annotations": { + "locked": "1.0", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "net.sf.saxon:Saxon-HE": { + "locked": "10.5", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "org.apache.bcel:bcel": { + "locked": "6.5.0", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.github.spotbugs:spotbugs", + "org.apache.commons:commons-text" + ] + }, + "org.apache.commons:commons-text": { + "locked": "1.9", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "org.dom4j:dom4j": { + "locked": "2.1.3", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "org.junit:junit-bom": { + "locked": "5.7.2", + "transitive": [ + "com.github.spotbugs:spotbugs", + "com.github.spotbugs:spotbugs-annotations" + ] + }, + "org.ow2.asm:asm": { + "locked": "9.2", + "transitive": [ + "com.github.spotbugs:spotbugs", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-tree", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "9.2", + "transitive": [ + "com.github.spotbugs:spotbugs", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "9.2", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "9.2", + "transitive": [ + "com.github.spotbugs:spotbugs", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "9.2", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.github.spotbugs:spotbugs" + ] } }, "spotbugsSlf4j": { + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.slf4j:slf4j-simple" + ] + }, "org.slf4j:slf4j-simple": { "locked": "1.8.0-beta4" } }, "testCompileClasspath": { + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "com.amazonaws:aws-java-sdk-core": { "locked": "1.11.86" }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.13.2" + "locked": "2.11.4" + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.13.2" + "locked": "2.11.4" + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -197,94 +967,649 @@ "com.netflix.eureka:eureka-client": { "locked": "1.10.10" }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.netflix.spectator:spectator-api": { "locked": "0.122.0" }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.sun.jersey:jersey-client": { - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { "locked": "2.7" }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine", + "org.powermock:powermock-module-junit4", + "org.powermock:powermock-module-junit4-common" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.powermock:powermock-core", + "org.powermock:powermock-reflect" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.powermock:powermock-core", + "org.powermock:powermock-reflect" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "org.powermock:powermock-module-junit4", + "org.powermock:powermock-module-junit4-common" + ] + }, + "org.javassist:javassist": { + "locked": "3.27.0-GA", + "transitive": [ + "org.powermock:powermock-core" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.powermock:powermock-api-mockito2", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "3.0.1", + "transitive": [ + "org.mockito:mockito-core", + "org.powermock:powermock-reflect" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, "org.powermock:powermock-api-mockito2": { "locked": "2.0.9" }, + "org.powermock:powermock-api-support": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-api-mockito2" + ] + }, + "org.powermock:powermock-core": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-api-support", + "org.powermock:powermock-module-junit4-common" + ] + }, "org.powermock:powermock-module-junit4": { "locked": "2.0.9" }, + "org.powermock:powermock-module-junit4-common": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-module-junit4" + ] + }, + "org.powermock:powermock-reflect": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-api-support", + "org.powermock:powermock-core", + "org.powermock:powermock-module-junit4-common" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.servo:servo-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } }, "testRuntimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "com.amazonaws:aws-java-sdk-core": { "locked": "1.11.86" }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.13.2" + "locked": "2.11.4" }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.13.2" + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { + "locked": "2.11.4" + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -292,79 +1617,587 @@ "com.netflix.eureka:eureka-client": { "locked": "1.10.10" }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, "com.netflix.spectator:spectator-api": { "locked": "0.122.0" }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, "com.sun.jersey:jersey-client": { - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { "locked": "2.7" }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.netflix-commons:netflix-infix" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine", + "org.powermock:powermock-module-junit4", + "org.powermock:powermock-module-junit4-common" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.powermock:powermock-core", + "org.powermock:powermock-reflect" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.powermock:powermock-core", + "org.powermock:powermock-reflect" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.4.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "org.powermock:powermock-module-junit4", + "org.powermock:powermock-module-junit4-common" + ] + }, + "org.javassist:javassist": { + "locked": "3.27.0-GA", + "transitive": [ + "org.powermock:powermock-core" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.powermock:powermock-api-mockito2", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "3.0.1", + "transitive": [ + "org.mockito:mockito-core", + "org.powermock:powermock-reflect" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] }, "org.powermock:powermock-api-mockito2": { "locked": "2.0.9" }, + "org.powermock:powermock-api-support": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-api-mockito2" + ] + }, + "org.powermock:powermock-core": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-api-support", + "org.powermock:powermock-module-junit4-common" + ] + }, "org.powermock:powermock-module-junit4": { "locked": "2.0.9" }, + "org.powermock:powermock-module-junit4-common": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-module-junit4" + ] + }, + "org.powermock:powermock-reflect": { + "locked": "2.0.9", + "transitive": [ + "org.powermock:powermock-api-support", + "org.powermock:powermock-core", + "org.powermock:powermock-module-junit4-common" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } } } \ No newline at end of file diff --git a/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java b/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java index e2ae52f70..fdcb1a046 100644 --- a/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java +++ b/client/src/main/java/com/netflix/conductor/client/automator/TaskPollExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -18,11 +18,8 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; +import java.util.function.Function; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.concurrent.BasicThreadFactory; @@ -36,7 +33,6 @@ import com.netflix.conductor.client.worker.Worker; import com.netflix.conductor.common.metadata.tasks.Task; import com.netflix.conductor.common.metadata.tasks.TaskResult; -import com.netflix.conductor.common.utils.RetryUtil; import com.netflix.discovery.EurekaClient; import com.netflix.spectator.api.Registry; import com.netflix.spectator.api.Spectator; @@ -259,7 +255,7 @@ private void executeTask(Worker worker, Task task) { worker.getClass().getSimpleName(), worker.getIdentity(), result.getStatus()); - updateWithRetry(updateRetryCount, task, result, worker); + updateTaskResult(updateRetryCount, task, result, worker); } private void finalizeTask(Task task, Throwable throwable) { @@ -279,44 +275,29 @@ private void finalizeTask(Task task, Throwable throwable) { } } - private void updateWithRetry(int count, Task task, TaskResult result, Worker worker) { + private void updateTaskResult(int count, Task task, TaskResult result, Worker worker) { try { - String updateTaskDesc = - String.format( - "Retry updating task result: %s for task: %s in worker: %s", - result.toString(), task.getTaskDefName(), worker.getIdentity()); - String evaluatePayloadDesc = - String.format( - "Evaluate Task payload for task: %s in worker: %s", - task.getTaskDefName(), worker.getIdentity()); - String methodName = "updateWithRetry"; - - TaskResult finalResult = - new RetryUtil() - .retryOnException( - () -> { - TaskResult taskResult = result.copy(); - taskClient.evaluateAndUploadLargePayload( - taskResult, task.getTaskType()); - return taskResult; - }, - null, - null, - count, - evaluatePayloadDesc, - methodName); - - new RetryUtil<>() - .retryOnException( - () -> { - taskClient.updateTask(finalResult); - return null; - }, - null, - null, + // upload if necessary + Optional optionalExternalStorageLocation = + retryOperation( + (TaskResult taskResult) -> upload(taskResult, task.getTaskType()), count, - updateTaskDesc, - methodName); + result, + "evaluateAndUploadLargePayload"); + + if (optionalExternalStorageLocation.isPresent()) { + result.setExternalOutputPayloadStoragePath(optionalExternalStorageLocation.get()); + result.setOutputData(null); + } + + retryOperation( + (TaskResult taskResult) -> { + taskClient.updateTask(taskResult); + return null; + }, + count, + result, + "updateTask"); } catch (Exception e) { worker.onErrorUpdate(task); MetricsContainer.incrementTaskUpdateErrorCount(worker.getTaskDefName(), e); @@ -328,6 +309,34 @@ private void updateWithRetry(int count, Task task, TaskResult result, Worker wor } } + private Optional upload(TaskResult result, String taskType) { + try { + return taskClient.evaluateAndUploadLargePayload(result.getOutputData(), taskType); + } catch (IllegalArgumentException iae) { + result.setReasonForIncompletion(iae.getMessage()); + result.setOutputData(null); + result.setStatus(TaskResult.Status.FAILED_WITH_TERMINAL_ERROR); + return Optional.empty(); + } + } + + private R retryOperation(Function operation, int count, T input, String opName) { + int index = 0; + while (index < count) { + try { + return operation.apply(input); + } catch (Exception e) { + index++; + try { + Thread.sleep(500L); + } catch (InterruptedException ie) { + LOGGER.error("Retry interrupted", ie); + } + } + } + throw new RuntimeException("Exhausted retries performing " + opName); + } + private void handleException(Throwable t, TaskResult result, Worker worker, Task task) { LOGGER.error(String.format("Error while executing task %s", task.toString()), t); MetricsContainer.incrementTaskExecutionErrorCount(worker.getTaskDefName(), t); @@ -338,7 +347,7 @@ private void handleException(Throwable t, TaskResult result, Worker worker, Task t.printStackTrace(new PrintWriter(stringWriter)); result.log(stringWriter.toString()); - updateWithRetry(updateRetryCount, task, result, worker); + updateTaskResult(updateRetryCount, task, result, worker); } private PollingSemaphore getPollingSemaphore(String taskType) { diff --git a/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java b/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java index 1b7dbab03..bb3cfa1c4 100644 --- a/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java +++ b/client/src/main/java/com/netflix/conductor/client/automator/TaskRunnerConfigurer.java @@ -198,17 +198,23 @@ public TaskRunnerConfigurer build() { } } - /** @return Thread Count for the shared executor pool */ + /** + * @return Thread Count for the shared executor pool + */ public int getThreadCount() { return threadCount; } - /** @return Thread Count for individual task type */ + /** + * @return Thread Count for individual task type + */ public Map getTaskThreadCount() { return taskThreadCount; } - /** @return seconds before forcing shutdown of worker */ + /** + * @return seconds before forcing shutdown of worker + */ public int getShutdownGracePeriodSeconds() { return shutdownGracePeriodSeconds; } @@ -229,7 +235,9 @@ public int getUpdateRetryCount() { return updateRetryCount; } - /** @return prefix used for worker names */ + /** + * @return prefix used for worker names + */ public String getWorkerNamePrefix() { return workerNamePrefix; } diff --git a/client/src/main/java/com/netflix/conductor/client/http/EventClient.java b/client/src/main/java/com/netflix/conductor/client/http/EventClient.java index 970b919db..46bf00d55 100644 --- a/client/src/main/java/com/netflix/conductor/client/http/EventClient.java +++ b/client/src/main/java/com/netflix/conductor/client/http/EventClient.java @@ -36,7 +36,9 @@ public EventClient() { this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null); } - /** @param clientConfig REST Client configuration */ + /** + * @param clientConfig REST Client configuration + */ public EventClient(ClientConfig clientConfig) { this(clientConfig, new DefaultConductorClientConfiguration(), null); } diff --git a/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java b/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java index 50f014ea2..f27e84308 100644 --- a/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java +++ b/client/src/main/java/com/netflix/conductor/client/http/MetadataClient.java @@ -34,7 +34,9 @@ public MetadataClient() { this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null); } - /** @param clientConfig REST Client configuration */ + /** + * @param clientConfig REST Client configuration + */ public MetadataClient(ClientConfig clientConfig) { this(clientConfig, new DefaultConductorClientConfiguration(), null); } diff --git a/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java b/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java index 54aa0f47e..a21c43454 100644 --- a/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java +++ b/client/src/main/java/com/netflix/conductor/client/http/TaskClient.java @@ -14,6 +14,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -69,7 +70,9 @@ public TaskClient() { this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null); } - /** @param config REST Client configuration */ + /** + * @param config REST Client configuration + */ public TaskClient(ClientConfig config) { this(config, new DefaultConductorClientConfiguration(), null); } @@ -235,14 +238,10 @@ public void updateTask(TaskResult taskResult) { postForEntityWithRequestOnly("tasks", taskResult); } - public void evaluateAndUploadLargePayload(TaskResult taskResult, String taskType) { - Preconditions.checkNotNull(taskResult, "Task result cannot be null"); - Preconditions.checkArgument( - StringUtils.isBlank(taskResult.getExternalOutputPayloadStoragePath()), - "External Storage Path must not be set"); - + public Optional evaluateAndUploadLargePayload( + Map taskOutputData, String taskType) { try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { - objectMapper.writeValue(byteArrayOutputStream, taskResult.getOutputData()); + objectMapper.writeValue(byteArrayOutputStream, taskOutputData); byte[] taskOutputBytes = byteArrayOutputStream.toByteArray(); long taskResultSize = taskOutputBytes.length; MetricsContainer.recordTaskResultPayloadSize(taskType, taskResultSize); @@ -254,30 +253,22 @@ public void evaluateAndUploadLargePayload(TaskResult taskResult, String taskType || taskResultSize > conductorClientConfiguration.getTaskOutputMaxPayloadThresholdKB() * 1024L) { - taskResult.setReasonForIncompletion( + throw new IllegalArgumentException( String.format( "The TaskResult payload size: %d is greater than the permissible %d bytes", taskResultSize, payloadSizeThreshold)); - taskResult.setStatus(TaskResult.Status.FAILED_WITH_TERMINAL_ERROR); - taskResult.setOutputData(null); - } else { - MetricsContainer.incrementExternalPayloadUsedCount( - taskType, - ExternalPayloadStorage.Operation.WRITE.name(), - ExternalPayloadStorage.PayloadType.TASK_OUTPUT.name()); - String externalStoragePath = - uploadToExternalPayloadStorage( - ExternalPayloadStorage.PayloadType.TASK_OUTPUT, - taskOutputBytes, - taskResultSize); - taskResult.setExternalOutputPayloadStoragePath(externalStoragePath); - taskResult.setOutputData(null); } + MetricsContainer.incrementExternalPayloadUsedCount( + taskType, + ExternalPayloadStorage.Operation.WRITE.name(), + ExternalPayloadStorage.PayloadType.TASK_OUTPUT.name()); + return Optional.of( + uploadToExternalPayloadStorage( + PayloadType.TASK_OUTPUT, taskOutputBytes, taskResultSize)); } + return Optional.empty(); } catch (IOException e) { - String errorMsg = - String.format( - "Unable to update task: %s with task result", taskResult.getTaskId()); + String errorMsg = String.format("Unable to update task: %s with task result", taskType); LOGGER.error(errorMsg, e); throw new ConductorClientException(errorMsg, e); } @@ -352,13 +343,43 @@ public void removeTaskFromQueue(String taskType, String taskId) { public int getQueueSizeForTask(String taskType) { Preconditions.checkArgument(StringUtils.isNotBlank(taskType), "Task type cannot be blank"); - Map taskTypeToQueueSizeMap = + Integer queueSize = getForEntity( - "tasks/queue/sizes", new Object[] {"taskType", taskType}, queueSizeMap); - if (taskTypeToQueueSizeMap.containsKey(taskType)) { - return taskTypeToQueueSizeMap.get(taskType); + "tasks/queue/size", + new Object[] {"taskType", taskType}, + new GenericType() {}); + return queueSize != null ? queueSize : 0; + } + + public int getQueueSizeForTask( + String taskType, String domain, String isolationGroupId, String executionNamespace) { + Preconditions.checkArgument(StringUtils.isNotBlank(taskType), "Task type cannot be blank"); + + List params = new LinkedList<>(); + params.add("taskType"); + params.add(taskType); + + if (StringUtils.isNotBlank(domain)) { + params.add("domain"); + params.add(domain); + } + + if (StringUtils.isNotBlank(isolationGroupId)) { + params.add("isolationGroupId"); + params.add(isolationGroupId); } - return 0; + + if (StringUtils.isNotBlank(executionNamespace)) { + params.add("executionNamespace"); + params.add(executionNamespace); + } + + Integer queueSize = + getForEntity( + "tasks/queue/size", + params.toArray(new Object[0]), + new GenericType() {}); + return queueSize != null ? queueSize : 0; } /** diff --git a/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java b/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java index 3bc445bda..a75129f13 100644 --- a/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java +++ b/client/src/main/java/com/netflix/conductor/client/http/WorkflowClient.java @@ -54,7 +54,9 @@ public WorkflowClient() { this(new DefaultClientConfig(), new DefaultConductorClientConfiguration(), null); } - /** @param config REST Client configuration */ + /** + * @param config REST Client configuration + */ public WorkflowClient(ClientConfig config) { this(config, new DefaultConductorClientConfiguration(), null); } diff --git a/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java b/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java index 54287ca56..19791e385 100644 --- a/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java +++ b/client/src/test/java/com/netflix/conductor/client/automator/TaskPollExecutorTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -14,12 +14,9 @@ import java.util.HashMap; import java.util.Map; +import java.util.Optional; import java.util.UUID; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; +import java.util.concurrent.*; import org.junit.Test; import org.mockito.Mockito; @@ -34,25 +31,19 @@ import com.netflix.conductor.common.metadata.tasks.TaskResult; import com.netflix.discovery.EurekaClient; -import com.google.common.util.concurrent.Uninterruptibles; - import static com.netflix.conductor.common.metadata.tasks.TaskResult.Status.IN_PROGRESS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.mockito.Mockito.*; public class TaskPollExecutorTest { private static final String TEST_TASK_DEF_NAME = "test"; @Test - public void testTaskExecutionException() { + public void testTaskExecutionException() throws InterruptedException { Worker worker = Worker.create( TEST_TASK_DEF_NAME, @@ -83,13 +74,13 @@ public void testTaskExecutionException() { .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); verify(taskClient).updateTask(any()); } @SuppressWarnings("rawtypes") @Test - public void testMultipleTasksExecution() { + public void testMultipleTasksExecution() throws InterruptedException { String outputKey = "KEY"; Task task = testTask(); Worker worker = mock(Worker.class); @@ -101,9 +92,10 @@ public void testMultipleTasksExecution() { private int count = 0; Map outputMap = new HashMap<>(); - public TaskResult answer(InvocationOnMock invocation) { + public TaskResult answer(InvocationOnMock invocation) + throws InterruptedException { // Sleep for 2 seconds to simulate task execution - Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); + Thread.sleep(2000L); TaskResult taskResult = new TaskResult(task); outputMap.put(outputKey, count++); taskResult.setOutputData(outputMap); @@ -138,15 +130,16 @@ public TaskResult answer(InvocationOnMock invocation) { Executors.newSingleThreadScheduledExecutor() .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); // execute() is called 3 times on the worker (once for each task) verify(worker, times(3)).execute(any()); verify(taskClient, times(3)).updateTask(any()); } + @SuppressWarnings("unchecked") @Test - public void testLargePayloadCanFailUpdateWithRetry() { + public void testLargePayloadCanFailUpdateWithRetry() throws InterruptedException { Task task = testTask(); Worker worker = mock(Worker.class); @@ -163,11 +156,11 @@ public void testLargePayloadCanFailUpdateWithRetry() { Object[] args = invocation.getArguments(); TaskResult result = (TaskResult) args[0]; assertNull(result.getReasonForIncompletion()); - result.setReasonForIncompletion("some_reason"); + result.setReasonForIncompletion("some_reason_1"); throw new ConductorClientException(); }) .when(taskClient) - .evaluateAndUploadLargePayload(any(TaskResult.class), any()); + .evaluateAndUploadLargePayload(any(Map.class), any()); TaskPollExecutor taskPollExecutor = new TaskPollExecutor( @@ -184,14 +177,58 @@ public void testLargePayloadCanFailUpdateWithRetry() { Executors.newSingleThreadScheduledExecutor() .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); // When evaluateAndUploadLargePayload fails indefinitely, task update shouldn't be called. verify(taskClient, times(0)).updateTask(any()); } @Test - public void testTaskPollException() { + public void testLargePayloadLocationUpdate() throws InterruptedException { + Task task = testTask(); + String largePayloadLocation = "large_payload_location"; + + Worker worker = mock(Worker.class); + when(worker.getPollingInterval()).thenReturn(3000); + when(worker.getTaskDefName()).thenReturn(TEST_TASK_DEF_NAME); + when(worker.execute(any())).thenReturn(new TaskResult(task)); + + TaskClient taskClient = Mockito.mock(TaskClient.class); + when(taskClient.pollTask(any(), any(), any())).thenReturn(task); + when(taskClient.ack(any(), any())).thenReturn(true); + //noinspection unchecked + when(taskClient.evaluateAndUploadLargePayload(any(Map.class), any())) + .thenReturn(Optional.of(largePayloadLocation)); + + TaskPollExecutor taskPollExecutor = + new TaskPollExecutor( + null, taskClient, 1, 3, new HashMap<>(), "test-worker-", new HashMap<>()); + CountDownLatch latch = new CountDownLatch(1); + + doAnswer( + invocation -> { + Object[] args = invocation.getArguments(); + TaskResult result = (TaskResult) args[0]; + assertNull(result.getOutputData()); + assertEquals( + largePayloadLocation, + result.getExternalOutputPayloadStoragePath()); + latch.countDown(); + return null; + }) + .when(taskClient) + .updateTask(any()); + + Executors.newSingleThreadScheduledExecutor() + .scheduleAtFixedRate( + () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); + latch.await(); + + verify(taskClient, times(1)).updateTask(any()); + } + + @Test + public void testTaskPollException() throws InterruptedException { Task task = testTask(); Worker worker = mock(Worker.class); @@ -224,12 +261,12 @@ public void testTaskPollException() { .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); verify(taskClient).updateTask(any()); } @Test - public void testTaskPoll() { + public void testTaskPoll() throws InterruptedException { Task task = testTask(); Worker worker = mock(Worker.class); @@ -260,12 +297,12 @@ public void testTaskPoll() { .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); verify(taskClient).updateTask(any()); } @Test - public void testTaskPollDomain() { + public void testTaskPollDomain() throws InterruptedException { TaskClient taskClient = Mockito.mock(TaskClient.class); String testDomain = "foo"; Map taskToDomain = new HashMap<>(); @@ -292,12 +329,12 @@ public void testTaskPollDomain() { .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); verify(taskClient).pollTask(TEST_TASK_DEF_NAME, workerName, testDomain); } @Test - public void testPollOutOfDiscoveryForTask() { + public void testPollOutOfDiscoveryForTask() throws InterruptedException { Task task = testTask(); EurekaClient client = mock(EurekaClient.class); @@ -331,7 +368,7 @@ public void testPollOutOfDiscoveryForTask() { .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); verify(taskClient).updateTask(any()); } @@ -418,7 +455,7 @@ public void testPollOutOfDiscoveryAsExplicitFalseForTask() } @Test - public void testPollOutOfDiscoveryIsIgnoredWhenDiscoveryIsUp() { + public void testPollOutOfDiscoveryIsIgnoredWhenDiscoveryIsUp() throws InterruptedException { Task task = testTask(); EurekaClient client = mock(EurekaClient.class); @@ -452,12 +489,12 @@ public void testPollOutOfDiscoveryIsIgnoredWhenDiscoveryIsUp() { .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); verify(taskClient).updateTask(any()); } @Test - public void testTaskThreadCount() { + public void testTaskThreadCount() throws InterruptedException { TaskClient taskClient = Mockito.mock(TaskClient.class); Map taskThreadCount = new HashMap<>(); @@ -485,7 +522,7 @@ public void testTaskThreadCount() { .scheduleAtFixedRate( () -> taskPollExecutor.pollAndExecute(worker), 0, 1, TimeUnit.SECONDS); - Uninterruptibles.awaitUninterruptibly(latch); + latch.await(); verify(taskClient).pollTask(TEST_TASK_DEF_NAME, workerName, null); } diff --git a/common/build.gradle b/common/build.gradle index 47901c620..87d4212ea 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -13,8 +13,6 @@ dependencies { implementation "org.apache.commons:commons-lang3" - implementation "com.github.rholder:guava-retrying:${revGuavaRetrying}" - implementation "org.apache.bval:bval-jsr:${revBval}" implementation "com.google.protobuf:protobuf-java:${revProtoBuf}" @@ -40,7 +38,7 @@ dependencies { task protogen(dependsOn: jar, type: JavaExec) { classpath configurations.annotationsProcessorCodegen - main = 'com.netflix.conductor.annotationsprocessor.protogen.ProtoGenTask' + mainClass = "com.netflix.conductor.annotationsprocessor.protogen.ProtoGenTask" args( "conductor.proto", "com.netflix.conductor.proto", diff --git a/common/dependencies.lock b/common/dependencies.lock index e9218dbb4..78957aef7 100644 --- a/common/dependencies.lock +++ b/common/dependencies.lock @@ -1,94 +1,178 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "annotationsProcessorCodegen": { "com.github.jknack:handlebars": { - "firstLevelTransitive": [ + "locked": "4.3.0", + "transitive": [ "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "4.3.0" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.11.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ + "locked": "31.1-jre", + "transitive": [ "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "31.1-jre" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.20.1", + "transitive": [ "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "3.20.0" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-annotations-processor" - ], - "project": true + ] }, "com.netflix.conductor:conductor-annotations-processor": { "project": true }, "com.squareup:javapoet": { - "firstLevelTransitive": [ + "locked": "1.13.0", + "transitive": [ "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "1.13.0" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "1.3.2" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.13.3", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.17.2" + "com.netflix.conductor:conductor-annotations-processor", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.13.3", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.17.2" + "com.netflix.conductor:conductor-annotations-processor", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.13.3", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.17.2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.13.3", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.17.2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.13.3", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.17.2" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.github.jknack:handlebars", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "compileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "org.webjars:webjars-locator-core" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "locked": "2.0.0" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" @@ -96,17 +180,78 @@ "com.netflix.conductor:conductor-annotations": { "project": true }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.hibernate.validator:hibernate-validator" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, "org.apache.bval:bval-jsr": { "locked": "2.0.5" }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -117,25 +262,180 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] + }, "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" + "locked": "1.6.8" + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] } }, "runtimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "locked": "2.0.0" + "locked": "2.11.4" }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" @@ -147,152 +447,842 @@ "locked": "2.0.5" }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" + "locked": "2.11.4" }, - "com.github.rholder:guava-retrying": { - "locked": "2.0.0" + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-annotations": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { "locked": "2.0.5" }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" + "locked": "2.11.4" }, - "com.github.rholder:guava-retrying": { - "locked": "2.0.0" + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-annotations": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { "locked": "2.0.5" }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-validation" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java b/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java index 6ec57d9ac..55347529d 100644 --- a/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java +++ b/common/src/main/java/com/netflix/conductor/common/constraints/OwnerEmailMandatoryConstraint.java @@ -22,7 +22,7 @@ import javax.validation.ConstraintValidatorContext; import javax.validation.Payload; -import com.google.common.base.Strings; +import org.apache.commons.lang3.StringUtils; import static java.lang.annotation.ElementType.FIELD; import static java.lang.annotation.ElementType.TYPE; @@ -51,7 +51,7 @@ public void initialize(OwnerEmailMandatoryConstraint constraintAnnotation) {} @Override public boolean isValid(String ownerEmail, ConstraintValidatorContext context) { - return !ownerEmailMandatory || !Strings.isNullOrEmpty(ownerEmail); + return !ownerEmailMandatory || !StringUtils.isEmpty(ownerEmail); } private static boolean ownerEmailMandatory = true; diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java b/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java index 268754152..01f229480 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/Auditable.java @@ -24,52 +24,72 @@ public abstract class Auditable { private String updatedBy; - /** @return the ownerApp */ + /** + * @return the ownerApp + */ public String getOwnerApp() { return ownerApp; } - /** @param ownerApp the ownerApp to set */ + /** + * @param ownerApp the ownerApp to set + */ public void setOwnerApp(String ownerApp) { this.ownerApp = ownerApp; } - /** @return the createTime */ + /** + * @return the createTime + */ public Long getCreateTime() { return createTime; } - /** @param createTime the createTime to set */ + /** + * @param createTime the createTime to set + */ public void setCreateTime(Long createTime) { this.createTime = createTime; } - /** @return the updateTime */ + /** + * @return the updateTime + */ public Long getUpdateTime() { return updateTime; } - /** @param updateTime the updateTime to set */ + /** + * @param updateTime the updateTime to set + */ public void setUpdateTime(Long updateTime) { this.updateTime = updateTime; } - /** @return the createdBy */ + /** + * @return the createdBy + */ public String getCreatedBy() { return createdBy; } - /** @param createdBy the createdBy to set */ + /** + * @param createdBy the createdBy to set + */ public void setCreatedBy(String createdBy) { this.createdBy = createdBy; } - /** @return the updatedBy */ + /** + * @return the updatedBy + */ public String getUpdatedBy() { return updatedBy; } - /** @param updatedBy the updatedBy to set */ + /** + * @param updatedBy the updatedBy to set + */ public void setUpdatedBy(String updatedBy) { this.updatedBy = updatedBy; } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java index 65a740774..d6a2065e6 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventExecution.java @@ -63,82 +63,114 @@ public EventExecution(String id, String messageId) { this.messageId = messageId; } - /** @return the id */ + /** + * @return the id + */ public String getId() { return id; } - /** @param id the id to set */ + /** + * @param id the id to set + */ public void setId(String id) { this.id = id; } - /** @return the messageId */ + /** + * @return the messageId + */ public String getMessageId() { return messageId; } - /** @param messageId the messageId to set */ + /** + * @param messageId the messageId to set + */ public void setMessageId(String messageId) { this.messageId = messageId; } - /** @return the name */ + /** + * @return the name + */ public String getName() { return name; } - /** @param name the name to set */ + /** + * @param name the name to set + */ public void setName(String name) { this.name = name; } - /** @return the event */ + /** + * @return the event + */ public String getEvent() { return event; } - /** @param event the event to set */ + /** + * @param event the event to set + */ public void setEvent(String event) { this.event = event; } - /** @return the created */ + /** + * @return the created + */ public long getCreated() { return created; } - /** @param created the created to set */ + /** + * @param created the created to set + */ public void setCreated(long created) { this.created = created; } - /** @return the status */ + /** + * @return the status + */ public Status getStatus() { return status; } - /** @param status the status to set */ + /** + * @param status the status to set + */ public void setStatus(Status status) { this.status = status; } - /** @return the action */ + /** + * @return the action + */ public Action.Type getAction() { return action; } - /** @param action the action to set */ + /** + * @param action the action to set + */ public void setAction(Action.Type action) { this.action = action; } - /** @return the output */ + /** + * @return the output + */ public Map getOutput() { return output; } - /** @param output the output to set */ + /** + * @param output the output to set + */ public void setOutput(Map output) { this.output = output; } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java index fe8c9f042..77dda4c1e 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/events/EventHandler.java @@ -56,62 +56,86 @@ public class EventHandler { public EventHandler() {} - /** @return the name MUST be unique within a conductor instance */ + /** + * @return the name MUST be unique within a conductor instance + */ public String getName() { return name; } - /** @param name the name to set */ + /** + * @param name the name to set + */ public void setName(String name) { this.name = name; } - /** @return the event */ + /** + * @return the event + */ public String getEvent() { return event; } - /** @param event the event to set */ + /** + * @param event the event to set + */ public void setEvent(String event) { this.event = event; } - /** @return the condition */ + /** + * @return the condition + */ public String getCondition() { return condition; } - /** @param condition the condition to set */ + /** + * @param condition the condition to set + */ public void setCondition(String condition) { this.condition = condition; } - /** @return the actions */ + /** + * @return the actions + */ public List getActions() { return actions; } - /** @param actions the actions to set */ + /** + * @param actions the actions to set + */ public void setActions(List actions) { this.actions = actions; } - /** @return the active */ + /** + * @return the active + */ public boolean isActive() { return active; } - /** @param active if set to false, the event handler is deactivated */ + /** + * @param active if set to false, the event handler is deactivated + */ public void setActive(boolean active) { this.active = active; } - /** @return the evaluator type */ + /** + * @return the evaluator type + */ public String getEvaluatorType() { return evaluatorType; } - /** @param evaluatorType the evaluatorType to set */ + /** + * @param evaluatorType the evaluatorType to set + */ public void setEvaluatorType(String evaluatorType) { this.evaluatorType = evaluatorType; } @@ -141,42 +165,58 @@ public enum Type { @ProtoField(id = 5) private boolean expandInlineJSON; - /** @return the action */ + /** + * @return the action + */ public Type getAction() { return action; } - /** @param action the action to set */ + /** + * @param action the action to set + */ public void setAction(Type action) { this.action = action; } - /** @return the start_workflow */ + /** + * @return the start_workflow + */ public StartWorkflow getStart_workflow() { return start_workflow; } - /** @param start_workflow the start_workflow to set */ + /** + * @param start_workflow the start_workflow to set + */ public void setStart_workflow(StartWorkflow start_workflow) { this.start_workflow = start_workflow; } - /** @return the complete_task */ + /** + * @return the complete_task + */ public TaskDetails getComplete_task() { return complete_task; } - /** @param complete_task the complete_task to set */ + /** + * @param complete_task the complete_task to set + */ public void setComplete_task(TaskDetails complete_task) { this.complete_task = complete_task; } - /** @return the fail_task */ + /** + * @return the fail_task + */ public TaskDetails getFail_task() { return fail_task; } - /** @param fail_task the fail_task to set */ + /** + * @param fail_task the fail_task to set + */ public void setFail_task(TaskDetails fail_task) { this.fail_task = fail_task; } @@ -189,7 +229,9 @@ public void setExpandInlineJSON(boolean expandInlineJSON) { this.expandInlineJSON = expandInlineJSON; } - /** @return true if the json strings within the payload should be expanded. */ + /** + * @return true if the json strings within the payload should be expanded. + */ public boolean isExpandInlineJSON() { return expandInlineJSON; } @@ -214,32 +256,44 @@ public static class TaskDetails { @ProtoField(id = 5) private String taskId; - /** @return the workflowId */ + /** + * @return the workflowId + */ public String getWorkflowId() { return workflowId; } - /** @param workflowId the workflowId to set */ + /** + * @param workflowId the workflowId to set + */ public void setWorkflowId(String workflowId) { this.workflowId = workflowId; } - /** @return the taskRefName */ + /** + * @return the taskRefName + */ public String getTaskRefName() { return taskRefName; } - /** @param taskRefName the taskRefName to set */ + /** + * @param taskRefName the taskRefName to set + */ public void setTaskRefName(String taskRefName) { this.taskRefName = taskRefName; } - /** @return the output */ + /** + * @return the output + */ public Map getOutput() { return output; } - /** @param output the output to set */ + /** + * @param output the output to set + */ public void setOutput(Map output) { this.output = output; } @@ -252,12 +306,16 @@ public void setOutputMessage(Any outputMessage) { this.outputMessage = outputMessage; } - /** @return the taskId */ + /** + * @return the taskId + */ public String getTaskId() { return taskId; } - /** @param taskId the taskId to set */ + /** + * @param taskId the taskId to set + */ public void setTaskId(String taskId) { this.taskId = taskId; } @@ -285,42 +343,58 @@ public static class StartWorkflow { @ProtoField(id = 6) private Map taskToDomain; - /** @return the name */ + /** + * @return the name + */ public String getName() { return name; } - /** @param name the name to set */ + /** + * @param name the name to set + */ public void setName(String name) { this.name = name; } - /** @return the version */ + /** + * @return the version + */ public Integer getVersion() { return version; } - /** @param version the version to set */ + /** + * @param version the version to set + */ public void setVersion(Integer version) { this.version = version; } - /** @return the correlationId */ + /** + * @return the correlationId + */ public String getCorrelationId() { return correlationId; } - /** @param correlationId the correlationId to set */ + /** + * @param correlationId the correlationId to set + */ public void setCorrelationId(String correlationId) { this.correlationId = correlationId; } - /** @return the input */ + /** + * @return the input + */ public Map getInput() { return input; } - /** @param input the input to set */ + /** + * @param input the input to set + */ public void setInput(Map input) { this.input = input; } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java index 82a6a1af2..f51016340 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/Task.java @@ -216,12 +216,16 @@ public void setTaskType(String taskType) { this.taskType = taskType; } - /** @return Status of the task */ + /** + * @return Status of the task + */ public Status getStatus() { return status; } - /** @param status Status of the task */ + /** + * @param status Status of the task + */ public void setStatus(Status status) { this.status = status; } @@ -237,107 +241,149 @@ public void setInputData(Map inputData) { this.inputData = inputData; } - /** @return the referenceTaskName */ + /** + * @return the referenceTaskName + */ public String getReferenceTaskName() { return referenceTaskName; } - /** @param referenceTaskName the referenceTaskName to set */ + /** + * @param referenceTaskName the referenceTaskName to set + */ public void setReferenceTaskName(String referenceTaskName) { this.referenceTaskName = referenceTaskName; } - /** @return the correlationId */ + /** + * @return the correlationId + */ public String getCorrelationId() { return correlationId; } - /** @param correlationId the correlationId to set */ + /** + * @param correlationId the correlationId to set + */ public void setCorrelationId(String correlationId) { this.correlationId = correlationId; } - /** @return the retryCount */ + /** + * @return the retryCount + */ public int getRetryCount() { return retryCount; } - /** @param retryCount the retryCount to set */ + /** + * @param retryCount the retryCount to set + */ public void setRetryCount(int retryCount) { this.retryCount = retryCount; } - /** @return the scheduledTime */ + /** + * @return the scheduledTime + */ public long getScheduledTime() { return scheduledTime; } - /** @param scheduledTime the scheduledTime to set */ + /** + * @param scheduledTime the scheduledTime to set + */ public void setScheduledTime(long scheduledTime) { this.scheduledTime = scheduledTime; } - /** @return the startTime */ + /** + * @return the startTime + */ public long getStartTime() { return startTime; } - /** @param startTime the startTime to set */ + /** + * @param startTime the startTime to set + */ public void setStartTime(long startTime) { this.startTime = startTime; } - /** @return the endTime */ + /** + * @return the endTime + */ public long getEndTime() { return endTime; } - /** @param endTime the endTime to set */ + /** + * @param endTime the endTime to set + */ public void setEndTime(long endTime) { this.endTime = endTime; } - /** @return the startDelayInSeconds */ + /** + * @return the startDelayInSeconds + */ public int getStartDelayInSeconds() { return startDelayInSeconds; } - /** @param startDelayInSeconds the startDelayInSeconds to set */ + /** + * @param startDelayInSeconds the startDelayInSeconds to set + */ public void setStartDelayInSeconds(int startDelayInSeconds) { this.startDelayInSeconds = startDelayInSeconds; } - /** @return the retriedTaskId */ + /** + * @return the retriedTaskId + */ public String getRetriedTaskId() { return retriedTaskId; } - /** @param retriedTaskId the retriedTaskId to set */ + /** + * @param retriedTaskId the retriedTaskId to set + */ public void setRetriedTaskId(String retriedTaskId) { this.retriedTaskId = retriedTaskId; } - /** @return the seq */ + /** + * @return the seq + */ public int getSeq() { return seq; } - /** @param seq the seq to set */ + /** + * @param seq the seq to set + */ public void setSeq(int seq) { this.seq = seq; } - /** @return the updateTime */ + /** + * @return the updateTime + */ public long getUpdateTime() { return updateTime; } - /** @param updateTime the updateTime to set */ + /** + * @param updateTime the updateTime to set + */ public void setUpdateTime(long updateTime) { this.updateTime = updateTime; } - /** @return the queueWaitTime */ + /** + * @return the queueWaitTime + */ public long getQueueWaitTime() { if (this.startTime > 0 && this.scheduledTime > 0) { if (this.updateTime > 0 && getCallbackAfterSeconds() > 0) { @@ -352,12 +398,16 @@ public long getQueueWaitTime() { return 0L; } - /** @return True if the task has been retried after failure */ + /** + * @return True if the task has been retried after failure + */ public boolean isRetried() { return retried; } - /** @param retried the retried to set */ + /** + * @param retried the retried to set + */ public void setRetried(boolean retried) { this.retried = retried; } @@ -370,12 +420,16 @@ public boolean isExecuted() { return executed; } - /** @param executed the executed value to set */ + /** + * @param executed the executed value to set + */ public void setExecuted(boolean executed) { this.executed = executed; } - /** @return No. of times task has been polled */ + /** + * @return No. of times task has been polled + */ public int getPollCount() { return pollCount; } @@ -396,7 +450,9 @@ public void setCallbackFromWorker(boolean callbackFromWorker) { this.callbackFromWorker = callbackFromWorker; } - /** @return Name of the task definition */ + /** + * @return Name of the task definition + */ public String getTaskDefName() { if (taskDefName == null || "".equals(taskDefName)) { taskDefName = taskType; @@ -404,7 +460,9 @@ public String getTaskDefName() { return taskDefName; } - /** @param taskDefName Name of the task definition */ + /** + * @param taskDefName Name of the task definition + */ public void setTaskDefName(String taskDefName) { this.taskDefName = taskDefName; } @@ -424,12 +482,16 @@ public void setResponseTimeoutSeconds(long responseTimeoutSeconds) { this.responseTimeoutSeconds = responseTimeoutSeconds; } - /** @return the workflowInstanceId */ + /** + * @return the workflowInstanceId + */ public String getWorkflowInstanceId() { return workflowInstanceId; } - /** @param workflowInstanceId the workflowInstanceId to set */ + /** + * @param workflowInstanceId the workflowInstanceId to set + */ public void setWorkflowInstanceId(String workflowInstanceId) { this.workflowInstanceId = workflowInstanceId; } @@ -447,52 +509,72 @@ public com.netflix.conductor.common.metadata.tasks.Task setWorkflowType(String w return this; } - /** @return the taskId */ + /** + * @return the taskId + */ public String getTaskId() { return taskId; } - /** @param taskId the taskId to set */ + /** + * @param taskId the taskId to set + */ public void setTaskId(String taskId) { this.taskId = taskId; } - /** @return the reasonForIncompletion */ + /** + * @return the reasonForIncompletion + */ public String getReasonForIncompletion() { return reasonForIncompletion; } - /** @param reasonForIncompletion the reasonForIncompletion to set */ + /** + * @param reasonForIncompletion the reasonForIncompletion to set + */ public void setReasonForIncompletion(String reasonForIncompletion) { this.reasonForIncompletion = StringUtils.substring(reasonForIncompletion, 0, 500); } - /** @return the callbackAfterSeconds */ + /** + * @return the callbackAfterSeconds + */ public long getCallbackAfterSeconds() { return callbackAfterSeconds; } - /** @param callbackAfterSeconds the callbackAfterSeconds to set */ + /** + * @param callbackAfterSeconds the callbackAfterSeconds to set + */ public void setCallbackAfterSeconds(long callbackAfterSeconds) { this.callbackAfterSeconds = callbackAfterSeconds; } - /** @return the workerId */ + /** + * @return the workerId + */ public String getWorkerId() { return workerId; } - /** @param workerId the workerId to set */ + /** + * @param workerId the workerId to set + */ public void setWorkerId(String workerId) { this.workerId = workerId; } - /** @return the outputData */ + /** + * @return the outputData + */ public Map getOutputData() { return outputData; } - /** @param outputData the outputData to set */ + /** + * @param outputData the outputData to set + */ public void setOutputData(Map outputData) { if (outputData == null) { outputData = new HashMap<>(); @@ -500,22 +582,30 @@ public void setOutputData(Map outputData) { this.outputData = outputData; } - /** @return Workflow Task definition */ + /** + * @return Workflow Task definition + */ public WorkflowTask getWorkflowTask() { return workflowTask; } - /** @param workflowTask Task definition */ + /** + * @param workflowTask Task definition + */ public void setWorkflowTask(WorkflowTask workflowTask) { this.workflowTask = workflowTask; } - /** @return the domain */ + /** + * @return the domain + */ public String getDomain() { return domain; } - /** @param domain the Domain */ + /** + * @param domain the Domain + */ public void setDomain(String domain) { this.domain = domain; } @@ -536,7 +626,9 @@ public void setOutputMessage(Any outputMessage) { this.outputMessage = outputMessage; } - /** @return {@link Optional} containing the task definition if available */ + /** + * @return {@link Optional} containing the task definition if available + */ public Optional getTaskDefinition() { return Optional.ofNullable(this.getWorkflowTask()).map(WorkflowTask::getTaskDefinition); } @@ -557,7 +649,9 @@ public void setRateLimitFrequencyInSeconds(int rateLimitFrequencyInSeconds) { this.rateLimitFrequencyInSeconds = rateLimitFrequencyInSeconds; } - /** @return the external storage path for the task input payload */ + /** + * @return the external storage path for the task input payload + */ public String getExternalInputPayloadStoragePath() { return externalInputPayloadStoragePath; } @@ -570,7 +664,9 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag this.externalInputPayloadStoragePath = externalInputPayloadStoragePath; } - /** @return the external storage path for the task output payload */ + /** + * @return the external storage path for the task output payload + */ public String getExternalOutputPayloadStoragePath() { return externalOutputPayloadStoragePath; } @@ -599,12 +695,16 @@ public void setExecutionNameSpace(String executionNameSpace) { this.executionNameSpace = executionNameSpace; } - /** @return the iteration */ + /** + * @return the iteration + */ public int getIteration() { return iteration; } - /** @param iteration iteration */ + /** + * @param iteration iteration + */ public void setIteration(int iteration) { this.iteration = iteration; } @@ -618,7 +718,9 @@ public int getWorkflowPriority() { return workflowPriority; } - /** @param workflowPriority Priority defined for workflow */ + /** + * @param workflowPriority Priority defined for workflow + */ public void setWorkflowPriority(int workflowPriority) { this.workflowPriority = workflowPriority; } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java index e36d95774..b518fbb7a 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskDef.java @@ -158,87 +158,121 @@ public TaskDef( this.responseTimeoutSeconds = responseTimeoutSeconds; } - /** @return the name */ + /** + * @return the name + */ public String getName() { return name; } - /** @param name the name to set */ + /** + * @param name the name to set + */ public void setName(String name) { this.name = name; } - /** @return the description */ + /** + * @return the description + */ public String getDescription() { return description; } - /** @param description the description to set */ + /** + * @param description the description to set + */ public void setDescription(String description) { this.description = description; } - /** @return the retryCount */ + /** + * @return the retryCount + */ public int getRetryCount() { return retryCount; } - /** @param retryCount the retryCount to set */ + /** + * @param retryCount the retryCount to set + */ public void setRetryCount(int retryCount) { this.retryCount = retryCount; } - /** @return the timeoutSeconds */ + /** + * @return the timeoutSeconds + */ public long getTimeoutSeconds() { return timeoutSeconds; } - /** @param timeoutSeconds the timeoutSeconds to set */ + /** + * @param timeoutSeconds the timeoutSeconds to set + */ public void setTimeoutSeconds(long timeoutSeconds) { this.timeoutSeconds = timeoutSeconds; } - /** @return Returns the input keys */ + /** + * @return Returns the input keys + */ public List getInputKeys() { return inputKeys; } - /** @param inputKeys Set of keys that the task accepts in the input map */ + /** + * @param inputKeys Set of keys that the task accepts in the input map + */ public void setInputKeys(List inputKeys) { this.inputKeys = inputKeys; } - /** @return Returns the output keys for the task when executed */ + /** + * @return Returns the output keys for the task when executed + */ public List getOutputKeys() { return outputKeys; } - /** @param outputKeys Sets the output keys */ + /** + * @param outputKeys Sets the output keys + */ public void setOutputKeys(List outputKeys) { this.outputKeys = outputKeys; } - /** @return the timeoutPolicy */ + /** + * @return the timeoutPolicy + */ public TimeoutPolicy getTimeoutPolicy() { return timeoutPolicy; } - /** @param timeoutPolicy the timeoutPolicy to set */ + /** + * @param timeoutPolicy the timeoutPolicy to set + */ public void setTimeoutPolicy(TimeoutPolicy timeoutPolicy) { this.timeoutPolicy = timeoutPolicy; } - /** @return the retryLogic */ + /** + * @return the retryLogic + */ public RetryLogic getRetryLogic() { return retryLogic; } - /** @param retryLogic the retryLogic to set */ + /** + * @param retryLogic the retryLogic to set + */ public void setRetryLogic(RetryLogic retryLogic) { this.retryLogic = retryLogic; } - /** @return the retryDelaySeconds */ + /** + * @return the retryDelaySeconds + */ public int getRetryDelaySeconds() { return retryDelaySeconds; } @@ -258,12 +292,16 @@ public void setResponseTimeoutSeconds(long responseTimeoutSeconds) { this.responseTimeoutSeconds = responseTimeoutSeconds; } - /** @param retryDelaySeconds the retryDelaySeconds to set */ + /** + * @param retryDelaySeconds the retryDelaySeconds to set + */ public void setRetryDelaySeconds(int retryDelaySeconds) { this.retryDelaySeconds = retryDelaySeconds; } - /** @return the inputTemplate */ + /** + * @return the inputTemplate + */ public Map getInputTemplate() { return inputTemplate; } @@ -309,17 +347,23 @@ public void setConcurrentExecLimit(Integer concurrentExecLimit) { this.concurrentExecLimit = concurrentExecLimit; } - /** @return Limit of number of concurrent task that can be IN_PROGRESS at a given time */ + /** + * @return Limit of number of concurrent task that can be IN_PROGRESS at a given time + */ public Integer getConcurrentExecLimit() { return concurrentExecLimit; } - /** @return concurrency limit */ + /** + * @return concurrency limit + */ public int concurrencyLimit() { return concurrentExecLimit == null ? 0 : concurrentExecLimit; } - /** @param inputTemplate the inputTemplate to set */ + /** + * @param inputTemplate the inputTemplate to set + */ public void setInputTemplate(Map inputTemplate) { this.inputTemplate = inputTemplate; } @@ -340,32 +384,44 @@ public void setExecutionNameSpace(String executionNameSpace) { this.executionNameSpace = executionNameSpace; } - /** @return the email of the owner of this task definition */ + /** + * @return the email of the owner of this task definition + */ public String getOwnerEmail() { return ownerEmail; } - /** @param ownerEmail the owner email to set */ + /** + * @param ownerEmail the owner email to set + */ public void setOwnerEmail(String ownerEmail) { this.ownerEmail = ownerEmail; } - /** @param pollTimeoutSeconds the poll timeout to set */ + /** + * @param pollTimeoutSeconds the poll timeout to set + */ public void setPollTimeoutSeconds(Integer pollTimeoutSeconds) { this.pollTimeoutSeconds = pollTimeoutSeconds; } - /** @return the poll timeout of this task definition */ + /** + * @return the poll timeout of this task definition + */ public Integer getPollTimeoutSeconds() { return pollTimeoutSeconds; } - /** @param backoffScaleFactor the backoff rate to set */ + /** + * @param backoffScaleFactor the backoff rate to set + */ public void setBackoffScaleFactor(Integer backoffScaleFactor) { this.backoffScaleFactor = backoffScaleFactor; } - /** @return the backoff rate of this task definition */ + /** + * @return the backoff rate of this task definition + */ public Integer getBackoffScaleFactor() { return backoffScaleFactor; } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java index ae9dfb6c9..256e1da6f 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskExecLog.java @@ -37,32 +37,44 @@ public TaskExecLog(String log) { this.createdTime = System.currentTimeMillis(); } - /** @return Task Exec Log */ + /** + * @return Task Exec Log + */ public String getLog() { return log; } - /** @param log The Log */ + /** + * @param log The Log + */ public void setLog(String log) { this.log = log; } - /** @return the taskId */ + /** + * @return the taskId + */ public String getTaskId() { return taskId; } - /** @param taskId the taskId to set */ + /** + * @param taskId the taskId to set + */ public void setTaskId(String taskId) { this.taskId = taskId; } - /** @return the createdTime */ + /** + * @return the createdTime + */ public long getCreatedTime() { return createdTime; } - /** @param createdTime the createdTime to set */ + /** + * @param createdTime the createdTime to set + */ public void setCreatedTime(long createdTime) { this.createdTime = createdTime; } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java index d44917620..d1628ea61 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/tasks/TaskResult.java @@ -100,7 +100,9 @@ public TaskResult(Task task) { public TaskResult() {} - /** @return Workflow instance id for which the task result is produced */ + /** + * @return Workflow instance id for which the task result is produced + */ public String getWorkflowInstanceId() { return workflowInstanceId; } @@ -155,7 +157,9 @@ public void setWorkerId(String workerId) { this.workerId = workerId; } - /** @return the status */ + /** + * @return the status + */ public Status getStatus() { return status; } @@ -177,7 +181,9 @@ public Map getOutputData() { return outputData; } - /** @param outputData output data to be set for the task execution result */ + /** + * @param outputData output data to be set for the task execution result + */ public void setOutputData(Map outputData) { this.outputData = outputData; } @@ -202,12 +208,16 @@ public void setOutputMessage(Any outputMessage) { this.outputMessage = outputMessage; } - /** @return Task execution logs */ + /** + * @return Task execution logs + */ public List getLogs() { return logs; } - /** @param logs Task execution logs */ + /** + * @param logs Task execution logs + */ public void setLogs(List logs) { this.logs = logs; } @@ -221,7 +231,9 @@ public TaskResult log(String log) { return this; } - /** @return the path where the task output is stored in external storage */ + /** + * @return the path where the task output is stored in external storage + */ public String getExternalOutputPayloadStoragePath() { return externalOutputPayloadStoragePath; } @@ -299,25 +311,4 @@ public static TaskResult newTaskResult(Status status) { result.setStatus(status); return result; } - - /** - * Copy the given task result object - * - * @return a deep copy of the task result object except the externalOutputPayloadStoragePath - * field - */ - public TaskResult copy() { - TaskResult taskResult = new TaskResult(); - taskResult.setWorkflowInstanceId(workflowInstanceId); - taskResult.setTaskId(taskId); - taskResult.setReasonForIncompletion(reasonForIncompletion); - taskResult.setCallbackAfterSeconds(callbackAfterSeconds); - taskResult.setWorkerId(workerId); - taskResult.setStatus(status); - taskResult.setOutputData(outputData); - taskResult.setOutputMessage(outputMessage); - taskResult.setLogs(logs); - taskResult.setSubWorkflowId(subWorkflowId); - return taskResult; - } } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java index 82fae4637..816981b86 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/SubWorkflowParams.java @@ -23,7 +23,6 @@ import com.fasterxml.jackson.annotation.JsonGetter; import com.fasterxml.jackson.annotation.JsonSetter; -import com.google.common.base.Preconditions; @ProtoMessage public class SubWorkflowParams { @@ -44,7 +43,9 @@ public class SubWorkflowParams { @ProtoField(id = 4) private Object workflowDefinition; - /** @return the name */ + /** + * @return the name + */ public String getName() { if (workflowDefinition != null) { return getWorkflowDef().getName(); @@ -53,12 +54,16 @@ public String getName() { } } - /** @param name the name to set */ + /** + * @param name the name to set + */ public void setName(String name) { this.name = name; } - /** @return the version */ + /** + * @return the version + */ public Integer getVersion() { if (workflowDefinition != null) { return getWorkflowDef().getVersion(); @@ -67,41 +72,56 @@ public Integer getVersion() { } } - /** @param version the version to set */ + /** + * @param version the version to set + */ public void setVersion(Integer version) { this.version = version; } - /** @return the taskToDomain */ + /** + * @return the taskToDomain + */ public Map getTaskToDomain() { return taskToDomain; } - /** @param taskToDomain the taskToDomain to set */ + /** + * @param taskToDomain the taskToDomain to set + */ public void setTaskToDomain(Map taskToDomain) { this.taskToDomain = taskToDomain; } - /** @return the workflowDefinition as an Object */ + /** + * @return the workflowDefinition as an Object + */ public Object getWorkflowDefinition() { return workflowDefinition; } - /** @return the workflowDefinition as a WorkflowDef */ + /** + * @return the workflowDefinition as a WorkflowDef + */ @JsonGetter("workflowDefinition") public WorkflowDef getWorkflowDef() { return (WorkflowDef) workflowDefinition; } - /** @param workflowDef the workflowDefinition to set */ + /** + * @param workflowDef the workflowDefinition to set + */ public void setWorkflowDefinition(Object workflowDef) { - Preconditions.checkArgument( - workflowDef == null || workflowDef instanceof WorkflowDef, - "workflowDefinition must be either null or WorkflowDef"); + if (!(workflowDef == null || workflowDef instanceof WorkflowDef)) { + throw new IllegalArgumentException( + "workflowDefinition must be either null or WorkflowDef"); + } this.workflowDefinition = workflowDef; } - /** @param workflowDef the workflowDefinition to set */ + /** + * @param workflowDef the workflowDefinition to set + */ @JsonSetter("workflowDefinition") public void setWorkflowDef(WorkflowDef workflowDef) { this.workflowDefinition = workflowDef; diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java index f81a91fb0..c91e27692 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowDef.java @@ -101,72 +101,100 @@ public enum TimeoutPolicy { @ProtoField(id = 15) private Map inputTemplate = new HashMap<>(); - /** @return the name */ + /** + * @return the name + */ public String getName() { return name; } - /** @param name the name to set */ + /** + * @param name the name to set + */ public void setName(String name) { this.name = name; } - /** @return the description */ + /** + * @return the description + */ public String getDescription() { return description; } - /** @param description the description to set */ + /** + * @param description the description to set + */ public void setDescription(String description) { this.description = description; } - /** @return the tasks */ + /** + * @return the tasks + */ public List getTasks() { return tasks; } - /** @param tasks the tasks to set */ + /** + * @param tasks the tasks to set + */ public void setTasks(List<@Valid WorkflowTask> tasks) { this.tasks = tasks; } - /** @return the inputParameters */ + /** + * @return the inputParameters + */ public List getInputParameters() { return inputParameters; } - /** @param inputParameters the inputParameters to set */ + /** + * @param inputParameters the inputParameters to set + */ public void setInputParameters(List inputParameters) { this.inputParameters = inputParameters; } - /** @return the outputParameters */ + /** + * @return the outputParameters + */ public Map getOutputParameters() { return outputParameters; } - /** @param outputParameters the outputParameters to set */ + /** + * @param outputParameters the outputParameters to set + */ public void setOutputParameters(Map outputParameters) { this.outputParameters = outputParameters; } - /** @return the version */ + /** + * @return the version + */ public int getVersion() { return version; } - /** @return the failureWorkflow */ + /** + * @return the failureWorkflow + */ public String getFailureWorkflow() { return failureWorkflow; } - /** @param failureWorkflow the failureWorkflow to set */ + /** + * @param failureWorkflow the failureWorkflow to set + */ public void setFailureWorkflow(String failureWorkflow) { this.failureWorkflow = failureWorkflow; } - /** @param version the version to set */ + /** + * @param version the version to set + */ public void setVersion(int version) { this.version = version; } @@ -190,12 +218,16 @@ public void setRestartable(boolean restartable) { this.restartable = restartable; } - /** @return the schemaVersion */ + /** + * @return the schemaVersion + */ public int getSchemaVersion() { return schemaVersion; } - /** @param schemaVersion the schemaVersion to set */ + /** + * @param schemaVersion the schemaVersion to set + */ public void setSchemaVersion(int schemaVersion) { this.schemaVersion = schemaVersion; } @@ -217,42 +249,58 @@ public void setWorkflowStatusListenerEnabled(boolean workflowStatusListenerEnabl this.workflowStatusListenerEnabled = workflowStatusListenerEnabled; } - /** @return the email of the owner of this workflow definition */ + /** + * @return the email of the owner of this workflow definition + */ public String getOwnerEmail() { return ownerEmail; } - /** @param ownerEmail the owner email to set */ + /** + * @param ownerEmail the owner email to set + */ public void setOwnerEmail(String ownerEmail) { this.ownerEmail = ownerEmail; } - /** @return the timeoutPolicy */ + /** + * @return the timeoutPolicy + */ public TimeoutPolicy getTimeoutPolicy() { return timeoutPolicy; } - /** @param timeoutPolicy the timeoutPolicy to set */ + /** + * @param timeoutPolicy the timeoutPolicy to set + */ public void setTimeoutPolicy(TimeoutPolicy timeoutPolicy) { this.timeoutPolicy = timeoutPolicy; } - /** @return the time after which a workflow is deemed to have timed out */ + /** + * @return the time after which a workflow is deemed to have timed out + */ public long getTimeoutSeconds() { return timeoutSeconds; } - /** @param timeoutSeconds the timeout in seconds to set */ + /** + * @param timeoutSeconds the timeout in seconds to set + */ public void setTimeoutSeconds(long timeoutSeconds) { this.timeoutSeconds = timeoutSeconds; } - /** @return the global workflow variables */ + /** + * @return the global workflow variables + */ public Map getVariables() { return variables; } - /** @param variables the set of global workflow variables to set */ + /** + * @param variables the set of global workflow variables to set + */ public void setVariables(Map variables) { this.variables = variables; } diff --git a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java index e059853c6..f6cf4fc48 100644 --- a/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java +++ b/common/src/main/java/com/netflix/conductor/common/metadata/workflow/WorkflowTask.java @@ -145,47 +145,65 @@ public void setTasks(List tasks) { @ProtoField(id = 28) private String expression; - /** @return the name */ + /** + * @return the name + */ public String getName() { return name; } - /** @param name the name to set */ + /** + * @param name the name to set + */ public void setName(String name) { this.name = name; } - /** @return the taskReferenceName */ + /** + * @return the taskReferenceName + */ public String getTaskReferenceName() { return taskReferenceName; } - /** @param taskReferenceName the taskReferenceName to set */ + /** + * @param taskReferenceName the taskReferenceName to set + */ public void setTaskReferenceName(String taskReferenceName) { this.taskReferenceName = taskReferenceName; } - /** @return the description */ + /** + * @return the description + */ public String getDescription() { return description; } - /** @param description the description to set */ + /** + * @param description the description to set + */ public void setDescription(String description) { this.description = description; } - /** @return the inputParameters */ + /** + * @return the inputParameters + */ public Map getInputParameters() { return inputParameters; } - /** @param inputParameters the inputParameters to set */ + /** + * @param inputParameters the inputParameters to set + */ public void setInputParameters(Map inputParameters) { this.inputParameters = inputParameters; } - /** @return the type */ + /** + * @return the type + */ public String getType() { return type; } @@ -194,67 +212,93 @@ public void setWorkflowTaskType(TaskType type) { this.type = type.name(); } - /** @param type the type to set */ + /** + * @param type the type to set + */ public void setType(@NotEmpty(message = "WorkTask type cannot be null or empty") String type) { this.type = type; } - /** @return the decisionCases */ + /** + * @return the decisionCases + */ public Map> getDecisionCases() { return decisionCases; } - /** @param decisionCases the decisionCases to set */ + /** + * @param decisionCases the decisionCases to set + */ public void setDecisionCases(Map> decisionCases) { this.decisionCases = decisionCases; } - /** @return the defaultCase */ + /** + * @return the defaultCase + */ public List getDefaultCase() { return defaultCase; } - /** @param defaultCase the defaultCase to set */ + /** + * @param defaultCase the defaultCase to set + */ public void setDefaultCase(List defaultCase) { this.defaultCase = defaultCase; } - /** @return the forkTasks */ + /** + * @return the forkTasks + */ public List> getForkTasks() { return forkTasks; } - /** @param forkTasks the forkTasks to set */ + /** + * @param forkTasks the forkTasks to set + */ public void setForkTasks(List> forkTasks) { this.forkTasks = forkTasks; } - /** @return the startDelay in seconds */ + /** + * @return the startDelay in seconds + */ public int getStartDelay() { return startDelay; } - /** @param startDelay the startDelay to set */ + /** + * @param startDelay the startDelay to set + */ public void setStartDelay(int startDelay) { this.startDelay = startDelay; } - /** @return the retryCount */ + /** + * @return the retryCount + */ public Integer getRetryCount() { return retryCount; } - /** @param retryCount the retryCount to set */ + /** + * @param retryCount the retryCount to set + */ public void setRetryCount(final Integer retryCount) { this.retryCount = retryCount; } - /** @return the dynamicTaskNameParam */ + /** + * @return the dynamicTaskNameParam + */ public String getDynamicTaskNameParam() { return dynamicTaskNameParam; } - /** @param dynamicTaskNameParam the dynamicTaskNameParam to set to be used by DYNAMIC tasks */ + /** + * @param dynamicTaskNameParam the dynamicTaskNameParam to set to be used by DYNAMIC tasks + */ public void setDynamicTaskNameParam(String dynamicTaskNameParam) { this.dynamicTaskNameParam = dynamicTaskNameParam; } @@ -336,57 +380,79 @@ public void setScriptExpression(String expression) { this.scriptExpression = expression; } - /** @return the subWorkflow */ + /** + * @return the subWorkflow + */ public SubWorkflowParams getSubWorkflowParam() { return subWorkflowParam; } - /** @param subWorkflow the subWorkflowParam to set */ + /** + * @param subWorkflow the subWorkflowParam to set + */ public void setSubWorkflowParam(SubWorkflowParams subWorkflow) { this.subWorkflowParam = subWorkflow; } - /** @return the joinOn */ + /** + * @return the joinOn + */ public List getJoinOn() { return joinOn; } - /** @param joinOn the joinOn to set */ + /** + * @param joinOn the joinOn to set + */ public void setJoinOn(List joinOn) { this.joinOn = joinOn; } - /** @return the loopCondition */ + /** + * @return the loopCondition + */ public String getLoopCondition() { return loopCondition; } - /** @param loopCondition the expression to set */ + /** + * @param loopCondition the expression to set + */ public void setLoopCondition(String loopCondition) { this.loopCondition = loopCondition; } - /** @return the loopOver */ + /** + * @return the loopOver + */ public List getLoopOver() { return loopOver; } - /** @param loopOver the loopOver to set */ + /** + * @param loopOver the loopOver to set + */ public void setLoopOver(List loopOver) { this.loopOver = loopOver; } - /** @return Sink value for the EVENT type of task */ + /** + * @return Sink value for the EVENT type of task + */ public String getSink() { return sink; } - /** @param sink Name of the sink */ + /** + * @param sink Name of the sink + */ public void setSink(String sink) { this.sink = sink; } - /** @return whether wait for an external event to complete the task, for EVENT and HTTP tasks */ + /** + * @return whether wait for an external event to complete the task, for EVENT and HTTP tasks + */ public Boolean isAsyncComplete() { return asyncComplete; } @@ -403,17 +469,23 @@ public boolean isOptional() { return optional; } - /** @return Task definition associated to the Workflow Task */ + /** + * @return Task definition associated to the Workflow Task + */ public TaskDef getTaskDefinition() { return taskDefinition; } - /** @param taskDefinition Task definition */ + /** + * @param taskDefinition Task definition + */ public void setTaskDefinition(TaskDef taskDefinition) { this.taskDefinition = taskDefinition; } - /** @param optional when set to true, the task is marked as optional */ + /** + * @param optional when set to true, the task is marked as optional + */ public void setOptional(boolean optional) { this.optional = optional; } @@ -438,12 +510,16 @@ public void setDefaultExclusiveJoinTask(List defaultExclusiveJoinTask) { this.defaultExclusiveJoinTask = defaultExclusiveJoinTask; } - /** @return the evaluatorType */ + /** + * @return the evaluatorType + */ public String getEvaluatorType() { return evaluatorType; } - /** @param evaluatorType the evaluatorType to set */ + /** + * @param evaluatorType the evaluatorType to set + */ public void setEvaluatorType(String evaluatorType) { this.evaluatorType = evaluatorType; } @@ -457,7 +533,9 @@ public String getExpression() { return expression; } - /** @param expression the expression to set */ + /** + * @param expression the expression to set + */ public void setExpression(String expression) { this.expression = expression; } diff --git a/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java b/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java index d77249f80..72be415a9 100644 --- a/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java +++ b/common/src/main/java/com/netflix/conductor/common/run/SearchResult.java @@ -28,22 +28,30 @@ public SearchResult(long totalHits, List results) { this.results = results; } - /** @return the totalHits */ + /** + * @return the totalHits + */ public long getTotalHits() { return totalHits; } - /** @return the results */ + /** + * @return the results + */ public List getResults() { return results; } - /** @param totalHits the totalHits to set */ + /** + * @param totalHits the totalHits to set + */ public void setTotalHits(long totalHits) { this.totalHits = totalHits; } - /** @param results the results to set */ + /** + * @param results the results to set + */ public void setResults(List results) { this.results = results; } diff --git a/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java b/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java index f8322f62f..9823f8b85 100644 --- a/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java +++ b/common/src/main/java/com/netflix/conductor/common/run/TaskSummary.java @@ -129,167 +129,233 @@ public TaskSummary(Task task) { } } - /** @return the workflowId */ + /** + * @return the workflowId + */ public String getWorkflowId() { return workflowId; } - /** @param workflowId the workflowId to set */ + /** + * @param workflowId the workflowId to set + */ public void setWorkflowId(String workflowId) { this.workflowId = workflowId; } - /** @return the workflowType */ + /** + * @return the workflowType + */ public String getWorkflowType() { return workflowType; } - /** @param workflowType the workflowType to set */ + /** + * @param workflowType the workflowType to set + */ public void setWorkflowType(String workflowType) { this.workflowType = workflowType; } - /** @return the correlationId */ + /** + * @return the correlationId + */ public String getCorrelationId() { return correlationId; } - /** @param correlationId the correlationId to set */ + /** + * @param correlationId the correlationId to set + */ public void setCorrelationId(String correlationId) { this.correlationId = correlationId; } - /** @return the scheduledTime */ + /** + * @return the scheduledTime + */ public String getScheduledTime() { return scheduledTime; } - /** @param scheduledTime the scheduledTime to set */ + /** + * @param scheduledTime the scheduledTime to set + */ public void setScheduledTime(String scheduledTime) { this.scheduledTime = scheduledTime; } - /** @return the startTime */ + /** + * @return the startTime + */ public String getStartTime() { return startTime; } - /** @param startTime the startTime to set */ + /** + * @param startTime the startTime to set + */ public void setStartTime(String startTime) { this.startTime = startTime; } - /** @return the updateTime */ + /** + * @return the updateTime + */ public String getUpdateTime() { return updateTime; } - /** @param updateTime the updateTime to set */ + /** + * @param updateTime the updateTime to set + */ public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } - /** @return the endTime */ + /** + * @return the endTime + */ public String getEndTime() { return endTime; } - /** @param endTime the endTime to set */ + /** + * @param endTime the endTime to set + */ public void setEndTime(String endTime) { this.endTime = endTime; } - /** @return the status */ + /** + * @return the status + */ public Status getStatus() { return status; } - /** @param status the status to set */ + /** + * @param status the status to set + */ public void setStatus(Status status) { this.status = status; } - /** @return the reasonForIncompletion */ + /** + * @return the reasonForIncompletion + */ public String getReasonForIncompletion() { return reasonForIncompletion; } - /** @param reasonForIncompletion the reasonForIncompletion to set */ + /** + * @param reasonForIncompletion the reasonForIncompletion to set + */ public void setReasonForIncompletion(String reasonForIncompletion) { this.reasonForIncompletion = reasonForIncompletion; } - /** @return the executionTime */ + /** + * @return the executionTime + */ public long getExecutionTime() { return executionTime; } - /** @param executionTime the executionTime to set */ + /** + * @param executionTime the executionTime to set + */ public void setExecutionTime(long executionTime) { this.executionTime = executionTime; } - /** @return the queueWaitTime */ + /** + * @return the queueWaitTime + */ public long getQueueWaitTime() { return queueWaitTime; } - /** @param queueWaitTime the queueWaitTime to set */ + /** + * @param queueWaitTime the queueWaitTime to set + */ public void setQueueWaitTime(long queueWaitTime) { this.queueWaitTime = queueWaitTime; } - /** @return the taskDefName */ + /** + * @return the taskDefName + */ public String getTaskDefName() { return taskDefName; } - /** @param taskDefName the taskDefName to set */ + /** + * @param taskDefName the taskDefName to set + */ public void setTaskDefName(String taskDefName) { this.taskDefName = taskDefName; } - /** @return the taskType */ + /** + * @return the taskType + */ public String getTaskType() { return taskType; } - /** @param taskType the taskType to set */ + /** + * @param taskType the taskType to set + */ public void setTaskType(String taskType) { this.taskType = taskType; } - /** @return input to the task */ + /** + * @return input to the task + */ public String getInput() { return input; } - /** @param input input to the task */ + /** + * @param input input to the task + */ public void setInput(String input) { this.input = input; } - /** @return output of the task */ + /** + * @return output of the task + */ public String getOutput() { return output; } - /** @param output Task output */ + /** + * @param output Task output + */ public void setOutput(String output) { this.output = output; } - /** @return the taskId */ + /** + * @return the taskId + */ public String getTaskId() { return taskId; } - /** @param taskId the taskId to set */ + /** + * @param taskId the taskId to set + */ public void setTaskId(String taskId) { this.taskId = taskId; } - /** @return the external storage path for the task input payload */ + /** + * @return the external storage path for the task input payload + */ public String getExternalInputPayloadStoragePath() { return externalInputPayloadStoragePath; } @@ -302,7 +368,9 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag this.externalInputPayloadStoragePath = externalInputPayloadStoragePath; } - /** @return the external storage path for the task output payload */ + /** + * @return the external storage path for the task output payload + */ public String getExternalOutputPayloadStoragePath() { return externalOutputPayloadStoragePath; } @@ -315,12 +383,16 @@ public void setExternalOutputPayloadStoragePath(String externalOutputPayloadStor this.externalOutputPayloadStoragePath = externalOutputPayloadStoragePath; } - /** @return the priority defined on workflow */ + /** + * @return the priority defined on workflow + */ public int getWorkflowPriority() { return workflowPriority; } - /** @param workflowPriority Priority defined for workflow */ + /** + * @param workflowPriority Priority defined for workflow + */ public void setWorkflowPriority(int workflowPriority) { this.workflowPriority = workflowPriority; } diff --git a/common/src/main/java/com/netflix/conductor/common/run/Workflow.java b/common/src/main/java/com/netflix/conductor/common/run/Workflow.java index 946ab90ed..0afc4d947 100644 --- a/common/src/main/java/com/netflix/conductor/common/run/Workflow.java +++ b/common/src/main/java/com/netflix/conductor/common/run/Workflow.java @@ -12,13 +12,7 @@ */ package com.netflix.conductor.common.run; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import javax.validation.constraints.Max; @@ -33,8 +27,6 @@ import com.netflix.conductor.common.metadata.tasks.Task; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.google.common.base.Preconditions; - @ProtoMessage public class Workflow extends Auditable { @@ -133,62 +125,86 @@ public boolean isSuccessful() { public Workflow() {} - /** @return the status */ + /** + * @return the status + */ public WorkflowStatus getStatus() { return status; } - /** @param status the status to set */ + /** + * @param status the status to set + */ public void setStatus(WorkflowStatus status) { this.status = status; } - /** @return the startTime */ + /** + * @return the startTime + */ public long getStartTime() { return getCreateTime(); } - /** @param startTime the startTime to set */ + /** + * @param startTime the startTime to set + */ public void setStartTime(long startTime) { this.setCreateTime(startTime); } - /** @return the endTime */ + /** + * @return the endTime + */ public long getEndTime() { return endTime; } - /** @param endTime the endTime to set */ + /** + * @param endTime the endTime to set + */ public void setEndTime(long endTime) { this.endTime = endTime; } - /** @return the workflowId */ + /** + * @return the workflowId + */ public String getWorkflowId() { return workflowId; } - /** @param workflowId the workflowId to set */ + /** + * @param workflowId the workflowId to set + */ public void setWorkflowId(String workflowId) { this.workflowId = workflowId; } - /** @return the tasks which are scheduled, in progress or completed. */ + /** + * @return the tasks which are scheduled, in progress or completed. + */ public List getTasks() { return tasks; } - /** @param tasks the tasks to set */ + /** + * @param tasks the tasks to set + */ public void setTasks(List tasks) { this.tasks = tasks; } - /** @return the input */ + /** + * @return the input + */ public Map getInput() { return input; } - /** @param input the input to set */ + /** + * @param input the input to set + */ public void setInput(Map input) { if (input == null) { input = new HashMap<>(); @@ -196,22 +212,30 @@ public void setInput(Map input) { this.input = input; } - /** @return the task to domain map */ + /** + * @return the task to domain map + */ public Map getTaskToDomain() { return taskToDomain; } - /** @param taskToDomain the task to domain map */ + /** + * @param taskToDomain the task to domain map + */ public void setTaskToDomain(Map taskToDomain) { this.taskToDomain = taskToDomain; } - /** @return the output */ + /** + * @return the output + */ public Map getOutput() { return output; } - /** @param output the output to set */ + /** + * @param output the output to set + */ public void setOutput(Map output) { if (output == null) { output = new HashMap<>(); @@ -219,12 +243,16 @@ public void setOutput(Map output) { this.output = output; } - /** @return The correlation id used when starting the workflow */ + /** + * @return The correlation id used when starting the workflow + */ public String getCorrelationId() { return correlationId; } - /** @param correlationId the correlation id */ + /** + * @param correlationId the correlation id + */ public void setCorrelationId(String correlationId) { this.correlationId = correlationId; } @@ -245,32 +273,44 @@ public void setReasonForIncompletion(String reasonForIncompletion) { this.reasonForIncompletion = reasonForIncompletion; } - /** @return the parentWorkflowId */ + /** + * @return the parentWorkflowId + */ public String getParentWorkflowId() { return parentWorkflowId; } - /** @param parentWorkflowId the parentWorkflowId to set */ + /** + * @param parentWorkflowId the parentWorkflowId to set + */ public void setParentWorkflowId(String parentWorkflowId) { this.parentWorkflowId = parentWorkflowId; } - /** @return the parentWorkflowTaskId */ + /** + * @return the parentWorkflowTaskId + */ public String getParentWorkflowTaskId() { return parentWorkflowTaskId; } - /** @param parentWorkflowTaskId the parentWorkflowTaskId to set */ + /** + * @param parentWorkflowTaskId the parentWorkflowTaskId to set + */ public void setParentWorkflowTaskId(String parentWorkflowTaskId) { this.parentWorkflowTaskId = parentWorkflowTaskId; } - /** @return Name of the event that started the workflow */ + /** + * @return Name of the event that started the workflow + */ public String getEvent() { return event; } - /** @param event Name of the event that started the workflow */ + /** + * @param event Name of the event that started the workflow + */ public void setEvent(String event) { this.event = event; } @@ -291,7 +331,9 @@ public void setWorkflowDefinition(WorkflowDef workflowDefinition) { this.workflowDefinition = workflowDefinition; } - /** @return the external storage path of the workflow input payload */ + /** + * @return the external storage path of the workflow input payload + */ public String getExternalInputPayloadStoragePath() { return externalInputPayloadStoragePath; } @@ -304,17 +346,23 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag this.externalInputPayloadStoragePath = externalInputPayloadStoragePath; } - /** @return the external storage path of the workflow output payload */ + /** + * @return the external storage path of the workflow output payload + */ public String getExternalOutputPayloadStoragePath() { return externalOutputPayloadStoragePath; } - /** @return the priority to define on tasks */ + /** + * @return the priority to define on tasks + */ public int getPriority() { return priority; } - /** @param priority priority of tasks (between 0 and 99) */ + /** + * @param priority priority of tasks (between 0 and 99) + */ public void setPriority(int priority) { if (priority < 0 || priority > 99) { throw new IllegalArgumentException("priority MUST be between 0 and 99 (inclusive)"); @@ -328,7 +376,9 @@ public void setPriority(int priority) { * @return the workflow definition name. */ public String getWorkflowName() { - Preconditions.checkNotNull(workflowDefinition, "Workflow definition is null"); + if (workflowDefinition == null) { + throw new NullPointerException("Workflow definition is null"); + } return workflowDefinition.getName(); } @@ -338,7 +388,9 @@ public String getWorkflowName() { * @return the workflow definition version. */ public int getWorkflowVersion() { - Preconditions.checkNotNull(workflowDefinition, "Workflow definition is null"); + if (workflowDefinition == null) { + throw new NullPointerException("Workflow definition is null"); + } return workflowDefinition.getVersion(); } @@ -350,12 +402,16 @@ public void setExternalOutputPayloadStoragePath(String externalOutputPayloadStor this.externalOutputPayloadStoragePath = externalOutputPayloadStoragePath; } - /** @return the global workflow variables */ + /** + * @return the global workflow variables + */ public Map getVariables() { return variables; } - /** @param variables the set of global workflow variables to set */ + /** + * @param variables the set of global workflow variables to set + */ public void setVariables(Map variables) { this.variables = variables; } @@ -369,7 +425,9 @@ public long getLastRetriedTime() { return lastRetriedTime; } - /** @param lastRetriedTime time in milliseconds when the workflow is retried */ + /** + * @param lastRetriedTime time in milliseconds when the workflow is retried + */ public void setLastRetriedTime(long lastRetriedTime) { this.lastRetriedTime = lastRetriedTime; } @@ -403,7 +461,9 @@ public Task getTaskByRefName(String refName) { return found.getLast(); } - /** @return a deep copy of the workflow instance */ + /** + * @return a deep copy of the workflow instance + */ public Workflow copy() { Workflow copy = new Workflow(); copy.setInput(input); diff --git a/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java b/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java index 333cf29df..3c6536bae 100644 --- a/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java +++ b/common/src/main/java/com/netflix/conductor/common/run/WorkflowSummary.java @@ -126,42 +126,58 @@ public WorkflowSummary(Workflow workflow) { } } - /** @return the workflowType */ + /** + * @return the workflowType + */ public String getWorkflowType() { return workflowType; } - /** @return the version */ + /** + * @return the version + */ public int getVersion() { return version; } - /** @return the workflowId */ + /** + * @return the workflowId + */ public String getWorkflowId() { return workflowId; } - /** @return the correlationId */ + /** + * @return the correlationId + */ public String getCorrelationId() { return correlationId; } - /** @return the startTime */ + /** + * @return the startTime + */ public String getStartTime() { return startTime; } - /** @return the endTime */ + /** + * @return the endTime + */ public String getEndTime() { return endTime; } - /** @return the status */ + /** + * @return the status + */ public WorkflowStatus getStatus() { return status; } - /** @return the input */ + /** + * @return the input + */ public String getInput() { return input; } @@ -170,7 +186,9 @@ public long getInputSize() { return input != null ? input.length() : 0; } - /** @return the output */ + /** + * @return the output + */ public String getOutput() { return output; } @@ -179,27 +197,37 @@ public long getOutputSize() { return output != null ? output.length() : 0; } - /** @return the reasonForIncompletion */ + /** + * @return the reasonForIncompletion + */ public String getReasonForIncompletion() { return reasonForIncompletion; } - /** @return the executionTime */ + /** + * @return the executionTime + */ public long getExecutionTime() { return executionTime; } - /** @return the updateTime */ + /** + * @return the updateTime + */ public String getUpdateTime() { return updateTime; } - /** @return The event */ + /** + * @return The event + */ public String getEvent() { return event; } - /** @param event The event */ + /** + * @param event The event + */ public void setEvent(String event) { this.event = event; } @@ -260,7 +288,9 @@ public void setExecutionTime(long executionTime) { this.executionTime = executionTime; } - /** @return the external storage path of the workflow input payload */ + /** + * @return the external storage path of the workflow input payload + */ public String getExternalInputPayloadStoragePath() { return externalInputPayloadStoragePath; } @@ -273,7 +303,9 @@ public void setExternalInputPayloadStoragePath(String externalInputPayloadStorag this.externalInputPayloadStoragePath = externalInputPayloadStoragePath; } - /** @return the external storage path of the workflow output payload */ + /** + * @return the external storage path of the workflow output payload + */ public String getExternalOutputPayloadStoragePath() { return externalOutputPayloadStoragePath; } @@ -286,12 +318,16 @@ public void setExternalOutputPayloadStoragePath(String externalOutputPayloadStor this.externalOutputPayloadStoragePath = externalOutputPayloadStoragePath; } - /** @return the priority to define on tasks */ + /** + * @return the priority to define on tasks + */ public int getPriority() { return priority; } - /** @param priority priority of tasks (between 0 and 99) */ + /** + * @param priority priority of tasks (between 0 and 99) + */ public void setPriority(int priority) { this.priority = priority; } diff --git a/common/src/main/java/com/netflix/conductor/common/utils/RetryUtil.java b/common/src/main/java/com/netflix/conductor/common/utils/RetryUtil.java deleted file mode 100644 index 49672c838..000000000 --- a/common/src/main/java/com/netflix/conductor/common/utils/RetryUtil.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.common.utils; - -import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Supplier; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.rholder.retry.Attempt; -import com.github.rholder.retry.BlockStrategies; -import com.github.rholder.retry.RetryException; -import com.github.rholder.retry.RetryListener; -import com.github.rholder.retry.Retryer; -import com.github.rholder.retry.RetryerBuilder; -import com.github.rholder.retry.StopStrategies; -import com.github.rholder.retry.WaitStrategies; -import com.google.common.base.Predicate; - -import static java.lang.String.format; - -/** - * Utility class that deals with retries in case of transient failures. - * - *

Note: Create a new {@link RetryUtil} for every operation that needs to retried for the - * stated retries. - * - *

Limitations: - * - *

    - *
  • The current implementation does not make a distinction between transient and non transient - * errors. There is no categorization of transient and non transient failure in Conductor. - * Once the exception hierarchy is available in Conductor, this class implementation can be - * changed to short circuit the non transient errors. - *
  • Currently only couple of wait strategies are implemented {@link - * WaitStrategies#exponentialWait()} and {@link WaitStrategies#randomWait(long, TimeUnit)} - * with fixed attributes for each of the strategies. - *
  • The retry limit is not configurable and is hard coded to 3 - *
- * - * @param The type of the object that will be returned by the flaky supplier function - */ -@SuppressWarnings("UnstableApiUsage") -public class RetryUtil { - - private static final Logger LOGGER = LoggerFactory.getLogger(RetryUtil.class); - - private final AtomicInteger internalNumberOfRetries = new AtomicInteger(); - - /** - * A helper method which has the ability to execute a flaky supplier function and retry in case - * of failures. - * - * @param supplierCommand: Any function that is flaky and needs multiple retries. - * @param throwablePredicate: A Guava {@link Predicate} housing the exceptional criteria to - * perform informed filtering before retrying. - * @param resultRetryPredicate: a predicate to be evaluated for a valid condition of the - * expected result - * @param retryCount: Number of times the function is to be retried before failure - * @param shortDescription: A short description of the function that will be used in logging and - * error propagation. The intention of this description is to provide context for - * Operability. - * @param operationName: The name of the function for traceability in logs - * @return an instance of return type of the supplierCommand - * @throws RuntimeException in case of failed attempts to get T, which needs to be returned by - * the supplierCommand. The instance of the returned exception has: - *
    - *
  • A message with shortDescription and operationName with the number of retries made - *
  • And a reference to the original exception generated during the last {@link Attempt} - * of the retry - *
- */ - @SuppressWarnings("Guava") - public T retryOnException( - Supplier supplierCommand, - Predicate throwablePredicate, - Predicate resultRetryPredicate, - int retryCount, - String shortDescription, - String operationName) - throws RuntimeException { - - Retryer retryer = - RetryerBuilder.newBuilder() - .retryIfException( - Optional.ofNullable(throwablePredicate).orElse(exception -> true)) - .retryIfResult( - Optional.ofNullable(resultRetryPredicate).orElse(result -> false)) - .withWaitStrategy( - WaitStrategies.join( - WaitStrategies.exponentialWait(1000, 90, TimeUnit.SECONDS), - WaitStrategies.randomWait( - 100, - TimeUnit.MILLISECONDS, - 500, - TimeUnit.MILLISECONDS))) - .withStopStrategy(StopStrategies.stopAfterAttempt(retryCount)) - .withBlockStrategy(BlockStrategies.threadSleepStrategy()) - .withRetryListener( - new RetryListener() { - @Override - public void onRetry(Attempt attempt) { - LOGGER.debug( - "Attempt # {}, {} millis since first attempt. Operation: {}, description:{}", - attempt.getAttemptNumber(), - attempt.getDelaySinceFirstAttempt(), - operationName, - shortDescription); - internalNumberOfRetries.incrementAndGet(); - } - }) - .build(); - - try { - return retryer.call(supplierCommand::get); - } catch (ExecutionException executionException) { - String errorMessage = - format( - "Operation '%s:%s' failed for the %d time in RetryUtil", - operationName, shortDescription, internalNumberOfRetries.get()); - LOGGER.debug(errorMessage); - throw new RuntimeException(errorMessage, executionException.getCause()); - } catch (RetryException retryException) { - String errorMessage = - format( - "Operation '%s:%s' failed after retrying %d times, retry limit %d", - operationName, shortDescription, internalNumberOfRetries.get(), 3); - LOGGER.error(errorMessage, retryException.getLastFailedAttempt().getExceptionCause()); - throw new RuntimeException( - errorMessage, retryException.getLastFailedAttempt().getExceptionCause()); - } - } -} diff --git a/contribs/build.gradle b/contribs/build.gradle deleted file mode 100644 index 93ea5b8e6..000000000 --- a/contribs/build.gradle +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2021 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -dependencies { - implementation project(':conductor-common') - implementation project(':conductor-core') - compileOnly 'org.springframework.boot:spring-boot-starter' - compileOnly 'org.springframework.boot:spring-boot-starter-web' - - implementation "com.amazonaws:aws-java-sdk-s3:${revAwsSdk}" - implementation "com.amazonaws:aws-java-sdk-sqs:${revAwsSdk}" - - implementation "org.apache.commons:commons-lang3:" - - implementation "net.thisptr:jackson-jq:${revJq}" - // SBMTODO: remove guava dep - implementation "com.google.guava:guava:${revGuava}" - - implementation "javax.ws.rs:jsr311-api:${revJsr311Api}" - - implementation "org.apache.kafka:kafka-clients:${revKafka}" - - implementation "com.rabbitmq:amqp-client:${revAmqpClient}" - - implementation "io.nats:java-nats-streaming:${revNatsStreaming}" - - implementation "io.reactivex:rxjava:${revRxJava}" - - implementation "com.netflix.spectator:spectator-reg-metrics3:${revSpectator}" - implementation "com.netflix.spectator:spectator-reg-micrometer:${revSpectator}" - implementation "io.prometheus:simpleclient:${revPrometheus}" - implementation "io.micrometer:micrometer-registry-prometheus:${revMicrometer}" - - testImplementation 'org.springframework.boot:spring-boot-starter-web' - testImplementation "org.testcontainers:mockserver:${revTestContainer}" - testImplementation "org.mock-server:mockserver-client-java:${revMockServerClient}" - - testImplementation project(':conductor-common').sourceSets.test.output -} diff --git a/contribs/dependencies.lock b/contribs/dependencies.lock deleted file mode 100644 index fb5ab96bd..000000000 --- a/contribs/dependencies.lock +++ /dev/null @@ -1,549 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" - } - }, - "compileClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "locked": "1.11.86" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.14.0" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.6.2" - }, - "io.nats:java-nats-streaming": { - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "locked": "0.9.0" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "net.thisptr:jackson-jq": { - "locked": "0.0.13" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "locked": "2.6.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" - } - }, - "runtimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.14.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.6.2" - }, - "io.nats:java-nats-streaming": { - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "locked": "0.9.0" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "net.thisptr:jackson-jq": { - "locked": "0.0.13" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "locked": "2.6.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - } - }, - "testCompileClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "locked": "1.11.86" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.14.0" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.6.2" - }, - "io.nats:java-nats-streaming": { - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "locked": "0.9.0" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.thisptr:jackson-jq": { - "locked": "0.0.13" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "locked": "2.6.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.11.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.14.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.6.2" - }, - "io.nats:java-nats-streaming": { - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "locked": "0.9.0" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.thisptr:jackson-jq": { - "locked": "0.0.13" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "locked": "2.6.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.11.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWithTTLWorkflowStatusListener.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWithTTLWorkflowStatusListener.java deleted file mode 100644 index 69b50d6a3..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWithTTLWorkflowStatusListener.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener.archive; - -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -import javax.annotation.PreDestroy; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.core.dal.ExecutionDAOFacade; -import com.netflix.conductor.core.listener.WorkflowStatusListener; -import com.netflix.conductor.metrics.Monitors; -import com.netflix.conductor.model.WorkflowModel; - -public class ArchivingWithTTLWorkflowStatusListener implements WorkflowStatusListener { - - private static final Logger LOGGER = - LoggerFactory.getLogger(ArchivingWithTTLWorkflowStatusListener.class); - - private final ExecutionDAOFacade executionDAOFacade; - private final int archiveTTLSeconds; - private final int delayArchiveSeconds; - private final ScheduledThreadPoolExecutor scheduledThreadPoolExecutor; - - public ArchivingWithTTLWorkflowStatusListener( - ExecutionDAOFacade executionDAOFacade, ArchivingWorkflowListenerProperties properties) { - this.executionDAOFacade = executionDAOFacade; - this.archiveTTLSeconds = (int) properties.getTtlDuration().getSeconds(); - this.delayArchiveSeconds = properties.getWorkflowArchivalDelay(); - - this.scheduledThreadPoolExecutor = - new ScheduledThreadPoolExecutor( - properties.getDelayQueueWorkerThreadCount(), - (runnable, executor) -> { - LOGGER.warn( - "Request {} to delay archiving index dropped in executor {}", - runnable, - executor); - Monitors.recordDiscardedArchivalCount(); - }); - this.scheduledThreadPoolExecutor.setRemoveOnCancelPolicy(true); - } - - @PreDestroy - public void shutdownExecutorService() { - try { - LOGGER.info("Gracefully shutdown executor service"); - scheduledThreadPoolExecutor.shutdown(); - if (scheduledThreadPoolExecutor.awaitTermination( - delayArchiveSeconds, TimeUnit.SECONDS)) { - LOGGER.debug("tasks completed, shutting down"); - } else { - LOGGER.warn("Forcing shutdown after waiting for {} seconds", delayArchiveSeconds); - scheduledThreadPoolExecutor.shutdownNow(); - } - } catch (InterruptedException ie) { - LOGGER.warn( - "Shutdown interrupted, invoking shutdownNow on scheduledThreadPoolExecutor for delay queue"); - scheduledThreadPoolExecutor.shutdownNow(); - Thread.currentThread().interrupt(); - } - } - - @Override - public void onWorkflowCompleted(WorkflowModel workflow) { - LOGGER.info("Archiving workflow {} on completion ", workflow.getWorkflowId()); - if (delayArchiveSeconds > 0) { - scheduledThreadPoolExecutor.schedule( - new DelayArchiveWorkflow(workflow, executionDAOFacade), - delayArchiveSeconds, - TimeUnit.SECONDS); - } else { - this.executionDAOFacade.removeWorkflowWithExpiry( - workflow.getWorkflowId(), true, archiveTTLSeconds); - Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus()); - } - } - - @Override - public void onWorkflowTerminated(WorkflowModel workflow) { - LOGGER.info("Archiving workflow {} on termination", workflow.getWorkflowId()); - if (delayArchiveSeconds > 0) { - scheduledThreadPoolExecutor.schedule( - new DelayArchiveWorkflow(workflow, executionDAOFacade), - delayArchiveSeconds, - TimeUnit.SECONDS); - } else { - this.executionDAOFacade.removeWorkflowWithExpiry( - workflow.getWorkflowId(), true, archiveTTLSeconds); - Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus()); - } - } - - private class DelayArchiveWorkflow implements Runnable { - - private final String workflowId; - private final String workflowName; - private final WorkflowModel.Status status; - private final ExecutionDAOFacade executionDAOFacade; - - DelayArchiveWorkflow(WorkflowModel workflow, ExecutionDAOFacade executionDAOFacade) { - this.workflowId = workflow.getWorkflowId(); - this.workflowName = workflow.getWorkflowName(); - this.status = workflow.getStatus(); - this.executionDAOFacade = executionDAOFacade; - } - - @Override - public void run() { - try { - this.executionDAOFacade.removeWorkflowWithExpiry( - workflowId, true, archiveTTLSeconds); - LOGGER.info("Archived workflow {}", workflowId); - Monitors.recordWorkflowArchived(workflowName, status); - Monitors.recordArchivalDelayQueueSize( - scheduledThreadPoolExecutor.getQueue().size()); - } catch (Exception e) { - LOGGER.error("Unable to archive workflow: {}", workflowId, e); - } - } - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerConfiguration.java deleted file mode 100644 index c98c0c173..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerConfiguration.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener.archive; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.core.dal.ExecutionDAOFacade; -import com.netflix.conductor.core.listener.WorkflowStatusListener; - -@Configuration -@EnableConfigurationProperties(ArchivingWorkflowListenerProperties.class) -@ConditionalOnProperty(name = "conductor.workflow-status-listener.type", havingValue = "archive") -public class ArchivingWorkflowListenerConfiguration { - - @Bean - public WorkflowStatusListener getWorkflowStatusListener( - ExecutionDAOFacade executionDAOFacade, ArchivingWorkflowListenerProperties properties) { - if (properties.getTtlDuration().getSeconds() > 0) { - return new ArchivingWithTTLWorkflowStatusListener(executionDAOFacade, properties); - } else { - return new ArchivingWorkflowStatusListener(executionDAOFacade); - } - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerProperties.java deleted file mode 100644 index dfd57d301..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowListenerProperties.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener.archive; - -import java.time.Duration; -import java.time.temporal.ChronoUnit; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.convert.DurationUnit; -import org.springframework.core.env.Environment; - -@ConfigurationProperties("conductor.workflow-status-listener.archival") -public class ArchivingWorkflowListenerProperties { - - private final Environment environment; - - @Autowired - public ArchivingWorkflowListenerProperties(Environment environment) { - this.environment = environment; - } - - /** - * The time to live in seconds for workflow archiving module. Currently, only RedisExecutionDAO - * supports this - */ - @DurationUnit(ChronoUnit.SECONDS) - private Duration ttlDuration = Duration.ZERO; - - /** The number of threads to process the delay queue in workflow archival */ - private int delayQueueWorkerThreadCount = 5; - - public Duration getTtlDuration() { - return ttlDuration; - } - - public void setTtlDuration(Duration ttlDuration) { - this.ttlDuration = ttlDuration; - } - - public int getDelayQueueWorkerThreadCount() { - return delayQueueWorkerThreadCount; - } - - public void setDelayQueueWorkerThreadCount(int delayQueueWorkerThreadCount) { - this.delayQueueWorkerThreadCount = delayQueueWorkerThreadCount; - } - - /** The time to delay the archival of workflow */ - public int getWorkflowArchivalDelay() { - return environment.getProperty( - "conductor.workflow-status-listener.archival.delaySeconds", - Integer.class, - environment.getProperty( - "conductor.app.asyncUpdateDelaySeconds", Integer.class, 60)); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowStatusListener.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowStatusListener.java deleted file mode 100644 index f1fe98cca..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/archive/ArchivingWorkflowStatusListener.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener.archive; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.core.dal.ExecutionDAOFacade; -import com.netflix.conductor.core.listener.WorkflowStatusListener; -import com.netflix.conductor.metrics.Monitors; -import com.netflix.conductor.model.WorkflowModel; - -/** - * Provides default implementation of workflow archiving immediately after workflow is completed or - * terminated. - * - * @author pavel.halabala - */ -public class ArchivingWorkflowStatusListener implements WorkflowStatusListener { - - private static final Logger LOGGER = - LoggerFactory.getLogger(ArchivingWorkflowStatusListener.class); - private final ExecutionDAOFacade executionDAOFacade; - - public ArchivingWorkflowStatusListener(ExecutionDAOFacade executionDAOFacade) { - this.executionDAOFacade = executionDAOFacade; - } - - @Override - public void onWorkflowCompleted(WorkflowModel workflow) { - LOGGER.info("Archiving workflow {} on completion ", workflow.getWorkflowId()); - this.executionDAOFacade.removeWorkflow(workflow.getWorkflowId(), true); - Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus()); - } - - @Override - public void onWorkflowTerminated(WorkflowModel workflow) { - LOGGER.info("Archiving workflow {} on termination", workflow.getWorkflowId()); - this.executionDAOFacade.removeWorkflow(workflow.getWorkflowId(), true); - Monitors.recordWorkflowArchived(workflow.getWorkflowName(), workflow.getStatus()); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisher.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisher.java deleted file mode 100644 index 5f85e876e..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisher.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener.conductorqueue; - -import java.util.Collections; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.common.run.WorkflowSummary; -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.core.listener.WorkflowStatusListener; -import com.netflix.conductor.dao.QueueDAO; -import com.netflix.conductor.model.WorkflowModel; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Publishes a {@link Message} containing a {@link WorkflowSummary} to the undlerying {@link - * QueueDAO} implementation on a workflow completion or termination event. - */ -public class ConductorQueueStatusPublisher implements WorkflowStatusListener { - - private static final Logger LOGGER = - LoggerFactory.getLogger(ConductorQueueStatusPublisher.class); - private final QueueDAO queueDAO; - private final ObjectMapper objectMapper; - - private final String successStatusQueue; - private final String failureStatusQueue; - private final String finalizeStatusQueue; - - public ConductorQueueStatusPublisher( - QueueDAO queueDAO, - ObjectMapper objectMapper, - ConductorQueueStatusPublisherProperties properties) { - this.queueDAO = queueDAO; - this.objectMapper = objectMapper; - this.successStatusQueue = properties.getSuccessQueue(); - this.failureStatusQueue = properties.getFailureQueue(); - this.finalizeStatusQueue = properties.getFinalizeQueue(); - } - - @Override - public void onWorkflowCompleted(WorkflowModel workflow) { - LOGGER.info("Publishing callback of workflow {} on completion ", workflow.getWorkflowId()); - queueDAO.push(successStatusQueue, Collections.singletonList(workflowToMessage(workflow))); - } - - @Override - public void onWorkflowTerminated(WorkflowModel workflow) { - LOGGER.info("Publishing callback of workflow {} on termination", workflow.getWorkflowId()); - queueDAO.push(failureStatusQueue, Collections.singletonList(workflowToMessage(workflow))); - } - - @Override - public void onWorkflowFinalized(WorkflowModel workflow) { - LOGGER.info("Publishing callback of workflow {} on finalization", workflow.getWorkflowId()); - queueDAO.push(finalizeStatusQueue, Collections.singletonList(workflowToMessage(workflow))); - } - - private Message workflowToMessage(WorkflowModel workflowModel) { - String jsonWfSummary; - WorkflowSummary summary = new WorkflowSummary(workflowModel.toWorkflow()); - try { - jsonWfSummary = objectMapper.writeValueAsString(summary); - } catch (JsonProcessingException e) { - LOGGER.error( - "Failed to convert WorkflowSummary: {} to String. Exception: {}", summary, e); - throw new RuntimeException(e); - } - return new Message(workflowModel.getWorkflowId(), jsonWfSummary, null); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherConfiguration.java deleted file mode 100644 index df4e69404..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener.conductorqueue; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.core.listener.WorkflowStatusListener; -import com.netflix.conductor.dao.QueueDAO; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Configuration -@EnableConfigurationProperties(ConductorQueueStatusPublisherProperties.class) -@ConditionalOnProperty( - name = "conductor.workflow-status-listener.type", - havingValue = "queue_publisher") -public class ConductorQueueStatusPublisherConfiguration { - - @Bean - public WorkflowStatusListener getWorkflowStatusListener( - QueueDAO queueDAO, - ConductorQueueStatusPublisherProperties properties, - ObjectMapper objectMapper) { - return new ConductorQueueStatusPublisher(queueDAO, objectMapper, properties); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherProperties.java deleted file mode 100644 index ea9a53f74..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/listener/conductorqueue/ConductorQueueStatusPublisherProperties.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener.conductorqueue; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties("conductor.workflow-status-listener.queue-publisher") -public class ConductorQueueStatusPublisherProperties { - - private String successQueue = "_callbackSuccessQueue"; - - private String failureQueue = "_callbackFailureQueue"; - - private String finalizeQueue = "_callbackFinalizeQueue"; - - public String getSuccessQueue() { - return successQueue; - } - - public void setSuccessQueue(String successQueue) { - this.successQueue = successQueue; - } - - public String getFailureQueue() { - return failureQueue; - } - - public void setFailureQueue(String failureQueue) { - this.failureQueue = failureQueue; - } - - public String getFinalizeQueue() { - return finalizeQueue; - } - - public void setFinalizeQueue(String finalizeQueue) { - this.finalizeQueue = finalizeQueue; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/DatadogMetricsConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/DatadogMetricsConfiguration.java deleted file mode 100644 index 32ca11edc..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/DatadogMetricsConfiguration.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.metrics; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Configuration; - -import com.netflix.spectator.api.Spectator; -import com.netflix.spectator.micrometer.MicrometerRegistry; - -import io.micrometer.core.instrument.MeterRegistry; - -/** - * Metrics Datadog module, sending all metrics to a Datadog server. - * - *

Enable in config: conductor.metrics-datadog.enabled=true - * - *

Make sure your dependencies include both micrometer-registry-datadog & - * spring-boot-starter-actuator - */ -@ConditionalOnProperty(value = "conductor.metrics-datadog.enabled", havingValue = "true") -@Configuration -public class DatadogMetricsConfiguration { - - public DatadogMetricsConfiguration(MeterRegistry meterRegistry) { - final MicrometerRegistry metricsRegistry = new MicrometerRegistry(meterRegistry); - Spectator.globalRegistry().add(metricsRegistry); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfiguration.java deleted file mode 100644 index 33b66faff..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfiguration.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.metrics; - -import java.time.Duration; -import java.util.concurrent.TimeUnit; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.Slf4jReporter; - -/** - * Metrics logging reporter, dumping all metrics into an Slf4J logger. - * - *

Enable in config: conductor.metrics-logger.enabled=true - * - *

additional config: conductor.metrics-logger.reportInterval=15s - */ -@ConditionalOnProperty(value = "conductor.metrics-logger.enabled", havingValue = "true") -@Configuration -public class LoggingMetricsConfiguration { - - private static final Logger LOGGER = LoggerFactory.getLogger(LoggingMetricsConfiguration.class); - - // Dedicated logger for metrics - // This way one can cleanly separate the metrics stream from rest of the logs - private static final Logger METRICS_LOGGER = LoggerFactory.getLogger("ConductorMetrics"); - - @Value("${conductor.metrics-logger.reportInterval:#{T(java.time.Duration).ofSeconds(30)}}") - private Duration reportInterval; - - @Bean - public Slf4jReporter getSl4jReporter(MetricRegistry metricRegistry) { - return new Slf4jReporterProvider(metricRegistry, reportInterval.getSeconds()).getReporter(); - } - - static class Slf4jReporterProvider { - - private final long metricsReportInterval; - private final MetricRegistry metrics3Registry; - private final Logger logger; - - Slf4jReporterProvider(MetricRegistry metricRegistry, long reportInterval) { - this(metricRegistry, METRICS_LOGGER, reportInterval); - } - - Slf4jReporterProvider( - MetricRegistry metricRegistry, Logger outputLogger, long metricsReportInterval) { - this.metrics3Registry = metricRegistry; - this.logger = outputLogger; - this.metricsReportInterval = metricsReportInterval; - } - - public Slf4jReporter getReporter() { - final Slf4jReporter reporter = - Slf4jReporter.forRegistry(metrics3Registry) - .outputTo(logger) - .convertRatesTo(TimeUnit.SECONDS) - .convertDurationsTo(TimeUnit.MILLISECONDS) - .build(); - - reporter.start(metricsReportInterval, TimeUnit.SECONDS); - LOGGER.info( - "Logging metrics reporter started, reporting every {} seconds", - metricsReportInterval); - return reporter; - } - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/MetricsRegistryConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/MetricsRegistryConfiguration.java deleted file mode 100644 index f28e1caa0..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/MetricsRegistryConfiguration.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.metrics; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.spectator.api.Clock; -import com.netflix.spectator.api.Spectator; -import com.netflix.spectator.metrics3.MetricsRegistry; - -import com.codahale.metrics.MetricRegistry; - -@ConditionalOnProperty(value = "conductor.metrics-logger.enabled", havingValue = "true") -@Configuration -public class MetricsRegistryConfiguration { - - public static final MetricRegistry METRIC_REGISTRY = new MetricRegistry(); - public static final MetricsRegistry METRICS_REGISTRY = - new MetricsRegistry(Clock.SYSTEM, METRIC_REGISTRY); - - static { - Spectator.globalRegistry().add(METRICS_REGISTRY); - } - - @Bean - public MetricRegistry metricRegistry() { - return METRIC_REGISTRY; - } - - @Bean - public MetricsRegistry metricsRegistry() { - return METRICS_REGISTRY; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfiguration.java deleted file mode 100644 index f9a6c2ec7..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfiguration.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.metrics; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Configuration; - -import com.netflix.spectator.api.Spectator; -import com.netflix.spectator.micrometer.MicrometerRegistry; - -import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.prometheus.PrometheusRenameFilter; - -/** - * Metrics prometheus module, sending all metrics to a Prometheus server. - * - *

Enable in config: conductor.metrics-prometheus.enabled=true - * - *

Make sure your dependencies include both spectator-reg-micrometer & - * spring-boot-starter-actuator - */ -@ConditionalOnProperty(value = "conductor.metrics-prometheus.enabled", havingValue = "true") -@Configuration -public class PrometheusMetricsConfiguration { - private static final Logger LOGGER = - LoggerFactory.getLogger(PrometheusMetricsConfiguration.class); - - public PrometheusMetricsConfiguration(MeterRegistry meterRegistry) { - LOGGER.info("Prometheus metrics module initialized"); - final MicrometerRegistry metricsRegistry = new MicrometerRegistry(meterRegistry); - meterRegistry.config().meterFilter(new PrometheusRenameFilter()); - Spectator.globalRegistry().add(metricsRegistry); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPConnection.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPConnection.java deleted file mode 100644 index ab97c58e2..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPConnection.java +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp; - -import java.io.IOException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeoutException; -import java.util.stream.Collectors; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.contribs.queue.amqp.config.AMQPRetryPattern; -import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants; -import com.netflix.conductor.contribs.queue.amqp.util.ConnectionType; - -import com.rabbitmq.client.Address; -import com.rabbitmq.client.BlockedListener; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.ShutdownListener; -import com.rabbitmq.client.ShutdownSignalException; - -public class AMQPConnection { - - private static Logger LOGGER = LoggerFactory.getLogger(AMQPConnection.class); - private volatile Connection publisherConnection = null; - private volatile Connection subscriberConnection = null; - private ConnectionFactory factory = null; - private Address[] addresses = null; - private static AMQPConnection amqpConnection = null; - private static final String PUBLISHER = "Publisher"; - private static final String SUBSCRIBER = "Subscriber"; - private static final Map> availableChannelPool = - new ConcurrentHashMap>(); - private static final Map subscriberReservedChannelPool = - new ConcurrentHashMap(); - private static AMQPRetryPattern retrySettings = null; - - private AMQPConnection() {} - - private AMQPConnection(final ConnectionFactory factory, final Address[] address) { - this.factory = factory; - this.addresses = address; - } - - public static synchronized AMQPConnection getInstance( - final ConnectionFactory factory, - final Address[] address, - final AMQPRetryPattern retrySettings) { - if (AMQPConnection.amqpConnection == null) { - AMQPConnection.amqpConnection = new AMQPConnection(factory, address); - } - AMQPConnection.retrySettings = retrySettings; - return AMQPConnection.amqpConnection; - } - - // Exposed for UT - public static void setAMQPConnection(AMQPConnection amqpConnection) { - AMQPConnection.amqpConnection = amqpConnection; - } - - public Address[] getAddresses() { - return addresses; - } - - private Connection createConnection(String connectionPrefix) { - int retryIndex = 1; - while (true) { - try { - Connection connection = - factory.newConnection( - addresses, System.getenv("HOSTNAME") + "-" + connectionPrefix); - if (connection == null || !connection.isOpen()) { - throw new RuntimeException("Failed to open connection"); - } - connection.addShutdownListener( - new ShutdownListener() { - @Override - public void shutdownCompleted(ShutdownSignalException cause) { - LOGGER.error( - "Received a shutdown exception for the connection {}. reason {} cause{}", - connection.getClientProvidedName(), - cause.getMessage(), - cause); - } - }); - connection.addBlockedListener( - new BlockedListener() { - @Override - public void handleUnblocked() throws IOException { - LOGGER.info( - "Connection {} is unblocked", - connection.getClientProvidedName()); - } - - @Override - public void handleBlocked(String reason) throws IOException { - LOGGER.error( - "Connection {} is blocked. reason: {}", - connection.getClientProvidedName(), - reason); - } - }); - return connection; - } catch (final IOException e) { - AMQPRetryPattern retry = retrySettings; - if (retry == null) { - final String error = - "IO error while connecting to " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")); - LOGGER.error(error, e); - throw new RuntimeException(error, e); - } - try { - retry.continueOrPropogate(e, retryIndex); - } catch (Exception ex) { - final String error = - "Retries completed. IO error while connecting to " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")); - LOGGER.error(error, e); - throw new RuntimeException(error, e); - } - retryIndex++; - } catch (final TimeoutException e) { - AMQPRetryPattern retry = retrySettings; - if (retry == null) { - final String error = - "Timeout while connecting to " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")); - LOGGER.error(error, e); - throw new RuntimeException(error, e); - } - try { - retry.continueOrPropogate(e, retryIndex); - } catch (Exception ex) { - final String error = - "Retries completed. Timeout while connecting to " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")); - LOGGER.error(error, e); - throw new RuntimeException(error, e); - } - retryIndex++; - } - } - } - - public Channel getOrCreateChannel(ConnectionType connectionType, String queueOrExchangeName) - throws Exception { - LOGGER.debug( - "Accessing the channel for queueOrExchange {} with type {} ", - queueOrExchangeName, - connectionType); - switch (connectionType) { - case SUBSCRIBER: - String subChnName = connectionType + ";" + queueOrExchangeName; - if (subscriberReservedChannelPool.containsKey(subChnName)) { - Channel locChn = subscriberReservedChannelPool.get(subChnName); - if (locChn != null && locChn.isOpen()) { - return locChn; - } - } - synchronized (this) { - if (subscriberConnection == null || !subscriberConnection.isOpen()) { - subscriberConnection = createConnection(SUBSCRIBER); - } - } - Channel subChn = borrowChannel(connectionType, subscriberConnection); - // Add the subscribed channels to Map to avoid messages being acknowledged on - // different from the subscribed one - subscriberReservedChannelPool.put(subChnName, subChn); - return subChn; - case PUBLISHER: - synchronized (this) { - if (publisherConnection == null || !publisherConnection.isOpen()) { - publisherConnection = createConnection(PUBLISHER); - } - } - return borrowChannel(connectionType, publisherConnection); - default: - return null; - } - } - - private Channel getOrCreateChannel(ConnectionType connType, Connection rmqConnection) { - // Channel creation is required - Channel locChn = null; - int retryIndex = 1; - while (true) { - try { - LOGGER.debug("Creating a channel for " + connType); - locChn = rmqConnection.createChannel(); - if (locChn == null || !locChn.isOpen()) { - throw new RuntimeException("Fail to open " + connType + " channel"); - } - locChn.addShutdownListener( - cause -> { - LOGGER.error( - connType + " Channel has been shutdown: {}", - cause.getMessage(), - cause); - }); - return locChn; - } catch (final IOException e) { - AMQPRetryPattern retry = retrySettings; - if (retry == null) { - throw new RuntimeException( - "Cannot open " - + connType - + " channel on " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")), - e); - } - try { - retry.continueOrPropogate(e, retryIndex); - } catch (Exception ex) { - throw new RuntimeException( - "Retries completed. Cannot open " - + connType - + " channel on " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")), - e); - } - retryIndex++; - } catch (final Exception e) { - AMQPRetryPattern retry = retrySettings; - if (retry == null) { - throw new RuntimeException( - "Cannot open " - + connType - + " channel on " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")), - e); - } - try { - retry.continueOrPropogate(e, retryIndex); - } catch (Exception ex) { - throw new RuntimeException( - "Retries completed. Cannot open " - + connType - + " channel on " - + Arrays.stream(addresses) - .map(address -> address.toString()) - .collect(Collectors.joining(",")), - e); - } - retryIndex++; - } - } - } - - public void close() { - LOGGER.info("Closing all connections and channels"); - try { - closeChannelsInMap(ConnectionType.PUBLISHER); - closeChannelsInMap(ConnectionType.SUBSCRIBER); - closeConnection(publisherConnection); - closeConnection(subscriberConnection); - } finally { - availableChannelPool.clear(); - publisherConnection = null; - subscriberConnection = null; - } - } - - private void closeChannelsInMap(ConnectionType conType) { - Set channels = availableChannelPool.get(conType); - if (channels != null && !channels.isEmpty()) { - Iterator itr = channels.iterator(); - while (itr.hasNext()) { - Channel channel = itr.next(); - closeChannel(channel); - } - channels.clear(); - } - } - - private void closeConnection(Connection connection) { - if (connection == null || !connection.isOpen()) { - LOGGER.warn("Connection is null or closed already. Not closing it again"); - } else { - try { - connection.close(); - } catch (Exception e) { - LOGGER.warn("Fail to close connection: {}", e.getMessage(), e); - } - } - } - - private void closeChannel(Channel channel) { - if (channel == null || !channel.isOpen()) { - LOGGER.warn("Channel is null or closed already. Not closing it again"); - } else { - try { - channel.close(); - } catch (Exception e) { - LOGGER.warn("Fail to close channel: {}", e.getMessage(), e); - } - } - } - - /** - * Gets the channel for specified connectionType. - * - * @param connectionType holds the multiple channels for different connection types for thread - * safe operation. - * @param rmqConnection publisher or subscriber connection instance - * @return channel instance - * @throws Exception - */ - private synchronized Channel borrowChannel( - ConnectionType connectionType, Connection rmqConnection) throws Exception { - if (!availableChannelPool.containsKey(connectionType)) { - Channel channel = getOrCreateChannel(connectionType, rmqConnection); - LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_CREATION_SUCCESS, connectionType)); - return channel; - } - Set channels = availableChannelPool.get(connectionType); - if (channels != null && channels.isEmpty()) { - Channel channel = getOrCreateChannel(connectionType, rmqConnection); - LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_CREATION_SUCCESS, connectionType)); - return channel; - } - Iterator itr = channels.iterator(); - while (itr.hasNext()) { - Channel channel = itr.next(); - if (channel != null && channel.isOpen()) { - itr.remove(); - LOGGER.info( - String.format(AMQPConstants.INFO_CHANNEL_BORROW_SUCCESS, connectionType)); - return channel; - } else { - itr.remove(); - } - } - Channel channel = getOrCreateChannel(connectionType, rmqConnection); - LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_RESET_SUCCESS, connectionType)); - return channel; - } - - /** - * Returns the channel to connection pool for specified connectionType. - * - * @param connectionType - * @param channel - * @throws Exception - */ - public synchronized void returnChannel(ConnectionType connectionType, Channel channel) - throws Exception { - if (channel == null || !channel.isOpen()) { - channel = null; // channel is reset. - } - Set channels = availableChannelPool.get(connectionType); - if (channels == null) { - channels = new HashSet(); - availableChannelPool.put(connectionType, channels); - } - channels.add(channel); - LOGGER.info(String.format(AMQPConstants.INFO_CHANNEL_RETURN_SUCCESS, connectionType)); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueue.java deleted file mode 100644 index 203c4dfbe..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueue.java +++ /dev/null @@ -1,807 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties; -import com.netflix.conductor.contribs.queue.amqp.config.AMQPRetryPattern; -import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants; -import com.netflix.conductor.contribs.queue.amqp.util.AMQPSettings; -import com.netflix.conductor.contribs.queue.amqp.util.ConnectionType; -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.core.events.queue.ObservableQueue; -import com.netflix.conductor.metrics.Monitors; - -import com.google.common.collect.Maps; -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.Address; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.Consumer; -import com.rabbitmq.client.DefaultConsumer; -import com.rabbitmq.client.Envelope; -import com.rabbitmq.client.GetResponse; -import rx.Observable; -import rx.Subscriber; - -/** @author Ritu Parathody */ -public class AMQPObservableQueue implements ObservableQueue { - - private static final Logger LOGGER = LoggerFactory.getLogger(AMQPObservableQueue.class); - - private final AMQPSettings settings; - private final AMQPRetryPattern retrySettings; - private final String QUEUE_TYPE = "x-queue-type"; - private final int batchSize; - private final boolean useExchange; - private int pollTimeInMS; - private AMQPConnection amqpConnection; - - protected LinkedBlockingQueue messages = new LinkedBlockingQueue<>(); - private volatile boolean running; - - public AMQPObservableQueue( - ConnectionFactory factory, - Address[] addresses, - boolean useExchange, - AMQPSettings settings, - AMQPRetryPattern retrySettings, - int batchSize, - int pollTimeInMS) { - if (factory == null) { - throw new IllegalArgumentException("Connection factory is undefined"); - } - if (addresses == null || addresses.length == 0) { - throw new IllegalArgumentException("Addresses are undefined"); - } - if (settings == null) { - throw new IllegalArgumentException("Settings are undefined"); - } - if (batchSize <= 0) { - throw new IllegalArgumentException("Batch size must be greater than 0"); - } - if (pollTimeInMS <= 0) { - throw new IllegalArgumentException("Poll time must be greater than 0 ms"); - } - this.useExchange = useExchange; - this.settings = settings; - this.batchSize = batchSize; - this.amqpConnection = AMQPConnection.getInstance(factory, addresses, retrySettings); - this.retrySettings = retrySettings; - this.setPollTimeInMS(pollTimeInMS); - } - - @Override - public Observable observe() { - Observable.OnSubscribe onSubscribe = null; - // This will enabled the messages to be processed one after the other as per the - // observable next behavior. - if (settings.isSequentialProcessing()) { - LOGGER.info("Subscribing for the message processing on schedule basis"); - receiveMessages(); - onSubscribe = - subscriber -> { - Observable interval = - Observable.interval(pollTimeInMS, TimeUnit.MILLISECONDS); - interval.flatMap( - (Long x) -> { - if (!isRunning()) { - LOGGER.debug( - "Component stopped, skip listening for messages from RabbitMQ"); - return Observable.from(Collections.emptyList()); - } else { - List available = new LinkedList<>(); - messages.drainTo(available); - - if (!available.isEmpty()) { - AtomicInteger count = new AtomicInteger(0); - StringBuilder buffer = new StringBuilder(); - available.forEach( - msg -> { - buffer.append(msg.getId()) - .append("=") - .append(msg.getPayload()); - count.incrementAndGet(); - - if (count.get() - < available.size()) { - buffer.append(","); - } - }); - LOGGER.info( - String.format( - "Batch from %s to conductor is %s", - settings - .getQueueOrExchangeName(), - buffer.toString())); - } - return Observable.from(available); - } - }) - .subscribe(subscriber::onNext, subscriber::onError); - }; - LOGGER.info("Subscribed for the message processing on schedule basis"); - } else { - onSubscribe = - subscriber -> { - LOGGER.info("Subscribing for the event based AMQP message processing"); - receiveMessages(subscriber); - LOGGER.info("Subscribed for the event based AMQP message processing"); - }; - } - return Observable.create(onSubscribe); - } - - @Override - public String getType() { - return useExchange ? AMQPConstants.AMQP_EXCHANGE_TYPE : AMQPConstants.AMQP_QUEUE_TYPE; - } - - @Override - public String getName() { - return settings.getEventName(); - } - - @Override - public String getURI() { - return settings.getQueueOrExchangeName(); - } - - public int getBatchSize() { - return batchSize; - } - - public AMQPSettings getSettings() { - return settings; - } - - public Address[] getAddresses() { - return amqpConnection.getAddresses(); - } - - @Override - public List ack(List messages) { - final List processedDeliveryTags = new ArrayList<>(); - for (final Message message : messages) { - int retryIndex = 1; - while (true) { - try { - LOGGER.info("ACK message with delivery tag {}", message.getReceipt()); - Channel chn = - amqpConnection.getOrCreateChannel( - ConnectionType.SUBSCRIBER, - getSettings().getQueueOrExchangeName()); - chn.basicAck(Long.parseLong(message.getReceipt()), false); - processedDeliveryTags.add(message.getReceipt()); - LOGGER.info("Ack'ed the message with delivery tag {}", message.getReceipt()); - break; - } catch (final Exception e) { - AMQPRetryPattern retry = retrySettings; - if (retry == null) { - LOGGER.error( - "Cannot ACK message with delivery tag {}", message.getReceipt(), e); - } - try { - retry.continueOrPropogate(e, retryIndex); - } catch (Exception ex) { - LOGGER.error( - "Retries completed. Cannot ACK message with delivery tag {}", - message.getReceipt(), - e); - } - retryIndex++; - } - } - } - return processedDeliveryTags; - } - - private static AMQP.BasicProperties buildBasicProperties( - final Message message, final AMQPSettings settings) { - return new AMQP.BasicProperties.Builder() - .messageId( - StringUtils.isEmpty(message.getId()) - ? UUID.randomUUID().toString() - : message.getId()) - .correlationId( - StringUtils.isEmpty(message.getReceipt()) - ? UUID.randomUUID().toString() - : message.getReceipt()) - .contentType(settings.getContentType()) - .contentEncoding(settings.getContentEncoding()) - .deliveryMode(settings.getDeliveryMode()) - .build(); - } - - private void publishMessage(Message message, String exchange, String routingKey) { - Channel chn = null; - int retryIndex = 1; - while (true) { - try { - final String payload = message.getPayload(); - chn = - amqpConnection.getOrCreateChannel( - ConnectionType.PUBLISHER, getSettings().getQueueOrExchangeName()); - chn.basicPublish( - exchange, - routingKey, - buildBasicProperties(message, settings), - payload.getBytes(settings.getContentEncoding())); - LOGGER.info(String.format("Published message to %s: %s", exchange, payload)); - break; - } catch (Exception ex) { - AMQPRetryPattern retry = retrySettings; - if (retry == null) { - LOGGER.error( - "Failed to publish message {} to {}", - message.getPayload(), - exchange, - ex); - throw new RuntimeException(ex); - } - try { - retry.continueOrPropogate(ex, retryIndex); - } catch (Exception e) { - LOGGER.error( - "Retries completed. Failed to publish message {} to {}", - message.getPayload(), - exchange, - ex); - throw new RuntimeException(ex); - } - retryIndex++; - } finally { - if (chn != null) { - try { - amqpConnection.returnChannel(ConnectionType.PUBLISHER, chn); - } catch (Exception e) { - LOGGER.error( - "Failed to return the channel of {}. {}", - ConnectionType.PUBLISHER, - e); - } - } - } - } - } - - @Override - public void publish(List messages) { - try { - final String exchange, routingKey; - if (useExchange) { - // Use exchange + routing key for publishing - getOrCreateExchange( - ConnectionType.PUBLISHER, - settings.getQueueOrExchangeName(), - settings.getExchangeType(), - settings.isDurable(), - settings.autoDelete(), - settings.getArguments()); - exchange = settings.getQueueOrExchangeName(); - routingKey = settings.getRoutingKey(); - } else { - // Use queue for publishing - final AMQP.Queue.DeclareOk declareOk = - getOrCreateQueue( - ConnectionType.PUBLISHER, - settings.getQueueOrExchangeName(), - settings.isDurable(), - settings.isExclusive(), - settings.autoDelete(), - settings.getArguments()); - exchange = StringUtils.EMPTY; // Empty exchange name for queue - routingKey = declareOk.getQueue(); // Routing name is the name of queue - } - messages.forEach(message -> publishMessage(message, exchange, routingKey)); - } catch (final RuntimeException ex) { - throw ex; - } catch (final Exception ex) { - LOGGER.error("Failed to publish messages: {}", ex.getMessage(), ex); - throw new RuntimeException(ex); - } - } - - @Override - public void setUnackTimeout(Message message, long unackTimeout) { - throw new UnsupportedOperationException(); - } - - @Override - public long size() { - Channel chn = null; - try { - chn = - amqpConnection.getOrCreateChannel( - ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName()); - return chn.messageCount(settings.getQueueOrExchangeName()); - } catch (final Exception e) { - throw new RuntimeException(e); - } finally { - if (chn != null) { - try { - amqpConnection.returnChannel(ConnectionType.SUBSCRIBER, chn); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - } - } - - @Override - public void close() { - amqpConnection.close(); - } - - @Override - public void start() { - LOGGER.info( - "Started listening to {}:{}", - getClass().getSimpleName(), - settings.getQueueOrExchangeName()); - running = true; - } - - @Override - public void stop() { - LOGGER.info( - "Stopped listening to {}:{}", - getClass().getSimpleName(), - settings.getQueueOrExchangeName()); - running = false; - } - - @Override - public boolean isRunning() { - return running; - } - - public static class Builder { - - private final Address[] addresses; - private final int batchSize; - private final int pollTimeInMS; - private final ConnectionFactory factory; - private final AMQPEventQueueProperties properties; - - public Builder(AMQPEventQueueProperties properties) { - this.properties = properties; - this.addresses = buildAddressesFromHosts(); - this.factory = buildConnectionFactory(); - // messages polling settings - this.batchSize = properties.getBatchSize(); - this.pollTimeInMS = (int) properties.getPollTimeDuration().toMillis(); - } - - private Address[] buildAddressesFromHosts() { - // Read hosts from config - final String hosts = properties.getHosts(); - if (StringUtils.isEmpty(hosts)) { - throw new IllegalArgumentException("Hosts are undefined"); - } - return Address.parseAddresses(hosts); - } - - private ConnectionFactory buildConnectionFactory() { - final ConnectionFactory factory = new ConnectionFactory(); - // Get rabbitmq username from config - final String username = properties.getUsername(); - if (StringUtils.isEmpty(username)) { - throw new IllegalArgumentException("Username is null or empty"); - } else { - factory.setUsername(username); - } - // Get rabbitmq password from config - final String password = properties.getPassword(); - if (StringUtils.isEmpty(password)) { - throw new IllegalArgumentException("Password is null or empty"); - } else { - factory.setPassword(password); - } - // Get vHost from config - final String virtualHost = properties.getVirtualHost(); - ; - if (StringUtils.isEmpty(virtualHost)) { - throw new IllegalArgumentException("Virtual host is null or empty"); - } else { - factory.setVirtualHost(virtualHost); - } - // Get server port from config - final int port = properties.getPort(); - if (port <= 0) { - throw new IllegalArgumentException("Port must be greater than 0"); - } else { - factory.setPort(port); - } - final boolean useNio = properties.isUseNio(); - if (useNio) { - factory.useNio(); - } - factory.setConnectionTimeout(properties.getConnectionTimeoutInMilliSecs()); - factory.setRequestedHeartbeat(properties.getRequestHeartbeatTimeoutInSecs()); - factory.setNetworkRecoveryInterval(properties.getNetworkRecoveryIntervalInMilliSecs()); - factory.setHandshakeTimeout(properties.getHandshakeTimeoutInMilliSecs()); - factory.setAutomaticRecoveryEnabled(true); - factory.setTopologyRecoveryEnabled(true); - factory.setRequestedChannelMax(properties.getMaxChannelCount()); - return factory; - } - - public AMQPObservableQueue build(final boolean useExchange, final String queueURI) { - final AMQPSettings settings = new AMQPSettings(properties).fromURI(queueURI); - final AMQPRetryPattern retrySettings = - new AMQPRetryPattern( - properties.getLimit(), properties.getDuration(), properties.getType()); - return new AMQPObservableQueue( - factory, - addresses, - useExchange, - settings, - retrySettings, - batchSize, - pollTimeInMS); - } - } - - private AMQP.Exchange.DeclareOk getOrCreateExchange(ConnectionType connectionType) - throws Exception { - return getOrCreateExchange( - connectionType, - settings.getQueueOrExchangeName(), - settings.getExchangeType(), - settings.isDurable(), - settings.autoDelete(), - settings.getArguments()); - } - - private AMQP.Exchange.DeclareOk getOrCreateExchange( - ConnectionType connectionType, - String name, - final String type, - final boolean isDurable, - final boolean autoDelete, - final Map arguments) - throws Exception { - if (StringUtils.isEmpty(name)) { - throw new RuntimeException("Exchange name is undefined"); - } - if (StringUtils.isEmpty(type)) { - throw new RuntimeException("Exchange type is undefined"); - } - Channel chn = null; - try { - LOGGER.debug("Creating exchange {} of type {}", name, type); - chn = - amqpConnection.getOrCreateChannel( - connectionType, getSettings().getQueueOrExchangeName()); - return chn.exchangeDeclare(name, type, isDurable, autoDelete, arguments); - } catch (final Exception e) { - LOGGER.warn("Failed to create exchange {} of type {}", name, type, e); - throw e; - } finally { - if (chn != null) { - try { - amqpConnection.returnChannel(connectionType, chn); - } catch (Exception e) { - LOGGER.error("Failed to return the channel of {}. {}", connectionType, e); - } - } - } - } - - private AMQP.Queue.DeclareOk getOrCreateQueue(ConnectionType connectionType) throws Exception { - return getOrCreateQueue( - connectionType, - settings.getQueueOrExchangeName(), - settings.isDurable(), - settings.isExclusive(), - settings.autoDelete(), - settings.getArguments()); - } - - private AMQP.Queue.DeclareOk getOrCreateQueue( - ConnectionType connectionType, - final String name, - final boolean isDurable, - final boolean isExclusive, - final boolean autoDelete, - final Map arguments) - throws Exception { - if (StringUtils.isEmpty(name)) { - throw new RuntimeException("Queue name is undefined"); - } - arguments.put(QUEUE_TYPE, settings.getQueueType()); - Channel chn = null; - try { - LOGGER.debug("Creating queue {}", name); - chn = - amqpConnection.getOrCreateChannel( - connectionType, getSettings().getQueueOrExchangeName()); - return chn.queueDeclare(name, isDurable, isExclusive, autoDelete, arguments); - } catch (final Exception e) { - LOGGER.warn("Failed to create queue {}", name, e); - throw e; - } finally { - if (chn != null) { - try { - amqpConnection.returnChannel(connectionType, chn); - } catch (Exception e) { - LOGGER.error("Failed to return the channel of {}. {}", connectionType, e); - } - } - } - } - - private static Message asMessage(AMQPSettings settings, GetResponse response) throws Exception { - if (response == null) { - return null; - } - final Message message = new Message(); - message.setId(response.getProps().getMessageId()); - message.setPayload(new String(response.getBody(), settings.getContentEncoding())); - message.setReceipt(String.valueOf(response.getEnvelope().getDeliveryTag())); - return message; - } - - private void receiveMessagesFromQueue(String queueName) throws Exception { - LOGGER.debug("Accessing channel for queue {}", queueName); - - Consumer consumer = - new DefaultConsumer( - amqpConnection.getOrCreateChannel( - ConnectionType.SUBSCRIBER, - getSettings().getQueueOrExchangeName())) { - - @Override - public void handleDelivery( - final String consumerTag, - final Envelope envelope, - final AMQP.BasicProperties properties, - final byte[] body) - throws IOException { - try { - Message message = - asMessage( - settings, - new GetResponse( - envelope, properties, body, Integer.MAX_VALUE)); - if (message != null) { - if (LOGGER.isDebugEnabled()) { - LOGGER.debug( - "Got message with ID {} and receipt {}", - message.getId(), - message.getReceipt()); - } - messages.add(message); - LOGGER.info("receiveMessagesFromQueue- End method {}", messages); - } - } catch (InterruptedException e) { - LOGGER.error( - "Issue in handling the mesages for the subscriber with consumer tag {}. {}", - consumerTag, - e); - Thread.currentThread().interrupt(); - } catch (Exception e) { - LOGGER.error( - "Issue in handling the mesages for the subscriber with consumer tag {}. {}", - consumerTag, - e); - } - } - - public void handleCancel(String consumerTag) throws IOException { - LOGGER.error( - "Recieved a consumer cancel notification for subscriber {}", - consumerTag); - } - }; - - amqpConnection - .getOrCreateChannel( - ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName()) - .basicConsume(queueName, false, consumer); - Monitors.recordEventQueueMessagesProcessed(getType(), queueName, messages.size()); - } - - private void receiveMessagesFromQueue(String queueName, Subscriber subscriber) - throws Exception { - LOGGER.debug("Accessing channel for queue {}", queueName); - - Consumer consumer = - new DefaultConsumer( - amqpConnection.getOrCreateChannel( - ConnectionType.SUBSCRIBER, - getSettings().getQueueOrExchangeName())) { - - @Override - public void handleDelivery( - final String consumerTag, - final Envelope envelope, - final AMQP.BasicProperties properties, - final byte[] body) - throws IOException { - try { - Message message = - asMessage( - settings, - new GetResponse( - envelope, properties, body, Integer.MAX_VALUE)); - if (message == null) { - return; - } - LOGGER.info( - "Got message with ID {} and receipt {}", - message.getId(), - message.getReceipt()); - LOGGER.debug("Message content {}", message); - // Not using thread-pool here as the number of concurrent threads are - // controlled - // by the number of messages delivery using pre-fetch count in RabbitMQ - Thread newThread = - new Thread( - () -> { - LOGGER.info( - "Spawning a new thread for message with ID {}", - message.getId()); - subscriber.onNext(message); - }); - newThread.start(); - } catch (InterruptedException e) { - LOGGER.error( - "Issue in handling the mesages for the subscriber with consumer tag {}. {}", - consumerTag, - e); - Thread.currentThread().interrupt(); - } catch (Exception e) { - LOGGER.error( - "Issue in handling the mesages for the subscriber with consumer tag {}. {}", - consumerTag, - e); - } - } - - public void handleCancel(String consumerTag) throws IOException { - LOGGER.error( - "Recieved a consumer cancel notification for subscriber {}", - consumerTag); - } - }; - amqpConnection - .getOrCreateChannel( - ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName()) - .basicConsume(queueName, false, consumer); - } - - protected void receiveMessages() { - try { - amqpConnection - .getOrCreateChannel( - ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName()) - .basicQos(batchSize); - String queueName; - if (useExchange) { - // Consume messages from an exchange - getOrCreateExchange(ConnectionType.SUBSCRIBER); - /* - * Create queue if not present based on the settings provided in the queue URI - * or configuration properties. Sample URI format: - * amqp-exchange:myExchange?exchangeType=topic&routingKey=myRoutingKey&exclusive - * =false&autoDelete=false&durable=true Default settings if not provided in the - * queue URI or properties: isDurable: true, autoDelete: false, isExclusive: - * false The same settings are currently used during creation of exchange as - * well as queue. TODO: This can be enhanced further to get the settings - * separately for exchange and queue from the URI - */ - final AMQP.Queue.DeclareOk declareOk = - getOrCreateQueue( - ConnectionType.SUBSCRIBER, - String.format("bound_to_%s", settings.getQueueOrExchangeName()), - settings.isDurable(), - settings.isExclusive(), - settings.autoDelete(), - Maps.newHashMap()); - // Bind the declared queue to exchange - queueName = declareOk.getQueue(); - amqpConnection - .getOrCreateChannel( - ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName()) - .queueBind( - queueName, - settings.getQueueOrExchangeName(), - settings.getRoutingKey()); - } else { - // Consume messages from a queue - queueName = getOrCreateQueue(ConnectionType.SUBSCRIBER).getQueue(); - } - // Consume messages - LOGGER.info("Consuming from queue {}", queueName); - receiveMessagesFromQueue(queueName); - } catch (Exception exception) { - LOGGER.error("Exception while getting messages from RabbitMQ", exception); - Monitors.recordObservableQMessageReceivedErrors(getType()); - } - } - - protected void receiveMessages(Subscriber subscriber) { - try { - amqpConnection - .getOrCreateChannel( - ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName()) - .basicQos(batchSize); - String queueName; - if (useExchange) { - // Consume messages from an exchange - getOrCreateExchange(ConnectionType.SUBSCRIBER); - /* - * Create queue if not present based on the settings provided in the queue URI - * or configuration properties. Sample URI format: - * amqp-exchange:myExchange?exchangeType=topic&routingKey=myRoutingKey&exclusive - * =false&autoDelete=false&durable=true Default settings if not provided in the - * queue URI or properties: isDurable: true, autoDelete: false, isExclusive: - * false The same settings are currently used during creation of exchange as - * well as queue. TODO: This can be enhanced further to get the settings - * separately for exchange and queue from the URI - */ - final AMQP.Queue.DeclareOk declareOk = - getOrCreateQueue( - ConnectionType.SUBSCRIBER, - String.format("bound_to_%s", settings.getQueueOrExchangeName()), - settings.isDurable(), - settings.isExclusive(), - settings.autoDelete(), - Maps.newHashMap()); - // Bind the declared queue to exchange - queueName = declareOk.getQueue(); - amqpConnection - .getOrCreateChannel( - ConnectionType.SUBSCRIBER, getSettings().getQueueOrExchangeName()) - .queueBind( - queueName, - settings.getQueueOrExchangeName(), - settings.getRoutingKey()); - } else { - // Consume messages from a queue - queueName = getOrCreateQueue(ConnectionType.SUBSCRIBER).getQueue(); - } - // Consume messages - LOGGER.info("Consuming from queue {}", queueName); - receiveMessagesFromQueue(queueName, subscriber); - } catch (Exception exception) { - LOGGER.error("Exception while getting messages from RabbitMQ", exception); - Monitors.recordObservableQMessageReceivedErrors(getType()); - } - } - - public int getPollTimeInMS() { - return pollTimeInMS; - } - - public void setPollTimeInMS(int pollTimeInMS) { - this.pollTimeInMS = pollTimeInMS; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueConfiguration.java deleted file mode 100644 index 9691b3c6e..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueConfiguration.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.config; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.contribs.queue.amqp.AMQPObservableQueue.Builder; -import com.netflix.conductor.core.config.ConductorProperties; -import com.netflix.conductor.core.events.EventQueueProvider; -import com.netflix.conductor.core.events.queue.ObservableQueue; -import com.netflix.conductor.model.TaskModel.Status; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(AMQPEventQueueProperties.class) -@ConditionalOnProperty(name = "conductor.event-queues.amqp.enabled", havingValue = "true") -public class AMQPEventQueueConfiguration { - - private enum QUEUE_TYPE { - AMQP_QUEUE("amqp_queue"), - AMQP_EXCHANGE("amqp_exchange"); - - private final String type; - - QUEUE_TYPE(String type) { - this.type = type; - } - - public String getType() { - return type; - } - } - - @Bean - public EventQueueProvider amqpEventQueueProvider(AMQPEventQueueProperties properties) { - return new AMQPEventQueueProvider(properties, QUEUE_TYPE.AMQP_QUEUE.getType(), false); - } - - @Bean - public EventQueueProvider amqpExchangeEventQueueProvider(AMQPEventQueueProperties properties) { - return new AMQPEventQueueProvider(properties, QUEUE_TYPE.AMQP_EXCHANGE.getType(), true); - } - - @ConditionalOnProperty(name = "conductor.default-event-queue.type", havingValue = "amqp") - @Bean - public Map getQueues( - ConductorProperties conductorProperties, AMQPEventQueueProperties properties) { - String stack = ""; - if (conductorProperties.getStack() != null && conductorProperties.getStack().length() > 0) { - stack = conductorProperties.getStack() + "_"; - } - final boolean useExchange = properties.isUseExchange(); - - Status[] statuses = new Status[] {Status.COMPLETED, Status.FAILED}; - Map queues = new HashMap<>(); - for (Status status : statuses) { - String queuePrefix = - StringUtils.isBlank(properties.getListenerQueuePrefix()) - ? conductorProperties.getAppId() + "_amqp_notify_" + stack - : properties.getListenerQueuePrefix(); - - String queueName = queuePrefix + status.name(); - - final ObservableQueue queue = new Builder(properties).build(useExchange, queueName); - queues.put(status, queue); - } - - return queues; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProperties.java deleted file mode 100644 index 3ebdd5788..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProperties.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.config; - -import java.time.Duration; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -import com.netflix.conductor.contribs.queue.amqp.util.RetryType; - -import com.rabbitmq.client.AMQP.PROTOCOL; -import com.rabbitmq.client.ConnectionFactory; - -@ConfigurationProperties("conductor.event-queues.amqp") -public class AMQPEventQueueProperties { - - private int batchSize = 1; - - private Duration pollTimeDuration = Duration.ofMillis(100); - - private String hosts = ConnectionFactory.DEFAULT_HOST; - - private String username = ConnectionFactory.DEFAULT_USER; - - private String password = ConnectionFactory.DEFAULT_PASS; - - private String virtualHost = ConnectionFactory.DEFAULT_VHOST; - - private int port = PROTOCOL.PORT; - - private int connectionTimeoutInMilliSecs = 180000; - private int networkRecoveryIntervalInMilliSecs = 5000; - private int requestHeartbeatTimeoutInSecs = 30; - private int handshakeTimeoutInMilliSecs = 180000; - private int maxChannelCount = 5000; - private int limit = 50; - private int duration = 1000; - private RetryType retryType = RetryType.REGULARINTERVALS; - - public int getLimit() { - return limit; - } - - public void setLimit(int limit) { - this.limit = limit; - } - - public int getDuration() { - return duration; - } - - public void setDuration(int duration) { - this.duration = duration; - } - - public RetryType getType() { - return retryType; - } - - public void setType(RetryType type) { - this.retryType = type; - } - - public int getConnectionTimeoutInMilliSecs() { - return connectionTimeoutInMilliSecs; - } - - public void setConnectionTimeoutInMilliSecs(int connectionTimeoutInMilliSecs) { - this.connectionTimeoutInMilliSecs = connectionTimeoutInMilliSecs; - } - - public int getHandshakeTimeoutInMilliSecs() { - return handshakeTimeoutInMilliSecs; - } - - public void setHandshakeTimeoutInMilliSecs(int handshakeTimeoutInMilliSecs) { - this.handshakeTimeoutInMilliSecs = handshakeTimeoutInMilliSecs; - } - - public int getMaxChannelCount() { - return maxChannelCount; - } - - public void setMaxChannelCount(int maxChannelCount) { - this.maxChannelCount = maxChannelCount; - } - - private boolean useNio = false; - - private boolean durable = true; - - private boolean exclusive = false; - - private boolean autoDelete = false; - - private String contentType = "application/json"; - - private String contentEncoding = "UTF-8"; - - private String exchangeType = "topic"; - - private String queueType = "classic"; - - private boolean sequentialMsgProcessing = true; - - private int deliveryMode = 2; - - private boolean useExchange = true; - - private String listenerQueuePrefix = ""; - - public int getBatchSize() { - return batchSize; - } - - public void setBatchSize(int batchSize) { - this.batchSize = batchSize; - } - - public Duration getPollTimeDuration() { - return pollTimeDuration; - } - - public void setPollTimeDuration(Duration pollTimeDuration) { - this.pollTimeDuration = pollTimeDuration; - } - - public String getHosts() { - return hosts; - } - - public void setHosts(String hosts) { - this.hosts = hosts; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getVirtualHost() { - return virtualHost; - } - - public void setVirtualHost(String virtualHost) { - this.virtualHost = virtualHost; - } - - public int getPort() { - return port; - } - - public void setPort(int port) { - this.port = port; - } - - public boolean isUseNio() { - return useNio; - } - - public void setUseNio(boolean useNio) { - this.useNio = useNio; - } - - public boolean isDurable() { - return durable; - } - - public void setDurable(boolean durable) { - this.durable = durable; - } - - public boolean isExclusive() { - return exclusive; - } - - public void setExclusive(boolean exclusive) { - this.exclusive = exclusive; - } - - public boolean isAutoDelete() { - return autoDelete; - } - - public void setAutoDelete(boolean autoDelete) { - this.autoDelete = autoDelete; - } - - public String getContentType() { - return contentType; - } - - public void setContentType(String contentType) { - this.contentType = contentType; - } - - public String getContentEncoding() { - return contentEncoding; - } - - public void setContentEncoding(String contentEncoding) { - this.contentEncoding = contentEncoding; - } - - public String getExchangeType() { - return exchangeType; - } - - public void setExchangeType(String exchangeType) { - this.exchangeType = exchangeType; - } - - public int getDeliveryMode() { - return deliveryMode; - } - - public void setDeliveryMode(int deliveryMode) { - this.deliveryMode = deliveryMode; - } - - public boolean isUseExchange() { - return useExchange; - } - - public void setUseExchange(boolean useExchange) { - this.useExchange = useExchange; - } - - public String getListenerQueuePrefix() { - return listenerQueuePrefix; - } - - public void setListenerQueuePrefix(String listenerQueuePrefix) { - this.listenerQueuePrefix = listenerQueuePrefix; - } - - public String getQueueType() { - return queueType; - } - - /** - * @param queueType Supports two queue types, 'classic' and 'quorum'. Classic will be be - * deprecated in 2022 and its usage discouraged from RabbitMQ community. So not using enum - * type here to hold different values. - */ - public void setQueueType(String queueType) { - this.queueType = queueType; - } - - /** @return the sequentialMsgProcessing */ - public boolean isSequentialMsgProcessing() { - return sequentialMsgProcessing; - } - - /** - * @param sequentialMsgProcessing the sequentialMsgProcessing to set Supports sequential and - * parallel message processing capabilities. In parallel message processing, number of - * threads are controlled by batch size. No thread control or execution framework required - * here as threads are limited and short-lived. - */ - public void setSequentialMsgProcessing(boolean sequentialMsgProcessing) { - this.sequentialMsgProcessing = sequentialMsgProcessing; - } - - public int getNetworkRecoveryIntervalInMilliSecs() { - return networkRecoveryIntervalInMilliSecs; - } - - public void setNetworkRecoveryIntervalInMilliSecs(int networkRecoveryIntervalInMilliSecs) { - this.networkRecoveryIntervalInMilliSecs = networkRecoveryIntervalInMilliSecs; - } - - public int getRequestHeartbeatTimeoutInSecs() { - return requestHeartbeatTimeoutInSecs; - } - - public void setRequestHeartbeatTimeoutInSecs(int requestHeartbeatTimeoutInSecs) { - this.requestHeartbeatTimeoutInSecs = requestHeartbeatTimeoutInSecs; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProvider.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProvider.java deleted file mode 100644 index e4eb880ce..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPEventQueueProvider.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.config; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.lang.NonNull; - -import com.netflix.conductor.contribs.queue.amqp.AMQPObservableQueue; -import com.netflix.conductor.contribs.queue.amqp.AMQPObservableQueue.Builder; -import com.netflix.conductor.core.events.EventQueueProvider; -import com.netflix.conductor.core.events.queue.ObservableQueue; - -/** @author Ritu Parathody */ -public class AMQPEventQueueProvider implements EventQueueProvider { - - private static final Logger LOGGER = LoggerFactory.getLogger(AMQPEventQueueProvider.class); - protected Map queues = new ConcurrentHashMap<>(); - private final boolean useExchange; - private final AMQPEventQueueProperties properties; - private final String queueType; - - public AMQPEventQueueProvider( - AMQPEventQueueProperties properties, String queueType, boolean useExchange) { - this.properties = properties; - this.queueType = queueType; - this.useExchange = useExchange; - } - - @Override - public String getQueueType() { - return queueType; - } - - @Override - @NonNull - public ObservableQueue getQueue(String queueURI) { - if (LOGGER.isInfoEnabled()) { - LOGGER.info("Retrieve queue with URI {}", queueURI); - } - // Build the queue with the inner Builder class of AMQPObservableQueue - return queues.computeIfAbsent(queueURI, q -> new Builder(properties).build(useExchange, q)); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPRetryPattern.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPRetryPattern.java deleted file mode 100644 index 3890a9980..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/config/AMQPRetryPattern.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.config; - -import com.netflix.conductor.contribs.queue.amqp.util.RetryType; - -public class AMQPRetryPattern { - - private int limit = 50; - private int duration = 1000; - private RetryType type = RetryType.REGULARINTERVALS; - - public AMQPRetryPattern() {} - - public AMQPRetryPattern(int limit, int duration, RetryType type) { - this.limit = limit; - this.duration = duration; - this.type = type; - } - - /** - * This gets executed if the retry index is within the allowed limits, otherwise exception will - * be thrown. - * - * @throws Exception - */ - public void continueOrPropogate(Exception ex, int retryIndex) throws Exception { - if (retryIndex > limit) { - throw ex; - } - // Regular Intervals is the default - long waitDuration = duration; - if (type == RetryType.INCREMENTALINTERVALS) { - waitDuration = duration * retryIndex; - } else if (type == RetryType.EXPONENTIALBACKOFF) { - waitDuration = (long) Math.pow(2, retryIndex) * duration; - } - try { - Thread.sleep(waitDuration); - } catch (InterruptedException ignored) { - Thread.currentThread().interrupt(); - } - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConfigurations.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConfigurations.java deleted file mode 100644 index 9caa68383..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConfigurations.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.util; - -/** @author Ritu Parathody */ -public enum AMQPConfigurations { - - // queue exchange settings - PARAM_EXCHANGE_TYPE("exchangeType"), - PARAM_ROUTING_KEY("routingKey"), - PARAM_DELIVERY_MODE("deliveryMode"), - PARAM_DURABLE("durable"), - PARAM_EXCLUSIVE("exclusive"), - PARAM_AUTO_DELETE("autoDelete"), - PARAM_MAX_PRIORITY("maxPriority"); - - String propertyName; - - AMQPConfigurations(String propertyName) { - this.propertyName = propertyName; - } - - @Override - public String toString() { - return propertyName; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConstants.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConstants.java deleted file mode 100644 index f8f06aece..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPConstants.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.util; - -/** @author Ritu Parathody */ -public class AMQPConstants { - - /** this when set will create a rabbitmq queue */ - public static String AMQP_QUEUE_TYPE = "amqp_queue"; - /** this when set will create a rabbitmq exchange */ - public static String AMQP_EXCHANGE_TYPE = "amqp_exchange"; - - public static String PROPERTY_KEY_TEMPLATE = "conductor.event-queues.amqp.%s"; - - /** default content type for the message read from rabbitmq */ - public static String DEFAULT_CONTENT_TYPE = "application/json"; - - /** default encoding for the message read from rabbitmq */ - public static String DEFAULT_CONTENT_ENCODING = "UTF-8"; - - /** default rabbitmq exchange type */ - public static String DEFAULT_EXCHANGE_TYPE = "topic"; - - /** - * default rabbitmq durability When set to true the queues are persisted to the disk. - * - *

{@see RabbitMQ}. - */ - public static boolean DEFAULT_DURABLE = true; - - /** - * default rabbitmq exclusivity When set to true the queues can be only used by one connection. - * - *

{@see RabbitMQ}. - */ - public static boolean DEFAULT_EXCLUSIVE = false; - - /** - * default rabbitmq auto delete When set to true the queues will be deleted when the last - * consumer is cancelled - * - *

{@see RabbitMQ}. - */ - public static boolean DEFAULT_AUTO_DELETE = false; - /** - * default rabbitmq delivery mode This is a property of the message When set to 1 the will be - * non persistent and 2 will be persistent {@see Consumer Prefetch}. - */ - public static int DEFAULT_BATCH_SIZE = 1; - /** - * default rabbitmq delivery mode This is a property of the amqp implementation which sets teh - * polling time to drain the in-memory queue. - */ - public static int DEFAULT_POLL_TIME_MS = 100; - - // info channel messages. - public static final String INFO_CHANNEL_BORROW_SUCCESS = - "Borrowed the channel object from the channel pool for " + "the connection type [%s]"; - public static final String INFO_CHANNEL_RETURN_SUCCESS = - "Returned the borrowed channel object to the pool for " + "the connection type [%s]"; - public static final String INFO_CHANNEL_CREATION_SUCCESS = - "Channels are not available in the pool. Created a" - + " channel for the connection type [%s]"; - public static final String INFO_CHANNEL_RESET_SUCCESS = - "No proper channels available in the pool. Created a " - + "channel for the connection type [%s]"; -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPSettings.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPSettings.java deleted file mode 100644 index 7ca2c5140..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/AMQPSettings.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.util; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties; - -import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_AUTO_DELETE; -import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_DELIVERY_MODE; -import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_DURABLE; -import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_EXCHANGE_TYPE; -import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_EXCLUSIVE; -import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_MAX_PRIORITY; -import static com.netflix.conductor.contribs.queue.amqp.util.AMQPConfigurations.PARAM_ROUTING_KEY; - -/** @author Ritu Parathody */ -public class AMQPSettings { - - private static final Pattern URI_PATTERN = - Pattern.compile( - "^(?:amqp\\_(queue|exchange))?\\:?(?[^\\?]+)\\??(?.*)$", - Pattern.CASE_INSENSITIVE); - - private String queueOrExchangeName; - private String eventName; - private String exchangeType; - private String queueType; - private String routingKey; - private final String contentEncoding; - private final String contentType; - private boolean durable; - private boolean exclusive; - private boolean autoDelete; - private boolean sequentialProcessing; - private int deliveryMode; - - private final Map arguments = new HashMap<>(); - private static final Logger LOGGER = LoggerFactory.getLogger(AMQPSettings.class); - - public AMQPSettings(final AMQPEventQueueProperties properties) { - // Initialize with a default values - durable = properties.isDurable(); - exclusive = properties.isExclusive(); - autoDelete = properties.isAutoDelete(); - contentType = properties.getContentType(); - contentEncoding = properties.getContentEncoding(); - exchangeType = properties.getExchangeType(); - routingKey = StringUtils.EMPTY; - queueType = properties.getQueueType(); - sequentialProcessing = properties.isSequentialMsgProcessing(); - // Set common settings for publishing and consuming - setDeliveryMode(properties.getDeliveryMode()); - } - - public final boolean isDurable() { - return durable; - } - - public final boolean isExclusive() { - return exclusive; - } - - public final boolean autoDelete() { - return autoDelete; - } - - public final Map getArguments() { - return arguments; - } - - public final String getContentEncoding() { - return contentEncoding; - } - - /** - * Use queue for publishing - * - * @param queueName the name of queue - */ - public void setQueue(String queueName) { - if (StringUtils.isEmpty(queueName)) { - throw new IllegalArgumentException("Queue name for publishing is undefined"); - } - this.queueOrExchangeName = queueName; - } - - public String getQueueOrExchangeName() { - return queueOrExchangeName; - } - - public String getExchangeType() { - return exchangeType; - } - - public String getRoutingKey() { - return routingKey; - } - - public int getDeliveryMode() { - return deliveryMode; - } - - public AMQPSettings setDeliveryMode(int deliveryMode) { - if (deliveryMode != 1 && deliveryMode != 2) { - throw new IllegalArgumentException("Delivery mode must be 1 or 2"); - } - this.deliveryMode = deliveryMode; - return this; - } - - public String getContentType() { - return contentType; - } - - /** - * Complete settings from the queue URI. - * - *

Example for queue: - * - *

-     * amqp-queue:myQueue?deliveryMode=1&autoDelete=true&exclusive=true
-     * 
- * - * Example for exchange: - * - *
-     * amqp-exchange:myExchange?exchangeType=topic&routingKey=myRoutingKey&exclusive=true
-     * 
- * - * @param queueURI - * @return - */ - public final AMQPSettings fromURI(final String queueURI) { - final Matcher matcher = URI_PATTERN.matcher(queueURI); - if (!matcher.matches()) { - throw new IllegalArgumentException("Queue URI doesn't matches the expected regexp"); - } - - // Set name of queue or exchange from group "name" - LOGGER.info("Queue URI:{}", queueURI); - queueOrExchangeName = matcher.group("name"); - eventName = queueURI; - if (matcher.groupCount() > 1) { - final String queryParams = matcher.group("params"); - if (StringUtils.isNotEmpty(queryParams)) { - // Handle parameters - Arrays.stream(queryParams.split("\\s*\\&\\s*")) - .forEach( - param -> { - final String[] kv = param.split("\\s*=\\s*"); - if (kv.length == 2) { - if (kv[0].equalsIgnoreCase( - String.valueOf(PARAM_EXCHANGE_TYPE))) { - String value = kv[1]; - if (StringUtils.isEmpty(value)) { - throw new IllegalArgumentException( - "The provided exchange type is empty"); - } - exchangeType = value; - } - if (kv[0].equalsIgnoreCase( - (String.valueOf(PARAM_ROUTING_KEY)))) { - String value = kv[1]; - if (StringUtils.isEmpty(value)) { - throw new IllegalArgumentException( - "The provided routing key is empty"); - } - routingKey = value; - } - if (kv[0].equalsIgnoreCase( - (String.valueOf(PARAM_DURABLE)))) { - durable = Boolean.parseBoolean(kv[1]); - } - if (kv[0].equalsIgnoreCase( - (String.valueOf(PARAM_EXCLUSIVE)))) { - exclusive = Boolean.parseBoolean(kv[1]); - } - if (kv[0].equalsIgnoreCase( - (String.valueOf(PARAM_AUTO_DELETE)))) { - autoDelete = Boolean.parseBoolean(kv[1]); - } - if (kv[0].equalsIgnoreCase( - (String.valueOf(PARAM_DELIVERY_MODE)))) { - setDeliveryMode(Integer.parseInt(kv[1])); - } - if (kv[0].equalsIgnoreCase( - (String.valueOf(PARAM_MAX_PRIORITY)))) { - arguments.put("x-max-priority", Integer.valueOf(kv[1])); - } - } - }); - } - } - return this; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (!(obj instanceof AMQPSettings)) return false; - AMQPSettings other = (AMQPSettings) obj; - return Objects.equals(arguments, other.arguments) - && autoDelete == other.autoDelete - && Objects.equals(contentEncoding, other.contentEncoding) - && Objects.equals(contentType, other.contentType) - && deliveryMode == other.deliveryMode - && durable == other.durable - && Objects.equals(eventName, other.eventName) - && Objects.equals(exchangeType, other.exchangeType) - && exclusive == other.exclusive - && Objects.equals(queueOrExchangeName, other.queueOrExchangeName) - && Objects.equals(queueType, other.queueType) - && Objects.equals(routingKey, other.routingKey) - && sequentialProcessing == other.sequentialProcessing; - } - - @Override - public int hashCode() { - return Objects.hash( - arguments, - autoDelete, - contentEncoding, - contentType, - deliveryMode, - durable, - eventName, - exchangeType, - exclusive, - queueOrExchangeName, - queueType, - routingKey, - sequentialProcessing); - } - - @Override - public String toString() { - return "AMQPSettings [queueOrExchangeName=" - + queueOrExchangeName - + ", eventName=" - + eventName - + ", exchangeType=" - + exchangeType - + ", queueType=" - + queueType - + ", routingKey=" - + routingKey - + ", contentEncoding=" - + contentEncoding - + ", contentType=" - + contentType - + ", durable=" - + durable - + ", exclusive=" - + exclusive - + ", autoDelete=" - + autoDelete - + ", sequentialProcessing=" - + sequentialProcessing - + ", deliveryMode=" - + deliveryMode - + ", arguments=" - + arguments - + "]"; - } - - public String getEventName() { - return eventName; - } - - /** @return the queueType */ - public String getQueueType() { - return queueType; - } - - /** @return the sequentialProcessing */ - public boolean isSequentialProcessing() { - return sequentialProcessing; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java deleted file mode 100644 index d1f06ff99..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/ConnectionType.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.util; - -public enum ConnectionType { - PUBLISHER, - SUBSCRIBER -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java deleted file mode 100644 index a8b072576..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/amqp/util/RetryType.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp.util; - -/** RetryType holds the retry type */ -public enum RetryType { - REGULARINTERVALS, - EXPONENTIALBACKOFF, - INCREMENTALINTERVALS -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSAbstractQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSAbstractQueue.java deleted file mode 100644 index fcb89740c..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSAbstractQueue.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats; - -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.concurrent.Executors; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.core.events.queue.ObservableQueue; - -import io.nats.client.NUID; -import rx.Observable; -import rx.Scheduler; - -/** @author Oleksiy Lysak */ -public abstract class NATSAbstractQueue implements ObservableQueue { - - private static final Logger LOGGER = LoggerFactory.getLogger(NATSAbstractQueue.class); - protected LinkedBlockingQueue messages = new LinkedBlockingQueue<>(); - protected final Lock mu = new ReentrantLock(); - private final String queueType; - private ScheduledExecutorService execs; - private final Scheduler scheduler; - - protected final String queueURI; - protected final String subject; - protected String queue; - - // Indicates that observe was called (Event Handler) and we must to re-initiate subscription - // upon reconnection - private boolean observable; - private boolean isOpened; - private volatile boolean running; - - NATSAbstractQueue(String queueURI, String queueType, Scheduler scheduler) { - this.queueURI = queueURI; - this.queueType = queueType; - this.scheduler = scheduler; - - // If queue specified (e.g. subject:queue) - split to subject & queue - if (queueURI.contains(":")) { - this.subject = queueURI.substring(0, queueURI.indexOf(':')); - queue = queueURI.substring(queueURI.indexOf(':') + 1); - } else { - this.subject = queueURI; - queue = null; - } - LOGGER.info( - String.format( - "Initialized with queueURI=%s, subject=%s, queue=%s", - queueURI, subject, queue)); - } - - void onMessage(String subject, byte[] data) { - String payload = new String(data); - LOGGER.info(String.format("Received message for %s: %s", subject, payload)); - - Message dstMsg = new Message(); - dstMsg.setId(NUID.nextGlobal()); - dstMsg.setPayload(payload); - - messages.add(dstMsg); - } - - @Override - public Observable observe() { - LOGGER.info("Observe invoked for queueURI " + queueURI); - observable = true; - - mu.lock(); - try { - subscribe(); - } finally { - mu.unlock(); - } - - Observable.OnSubscribe onSubscribe = - subscriber -> { - Observable interval = - Observable.interval(100, TimeUnit.MILLISECONDS, scheduler); - interval.flatMap( - (Long x) -> { - if (!isRunning()) { - LOGGER.debug( - "Component stopped, skip listening for messages from NATS Queue"); - return Observable.from(Collections.emptyList()); - } else { - List available = new LinkedList<>(); - messages.drainTo(available); - - if (!available.isEmpty()) { - AtomicInteger count = new AtomicInteger(0); - StringBuilder buffer = new StringBuilder(); - available.forEach( - msg -> { - buffer.append(msg.getId()) - .append("=") - .append(msg.getPayload()); - count.incrementAndGet(); - - if (count.get() < available.size()) { - buffer.append(","); - } - }); - LOGGER.info( - String.format( - "Batch from %s to conductor is %s", - subject, buffer.toString())); - } - - return Observable.from(available); - } - }) - .subscribe(subscriber::onNext, subscriber::onError); - }; - return Observable.create(onSubscribe); - } - - @Override - public String getType() { - return queueType; - } - - @Override - public String getName() { - return queueURI; - } - - @Override - public String getURI() { - return queueURI; - } - - @Override - public List ack(List messages) { - return Collections.emptyList(); - } - - @Override - public void setUnackTimeout(Message message, long unackTimeout) {} - - @Override - public long size() { - return messages.size(); - } - - @Override - public void publish(List messages) { - messages.forEach( - message -> { - try { - String payload = message.getPayload(); - publish(subject, payload.getBytes()); - LOGGER.info(String.format("Published message to %s: %s", subject, payload)); - } catch (Exception ex) { - LOGGER.error( - "Failed to publish message " - + message.getPayload() - + " to " - + subject, - ex); - throw new RuntimeException(ex); - } - }); - } - - @Override - public boolean rePublishIfNoAck() { - return true; - } - - @Override - public void close() { - LOGGER.info("Closing connection for " + queueURI); - mu.lock(); - try { - if (execs != null) { - execs.shutdownNow(); - execs = null; - } - closeSubs(); - closeConn(); - isOpened = false; - } finally { - mu.unlock(); - } - } - - public void open() { - // do nothing if not closed - if (isOpened) { - return; - } - - mu.lock(); - try { - try { - connect(); - - // Re-initiated subscription if existed - if (observable) { - subscribe(); - } - } catch (Exception ignore) { - } - - execs = Executors.newScheduledThreadPool(1); - execs.scheduleAtFixedRate(this::monitor, 0, 500, TimeUnit.MILLISECONDS); - isOpened = true; - } finally { - mu.unlock(); - } - } - - private void monitor() { - if (isConnected()) { - return; - } - - LOGGER.error("Monitor invoked for " + queueURI); - mu.lock(); - try { - closeSubs(); - closeConn(); - - // Connect - connect(); - - // Re-initiated subscription if existed - if (observable) { - subscribe(); - } - } catch (Exception ex) { - LOGGER.error("Monitor failed with " + ex.getMessage() + " for " + queueURI, ex); - } finally { - mu.unlock(); - } - } - - public boolean isClosed() { - return !isOpened; - } - - void ensureConnected() { - if (!isConnected()) { - throw new RuntimeException("No nats connection"); - } - } - - @Override - public void start() { - LOGGER.info("Started listening to {}:{}", getClass().getSimpleName(), queueURI); - running = true; - } - - @Override - public void stop() { - LOGGER.info("Stopped listening to {}:{}", getClass().getSimpleName(), queueURI); - running = false; - } - - @Override - public boolean isRunning() { - return running; - } - - abstract void connect(); - - abstract boolean isConnected(); - - abstract void publish(String subject, byte[] data) throws Exception; - - abstract void subscribe(); - - abstract void closeSubs(); - - abstract void closeConn(); -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSObservableQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSObservableQueue.java deleted file mode 100644 index 27c13a0c9..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSObservableQueue.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.nats.client.Connection; -import io.nats.client.ConnectionFactory; -import io.nats.client.Subscription; -import rx.Scheduler; - -/** @author Oleksiy Lysak */ -public class NATSObservableQueue extends NATSAbstractQueue { - - private static final Logger LOGGER = LoggerFactory.getLogger(NATSObservableQueue.class); - private final ConnectionFactory fact; - private Subscription subs; - private Connection conn; - - public NATSObservableQueue(ConnectionFactory factory, String queueURI, Scheduler scheduler) { - super(queueURI, "nats", scheduler); - this.fact = factory; - open(); - } - - @Override - public boolean isConnected() { - return (conn != null && conn.isConnected()); - } - - @Override - public void connect() { - try { - Connection temp = fact.createConnection(); - LOGGER.info("Successfully connected for " + queueURI); - temp.setReconnectedCallback( - (event) -> LOGGER.warn("onReconnect. Reconnected back for " + queueURI)); - temp.setDisconnectedCallback( - (event -> LOGGER.warn("onDisconnect. Disconnected for " + queueURI))); - conn = temp; - } catch (Exception e) { - LOGGER.error("Unable to establish nats connection for " + queueURI, e); - throw new RuntimeException(e); - } - } - - @Override - public void subscribe() { - // do nothing if already subscribed - if (subs != null) { - return; - } - - try { - ensureConnected(); - // Create subject/queue subscription if the queue has been provided - if (StringUtils.isNotEmpty(queue)) { - LOGGER.info( - "No subscription. Creating a queue subscription. subject={}, queue={}", - subject, - queue); - subs = - conn.subscribe( - subject, queue, msg -> onMessage(msg.getSubject(), msg.getData())); - } else { - LOGGER.info( - "No subscription. Creating a pub/sub subscription. subject={}", subject); - subs = conn.subscribe(subject, msg -> onMessage(msg.getSubject(), msg.getData())); - } - } catch (Exception ex) { - LOGGER.error( - "Subscription failed with " + ex.getMessage() + " for queueURI " + queueURI, - ex); - } - } - - @Override - public void publish(String subject, byte[] data) throws Exception { - ensureConnected(); - conn.publish(subject, data); - } - - @Override - public void closeSubs() { - if (subs != null) { - try { - subs.close(); - } catch (Exception ex) { - LOGGER.error("closeSubs failed with " + ex.getMessage() + " for " + queueURI, ex); - } - subs = null; - } - } - - @Override - public void closeConn() { - if (conn != null) { - try { - conn.close(); - } catch (Exception ex) { - LOGGER.error("closeConn failed with " + ex.getMessage() + " for " + queueURI, ex); - } - conn = null; - } - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSStreamObservableQueue.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSStreamObservableQueue.java deleted file mode 100644 index c3defb72b..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/NATSStreamObservableQueue.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats; - -import java.util.UUID; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import io.nats.streaming.StreamingConnection; -import io.nats.streaming.StreamingConnectionFactory; -import io.nats.streaming.Subscription; -import io.nats.streaming.SubscriptionOptions; -import rx.Scheduler; - -/** @author Oleksiy Lysak */ -public class NATSStreamObservableQueue extends NATSAbstractQueue { - - private static final Logger LOGGER = LoggerFactory.getLogger(NATSStreamObservableQueue.class); - private final StreamingConnectionFactory fact; - private StreamingConnection conn; - private Subscription subs; - private final String durableName; - - public NATSStreamObservableQueue( - String clusterId, - String natsUrl, - String durableName, - String queueURI, - Scheduler scheduler) { - super(queueURI, "nats_stream", scheduler); - this.fact = new StreamingConnectionFactory(); - this.fact.setClusterId(clusterId); - this.fact.setClientId(UUID.randomUUID().toString()); - this.fact.setNatsUrl(natsUrl); - this.durableName = durableName; - open(); - } - - @Override - public boolean isConnected() { - return (conn != null - && conn.getNatsConnection() != null - && conn.getNatsConnection().isConnected()); - } - - @Override - public void connect() { - try { - StreamingConnection temp = fact.createConnection(); - LOGGER.info("Successfully connected for " + queueURI); - temp.getNatsConnection() - .setReconnectedCallback( - (event) -> - LOGGER.warn("onReconnect. Reconnected back for " + queueURI)); - temp.getNatsConnection() - .setDisconnectedCallback( - (event -> LOGGER.warn("onDisconnect. Disconnected for " + queueURI))); - conn = temp; - } catch (Exception e) { - LOGGER.error("Unable to establish nats streaming connection for " + queueURI, e); - throw new RuntimeException(e); - } - } - - @Override - public void subscribe() { - // do nothing if already subscribed - if (subs != null) { - return; - } - - try { - ensureConnected(); - SubscriptionOptions subscriptionOptions = - new SubscriptionOptions.Builder().durableName(durableName).build(); - // Create subject/queue subscription if the queue has been provided - if (StringUtils.isNotEmpty(queue)) { - LOGGER.info( - "No subscription. Creating a queue subscription. subject={}, queue={}", - subject, - queue); - subs = - conn.subscribe( - subject, - queue, - msg -> onMessage(msg.getSubject(), msg.getData()), - subscriptionOptions); - } else { - LOGGER.info( - "No subscription. Creating a pub/sub subscription. subject={}", subject); - subs = - conn.subscribe( - subject, - msg -> onMessage(msg.getSubject(), msg.getData()), - subscriptionOptions); - } - } catch (Exception ex) { - LOGGER.error( - "Subscription failed with " + ex.getMessage() + " for queueURI " + queueURI, - ex); - } - } - - @Override - public void publish(String subject, byte[] data) throws Exception { - ensureConnected(); - conn.publish(subject, data); - } - - @Override - public void closeSubs() { - if (subs != null) { - try { - subs.close(true); - } catch (Exception ex) { - LOGGER.error("closeSubs failed with " + ex.getMessage() + " for " + queueURI, ex); - } - subs = null; - } - } - - @Override - public void closeConn() { - if (conn != null) { - try { - conn.close(); - } catch (Exception ex) { - LOGGER.error("closeConn failed with " + ex.getMessage() + " for " + queueURI, ex); - } - conn = null; - } - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSConfiguration.java deleted file mode 100644 index 19eb05f4f..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats.config; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; - -import com.netflix.conductor.core.events.EventQueueProvider; - -import rx.Scheduler; - -@Configuration -@ConditionalOnProperty(name = "conductor.event-queues.nats.enabled", havingValue = "true") -public class NATSConfiguration { - - @Bean - public EventQueueProvider natsEventQueueProvider(Environment environment, Scheduler scheduler) { - return new NATSEventQueueProvider(environment, scheduler); - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSEventQueueProvider.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSEventQueueProvider.java deleted file mode 100644 index 5c5e7f971..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSEventQueueProvider.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats.config; - -import java.util.Map; -import java.util.Properties; -import java.util.concurrent.ConcurrentHashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.env.Environment; -import org.springframework.lang.NonNull; - -import com.netflix.conductor.contribs.queue.nats.NATSObservableQueue; -import com.netflix.conductor.core.events.EventQueueProvider; -import com.netflix.conductor.core.events.queue.ObservableQueue; - -import io.nats.client.ConnectionFactory; -import rx.Scheduler; - -/** @author Oleksiy Lysak */ -public class NATSEventQueueProvider implements EventQueueProvider { - - private static final Logger LOGGER = LoggerFactory.getLogger(NATSEventQueueProvider.class); - - protected Map queues = new ConcurrentHashMap<>(); - private final ConnectionFactory factory; - private final Scheduler scheduler; - - public NATSEventQueueProvider(Environment environment, Scheduler scheduler) { - this.scheduler = scheduler; - LOGGER.info("NATS Event Queue Provider init"); - - // Init NATS API. Handle "io_nats" and "io.nats" ways to specify parameters - Properties props = new Properties(); - Properties temp = new Properties(); - temp.putAll(System.getenv()); - temp.putAll(System.getProperties()); - temp.forEach( - (k, v) -> { - String key = k.toString(); - String val = v.toString(); - - if (key.startsWith("io_nats")) { - key = key.replace("_", "."); - } - props.put(key, environment.getProperty(key, val)); - }); - - // Init NATS API - factory = new ConnectionFactory(props); - LOGGER.info("NATS Event Queue Provider initialized..."); - } - - @Override - public String getQueueType() { - return "nats"; - } - - @Override - @NonNull - public ObservableQueue getQueue(String queueURI) { - NATSObservableQueue queue = - queues.computeIfAbsent( - queueURI, q -> new NATSObservableQueue(factory, queueURI, scheduler)); - if (queue.isClosed()) { - queue.open(); - } - return queue; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamConfiguration.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamConfiguration.java deleted file mode 100644 index 3721e460f..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamConfiguration.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats.config; - -import java.util.HashMap; -import java.util.Map; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.common.metadata.tasks.Task; -import com.netflix.conductor.contribs.queue.nats.NATSStreamObservableQueue; -import com.netflix.conductor.core.config.ConductorProperties; -import com.netflix.conductor.core.events.EventQueueProvider; -import com.netflix.conductor.core.events.queue.ObservableQueue; - -import rx.Scheduler; - -@Configuration -@EnableConfigurationProperties(NATSStreamProperties.class) -@ConditionalOnProperty(name = "conductor.event-queues.nats-stream.enabled", havingValue = "true") -public class NATSStreamConfiguration { - - @Bean - public EventQueueProvider natsEventQueueProvider( - NATSStreamProperties properties, Scheduler scheduler) { - return new NATSStreamEventQueueProvider(properties, scheduler); - } - - @ConditionalOnProperty(name = "conductor.default-event-queue.type", havingValue = "nats_stream") - @Bean - public Map getQueues( - ConductorProperties conductorProperties, - NATSStreamProperties properties, - Scheduler scheduler) { - String stack = ""; - if (conductorProperties.getStack() != null && conductorProperties.getStack().length() > 0) { - stack = conductorProperties.getStack() + "_"; - } - Task.Status[] statuses = new Task.Status[] {Task.Status.COMPLETED, Task.Status.FAILED}; - Map queues = new HashMap<>(); - for (Task.Status status : statuses) { - String queuePrefix = - StringUtils.isBlank(properties.getListenerQueuePrefix()) - ? conductorProperties.getAppId() + "_nats_stream_notify_" + stack - : properties.getListenerQueuePrefix(); - - String queueName = queuePrefix + status.name(); - - ObservableQueue queue = - new NATSStreamObservableQueue( - properties.getClusterId(), - properties.getUrl(), - properties.getDurableName(), - queueName, - scheduler); - queues.put(status, queue); - } - - return queues; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamEventQueueProvider.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamEventQueueProvider.java deleted file mode 100644 index 133a79959..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamEventQueueProvider.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats.config; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.lang.NonNull; - -import com.netflix.conductor.contribs.queue.nats.NATSStreamObservableQueue; -import com.netflix.conductor.core.events.EventQueueProvider; -import com.netflix.conductor.core.events.queue.ObservableQueue; - -import rx.Scheduler; - -/** @author Oleksiy Lysak */ -public class NATSStreamEventQueueProvider implements EventQueueProvider { - - private static final Logger LOGGER = - LoggerFactory.getLogger(NATSStreamEventQueueProvider.class); - protected final Map queues = new ConcurrentHashMap<>(); - private final String durableName; - private final String clusterId; - private final String natsUrl; - private final Scheduler scheduler; - - public NATSStreamEventQueueProvider(NATSStreamProperties properties, Scheduler scheduler) { - LOGGER.info("NATS Stream Event Queue Provider init"); - this.scheduler = scheduler; - - // Get NATS Streaming options - clusterId = properties.getClusterId(); - durableName = properties.getDurableName(); - natsUrl = properties.getUrl(); - - LOGGER.info( - "NATS Streaming clusterId=" - + clusterId - + ", natsUrl=" - + natsUrl - + ", durableName=" - + durableName); - LOGGER.info("NATS Stream Event Queue Provider initialized..."); - } - - @Override - public String getQueueType() { - return "nats_stream"; - } - - @Override - @NonNull - public ObservableQueue getQueue(String queueURI) { - NATSStreamObservableQueue queue = - queues.computeIfAbsent( - queueURI, - q -> - new NATSStreamObservableQueue( - clusterId, natsUrl, durableName, queueURI, scheduler)); - if (queue.isClosed()) { - queue.open(); - } - return queue; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamProperties.java b/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamProperties.java deleted file mode 100644 index c949963df..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/queue/nats/config/NATSStreamProperties.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.nats.config; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -import io.nats.client.Nats; - -@ConfigurationProperties("conductor.event-queues.nats-stream") -public class NATSStreamProperties { - - /** The cluster id of the STAN session */ - private String clusterId = "test-cluster"; - - /** The durable subscriber name for the subscription */ - private String durableName = null; - - /** The NATS connection url */ - private String url = Nats.DEFAULT_URL; - - /** The prefix to be used for the default listener queues */ - private String listenerQueuePrefix = ""; - - public String getClusterId() { - return clusterId; - } - - public void setClusterId(String clusterId) { - this.clusterId = clusterId; - } - - public String getDurableName() { - return durableName; - } - - public void setDurableName(String durableName) { - this.durableName = durableName; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getListenerQueuePrefix() { - return listenerQueuePrefix; - } - - public void setListenerQueuePrefix(String listenerQueuePrefix) { - this.listenerQueuePrefix = listenerQueuePrefix; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java b/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java deleted file mode 100644 index 4095af478..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.tasks.kafka; - -import java.time.Duration; -import java.util.Objects; -import java.util.Properties; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; - -import org.apache.kafka.clients.producer.KafkaProducer; -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.RemovalListener; - -@SuppressWarnings("rawtypes") -@Component -public class KafkaProducerManager { - - private static final Logger LOGGER = LoggerFactory.getLogger(KafkaProducerManager.class); - - private final String requestTimeoutConfig; - private final Cache kafkaProducerCache; - private final String maxBlockMsConfig; - - private static final String STRING_SERIALIZER = - "org.apache.kafka.common.serialization.StringSerializer"; - private static final RemovalListener LISTENER = - notification -> { - if (notification.getValue() != null) { - notification.getValue().close(); - LOGGER.info("Closed producer for {}", notification.getKey()); - } - }; - - @Autowired - public KafkaProducerManager( - @Value("${conductor.tasks.kafka-publish.requestTimeout:100ms}") Duration requestTimeout, - @Value("${conductor.tasks.kafka-publish.maxBlock:500ms}") Duration maxBlock, - @Value("${conductor.tasks.kafka-publish.cacheSize:10}") int cacheSize, - @Value("${conductor.tasks.kafka-publish.cacheTime:120000ms}") Duration cacheTime) { - this.requestTimeoutConfig = String.valueOf(requestTimeout.toMillis()); - this.maxBlockMsConfig = String.valueOf(maxBlock.toMillis()); - this.kafkaProducerCache = - CacheBuilder.newBuilder() - .removalListener(LISTENER) - .maximumSize(cacheSize) - .expireAfterAccess(cacheTime.toMillis(), TimeUnit.MILLISECONDS) - .build(); - } - - public Producer getProducer(KafkaPublishTask.Input input) { - Properties configProperties = getProducerProperties(input); - return getFromCache(configProperties, () -> new KafkaProducer(configProperties)); - } - - @VisibleForTesting - Producer getFromCache(Properties configProperties, Callable createProducerCallable) { - try { - return kafkaProducerCache.get(configProperties, createProducerCallable); - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } - - @VisibleForTesting - Properties getProducerProperties(KafkaPublishTask.Input input) { - - Properties configProperties = new Properties(); - configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, input.getBootStrapServers()); - - configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, input.getKeySerializer()); - - String requestTimeoutMs = requestTimeoutConfig; - - if (Objects.nonNull(input.getRequestTimeoutMs())) { - requestTimeoutMs = String.valueOf(input.getRequestTimeoutMs()); - } - - String maxBlockMs = maxBlockMsConfig; - - if (Objects.nonNull(input.getMaxBlockMs())) { - maxBlockMs = String.valueOf(input.getMaxBlockMs()); - } - - configProperties.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, requestTimeoutMs); - configProperties.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, maxBlockMs); - configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, STRING_SERIALIZER); - return configProperties; - } -} diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java b/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java deleted file mode 100644 index 8ec91a039..000000000 --- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java +++ /dev/null @@ -1,313 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.tasks.kafka; - -import java.time.Instant; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerRecord; -import org.apache.kafka.clients.producer.RecordMetadata; -import org.apache.kafka.common.header.Header; -import org.apache.kafka.common.header.internals.RecordHeader; -import org.apache.kafka.common.serialization.IntegerSerializer; -import org.apache.kafka.common.serialization.LongSerializer; -import org.apache.kafka.common.serialization.StringSerializer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.netflix.conductor.core.execution.WorkflowExecutor; -import com.netflix.conductor.core.execution.tasks.WorkflowSystemTask; -import com.netflix.conductor.core.utils.Utils; -import com.netflix.conductor.model.TaskModel; -import com.netflix.conductor.model.WorkflowModel; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.annotations.VisibleForTesting; - -import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_KAFKA_PUBLISH; - -@Component(TASK_TYPE_KAFKA_PUBLISH) -public class KafkaPublishTask extends WorkflowSystemTask { - - private static final Logger LOGGER = LoggerFactory.getLogger(KafkaPublishTask.class); - - static final String REQUEST_PARAMETER_NAME = "kafka_request"; - private static final String MISSING_REQUEST = - "Missing Kafka request. Task input MUST have a '" - + REQUEST_PARAMETER_NAME - + "' key with KafkaTask.Input as value. See documentation for KafkaTask for required input parameters"; - private static final String MISSING_BOOT_STRAP_SERVERS = "No boot strap servers specified"; - private static final String MISSING_KAFKA_TOPIC = - "Missing Kafka topic. See documentation for KafkaTask for required input parameters"; - private static final String MISSING_KAFKA_VALUE = - "Missing Kafka value. See documentation for KafkaTask for required input parameters"; - private static final String FAILED_TO_INVOKE = "Failed to invoke kafka task due to: "; - - private final ObjectMapper objectMapper; - private final String requestParameter; - private final KafkaProducerManager producerManager; - - @Autowired - public KafkaPublishTask(KafkaProducerManager clientManager, ObjectMapper objectMapper) { - super(TASK_TYPE_KAFKA_PUBLISH); - this.requestParameter = REQUEST_PARAMETER_NAME; - this.producerManager = clientManager; - this.objectMapper = objectMapper; - LOGGER.info("KafkaTask initialized."); - } - - @Override - public void start(WorkflowModel workflow, TaskModel task, WorkflowExecutor executor) { - - long taskStartMillis = Instant.now().toEpochMilli(); - task.setWorkerId(Utils.getServerId()); - Object request = task.getInputData().get(requestParameter); - - if (Objects.isNull(request)) { - markTaskAsFailed(task, MISSING_REQUEST); - return; - } - - Input input = objectMapper.convertValue(request, Input.class); - - if (StringUtils.isBlank(input.getBootStrapServers())) { - markTaskAsFailed(task, MISSING_BOOT_STRAP_SERVERS); - return; - } - - if (StringUtils.isBlank(input.getTopic())) { - markTaskAsFailed(task, MISSING_KAFKA_TOPIC); - return; - } - - if (Objects.isNull(input.getValue())) { - markTaskAsFailed(task, MISSING_KAFKA_VALUE); - return; - } - - try { - Future recordMetaDataFuture = kafkaPublish(input); - try { - recordMetaDataFuture.get(); - if (isAsyncComplete(task)) { - task.setStatus(TaskModel.Status.IN_PROGRESS); - } else { - task.setStatus(TaskModel.Status.COMPLETED); - } - long timeTakenToCompleteTask = Instant.now().toEpochMilli() - taskStartMillis; - LOGGER.debug("Published message {}, Time taken {}", input, timeTakenToCompleteTask); - - } catch (ExecutionException ec) { - LOGGER.error( - "Failed to invoke kafka task: {} - execution exception ", - task.getTaskId(), - ec); - markTaskAsFailed(task, FAILED_TO_INVOKE + ec.getMessage()); - } - } catch (Exception e) { - LOGGER.error( - "Failed to invoke kafka task:{} for input {} - unknown exception", - task.getTaskId(), - input, - e); - markTaskAsFailed(task, FAILED_TO_INVOKE + e.getMessage()); - } - } - - private void markTaskAsFailed(TaskModel task, String reasonForIncompletion) { - task.setReasonForIncompletion(reasonForIncompletion); - task.setStatus(TaskModel.Status.FAILED); - } - - /** - * @param input Kafka Request - * @return Future for execution. - */ - @SuppressWarnings({"unchecked", "rawtypes"}) - private Future kafkaPublish(Input input) throws Exception { - - long startPublishingEpochMillis = Instant.now().toEpochMilli(); - - Producer producer = producerManager.getProducer(input); - - long timeTakenToCreateProducer = Instant.now().toEpochMilli() - startPublishingEpochMillis; - - LOGGER.debug("Time taken getting producer {}", timeTakenToCreateProducer); - - Object key = getKey(input); - - Iterable

headers = - input.getHeaders().entrySet().stream() - .map( - header -> - new RecordHeader( - header.getKey(), - String.valueOf(header.getValue()).getBytes())) - .collect(Collectors.toList()); - ProducerRecord rec = - new ProducerRecord( - input.getTopic(), - null, - null, - key, - objectMapper.writeValueAsString(input.getValue()), - headers); - - Future send = producer.send(rec); - - long timeTakenToPublish = Instant.now().toEpochMilli() - startPublishingEpochMillis; - - LOGGER.debug("Time taken publishing {}", timeTakenToPublish); - - return send; - } - - @VisibleForTesting - Object getKey(Input input) { - String keySerializer = input.getKeySerializer(); - - if (LongSerializer.class.getCanonicalName().equals(keySerializer)) { - return Long.parseLong(String.valueOf(input.getKey())); - } else if (IntegerSerializer.class.getCanonicalName().equals(keySerializer)) { - return Integer.parseInt(String.valueOf(input.getKey())); - } else { - return String.valueOf(input.getKey()); - } - } - - @Override - public boolean execute(WorkflowModel workflow, TaskModel task, WorkflowExecutor executor) { - return false; - } - - @Override - public void cancel(WorkflowModel workflow, TaskModel task, WorkflowExecutor executor) { - task.setStatus(TaskModel.Status.CANCELED); - } - - @Override - public boolean isAsync() { - return true; - } - - public static class Input { - - public static final String STRING_SERIALIZER = StringSerializer.class.getCanonicalName(); - private Map headers = new HashMap<>(); - private String bootStrapServers; - private Object key; - private Object value; - private Integer requestTimeoutMs; - private Integer maxBlockMs; - private String topic; - private String keySerializer = STRING_SERIALIZER; - - public Map getHeaders() { - return headers; - } - - public void setHeaders(Map headers) { - this.headers = headers; - } - - public String getBootStrapServers() { - return bootStrapServers; - } - - public void setBootStrapServers(String bootStrapServers) { - this.bootStrapServers = bootStrapServers; - } - - public Object getKey() { - return key; - } - - public void setKey(Object key) { - this.key = key; - } - - public Object getValue() { - return value; - } - - public void setValue(Object value) { - this.value = value; - } - - public Integer getRequestTimeoutMs() { - return requestTimeoutMs; - } - - public void setRequestTimeoutMs(Integer requestTimeoutMs) { - this.requestTimeoutMs = requestTimeoutMs; - } - - public String getTopic() { - return topic; - } - - public void setTopic(String topic) { - this.topic = topic; - } - - public String getKeySerializer() { - return keySerializer; - } - - public void setKeySerializer(String keySerializer) { - this.keySerializer = keySerializer; - } - - public Integer getMaxBlockMs() { - return maxBlockMs; - } - - public void setMaxBlockMs(Integer maxBlockMs) { - this.maxBlockMs = maxBlockMs; - } - - @Override - public String toString() { - return "Input{" - + "headers=" - + headers - + ", bootStrapServers='" - + bootStrapServers - + '\'' - + ", key=" - + key - + ", value=" - + value - + ", requestTimeoutMs=" - + requestTimeoutMs - + ", maxBlockMs=" - + maxBlockMs - + ", topic='" - + topic - + '\'' - + ", keySerializer='" - + keySerializer - + '\'' - + '}'; - } - } -} diff --git a/contribs/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/contribs/src/main/resources/META-INF/additional-spring-configuration-metadata.json deleted file mode 100644 index 3156ecbef..000000000 --- a/contribs/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ /dev/null @@ -1,136 +0,0 @@ -{ - "properties": [ - { - "name": "conductor.metrics-logger.reportPeriodSeconds", - "type": "java.lang.Long", - "description": "The interval (in seconds) at which the metrics will be reported into the log stream by the metrics-logger." - }, - { - "name": "conductor.tasks.http.readTimeout", - "type": "java.lang.Integer", - "description": "The read timeout of the underlying HttpClient used by the HTTP task." - }, - { - "name": "conductor.tasks.http.connectTimeout", - "type": "java.lang.Integer", - "description": "The connection timeout of the underlying HttpClient used by the HTTP task." - }, - { - "name": "conductor.tasks.kafka-publish.requestTimeoutMs", - "type": "java.lang.String", - "description": "The request.timeout.ms value that the kafka producer is configured with in the KAFKA_PUBLISH task." - }, - { - "name": "conductor.tasks.kafka-publish.maxBlockMs", - "type": "java.lang.String", - "description": "The max.block.ms value that the kafka producer is configured with in the KAFKA_PUBLISH task." - }, - { - "name": "conductor.tasks.kafka-publish.cacheSize", - "type": "java.lang.Integer", - "description": "The maximum number of entries permitted in the in-memory cache used by the KAFKA_PUBLISH task." - }, - { - "name": "conductor.tasks.kafka-publish.cacheTimeMs", - "type": "java.lang.Integer", - "description": "The duration after which a cached entry will be removed from the in-memory cache used by the KAFKA_PUBLISH task." - }, - { - "name": "conductor.workflow-status-listener.type", - "type": "java.lang.String", - "description": "The implementation of the workflow status listener to be used." - }, - { - "name": "conductor.workflow-execution-lock.type", - "type": "java.lang.String", - "description": "The implementation of the workflow execution lock to be used.", - "defaultValue": "noop_lock" - }, - { - "name": "conductor.event-queues.sqs.enabled", - "type": "java.lang.Boolean", - "description": "Enable the use of AWS SQS implementation to provide queues for consuming events.", - "sourceType": "com.netflix.conductor.contribs.queue.sqs.config.SQSEventQueueConfiguration" - }, - { - "name": "conductor.event-queues.amqp.enabled", - "type": "java.lang.Boolean", - "description": "Enable the use of RabbitMQ implementation to provide queues for consuming events.", - "sourceType": "com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueConfiguration" - }, - { - "name": "conductor.event-queues.nats.enabled", - "type": "java.lang.Boolean", - "description": "Enable the use of NATS implementation to provide queues for consuming events.", - "sourceType": "com.netflix.conductor.contribs.queue.nats.config.NATSConfiguration" - }, - { - "name": "conductor.event-queues.nats-stream.enabled", - "type": "java.lang.Boolean", - "description": "Enable the use of NATS Streaming implementation to provide queues for consuming events.", - "sourceType": "com.netflix.conductor.contribs.queue.nats.config.NATSStreamConfiguration" - }, - { - "name": "conductor.default-event-queue.type", - "type": "java.lang.String", - "description": "The default event queue type to listen on for the WAIT task." - } - ], - "hints": [ - { - "name": "conductor.workflow-status-listener.type", - "values": [ - { - "value": "stub", - "description": "Use the no-op implementation of the workflow status listener." - }, - { - "value": "archive", - "description": "Use then archive implementation which immediately archives the workflow upon termination or completion as the workflow status listener." - }, - { - "value": "queue_publisher", - "description": "Use the publisher implementation which publishes a message to the underlying queue implementation upon termination or completion as the workflow status listener." - } - ] - }, - { - "name": "conductor.default-event-queue.type", - "values": [ - { - "value": "sqs", - "description": "Use AWS SQS as the event queue to listen on for the WAIT task." - }, - { - "value": "amqp", - "description": "Use RabbitMQ as the event queue to listen on for the WAIT task." - }, - { - "value": "nats_stream", - "description": "Use NATS Stream as the event queue to listen on for the WAIT task." - } - ] - }, - { - "name": "conductor.workflow-execution-lock.type", - "values": [ - { - "value": "noop_lock", - "description": "Use the no-op implementation as the lock provider." - }, - { - "value": "local_only", - "description": "Use the local in-memory cache based implementation as the lock provider." - }, - { - "value": "redis", - "description": "Use the redis-lock implementation as the lock provider." - }, - { - "value": "zookeeper", - "description": "Use the zookeeper-lock implementation as the lock provider." - } - ] - } - ] -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/listener/ArchivingWorkflowStatusListenerTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/listener/ArchivingWorkflowStatusListenerTest.java deleted file mode 100644 index 9a89e86de..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/listener/ArchivingWorkflowStatusListenerTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.listener; - -import java.util.UUID; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; - -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.contribs.listener.archive.ArchivingWorkflowStatusListener; -import com.netflix.conductor.core.dal.ExecutionDAOFacade; -import com.netflix.conductor.model.WorkflowModel; - -import static org.mockito.Mockito.*; - -/** @author pavel.halabala */ -public class ArchivingWorkflowStatusListenerTest { - - WorkflowModel workflow; - ExecutionDAOFacade executionDAOFacade; - ArchivingWorkflowStatusListener listener; - - @Before - public void before() { - workflow = new WorkflowModel(); - WorkflowDef def = new WorkflowDef(); - def.setName("name1"); - def.setVersion(1); - workflow.setWorkflowDefinition(def); - workflow.setWorkflowId(UUID.randomUUID().toString()); - - executionDAOFacade = Mockito.mock(ExecutionDAOFacade.class); - listener = new ArchivingWorkflowStatusListener(executionDAOFacade); - } - - @Test - public void testArchiveOnWorkflowCompleted() { - listener.onWorkflowCompleted(workflow); - verify(executionDAOFacade, times(1)).removeWorkflow(workflow.getWorkflowId(), true); - verifyNoMoreInteractions(executionDAOFacade); - } - - @Test - public void testArchiveOnWorkflowTerminated() { - listener.onWorkflowTerminated(workflow); - verify(executionDAOFacade, times(1)).removeWorkflow(workflow.getWorkflowId(), true); - verifyNoMoreInteractions(executionDAOFacade); - } -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfigurationTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfigurationTest.java deleted file mode 100644 index 3fdd736f3..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/LoggingMetricsConfigurationTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.metrics; - -import java.util.concurrent.TimeUnit; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Import; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.contribs.metrics.LoggingMetricsConfiguration.Slf4jReporterProvider; - -import com.codahale.metrics.MetricRegistry; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.timeout; -import static org.mockito.Mockito.verify; - -@RunWith(SpringRunner.class) -@Import({LoggingMetricsConfiguration.class, MetricsRegistryConfiguration.class}) -@TestPropertySource(properties = {"conductor.metrics-logger.enabled=true"}) -public class LoggingMetricsConfigurationTest { - - @Autowired MetricRegistry metricRegistry; - - @Test - public void testCollector() { - Logger logger = spy(Logger.class); - doReturn(true).when(logger).isInfoEnabled(any()); - Slf4jReporterProvider reporterProvider = - new Slf4jReporterProvider(metricRegistry, logger, 1); - metricRegistry.counter("test").inc(); - - reporterProvider.getReporter(); - verify(logger, timeout(TimeUnit.SECONDS.toMillis(10))).isInfoEnabled(null); - } -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfigurationTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfigurationTest.java deleted file mode 100644 index c87b75dd0..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/metrics/PrometheusMetricsConfigurationTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2021 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.metrics; - -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.TestConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Primary; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.spectator.api.Registry; -import com.netflix.spectator.api.Spectator; -import com.netflix.spectator.micrometer.MicrometerRegistry; - -import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.prometheus.PrometheusConfig; -import io.micrometer.prometheus.PrometheusMeterRegistry; - -import static org.junit.Assert.assertTrue; - -@RunWith(SpringRunner.class) -@Import({PrometheusMetricsConfiguration.class}) -@TestPropertySource(properties = {"conductor.metrics-prometheus.enabled=true"}) -public class PrometheusMetricsConfigurationTest { - - @SuppressWarnings("unchecked") - @Test - public void testCollector() throws IllegalAccessException { - final Optional registries = - Arrays.stream(Spectator.globalRegistry().getClass().getDeclaredFields()) - .filter(f -> f.getName().equals("registries")) - .findFirst(); - assertTrue(registries.isPresent()); - registries.get().setAccessible(true); - - List meters = (List) registries.get().get(Spectator.globalRegistry()); - assertTrue(meters.size() > 0); - Optional microMeterReg = - meters.stream() - .filter(r -> r.getClass().equals(MicrometerRegistry.class)) - .findFirst(); - assertTrue(microMeterReg.isPresent()); - } - - @TestConfiguration - public static class TestConfig { - - /** - * This bean will be injected in PrometheusMetricsConfiguration, which wraps it with a - * MicrometerRegistry, and appends it to the global registry. - * - * @return a Prometheus registry instance - */ - @Bean - @Primary - public MeterRegistry meterRegistry() { - return new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); - } - } -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPEventQueueProviderTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPEventQueueProviderTest.java deleted file mode 100644 index 38e949121..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPEventQueueProviderTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp; - -import java.time.Duration; - -import org.junit.Before; -import org.junit.Test; - -import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties; -import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProvider; -import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants; -import com.netflix.conductor.core.events.queue.ObservableQueue; - -import com.rabbitmq.client.AMQP.PROTOCOL; -import com.rabbitmq.client.ConnectionFactory; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class AMQPEventQueueProviderTest { - - private AMQPEventQueueProperties properties; - - @Before - public void setUp() { - properties = mock(AMQPEventQueueProperties.class); - when(properties.getBatchSize()).thenReturn(1); - when(properties.getPollTimeDuration()).thenReturn(Duration.ofMillis(100)); - when(properties.getHosts()).thenReturn(ConnectionFactory.DEFAULT_HOST); - when(properties.getUsername()).thenReturn(ConnectionFactory.DEFAULT_USER); - when(properties.getPassword()).thenReturn(ConnectionFactory.DEFAULT_PASS); - when(properties.getVirtualHost()).thenReturn(ConnectionFactory.DEFAULT_VHOST); - when(properties.getPort()).thenReturn(PROTOCOL.PORT); - when(properties.getConnectionTimeoutInMilliSecs()).thenReturn(60000); - when(properties.isUseNio()).thenReturn(false); - when(properties.isDurable()).thenReturn(true); - when(properties.isExclusive()).thenReturn(false); - when(properties.isAutoDelete()).thenReturn(false); - when(properties.getContentType()).thenReturn("application/json"); - when(properties.getContentEncoding()).thenReturn("UTF-8"); - when(properties.getExchangeType()).thenReturn("topic"); - when(properties.getDeliveryMode()).thenReturn(2); - when(properties.isUseExchange()).thenReturn(true); - } - - @Test - public void testAMQPEventQueueProvider_defaultconfig_exchange() { - String exchangestring = - "amqp_exchange:myExchangeName?exchangeType=topic&routingKey=test&deliveryMode=2"; - AMQPEventQueueProvider eventqProvider = - new AMQPEventQueueProvider(properties, "amqp_exchange", true); - ObservableQueue queue = eventqProvider.getQueue(exchangestring); - assertNotNull(queue); - assertEquals(exchangestring, queue.getName()); - assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, queue.getType()); - } - - @Test - public void testAMQPEventQueueProvider_defaultconfig_queue() { - String exchangestring = - "amqp_queue:myQueueName?deliveryMode=2&durable=false&autoDelete=true&exclusive=true"; - AMQPEventQueueProvider eventqProvider = - new AMQPEventQueueProvider(properties, "amqp_queue", false); - ObservableQueue queue = eventqProvider.getQueue(exchangestring); - assertNotNull(queue); - assertEquals(exchangestring, queue.getName()); - assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, queue.getType()); - } -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueueTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueueTest.java deleted file mode 100644 index 86b3ac596..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPObservableQueueTest.java +++ /dev/null @@ -1,895 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp; - -import java.io.IOException; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.lang3.StringUtils; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.mockito.internal.stubbing.answers.DoesNothing; -import org.mockito.stubbing.OngoingStubbing; - -import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties; -import com.netflix.conductor.contribs.queue.amqp.config.AMQPRetryPattern; -import com.netflix.conductor.contribs.queue.amqp.util.AMQPConstants; -import com.netflix.conductor.contribs.queue.amqp.util.AMQPSettings; -import com.netflix.conductor.contribs.queue.amqp.util.RetryType; -import com.netflix.conductor.core.events.queue.Message; - -import com.rabbitmq.client.AMQP; -import com.rabbitmq.client.AMQP.PROTOCOL; -import com.rabbitmq.client.AMQP.Queue.DeclareOk; -import com.rabbitmq.client.Address; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.Consumer; -import com.rabbitmq.client.Envelope; -import com.rabbitmq.client.GetResponse; -import com.rabbitmq.client.impl.AMQImpl; -import rx.Observable; -import rx.observers.Subscribers; -import rx.observers.TestSubscriber; - -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyBoolean; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyMap; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.atLeast; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@SuppressWarnings({"rawtypes", "unchecked"}) -public class AMQPObservableQueueTest { - - final int batchSize = 10; - final int pollTimeMs = 500; - - Address[] addresses; - AMQPEventQueueProperties properties; - - @Before - public void setUp() { - properties = mock(AMQPEventQueueProperties.class); - when(properties.getBatchSize()).thenReturn(1); - when(properties.getPollTimeDuration()).thenReturn(Duration.ofMillis(100)); - when(properties.getHosts()).thenReturn(ConnectionFactory.DEFAULT_HOST); - when(properties.getUsername()).thenReturn(ConnectionFactory.DEFAULT_USER); - when(properties.getPassword()).thenReturn(ConnectionFactory.DEFAULT_PASS); - when(properties.getVirtualHost()).thenReturn(ConnectionFactory.DEFAULT_VHOST); - when(properties.getPort()).thenReturn(PROTOCOL.PORT); - when(properties.getConnectionTimeoutInMilliSecs()).thenReturn(60000); - when(properties.isUseNio()).thenReturn(false); - when(properties.isDurable()).thenReturn(true); - when(properties.isExclusive()).thenReturn(false); - when(properties.isAutoDelete()).thenReturn(false); - when(properties.getContentType()).thenReturn("application/json"); - when(properties.getContentEncoding()).thenReturn("UTF-8"); - when(properties.getExchangeType()).thenReturn("topic"); - when(properties.getDeliveryMode()).thenReturn(2); - when(properties.isUseExchange()).thenReturn(true); - addresses = new Address[] {new Address("localhost", PROTOCOL.PORT)}; - AMQPConnection.setAMQPConnection(null); - } - - List buildQueue(final Random random, final int bound) { - final LinkedList queue = new LinkedList(); - for (int i = 0; i < bound; i++) { - AMQP.BasicProperties props = mock(AMQP.BasicProperties.class); - when(props.getMessageId()).thenReturn(UUID.randomUUID().toString()); - Envelope envelope = mock(Envelope.class); - when(envelope.getDeliveryTag()).thenReturn(random.nextLong()); - GetResponse response = mock(GetResponse.class); - when(response.getProps()).thenReturn(props); - when(response.getEnvelope()).thenReturn(envelope); - when(response.getBody()).thenReturn("{}".getBytes()); - when(response.getMessageCount()).thenReturn(bound - i); - queue.add(response); - } - return queue; - } - - Channel mockBaseChannel() throws IOException, TimeoutException { - Channel channel = mock(Channel.class); - when(channel.isOpen()).thenReturn(Boolean.TRUE); - /* - * doAnswer(invocation -> { when(channel.isOpen()).thenReturn(Boolean.FALSE); - * return DoesNothing.doesNothing(); }).when(channel).close(); - */ - return channel; - } - - Channel mockChannelForQueue( - Channel channel, - boolean isWorking, - boolean exists, - String name, - List queue) - throws IOException { - // queueDeclarePassive - final AMQImpl.Queue.DeclareOk queueDeclareOK = - new AMQImpl.Queue.DeclareOk(name, queue.size(), 1); - if (exists) { - when(channel.queueDeclarePassive(eq(name))).thenReturn(queueDeclareOK); - } else { - when(channel.queueDeclarePassive(eq(name))) - .thenThrow(new IOException("Queue " + name + " exists")); - } - // queueDeclare - OngoingStubbing declareOkOngoingStubbing = - when(channel.queueDeclare( - eq(name), anyBoolean(), anyBoolean(), anyBoolean(), anyMap())) - .thenReturn(queueDeclareOK); - if (!isWorking) { - declareOkOngoingStubbing.thenThrow( - new IOException("Cannot declare queue " + name), - new RuntimeException("Not working")); - } - // messageCount - when(channel.messageCount(eq(name))).thenReturn((long) queue.size()); - // basicGet - OngoingStubbing getResponseOngoingStubbing = - Mockito.when(channel.basicConsume(eq(name), anyBoolean(), any(Consumer.class))) - .thenReturn(name); - if (!isWorking) { - getResponseOngoingStubbing.thenThrow( - new IOException("Not working"), new RuntimeException("Not working")); - } - // basicPublish - if (isWorking) { - doNothing() - .when(channel) - .basicPublish( - eq(StringUtils.EMPTY), - eq(name), - any(AMQP.BasicProperties.class), - any(byte[].class)); - } else { - doThrow(new IOException("Not working")) - .when(channel) - .basicPublish( - eq(StringUtils.EMPTY), - eq(name), - any(AMQP.BasicProperties.class), - any(byte[].class)); - } - return channel; - } - - Channel mockChannelForExchange( - Channel channel, - boolean isWorking, - boolean exists, - String queueName, - String name, - String type, - String routingKey, - List queue) - throws IOException { - // exchangeDeclarePassive - final AMQImpl.Exchange.DeclareOk exchangeDeclareOK = new AMQImpl.Exchange.DeclareOk(); - if (exists) { - when(channel.exchangeDeclarePassive(eq(name))).thenReturn(exchangeDeclareOK); - } else { - when(channel.exchangeDeclarePassive(eq(name))) - .thenThrow(new IOException("Exchange " + name + " exists")); - } - // exchangeDeclare - OngoingStubbing declareOkOngoingStubbing = - when(channel.exchangeDeclare( - eq(name), eq(type), anyBoolean(), anyBoolean(), anyMap())) - .thenReturn(exchangeDeclareOK); - if (!isWorking) { - declareOkOngoingStubbing.thenThrow( - new IOException("Cannot declare exchange " + name + " of type " + type), - new RuntimeException("Not working")); - } - // queueDeclarePassive - final AMQImpl.Queue.DeclareOk queueDeclareOK = - new AMQImpl.Queue.DeclareOk(queueName, queue.size(), 1); - if (exists) { - when(channel.queueDeclarePassive(eq(queueName))).thenReturn(queueDeclareOK); - } else { - when(channel.queueDeclarePassive(eq(queueName))) - .thenThrow(new IOException("Queue " + queueName + " exists")); - } - // queueDeclare - when(channel.queueDeclare( - eq(queueName), anyBoolean(), anyBoolean(), anyBoolean(), anyMap())) - .thenReturn(queueDeclareOK); - // queueBind - when(channel.queueBind(eq(queueName), eq(name), eq(routingKey))) - .thenReturn(new AMQImpl.Queue.BindOk()); - // messageCount - when(channel.messageCount(eq(name))).thenReturn((long) queue.size()); - // basicGet - - OngoingStubbing getResponseOngoingStubbing = - Mockito.when(channel.basicConsume(eq(queueName), anyBoolean(), any(Consumer.class))) - .thenReturn(queueName); - - if (!isWorking) { - getResponseOngoingStubbing.thenThrow( - new IOException("Not working"), new RuntimeException("Not working")); - } - // basicPublish - if (isWorking) { - doNothing() - .when(channel) - .basicPublish( - eq(name), - eq(routingKey), - any(AMQP.BasicProperties.class), - any(byte[].class)); - } else { - doThrow(new IOException("Not working")) - .when(channel) - .basicPublish( - eq(name), - eq(routingKey), - any(AMQP.BasicProperties.class), - any(byte[].class)); - } - return channel; - } - - Connection mockGoodConnection(Channel channel) throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenReturn(channel); - when(connection.isOpen()).thenReturn(Boolean.TRUE); - /* - * doAnswer(invocation -> { when(connection.isOpen()).thenReturn(Boolean.FALSE); - * return DoesNothing.doesNothing(); }).when(connection).close(); - */ return connection; - } - - Connection mockBadConnection() throws IOException { - Connection connection = mock(Connection.class); - when(connection.createChannel()).thenThrow(new IOException("Can't create channel")); - when(connection.isOpen()).thenReturn(Boolean.TRUE); - doThrow(new IOException("Can't close connection")).when(connection).close(); - return connection; - } - - ConnectionFactory mockConnectionFactory(Connection connection) - throws IOException, TimeoutException { - ConnectionFactory connectionFactory = mock(ConnectionFactory.class); - when(connectionFactory.newConnection(eq(addresses), Mockito.anyString())) - .thenReturn(connection); - return connectionFactory; - } - - void runObserve( - Channel channel, - AMQPObservableQueue observableQueue, - String queueName, - boolean useWorkingChannel, - int batchSize) - throws IOException { - - final List found = new ArrayList<>(batchSize); - TestSubscriber subscriber = TestSubscriber.create(Subscribers.create(found::add)); - rx.Observable observable = - observableQueue.observe().take(pollTimeMs * 2, TimeUnit.MILLISECONDS); - assertNotNull(observable); - observable.subscribe(subscriber); - subscriber.awaitTerminalEvent(); - subscriber.assertNoErrors(); - subscriber.assertCompleted(); - if (useWorkingChannel) { - verify(channel, atLeast(1)) - .basicConsume(eq(queueName), anyBoolean(), any(Consumer.class)); - doNothing().when(channel).basicAck(anyLong(), eq(false)); - doAnswer(DoesNothing.doesNothing()).when(channel).basicAck(anyLong(), eq(false)); - observableQueue.ack(Collections.synchronizedList(found)); - } else { - assertNotNull(found); - assertTrue(found.isEmpty()); - } - observableQueue.close(); - } - - @Test - public void - testGetMessagesFromExistingExchangeWithDurableExclusiveAutoDeleteQueueConfiguration() - throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - testGetMessagesFromExchangeAndCustomConfigurationFromURI( - channel, connection, true, true, true, true, true); - } - - @Test - public void testPublishMessagesToNotExistingExchangeAndDefaultConfiguration() - throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - testPublishMessagesToExchangeAndDefaultConfiguration(channel, connection, false, true); - } - - @Test - public void testAck() throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - final Random random = new Random(); - - final String name = RandomStringUtils.randomAlphabetic(30), - type = "topic", - routingKey = RandomStringUtils.randomAlphabetic(30); - AMQPRetryPattern retrySettings = null; - final AMQPSettings settings = - new AMQPSettings(properties) - .fromURI( - "amqp_exchange:" - + name - + "?exchangeType=" - + type - + "&routingKey=" - + routingKey); - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(connection), - addresses, - true, - settings, - retrySettings, - batchSize, - pollTimeMs); - List messages = new LinkedList<>(); - Message msg = new Message(); - msg.setId("0e3eef8f-ebb1-4244-9665-759ab5bdf433"); - msg.setPayload("Payload"); - msg.setReceipt("1"); - messages.add(msg); - List deliveredTags = observableQueue.ack(messages); - assertNotNull(deliveredTags); - } - - private void testGetMessagesFromExchangeAndDefaultConfiguration( - Channel channel, Connection connection, boolean exists, boolean useWorkingChannel) - throws IOException, TimeoutException { - - final Random random = new Random(); - - final String name = RandomStringUtils.randomAlphabetic(30), - type = "topic", - routingKey = RandomStringUtils.randomAlphabetic(30); - final String queueName = String.format("bound_to_%s", name); - - final AMQPSettings settings = - new AMQPSettings(properties) - .fromURI( - "amqp_exchange:" - + name - + "?exchangeType=" - + type - + "&routingKey=" - + routingKey); - assertTrue(settings.isDurable()); - assertFalse(settings.isExclusive()); - assertFalse(settings.autoDelete()); - assertEquals(2, settings.getDeliveryMode()); - assertEquals(name, settings.getQueueOrExchangeName()); - assertEquals(type, settings.getExchangeType()); - assertEquals(routingKey, settings.getRoutingKey()); - - List queue = buildQueue(random, batchSize); - channel = - mockChannelForExchange( - channel, - useWorkingChannel, - exists, - queueName, - name, - type, - routingKey, - queue); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(connection), - addresses, - true, - settings, - retrySettings, - batchSize, - pollTimeMs); - - assertArrayEquals(addresses, observableQueue.getAddresses()); - assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, observableQueue.getType()); - assertEquals( - AMQPConstants.AMQP_EXCHANGE_TYPE - + ":" - + name - + "?exchangeType=" - + type - + "&routingKey=" - + routingKey, - observableQueue.getName()); - assertEquals(name, observableQueue.getURI()); - assertEquals(batchSize, observableQueue.getBatchSize()); - assertEquals(pollTimeMs, observableQueue.getPollTimeInMS()); - assertEquals(queue.size(), observableQueue.size()); - - runObserve(channel, observableQueue, queueName, useWorkingChannel, batchSize); - - if (useWorkingChannel) { - verify(channel, atLeastOnce()) - .exchangeDeclare( - eq(name), - eq(type), - eq(settings.isDurable()), - eq(settings.autoDelete()), - eq(Collections.emptyMap())); - verify(channel, atLeastOnce()) - .queueDeclare( - eq(queueName), - eq(settings.isDurable()), - eq(settings.isExclusive()), - eq(settings.autoDelete()), - anyMap()); - - verify(channel, atLeastOnce()).queueBind(eq(queueName), eq(name), eq(routingKey)); - } - } - - private void testGetMessagesFromExchangeAndCustomConfigurationFromURI( - Channel channel, - Connection connection, - boolean exists, - boolean useWorkingChannel, - boolean durable, - boolean exclusive, - boolean autoDelete) - throws IOException, TimeoutException { - - final Random random = new Random(); - - final String name = RandomStringUtils.randomAlphabetic(30), - type = "topic", - routingKey = RandomStringUtils.randomAlphabetic(30); - final String queueName = String.format("bound_to_%s", name); - - final AMQPSettings settings = - new AMQPSettings(properties) - .fromURI( - "amqp_exchange:" - + name - + "?exchangeType=" - + type - + "&routingKey=" - + routingKey - + "&deliveryMode=2" - + "&durable=" - + durable - + "&exclusive=" - + exclusive - + "&autoDelete=" - + autoDelete); - assertEquals(durable, settings.isDurable()); - assertEquals(exclusive, settings.isExclusive()); - assertEquals(autoDelete, settings.autoDelete()); - assertEquals(2, settings.getDeliveryMode()); - assertEquals(name, settings.getQueueOrExchangeName()); - assertEquals(type, settings.getExchangeType()); - assertEquals(routingKey, settings.getRoutingKey()); - - List queue = buildQueue(random, batchSize); - channel = - mockChannelForExchange( - channel, - useWorkingChannel, - exists, - queueName, - name, - type, - routingKey, - queue); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(connection), - addresses, - true, - settings, - retrySettings, - batchSize, - pollTimeMs); - - assertArrayEquals(addresses, observableQueue.getAddresses()); - assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, observableQueue.getType()); - assertEquals( - AMQPConstants.AMQP_EXCHANGE_TYPE - + ":" - + name - + "?exchangeType=" - + type - + "&routingKey=" - + routingKey - + "&deliveryMode=2" - + "&durable=" - + durable - + "&exclusive=" - + exclusive - + "&autoDelete=" - + autoDelete, - observableQueue.getName()); - assertEquals(name, observableQueue.getURI()); - assertEquals(batchSize, observableQueue.getBatchSize()); - assertEquals(pollTimeMs, observableQueue.getPollTimeInMS()); - assertEquals(queue.size(), observableQueue.size()); - - runObserve(channel, observableQueue, queueName, useWorkingChannel, batchSize); - - if (useWorkingChannel) { - verify(channel, atLeastOnce()) - .exchangeDeclare( - eq(name), - eq(type), - eq(settings.isDurable()), - eq(settings.autoDelete()), - eq(Collections.emptyMap())); - verify(channel, atLeastOnce()) - .queueDeclare( - eq(queueName), - eq(settings.isDurable()), - eq(settings.isExclusive()), - eq(settings.autoDelete()), - anyMap()); - - verify(channel, atLeastOnce()).queueBind(eq(queueName), eq(name), eq(routingKey)); - } - } - - private void testPublishMessagesToExchangeAndDefaultConfiguration( - Channel channel, Connection connection, boolean exists, boolean useWorkingChannel) - throws IOException, TimeoutException { - final Random random = new Random(); - - final String name = RandomStringUtils.randomAlphabetic(30), - type = "topic", - queueName = RandomStringUtils.randomAlphabetic(30), - routingKey = RandomStringUtils.randomAlphabetic(30); - - final AMQPSettings settings = - new AMQPSettings(properties) - .fromURI( - "amqp_exchange:" - + name - + "?exchangeType=" - + type - + "&routingKey=" - + routingKey - + "&deliveryMode=2&durable=true&exclusive=false&autoDelete=true"); - assertTrue(settings.isDurable()); - assertFalse(settings.isExclusive()); - assertTrue(settings.autoDelete()); - assertEquals(2, settings.getDeliveryMode()); - assertEquals(name, settings.getQueueOrExchangeName()); - assertEquals(type, settings.getExchangeType()); - assertEquals(routingKey, settings.getRoutingKey()); - - List queue = buildQueue(random, batchSize); - channel = - mockChannelForExchange( - channel, - useWorkingChannel, - exists, - queueName, - name, - type, - routingKey, - queue); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(connection), - addresses, - true, - settings, - retrySettings, - batchSize, - pollTimeMs); - - assertArrayEquals(addresses, observableQueue.getAddresses()); - assertEquals(AMQPConstants.AMQP_EXCHANGE_TYPE, observableQueue.getType()); - assertEquals( - AMQPConstants.AMQP_EXCHANGE_TYPE - + ":" - + name - + "?exchangeType=" - + type - + "&routingKey=" - + routingKey - + "&deliveryMode=2&durable=true&exclusive=false&autoDelete=true", - observableQueue.getName()); - assertEquals(name, observableQueue.getURI()); - assertEquals(batchSize, observableQueue.getBatchSize()); - assertEquals(pollTimeMs, observableQueue.getPollTimeInMS()); - assertEquals(queue.size(), observableQueue.size()); - - List messages = new LinkedList<>(); - Observable.range(0, batchSize) - .forEach((Integer x) -> messages.add(new Message("" + x, "payload: " + x, null))); - assertEquals(batchSize, messages.size()); - observableQueue.publish(messages); - - if (useWorkingChannel) { - verify(channel, times(batchSize)) - .basicPublish( - eq(name), - eq(routingKey), - any(AMQP.BasicProperties.class), - any(byte[].class)); - } - } - - @Test - public void testGetMessagesFromExistingQueueAndDefaultConfiguration() - throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - testGetMessagesFromQueueAndDefaultConfiguration(channel, connection, true, true); - } - - @Test - public void testGetMessagesFromNotExistingQueueAndDefaultConfiguration() - throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - testGetMessagesFromQueueAndDefaultConfiguration(channel, connection, false, true); - } - - @Test - public void testGetMessagesFromQueueWithBadChannel() throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - testGetMessagesFromQueueAndDefaultConfiguration(channel, connection, true, false); - } - - @Test(expected = RuntimeException.class) - public void testPublishMessagesToQueueWithBadChannel() throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - testPublishMessagesToQueueAndDefaultConfiguration(channel, connection, true, false); - } - - @Test(expected = IllegalArgumentException.class) - public void testAMQPObservalbleQueue_empty() throws IOException, TimeoutException { - AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test"); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - null, addresses, false, settings, retrySettings, batchSize, pollTimeMs); - } - - @Test(expected = IllegalArgumentException.class) - public void testAMQPObservalbleQueue_addressEmpty() throws IOException, TimeoutException { - AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test"); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(mockGoodConnection(mockBaseChannel())), - null, - false, - settings, - retrySettings, - batchSize, - pollTimeMs); - } - - @Test(expected = IllegalArgumentException.class) - public void testAMQPObservalbleQueue_settingsEmpty() throws IOException, TimeoutException { - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(mockGoodConnection(mockBaseChannel())), - addresses, - false, - null, - retrySettings, - batchSize, - pollTimeMs); - } - - @Test(expected = IllegalArgumentException.class) - public void testAMQPObservalbleQueue_batchsizezero() throws IOException, TimeoutException { - AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test"); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(mockGoodConnection(mockBaseChannel())), - addresses, - false, - settings, - retrySettings, - 0, - pollTimeMs); - } - - @Test(expected = IllegalArgumentException.class) - public void testAMQPObservalbleQueue_polltimezero() throws IOException, TimeoutException { - AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:test"); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(mockGoodConnection(mockBaseChannel())), - addresses, - false, - settings, - retrySettings, - batchSize, - 0); - } - - @Test - public void testclosetExistingQueueAndDefaultConfiguration() - throws IOException, TimeoutException { - // Mock channel and connection - Channel channel = mockBaseChannel(); - Connection connection = mockGoodConnection(channel); - testGetMessagesFromQueueAndDefaultConfiguration_close(channel, connection, false, true); - } - - private void testGetMessagesFromQueueAndDefaultConfiguration( - Channel channel, Connection connection, boolean queueExists, boolean useWorkingChannel) - throws IOException, TimeoutException { - final Random random = new Random(); - - final String queueName = RandomStringUtils.randomAlphabetic(30); - AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:" + queueName); - - List queue = buildQueue(random, batchSize); - channel = mockChannelForQueue(channel, useWorkingChannel, queueExists, queueName, queue); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(connection), - addresses, - false, - settings, - retrySettings, - batchSize, - pollTimeMs); - - assertArrayEquals(addresses, observableQueue.getAddresses()); - assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, observableQueue.getType()); - assertEquals(AMQPConstants.AMQP_QUEUE_TYPE + ":" + queueName, observableQueue.getName()); - assertEquals(queueName, observableQueue.getURI()); - assertEquals(batchSize, observableQueue.getBatchSize()); - assertEquals(pollTimeMs, observableQueue.getPollTimeInMS()); - assertEquals(queue.size(), observableQueue.size()); - - runObserve(channel, observableQueue, queueName, useWorkingChannel, batchSize); - } - - private void testGetMessagesFromQueueAndDefaultConfiguration_close( - Channel channel, Connection connection, boolean queueExists, boolean useWorkingChannel) - throws IOException, TimeoutException { - final Random random = new Random(); - - final String queueName = RandomStringUtils.randomAlphabetic(30); - AMQPSettings settings = new AMQPSettings(properties).fromURI("amqp_queue:" + queueName); - - List queue = buildQueue(random, batchSize); - channel = mockChannelForQueue(channel, useWorkingChannel, queueExists, queueName, queue); - AMQPRetryPattern retrySettings = null; - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(connection), - addresses, - false, - settings, - retrySettings, - batchSize, - pollTimeMs); - observableQueue.close(); - assertArrayEquals(addresses, observableQueue.getAddresses()); - assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, observableQueue.getType()); - assertEquals(AMQPConstants.AMQP_QUEUE_TYPE + ":" + queueName, observableQueue.getName()); - assertEquals(queueName, observableQueue.getURI()); - assertEquals(batchSize, observableQueue.getBatchSize()); - assertEquals(pollTimeMs, observableQueue.getPollTimeInMS()); - assertEquals(queue.size(), observableQueue.size()); - } - - private void testPublishMessagesToQueueAndDefaultConfiguration( - Channel channel, Connection connection, boolean queueExists, boolean useWorkingChannel) - throws IOException, TimeoutException { - final Random random = new Random(); - - final String queueName = RandomStringUtils.randomAlphabetic(30); - final AMQPSettings settings = - new AMQPSettings(properties) - .fromURI( - "amqp_queue:" - + queueName - + "?deliveryMode=2&durable=true&exclusive=false&autoDelete=true"); - assertTrue(settings.isDurable()); - assertFalse(settings.isExclusive()); - assertTrue(settings.autoDelete()); - assertEquals(2, settings.getDeliveryMode()); - - List queue = buildQueue(random, batchSize); - channel = mockChannelForQueue(channel, useWorkingChannel, queueExists, queueName, queue); - AMQPRetryPattern retrySettings = new AMQPRetryPattern(3, 5, RetryType.REGULARINTERVALS); - AMQPObservableQueue observableQueue = - new AMQPObservableQueue( - mockConnectionFactory(connection), - addresses, - false, - settings, - retrySettings, - batchSize, - pollTimeMs); - - assertArrayEquals(addresses, observableQueue.getAddresses()); - assertEquals(AMQPConstants.AMQP_QUEUE_TYPE, observableQueue.getType()); - assertEquals( - AMQPConstants.AMQP_QUEUE_TYPE - + ":" - + queueName - + "?deliveryMode=2&durable=true&exclusive=false&autoDelete=true", - observableQueue.getName()); - assertEquals(queueName, observableQueue.getURI()); - assertEquals(batchSize, observableQueue.getBatchSize()); - assertEquals(pollTimeMs, observableQueue.getPollTimeInMS()); - assertEquals(queue.size(), observableQueue.size()); - - List messages = new LinkedList<>(); - Observable.range(0, batchSize) - .forEach((Integer x) -> messages.add(new Message("" + x, "payload: " + x, null))); - assertEquals(batchSize, messages.size()); - observableQueue.publish(messages); - - if (useWorkingChannel) { - verify(channel, times(batchSize)) - .basicPublish( - eq(StringUtils.EMPTY), - eq(queueName), - any(AMQP.BasicProperties.class), - any(byte[].class)); - } - } -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPSettingsTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPSettingsTest.java deleted file mode 100644 index 91afc6e50..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/queue/amqp/AMQPSettingsTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.queue.amqp; - -import java.time.Duration; - -import org.junit.Before; -import org.junit.Test; - -import com.netflix.conductor.contribs.queue.amqp.config.AMQPEventQueueProperties; -import com.netflix.conductor.contribs.queue.amqp.util.AMQPSettings; - -import com.rabbitmq.client.AMQP.PROTOCOL; -import com.rabbitmq.client.ConnectionFactory; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class AMQPSettingsTest { - - private AMQPEventQueueProperties properties; - - @Before - public void setUp() { - properties = mock(AMQPEventQueueProperties.class); - when(properties.getBatchSize()).thenReturn(1); - when(properties.getPollTimeDuration()).thenReturn(Duration.ofMillis(100)); - when(properties.getHosts()).thenReturn(ConnectionFactory.DEFAULT_HOST); - when(properties.getUsername()).thenReturn(ConnectionFactory.DEFAULT_USER); - when(properties.getPassword()).thenReturn(ConnectionFactory.DEFAULT_PASS); - when(properties.getVirtualHost()).thenReturn(ConnectionFactory.DEFAULT_VHOST); - when(properties.getPort()).thenReturn(PROTOCOL.PORT); - when(properties.getConnectionTimeoutInMilliSecs()).thenReturn(60000); - when(properties.isUseNio()).thenReturn(false); - when(properties.isDurable()).thenReturn(true); - when(properties.isExclusive()).thenReturn(false); - when(properties.isAutoDelete()).thenReturn(false); - when(properties.getContentType()).thenReturn("application/json"); - when(properties.getContentEncoding()).thenReturn("UTF-8"); - when(properties.getExchangeType()).thenReturn("topic"); - when(properties.getDeliveryMode()).thenReturn(2); - when(properties.isUseExchange()).thenReturn(true); - } - - @Test - public void testAMQPSettings_exchange_fromuri_defaultconfig() { - String exchangestring = - "amqp_exchange:myExchangeName?exchangeType=topic&routingKey=test&deliveryMode=2"; - AMQPSettings settings = new AMQPSettings(properties); - settings.fromURI(exchangestring); - assertEquals("topic", settings.getExchangeType()); - assertEquals("test", settings.getRoutingKey()); - assertEquals("myExchangeName", settings.getQueueOrExchangeName()); - } - - @Test - public void testAMQPSettings_queue_fromuri_defaultconfig() { - String exchangestring = - "amqp_queue:myQueueName?deliveryMode=2&durable=false&autoDelete=true&exclusive=true"; - AMQPSettings settings = new AMQPSettings(properties); - settings.fromURI(exchangestring); - assertFalse(settings.isDurable()); - assertTrue(settings.isExclusive()); - assertTrue(settings.autoDelete()); - assertEquals(2, settings.getDeliveryMode()); - assertEquals("myQueueName", settings.getQueueOrExchangeName()); - } - - @Test(expected = IllegalArgumentException.class) - public void testAMQPSettings_exchange_fromuri_wrongdeliverymode() { - String exchangestring = - "amqp_exchange:myExchangeName?exchangeType=topic&routingKey=test&deliveryMode=3"; - AMQPSettings settings = new AMQPSettings(properties); - settings.fromURI(exchangestring); - } -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManagerTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManagerTest.java deleted file mode 100644 index 338a8b862..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManagerTest.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.tasks.kafka; - -import java.time.Duration; -import java.util.Properties; - -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.clients.producer.ProducerConfig; -import org.apache.kafka.common.serialization.LongSerializer; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -public class KafkaProducerManagerTest { - - @Test - public void testRequestTimeoutSetFromDefault() { - KafkaProducerManager manager = - new KafkaProducerManager( - Duration.ofMillis(100), - Duration.ofMillis(500), - 10, - Duration.ofMillis(120000)); - KafkaPublishTask.Input input = getInput(); - Properties props = manager.getProducerProperties(input); - assertEquals(props.getProperty(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG), "100"); - } - - @Test - public void testRequestTimeoutSetFromInput() { - KafkaProducerManager manager = - new KafkaProducerManager( - Duration.ofMillis(100), - Duration.ofMillis(500), - 10, - Duration.ofMillis(120000)); - KafkaPublishTask.Input input = getInput(); - input.setRequestTimeoutMs(200); - Properties props = manager.getProducerProperties(input); - assertEquals(props.getProperty(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG), "200"); - } - - @Test - public void testRequestTimeoutSetFromConfig() { - KafkaProducerManager manager = - new KafkaProducerManager( - Duration.ofMillis(150), - Duration.ofMillis(500), - 10, - Duration.ofMillis(120000)); - KafkaPublishTask.Input input = getInput(); - Properties props = manager.getProducerProperties(input); - assertEquals(props.getProperty(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG), "150"); - } - - @SuppressWarnings("rawtypes") - @Test(expected = RuntimeException.class) - public void testExecutionException() { - KafkaProducerManager manager = - new KafkaProducerManager( - Duration.ofMillis(150), - Duration.ofMillis(500), - 10, - Duration.ofMillis(120000)); - KafkaPublishTask.Input input = getInput(); - Producer producer = manager.getProducer(input); - assertNotNull(producer); - } - - @SuppressWarnings("rawtypes") - @Test - public void testCacheInvalidation() { - KafkaProducerManager manager = - new KafkaProducerManager( - Duration.ofMillis(150), Duration.ofMillis(500), 0, Duration.ofMillis(0)); - KafkaPublishTask.Input input = getInput(); - input.setBootStrapServers(""); - Properties props = manager.getProducerProperties(input); - Producer producerMock = mock(Producer.class); - Producer producer = manager.getFromCache(props, () -> producerMock); - assertNotNull(producer); - verify(producerMock, times(1)).close(); - } - - @Test - public void testMaxBlockMsFromConfig() { - KafkaProducerManager manager = - new KafkaProducerManager( - Duration.ofMillis(150), - Duration.ofMillis(500), - 10, - Duration.ofMillis(120000)); - KafkaPublishTask.Input input = getInput(); - Properties props = manager.getProducerProperties(input); - assertEquals(props.getProperty(ProducerConfig.MAX_BLOCK_MS_CONFIG), "500"); - } - - @Test - public void testMaxBlockMsFromInput() { - KafkaProducerManager manager = - new KafkaProducerManager( - Duration.ofMillis(150), - Duration.ofMillis(500), - 10, - Duration.ofMillis(120000)); - KafkaPublishTask.Input input = getInput(); - input.setMaxBlockMs(600); - Properties props = manager.getProducerProperties(input); - assertEquals(props.getProperty(ProducerConfig.MAX_BLOCK_MS_CONFIG), "600"); - } - - private KafkaPublishTask.Input getInput() { - KafkaPublishTask.Input input = new KafkaPublishTask.Input(); - input.setTopic("testTopic"); - input.setValue("TestMessage"); - input.setKeySerializer(LongSerializer.class.getCanonicalName()); - input.setBootStrapServers("servers"); - return input; - } -} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTaskTest.java b/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTaskTest.java deleted file mode 100644 index a6e096120..000000000 --- a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTaskTest.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.contribs.tasks.kafka; - -import java.time.Duration; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - -import org.apache.kafka.clients.producer.Producer; -import org.apache.kafka.common.serialization.IntegerSerializer; -import org.apache.kafka.common.serialization.LongSerializer; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.core.execution.WorkflowExecutor; -import com.netflix.conductor.model.TaskModel; -import com.netflix.conductor.model.WorkflowModel; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -@SuppressWarnings({"unchecked", "rawtypes"}) -@ContextConfiguration(classes = {TestObjectMapperConfiguration.class}) -@RunWith(SpringRunner.class) -public class KafkaPublishTaskTest { - - @Autowired private ObjectMapper objectMapper; - - @Test - public void missingRequest_Fail() { - KafkaPublishTask kafkaPublishTask = - new KafkaPublishTask(getKafkaProducerManager(), objectMapper); - TaskModel task = new TaskModel(); - kafkaPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class)); - assertEquals(TaskModel.Status.FAILED, task.getStatus()); - } - - @Test - public void missingValue_Fail() { - - TaskModel task = new TaskModel(); - KafkaPublishTask.Input input = new KafkaPublishTask.Input(); - input.setBootStrapServers("localhost:9092"); - input.setTopic("testTopic"); - - task.getInputData().put(KafkaPublishTask.REQUEST_PARAMETER_NAME, input); - - KafkaPublishTask kPublishTask = - new KafkaPublishTask(getKafkaProducerManager(), objectMapper); - kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class)); - assertEquals(TaskModel.Status.FAILED, task.getStatus()); - } - - @Test - public void missingBootStrapServers_Fail() { - - TaskModel task = new TaskModel(); - KafkaPublishTask.Input input = new KafkaPublishTask.Input(); - - Map value = new HashMap<>(); - input.setValue(value); - input.setTopic("testTopic"); - - task.getInputData().put(KafkaPublishTask.REQUEST_PARAMETER_NAME, input); - - KafkaPublishTask kPublishTask = - new KafkaPublishTask(getKafkaProducerManager(), objectMapper); - kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class)); - assertEquals(TaskModel.Status.FAILED, task.getStatus()); - } - - @Test - public void kafkaPublishExecutionException_Fail() - throws ExecutionException, InterruptedException { - - TaskModel task = getTask(); - - KafkaProducerManager producerManager = mock(KafkaProducerManager.class); - KafkaPublishTask kafkaPublishTask = new KafkaPublishTask(producerManager, objectMapper); - - Producer producer = mock(Producer.class); - - when(producerManager.getProducer(any())).thenReturn(producer); - Future publishingFuture = mock(Future.class); - when(producer.send(any())).thenReturn(publishingFuture); - - ExecutionException executionException = mock(ExecutionException.class); - - when(executionException.getMessage()).thenReturn("Execution exception"); - when(publishingFuture.get()).thenThrow(executionException); - - kafkaPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class)); - assertEquals(TaskModel.Status.FAILED, task.getStatus()); - assertEquals( - "Failed to invoke kafka task due to: Execution exception", - task.getReasonForIncompletion()); - } - - @Test - public void kafkaPublishUnknownException_Fail() { - - TaskModel task = getTask(); - - KafkaProducerManager producerManager = mock(KafkaProducerManager.class); - KafkaPublishTask kPublishTask = new KafkaPublishTask(producerManager, objectMapper); - - Producer producer = mock(Producer.class); - - when(producerManager.getProducer(any())).thenReturn(producer); - when(producer.send(any())).thenThrow(new RuntimeException("Unknown exception")); - - kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class)); - assertEquals(TaskModel.Status.FAILED, task.getStatus()); - assertEquals( - "Failed to invoke kafka task due to: Unknown exception", - task.getReasonForIncompletion()); - } - - @Test - public void kafkaPublishSuccess_Completed() { - - TaskModel task = getTask(); - - KafkaProducerManager producerManager = mock(KafkaProducerManager.class); - KafkaPublishTask kPublishTask = new KafkaPublishTask(producerManager, objectMapper); - - Producer producer = mock(Producer.class); - - when(producerManager.getProducer(any())).thenReturn(producer); - when(producer.send(any())).thenReturn(mock(Future.class)); - - kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class)); - assertEquals(TaskModel.Status.COMPLETED, task.getStatus()); - } - - @Test - public void kafkaPublishSuccess_AsyncComplete() { - - TaskModel task = getTask(); - task.getInputData().put("asyncComplete", true); - - KafkaProducerManager producerManager = mock(KafkaProducerManager.class); - KafkaPublishTask kPublishTask = new KafkaPublishTask(producerManager, objectMapper); - - Producer producer = mock(Producer.class); - - when(producerManager.getProducer(any())).thenReturn(producer); - when(producer.send(any())).thenReturn(mock(Future.class)); - - kPublishTask.start(mock(WorkflowModel.class), task, mock(WorkflowExecutor.class)); - assertEquals(TaskModel.Status.IN_PROGRESS, task.getStatus()); - } - - private TaskModel getTask() { - TaskModel task = new TaskModel(); - KafkaPublishTask.Input input = new KafkaPublishTask.Input(); - input.setBootStrapServers("localhost:9092"); - - Map value = new HashMap<>(); - - value.put("input_key1", "value1"); - value.put("input_key2", 45.3d); - - input.setValue(value); - input.setTopic("testTopic"); - task.getInputData().put(KafkaPublishTask.REQUEST_PARAMETER_NAME, input); - return task; - } - - @Test - public void integerSerializer_integerObject() { - KafkaPublishTask kPublishTask = - new KafkaPublishTask(getKafkaProducerManager(), objectMapper); - KafkaPublishTask.Input input = new KafkaPublishTask.Input(); - input.setKeySerializer(IntegerSerializer.class.getCanonicalName()); - input.setKey(String.valueOf(Integer.MAX_VALUE)); - assertEquals(kPublishTask.getKey(input), Integer.MAX_VALUE); - } - - @Test - public void longSerializer_longObject() { - KafkaPublishTask kPublishTask = - new KafkaPublishTask(getKafkaProducerManager(), objectMapper); - KafkaPublishTask.Input input = new KafkaPublishTask.Input(); - input.setKeySerializer(LongSerializer.class.getCanonicalName()); - input.setKey(String.valueOf(Long.MAX_VALUE)); - assertEquals(kPublishTask.getKey(input), Long.MAX_VALUE); - } - - @Test - public void noSerializer_StringObject() { - KafkaPublishTask kPublishTask = - new KafkaPublishTask(getKafkaProducerManager(), objectMapper); - KafkaPublishTask.Input input = new KafkaPublishTask.Input(); - input.setKey("testStringKey"); - assertEquals(kPublishTask.getKey(input), "testStringKey"); - } - - private KafkaProducerManager getKafkaProducerManager() { - return new KafkaProducerManager( - Duration.ofMillis(100), Duration.ofMillis(500), 120000, Duration.ofMillis(10)); - } -} diff --git a/core/build.gradle b/core/build.gradle index 1347aa5e3..53c7c7ca8 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -16,6 +16,7 @@ dependencies { implementation project(':conductor-common') compileOnly 'org.springframework.boot:spring-boot-starter' compileOnly 'org.springframework.boot:spring-boot-starter-validation' + compileOnly 'org.springframework.retry:spring-retry' implementation "com.fasterxml.jackson.core:jackson-annotations" implementation "com.fasterxml.jackson.core:jackson-databind" @@ -34,12 +35,12 @@ dependencies { implementation "io.reactivex:rxjava:${revRxJava}" - implementation "com.google.guava:guava:${revGuava}" - implementation "com.netflix.spectator:spectator-api:${revSpectator}" implementation "org.apache.bval:bval-jsr:${revBval}" + implementation "com.github.ben-manes.caffeine:caffeine" + // JAXB is not bundled with Java 11, dependencies added explicitly // These are needed by Apache BVAL implementation "jakarta.xml.bind:jakarta.xml.bind-api:${revJAXB}" @@ -49,15 +50,10 @@ dependencies { testImplementation "org.glassfish.jaxb:jaxb-runtime:${revJAXB}" testImplementation 'org.springframework.boot:spring-boot-starter-validation' + testImplementation 'org.springframework.retry:spring-retry' testImplementation project(':conductor-common').sourceSets.test.output testImplementation "org.codehaus.groovy:groovy-all:${revGroovy}" testImplementation "org.spockframework:spock-core:${revSpock}" testImplementation "org.spockframework:spock-spring:${revSpock}" } - -test { - testLogging { - exceptionFormat = 'full' - } -} diff --git a/core/dependencies.lock b/core/dependencies.lock index f3b5cd440..bdf032d67 100644 --- a/core/dependencies.lock +++ b/core/dependencies.lock @@ -1,21 +1,39 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" + "locked": "2.11.4" }, - "com.google.guava:guava": { - "locked": "30.0-jre" + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8" + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" @@ -39,22 +57,58 @@ "locked": "1.2.2" }, "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.0" + "locked": "2.0.0", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { "locked": "2.3.3" }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, "org.apache.bval:bval-jsr": { "locked": "2.0.5" }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -65,52 +119,174 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "runtimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8" }, - "com.google.guava:guava": { - "locked": "30.0-jre" + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { "locked": "2.4.0" }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -128,77 +304,139 @@ "locked": "1.2.2" }, "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.0" + "locked": "2.0.0", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { "locked": "2.3.3" }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "testCompileClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" + "locked": "2.11.4" }, - "com.google.guava:guava": { - "locked": "30.0-jre" + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8" + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" }, "com.jayway.jsonpath:json-path": { - "locked": "2.4.0" + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -209,103 +447,697 @@ "com.spotify:completable-futures": { "locked": "0.3.3" }, + "com.sun.istack:istack-commons-runtime": { + "locked": "3.0.11", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] + }, "commons-io:commons-io": { "locked": "2.7" }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, "io.reactivex:rxjava": { "locked": "1.2.2" }, "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.0" + "locked": "2.0.0", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant" + ] }, "org.apache.bval:bval-jsr": { "locked": "2.0.5" }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.glassfish.jaxb:jaxb-runtime": { "locked": "2.3.3" }, + "org.glassfish.jaxb:txw2": { + "locked": "2.3.4", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "com.beust:jcommander": { + "locked": "1.72", + "transitive": [ + "org.testng:testng" + ] + }, "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] }, - "com.google.guava:guava": { - "locked": "30.0-jre" + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8" + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "locked": "2.4.0" + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -316,88 +1148,696 @@ "com.spotify:completable-futures": { "locked": "0.3.3" }, + "com.sun.activation:jakarta.activation": { + "locked": "1.2.2", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.istack:istack-commons-runtime": { + "locked": "3.0.11", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] + }, "commons-io:commons-io": { "locked": "2.7" }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, "io.reactivex:rxjava": { "locked": "1.2.2" }, "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.0" + "locked": "2.0.0", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant-junit", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-antlr": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-junit": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant", + "org.codehaus.groovy:groovy-ant" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovydoc" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.glassfish.jaxb:jaxb-runtime": { "locked": "2.3.3" }, + "org.glassfish.jaxb:txw2": { + "locked": "2.3.4", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.testng:testng": { + "locked": "6.13.1", + "transitive": [ + "org.codehaus.groovy:groovy-testng" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ExecuteFunction.java b/core/src/main/java/com/netflix/conductor/annotations/VisibleForTesting.java similarity index 59% rename from mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ExecuteFunction.java rename to core/src/main/java/com/netflix/conductor/annotations/VisibleForTesting.java index e94d878f4..492931128 100644 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ExecuteFunction.java +++ b/core/src/main/java/com/netflix/conductor/annotations/VisibleForTesting.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -10,17 +10,15 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.mysql.util; +package com.netflix.conductor.annotations; -import java.sql.SQLException; +import java.lang.annotation.*; /** - * Functional interface for {@link Query} executions with no expected result. - * - * @author mustafa + * Annotates a program element that exists, or is more widely visible than otherwise necessary, only + * for use in test code. */ -@FunctionalInterface -public interface ExecuteFunction { - - void apply(Query query) throws SQLException; -} +@Retention(RetentionPolicy.CLASS) +@Target({ElementType.FIELD, ElementType.TYPE, ElementType.METHOD}) +@Documented +public @interface VisibleForTesting {} diff --git a/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java b/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java index 2f996a47a..d870761c5 100644 --- a/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java +++ b/core/src/main/java/com/netflix/conductor/core/WorkflowContext.java @@ -44,12 +44,16 @@ public static void unset() { THREAD_LOCAL.remove(); } - /** @return the clientApp */ + /** + * @return the clientApp + */ public String getClientApp() { return clientApp; } - /** @return the username */ + /** + * @return the username + */ public String getUserName() { return userName; } diff --git a/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java b/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java index 100cab754..eedef68f1 100644 --- a/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java +++ b/core/src/main/java/com/netflix/conductor/core/config/ConductorCoreConfiguration.java @@ -14,12 +14,14 @@ import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.stream.Collectors; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; @@ -27,6 +29,10 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.retry.RetryContext; +import org.springframework.retry.backoff.NoBackOffPolicy; +import org.springframework.retry.policy.SimpleRetryPolicy; +import org.springframework.retry.support.RetryTemplate; import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.utils.ExternalPayloadStorage; @@ -37,12 +43,11 @@ import com.netflix.conductor.core.listener.WorkflowStatusListenerStub; import com.netflix.conductor.core.storage.DummyPayloadStorage; import com.netflix.conductor.core.sync.Lock; -import com.netflix.conductor.core.sync.NoopLock; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.netflix.conductor.core.sync.noop.NoopLock; import static com.netflix.conductor.core.events.EventQueues.EVENT_QUEUE_PROVIDERS_QUALIFIER; import static com.netflix.conductor.core.execution.tasks.SystemTaskRegistry.ASYNC_SYSTEM_TASKS_QUALIFIER; +import static com.netflix.conductor.core.utils.Utils.isTransientException; import static java.util.function.Function.identity; @@ -83,9 +88,9 @@ public WorkflowStatusListener workflowStatusListener() { @Bean public ExecutorService executorService(ConductorProperties conductorProperties) { ThreadFactory threadFactory = - new ThreadFactoryBuilder() - .setNameFormat("conductor-worker-%d") - .setDaemon(true) + new BasicThreadFactory.Builder() + .namingPattern("conductor-worker-%d") + .daemon(true) .build(); return Executors.newFixedThreadPool( conductorProperties.getExecutorServiceMaxThreadCount(), threadFactory); @@ -112,4 +117,27 @@ public Map getEventQueueProviders( return eventQueueProviders.stream() .collect(Collectors.toMap(EventQueueProvider::getQueueType, identity())); } + + @Bean + public RetryTemplate onTransientErrorRetryTemplate() { + SimpleRetryPolicy retryPolicy = new CustomRetryPolicy(); + retryPolicy.setMaxAttempts(3); + + RetryTemplate retryTemplate = new RetryTemplate(); + retryTemplate.setRetryPolicy(retryPolicy); + retryTemplate.setBackOffPolicy(new NoBackOffPolicy()); + return retryTemplate; + } + + public static class CustomRetryPolicy extends SimpleRetryPolicy { + + @Override + public boolean canRetry(final RetryContext context) { + final Optional lastThrowable = + Optional.ofNullable(context.getLastThrowable()); + return lastThrowable + .map(throwable -> super.canRetry(context) && isTransientException(throwable)) + .orElseGet(() -> super.canRetry(context)); + } + } } diff --git a/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java b/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java index ecdc6a375..b223008a1 100644 --- a/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java +++ b/core/src/main/java/com/netflix/conductor/core/config/ConductorProperties.java @@ -510,7 +510,9 @@ public void setMaxWorkflowVariablesPayloadSizeThreshold( this.maxWorkflowVariablesPayloadSizeThreshold = maxWorkflowVariablesPayloadSizeThreshold; } - /** @return Returns all the configurations in a map. */ + /** + * @return Returns all the configurations in a map. + */ public Map getAll() { Map map = new HashMap<>(); Properties props = System.getProperties(); diff --git a/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java b/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java index f5a453b03..364406e10 100644 --- a/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java +++ b/core/src/main/java/com/netflix/conductor/core/config/SchedulerConfiguration.java @@ -16,6 +16,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.EnableAsync; @@ -24,7 +25,6 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.config.ScheduledTaskRegistrar; -import com.google.common.util.concurrent.ThreadFactoryBuilder; import rx.Scheduler; import rx.schedulers.Schedulers; @@ -43,8 +43,8 @@ public class SchedulerConfiguration implements SchedulingConfigurer { @Bean public Scheduler scheduler(ConductorProperties properties) { ThreadFactory threadFactory = - new ThreadFactoryBuilder() - .setNameFormat("event-queue-poll-scheduler-thread-%d") + new BasicThreadFactory.Builder() + .namingPattern("event-queue-poll-scheduler-thread-%d") .build(); Executor executorService = Executors.newFixedThreadPool( @@ -60,7 +60,7 @@ public Executor sweeperExecutor(ConductorProperties properties) { "conductor.app.sweeper-thread-count must be greater than 0."); } ThreadFactory threadFactory = - new ThreadFactoryBuilder().setNameFormat("sweeper-thread-%d").build(); + new BasicThreadFactory.Builder().namingPattern("sweeper-thread-%d").build(); return Executors.newFixedThreadPool(properties.getSweeperThreadCount(), threadFactory); } diff --git a/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java b/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java index bf635be40..5b905a285 100644 --- a/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java +++ b/core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java @@ -449,7 +449,9 @@ public List getTasksForWorkflow(String workflowId) { public TaskModel getTaskModel(String taskId) { TaskModel taskModel = getTaskFromDatastore(taskId); - populateTaskData(taskModel); + if (taskModel != null) { + populateTaskData(taskModel); + } return taskModel; } diff --git a/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java b/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java index c9422cd8c..19767c478 100644 --- a/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java +++ b/core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java @@ -22,9 +22,12 @@ import java.util.concurrent.ThreadFactory; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.retry.support.RetryTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; @@ -32,11 +35,9 @@ import com.netflix.conductor.common.metadata.events.EventExecution.Status; import com.netflix.conductor.common.metadata.events.EventHandler; import com.netflix.conductor.common.metadata.events.EventHandler.Action; -import com.netflix.conductor.common.utils.RetryUtil; import com.netflix.conductor.core.config.ConductorProperties; import com.netflix.conductor.core.events.queue.Message; import com.netflix.conductor.core.events.queue.ObservableQueue; -import com.netflix.conductor.core.exception.ApplicationException; import com.netflix.conductor.core.execution.evaluators.Evaluator; import com.netflix.conductor.core.utils.JsonUtils; import com.netflix.conductor.metrics.Monitors; @@ -44,9 +45,10 @@ import com.netflix.conductor.service.MetadataService; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.spotify.futures.CompletableFutures; +import static com.netflix.conductor.core.utils.Utils.isTransientException; + /** * Event Processor is used to dispatch actions configured in the event handlers, based on incoming * events to the event queues. @@ -61,7 +63,6 @@ public class DefaultEventProcessor { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultEventProcessor.class); - private static final int RETRY_COUNT = 3; private final MetadataService metadataService; private final ExecutionService executionService; @@ -72,6 +73,7 @@ public class DefaultEventProcessor { private final JsonUtils jsonUtils; private final boolean isEventMessageIndexingEnabled; private final Map evaluators; + private final RetryTemplate retryTemplate; public DefaultEventProcessor( ExecutionService executionService, @@ -80,7 +82,8 @@ public DefaultEventProcessor( JsonUtils jsonUtils, ConductorProperties properties, ObjectMapper objectMapper, - Map evaluators) { + Map evaluators, + @Qualifier("onTransientErrorRetryTemplate") RetryTemplate retryTemplate) { this.executionService = executionService; this.metadataService = metadataService; this.actionProcessor = actionProcessor; @@ -94,12 +97,15 @@ public DefaultEventProcessor( + "processing, set conductor.default-event-processor.enabled=false."); } ThreadFactory threadFactory = - new ThreadFactoryBuilder().setNameFormat("event-action-executor-thread-%d").build(); + new BasicThreadFactory.Builder() + .namingPattern("event-action-executor-thread-%d") + .build(); eventActionExecutorService = Executors.newFixedThreadPool( properties.getEventProcessorThreadCount(), threadFactory); this.isEventMessageIndexingEnabled = properties.isEventMessageIndexingEnabled(); + this.retryTemplate = retryTemplate; LOGGER.info("Event Processing is ENABLED"); } @@ -254,30 +260,21 @@ protected CompletableFuture> executeActionsForEventHandler( */ protected EventExecution execute(EventExecution eventExecution, Action action, Object payload) { try { - String methodName = "executeEventAction"; - String description = - String.format( - "Executing action: %s for event: %s with messageId: %s with payload: %s", - action.getAction(), - eventExecution.getId(), - eventExecution.getMessageId(), - payload); - LOGGER.debug(description); + LOGGER.debug( + "Executing action: {} for event: {} with messageId: {} with payload: {}", + action.getAction(), + eventExecution.getId(), + eventExecution.getMessageId(), + payload); Map output = - new RetryUtil>() - .retryOnException( - () -> - actionProcessor.execute( - action, - payload, - eventExecution.getEvent(), - eventExecution.getMessageId()), - this::isTransientException, - null, - RETRY_COUNT, - description, - methodName); + retryTemplate.execute( + context -> + actionProcessor.execute( + action, + payload, + eventExecution.getEvent(), + eventExecution.getMessageId())); if (output != null) { eventExecution.getOutput().putAll(output); } @@ -293,7 +290,7 @@ protected EventExecution execute(EventExecution eventExecution, Action action, O eventExecution.getEvent(), eventExecution.getMessageId(), e); - if (!isTransientException(e.getCause())) { + if (!isTransientException(e)) { // not a transient error, fail the event execution eventExecution.setStatus(Status.FAILED); eventExecution.getOutput().put("exception", e.getMessage()); @@ -307,24 +304,6 @@ protected EventExecution execute(EventExecution eventExecution, Action action, O return eventExecution; } - /** - * Used to determine if the exception is thrown due to a transient failure and the operation is - * expected to succeed upon retrying. - * - * @param throwableException the exception that is thrown - * @return true - if the exception is a transient failure false - if the exception is - * non-transient - */ - protected boolean isTransientException(Throwable throwableException) { - if (throwableException != null) { - return !((throwableException instanceof UnsupportedOperationException) - || (throwableException instanceof ApplicationException - && ((ApplicationException) throwableException).getCode() - != ApplicationException.Code.BACKEND_ERROR)); - } - return true; - } - private Object getPayloadObject(String payload) { Object payloadObject = null; if (payload != null) { diff --git a/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java b/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java index 7db1ac56d..b7d33961f 100644 --- a/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java +++ b/core/src/main/java/com/netflix/conductor/core/events/queue/Message.java @@ -36,32 +36,44 @@ public Message(String id, String payload, String receipt, int priority) { this.priority = priority; } - /** @return the payload */ + /** + * @return the payload + */ public String getPayload() { return payload; } - /** @param payload the payload to set */ + /** + * @param payload the payload to set + */ public void setPayload(String payload) { this.payload = payload; } - /** @return the id */ + /** + * @return the id + */ public String getId() { return id; } - /** @param id the id to set */ + /** + * @param id the id to set + */ public void setId(String id) { this.id = id; } - /** @return Receipt attached to the message */ + /** + * @return Receipt attached to the message + */ public String getReceipt() { return receipt; } - /** @param receipt Receipt attached to the message */ + /** + * @param receipt Receipt attached to the message + */ public void setReceipt(String receipt) { this.receipt = receipt; } diff --git a/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java b/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java index 897090ba7..718cded76 100644 --- a/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java +++ b/core/src/main/java/com/netflix/conductor/core/events/queue/ObservableQueue.java @@ -20,16 +20,24 @@ public interface ObservableQueue extends Lifecycle { - /** @return An observable for the given queue */ + /** + * @return An observable for the given queue + */ Observable observe(); - /** @return Type of the queue */ + /** + * @return Type of the queue + */ String getType(); - /** @return Name of the queue */ + /** + * @return Name of the queue + */ String getName(); - /** @return URI identifier for the queue. */ + /** + * @return URI identifier for the queue. + */ String getURI(); /** @@ -38,7 +46,9 @@ public interface ObservableQueue extends Lifecycle { */ List ack(List messages); - /** @param messages Messages to be published */ + /** + * @param messages Messages to be published + */ void publish(List messages); /** diff --git a/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java b/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java index 493570b04..4a480a07f 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/DeciderService.java @@ -24,6 +24,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskDef; import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; @@ -43,8 +44,6 @@ import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.google.common.annotations.VisibleForTesting; - import static com.netflix.conductor.common.metadata.tasks.TaskType.TERMINATE; import static com.netflix.conductor.model.TaskModel.Status.*; @@ -58,8 +57,7 @@ public class DeciderService { private static final Logger LOGGER = LoggerFactory.getLogger(DeciderService.class); - @VisibleForTesting static final String MAX_TASK_LIMIT = "conductor.app.max-task-limit"; - + private final IDGenerator idGenerator; private final ParametersUtils parametersUtils; private final ExternalPayloadStorageUtils externalPayloadStorageUtils; private final MetadataDAO metadataDAO; @@ -81,6 +79,7 @@ public class DeciderService { && task.getStatus().isSuccessful()); public DeciderService( + IDGenerator idGenerator, ParametersUtils parametersUtils, MetadataDAO metadataDAO, ExternalPayloadStorageUtils externalPayloadStorageUtils, @@ -88,6 +87,7 @@ public DeciderService( @Qualifier("taskMappersByTaskType") Map taskMappers, @Value("${conductor.app.taskPendingTimeThreshold:60m}") Duration taskPendingTimeThreshold) { + this.idGenerator = idGenerator; this.metadataDAO = metadataDAO; this.parametersUtils = parametersUtils; this.taskMappers = taskMappers; @@ -569,7 +569,7 @@ Optional retry( rescheduled.setCallbackAfterSeconds(startDelay); rescheduled.setRetryCount(task.getRetryCount() + 1); rescheduled.setRetried(false); - rescheduled.setTaskId(IDGenerator.generate()); + rescheduled.setTaskId(idGenerator.generate()); rescheduled.setRetriedTaskId(task.getTaskId()); rescheduled.setStatus(SCHEDULED); rescheduled.setPollCount(0); @@ -832,7 +832,7 @@ public List getTasksToBeScheduled( .map(TaskModel::getReferenceTaskName) .collect(Collectors.toList()); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); TaskMapperContext taskMapperContext = TaskMapperContext.newBuilder() .withWorkflowModel(workflow) diff --git a/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java b/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java index 1fd88f909..be4912296 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/WorkflowExecutor.java @@ -22,13 +22,13 @@ import org.springframework.stereotype.Component; import com.netflix.conductor.annotations.Trace; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.*; import com.netflix.conductor.common.metadata.workflow.RerunWorkflowRequest; import com.netflix.conductor.common.metadata.workflow.SkipTaskRequest; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; import com.netflix.conductor.common.metadata.workflow.WorkflowTask; import com.netflix.conductor.common.run.Workflow; -import com.netflix.conductor.common.utils.RetryUtil; import com.netflix.conductor.common.utils.TaskUtils; import com.netflix.conductor.core.WorkflowContext; import com.netflix.conductor.core.config.ConductorProperties; @@ -44,6 +44,7 @@ import com.netflix.conductor.core.utils.IDGenerator; import com.netflix.conductor.core.utils.ParametersUtils; import com.netflix.conductor.core.utils.QueueUtils; +import com.netflix.conductor.core.utils.Utils; import com.netflix.conductor.dao.MetadataDAO; import com.netflix.conductor.dao.QueueDAO; import com.netflix.conductor.metrics.Monitors; @@ -51,9 +52,6 @@ import com.netflix.conductor.model.WorkflowModel; import com.netflix.conductor.service.ExecutionLockService; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; - import static com.netflix.conductor.core.exception.ApplicationException.Code.*; import static com.netflix.conductor.core.utils.Utils.DECIDER_QUEUE; import static com.netflix.conductor.model.TaskModel.Status.*; @@ -73,6 +71,7 @@ public class WorkflowExecutor { private final MetadataMapperService metadataMapperService; private final ExecutionDAOFacade executionDAOFacade; private final ParametersUtils parametersUtils; + private final IDGenerator idGenerator; private final WorkflowStatusListener workflowStatusListener; private final SystemTaskRegistry systemTaskRegistry; @@ -104,7 +103,8 @@ public WorkflowExecutor( ConductorProperties properties, ExecutionLockService executionLockService, SystemTaskRegistry systemTaskRegistry, - ParametersUtils parametersUtils) { + ParametersUtils parametersUtils, + IDGenerator idGenerator) { this.deciderService = deciderService; this.metadataDAO = metadataDAO; this.queueDAO = queueDAO; @@ -115,10 +115,13 @@ public WorkflowExecutor( this.workflowStatusListener = workflowStatusListener; this.executionLockService = executionLockService; this.parametersUtils = parametersUtils; + this.idGenerator = idGenerator; this.systemTaskRegistry = systemTaskRegistry; } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -129,7 +132,9 @@ public String startWorkflow( name, version, correlationId, input, externalInputPayloadStoragePath, null); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -147,7 +152,9 @@ public String startWorkflow( null); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -166,7 +173,9 @@ public String startWorkflow( event); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -188,7 +197,9 @@ public String startWorkflow( null); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -208,7 +219,9 @@ public String startWorkflow( taskToDomain); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -231,7 +244,9 @@ public String startWorkflow( taskToDomain); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -253,7 +268,9 @@ public String startWorkflow( null); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( WorkflowDef workflowDefinition, Map workflowInput, @@ -271,7 +288,9 @@ public String startWorkflow( taskToDomain); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( WorkflowDef workflowDefinition, Map workflowInput, @@ -292,7 +311,9 @@ public String startWorkflow( taskToDomain); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -316,7 +337,9 @@ public String startWorkflow( taskToDomain); } - /** @throws ApplicationException */ + /** + * @throws ApplicationException + */ public String startWorkflow( String name, Integer version, @@ -343,7 +366,9 @@ public String startWorkflow( taskToDomain); } - /** @throws ApplicationException if validation fails */ + /** + * @throws ApplicationException if validation fails + */ public String startWorkflow( WorkflowDef workflowDefinition, Map workflowInput, @@ -361,7 +386,7 @@ public String startWorkflow( validateWorkflow(workflowDefinition, workflowInput, externalInputPayloadStoragePath); // A random UUID is assigned to the work flow instance - String workflowId = IDGenerator.generate(); + String workflowId = idGenerator.generate(); // Persist the Workflow WorkflowModel workflow = new WorkflowModel(); @@ -487,8 +512,7 @@ public void resetCallbacksForWorkflow(String workflowId) { } public String rerun(RerunWorkflowRequest request) { - Preconditions.checkNotNull( - request.getReRunFromWorkflowId(), "reRunFromWorkflowId is missing"); + Utils.checkNotNull(request.getReRunFromWorkflowId(), "reRunFromWorkflowId is missing"); if (!rerunWF( request.getReRunFromWorkflowId(), request.getReRunFromTaskId(), @@ -756,7 +780,7 @@ private WorkflowModel findLastFailedSubWorkflowIfAny( */ private TaskModel taskToBeRescheduled(WorkflowModel workflow, TaskModel task) { TaskModel taskToBeRetried = task.copy(); - taskToBeRetried.setTaskId(IDGenerator.generate()); + taskToBeRetried.setTaskId(idGenerator.generate()); taskToBeRetried.setRetriedTaskId(task.getTaskId()); taskToBeRetried.setStatus(SCHEDULED); taskToBeRetried.setRetryCount(task.getRetryCount() + 1); @@ -1160,33 +1184,15 @@ public void updateTask(TaskResult taskResult) { case IN_PROGRESS: case SCHEDULED: try { - String postponeTaskMessageDesc = - "Postponing Task message in queue for taskId: " + task.getTaskId(); - String postponeTaskMessageOperation = "postponeTaskMessage"; - - new RetryUtil<>() - .retryOnException( - () -> { - // postpone based on callbackAfterSeconds - long callBack = taskResult.getCallbackAfterSeconds(); - queueDAO.postpone( - taskQueueName, - task.getTaskId(), - task.getWorkflowPriority(), - callBack); - LOGGER.debug( - "Task: {} postponed in taskQueue: {} since the task status is {} with callbackAfterSeconds: {}", - task, - taskQueueName, - task.getStatus().name(), - callBack); - return null; - }, - null, - null, - 2, - postponeTaskMessageDesc, - postponeTaskMessageOperation); + long callBack = taskResult.getCallbackAfterSeconds(); + queueDAO.postpone( + taskQueueName, task.getTaskId(), task.getWorkflowPriority(), callBack); + LOGGER.debug( + "Task: {} postponed in taskQueue: {} since the task status is {} with callbackAfterSeconds: {}", + task, + taskQueueName, + task.getStatus().name(), + callBack); } catch (Exception e) { // Throw exceptions on queue postpone, this would impact task execution String errorMsg = @@ -1205,20 +1211,7 @@ public void updateTask(TaskResult taskResult) { // Throw an ApplicationException if below operations fail to avoid workflow inconsistencies. try { - String updateTaskDesc = "Updating Task with taskId: " + task.getTaskId(); - String updateTaskOperation = "updateTask"; - - new RetryUtil<>() - .retryOnException( - () -> { - executionDAOFacade.updateTask(task); - return null; - }, - null, - null, - 2, - updateTaskDesc, - updateTaskOperation); + executionDAOFacade.updateTask(task); } catch (Exception e) { String errorMsg = String.format( @@ -1309,10 +1302,11 @@ public boolean decide(String workflowId) { List tasksToBeScheduled = outcome.tasksToBeScheduled; setTaskDomains(tasksToBeScheduled, workflow); List tasksToBeUpdated = outcome.tasksToBeUpdated; - boolean stateChanged = false; tasksToBeScheduled = dedupAndAddTasks(workflow, tasksToBeScheduled); + boolean stateChanged = scheduleTask(workflow, tasksToBeScheduled); // start + for (TaskModel task : outcome.tasksToBeScheduled) { if (systemTaskRegistry.isSystemTask(task.getTaskType()) && NON_TERMINAL_TASK.test(task)) { @@ -1331,12 +1325,9 @@ public boolean decide(String workflowId) { executionDAOFacade.updateWorkflow(workflow); } - stateChanged = scheduleTask(workflow, tasksToBeScheduled) || stateChanged; - if (stateChanged) { decide(workflowId); } - } catch (TerminateWorkflowException twe) { LOGGER.info("Execution terminated of workflow: {}", workflowId, twe); terminate(workflow, twe); @@ -1467,7 +1458,9 @@ List dedupAndAddTasks(WorkflowModel workflow, List tasks) return dedupedTasks; } - /** @throws ApplicationException if the workflow cannot be paused */ + /** + * @throws ApplicationException if the workflow cannot be paused + */ public void pauseWorkflow(String workflowId) { try { executionLockService.acquireLock(workflowId, 60000); @@ -1575,7 +1568,7 @@ public void skipTaskFromWorkflow( // Now create a "SKIPPED" task for this workflow TaskModel taskToBeSkipped = new TaskModel(); - taskToBeSkipped.setTaskId(IDGenerator.generate()); + taskToBeSkipped.setTaskId(idGenerator.generate()); taskToBeSkipped.setReferenceTaskName(taskReferenceName); taskToBeSkipped.setWorkflowInstanceId(workflowId); taskToBeSkipped.setWorkflowPriority(workflow.getPriority()); @@ -1690,7 +1683,6 @@ private long getTaskDuration(long s, TaskModel task) { @VisibleForTesting boolean scheduleTask(WorkflowModel workflow, List tasks) { - List createdTasks; List tasksToBeQueued; boolean startedSystemTasks = false; @@ -1828,6 +1820,13 @@ private boolean rerunWF( // Get the workflow WorkflowModel workflow = executionDAOFacade.getWorkflowModel(workflowId, true); + if (!workflow.getStatus().isTerminal()) { + String errorMsg = + String.format( + "Workflow: %s is not in terminal state, unable to rerun.", workflow); + LOGGER.error(errorMsg); + throw new ApplicationException(CONFLICT, errorMsg); + } updateAndPushParents(workflow, "reran"); // If the task Id is null it implies that the entire workflow has to be rerun diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java index b2fd2fed1..45b2add89 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapper.java @@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; import com.netflix.conductor.common.metadata.workflow.WorkflowTask; @@ -32,8 +33,6 @@ import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.google.common.annotations.VisibleForTesting; - /** * An implementation of {@link TaskMapper} to map a {@link WorkflowTask} of type {@link * TaskType#DECISION} to a List {@link TaskModel} starting with Task of type {@link diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java index 1691e69df..51609b919 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapper.java @@ -12,8 +12,6 @@ */ package com.netflix.conductor.core.execution.mapper; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Optional; @@ -26,7 +24,6 @@ import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; import com.netflix.conductor.common.metadata.workflow.WorkflowTask; -import com.netflix.conductor.common.utils.TaskUtils; import com.netflix.conductor.dao.MetadataDAO; import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; @@ -63,7 +60,6 @@ public TaskType getTaskType() { */ @Override public List getMappedTasks(TaskMapperContext taskMapperContext) { - LOGGER.debug("TaskMapperContext {} in DoWhileTaskMapper", taskMapperContext); WorkflowTask workflowTask = taskMapperContext.getWorkflowTask(); @@ -72,11 +68,9 @@ public List getMappedTasks(TaskMapperContext taskMapperContext) { TaskModel task = workflowModel.getTaskByRefName(workflowTask.getTaskReferenceName()); if (task != null && task.getStatus().isTerminal()) { // Since loopTask is already completed no need to schedule task again. - return Collections.emptyList(); + return List.of(); } - List tasksToBeScheduled = new ArrayList<>(); - int retryCount = taskMapperContext.getRetryCount(); TaskDef taskDefinition = Optional.ofNullable(taskMapperContext.getTaskDefinition()) .orElseGet( @@ -86,28 +80,14 @@ public List getMappedTasks(TaskMapperContext taskMapperContext) { workflowTask.getName())) .orElseGet(TaskDef::new)); - TaskModel loopTask = taskMapperContext.createTaskModel(); - loopTask.setTaskType(TaskType.TASK_TYPE_DO_WHILE); - loopTask.setIteration(1); - loopTask.setStatus(TaskModel.Status.IN_PROGRESS); - loopTask.setRateLimitPerFrequency(taskDefinition.getRateLimitPerFrequency()); - loopTask.setRateLimitFrequencyInSeconds(taskDefinition.getRateLimitFrequencyInSeconds()); - - tasksToBeScheduled.add(loopTask); - List loopOverTasks = workflowTask.getLoopOver(); - List tasks2 = - taskMapperContext - .getDeciderService() - .getTasksToBeScheduled(workflowModel, loopOverTasks.get(0), retryCount); - tasks2.forEach( - t -> { - t.setReferenceTaskName( - TaskUtils.appendIteration( - t.getReferenceTaskName(), loopTask.getIteration())); - t.setIteration(loopTask.getIteration()); - }); - tasksToBeScheduled.addAll(tasks2); + TaskModel doWhileTask = taskMapperContext.createTaskModel(); + doWhileTask.setTaskType(TaskType.TASK_TYPE_DO_WHILE); + doWhileTask.setStatus(TaskModel.Status.IN_PROGRESS); + doWhileTask.setStartTime(System.currentTimeMillis()); + doWhileTask.setRateLimitPerFrequency(taskDefinition.getRateLimitPerFrequency()); + doWhileTask.setRateLimitFrequencyInSeconds(taskDefinition.getRateLimitFrequencyInSeconds()); + doWhileTask.setRetryCount(taskMapperContext.getRetryCount()); - return tasksToBeScheduled; + return List.of(doWhileTask); } } diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java index 5d92add45..506fbbdc6 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapper.java @@ -22,6 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskDef; import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; @@ -32,8 +33,6 @@ import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.google.common.annotations.VisibleForTesting; - /** * An implementation of {@link TaskMapper} to map a {@link WorkflowTask} of type {@link * TaskType#DYNAMIC} to a {@link TaskModel} based on definition derived from the dynamic task name diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java index 5734dba5e..0a013b3b9 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapper.java @@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.DynamicForkJoinTaskList; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; @@ -41,7 +42,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.annotations.VisibleForTesting; /** * An implementation of {@link TaskMapper} to map a {@link WorkflowTask} of type {@link @@ -54,6 +54,7 @@ public class ForkJoinDynamicTaskMapper implements TaskMapper { public static final Logger LOGGER = LoggerFactory.getLogger(ForkJoinDynamicTaskMapper.class); + private final IDGenerator idGenerator; private final ParametersUtils parametersUtils; private final ObjectMapper objectMapper; private final MetadataDAO metadataDAO; @@ -62,7 +63,11 @@ public class ForkJoinDynamicTaskMapper implements TaskMapper { @Autowired public ForkJoinDynamicTaskMapper( - ParametersUtils parametersUtils, ObjectMapper objectMapper, MetadataDAO metadataDAO) { + IDGenerator idGenerator, + ParametersUtils parametersUtils, + ObjectMapper objectMapper, + MetadataDAO metadataDAO) { + this.idGenerator = idGenerator; this.parametersUtils = parametersUtils; this.objectMapper = objectMapper; this.metadataDAO = metadataDAO; @@ -226,11 +231,8 @@ public List getMappedTasks(TaskMapperContext taskMapperContext) * This method creates a FORK task and adds the list of dynamic fork tasks keyed by * "forkedTaskDefs" and their names keyed by "forkedTasks" into {@link TaskModel#getInputData()} * - * @param workflowTask A {@link WorkflowTask} representing {@link TaskType#FORK_JOIN_DYNAMIC} - * @param workflowModel: A instance of the {@link WorkflowModel} which represents the workflow - * being executed. - * @param taskId: The string representation of {@link java.util.UUID} which will be set as the - * taskId. + * @param taskMapperContext: The {@link TaskMapperContext} which wraps workflowTask, workflowDef + * and workflowModel * @param dynForkTasks: The list of dynamic forked tasks, the reference names of these tasks * will be added to the forkDynamicTask * @return A new instance of {@link TaskModel} representing a {@link TaskType#TASK_TYPE_FORK} @@ -284,7 +286,7 @@ TaskModel createJoinTask( joinTask.setScheduledTime(System.currentTimeMillis()); joinTask.setStartTime(System.currentTimeMillis()); joinTask.setInputData(joinInput); - joinTask.setTaskId(IDGenerator.generate()); + joinTask.setTaskId(idGenerator.generate()); joinTask.setStatus(TaskModel.Status.IN_PROGRESS); joinTask.setWorkflowTask(joinWorkflowTask); joinTask.setWorkflowPriority(workflowModel.getPriority()); diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java index 64a77df1d..167cd3aef 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapper.java @@ -18,6 +18,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.SubWorkflowParams; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; @@ -28,8 +29,6 @@ import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.google.common.annotations.VisibleForTesting; - import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_SUB_WORKFLOW; @Component diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java index 58366fdcf..af9bedc76 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/DoWhile.java @@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskDef; import com.netflix.conductor.common.utils.TaskUtils; import com.netflix.conductor.core.events.ScriptEvaluator; @@ -30,8 +31,6 @@ import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.google.common.annotations.VisibleForTesting; - import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_DO_WHILE; @Component(TASK_TYPE_DO_WHILE) @@ -53,38 +52,49 @@ public void cancel(WorkflowModel workflow, TaskModel task, WorkflowExecutor exec @Override public boolean execute( - WorkflowModel workflow, TaskModel task, WorkflowExecutor workflowExecutor) { + WorkflowModel workflow, TaskModel doWhileTaskModel, WorkflowExecutor workflowExecutor) { boolean allDone = true; boolean hasFailures = false; StringBuilder failureReason = new StringBuilder(); Map output = new HashMap<>(); - task.getOutputData().put("iteration", task.getIteration()); /* * Get the latest set of tasks (the ones that have the highest retry count). We don't want to evaluate any tasks * that have already failed if there is a more current one (a later retry count). */ Map relevantTasks = new LinkedHashMap<>(); - TaskModel relevantTask = null; + TaskModel relevantTask; for (TaskModel t : workflow.getTasks()) { - if (task.getWorkflowTask() + if (doWhileTaskModel + .getWorkflowTask() .has(TaskUtils.removeIterationFromTaskRefName(t.getReferenceTaskName())) - && !task.getReferenceTaskName().equals(t.getReferenceTaskName()) - && task.getIteration() == t.getIteration()) { + && !doWhileTaskModel.getReferenceTaskName().equals(t.getReferenceTaskName()) + && doWhileTaskModel.getIteration() == t.getIteration()) { relevantTask = relevantTasks.get(t.getReferenceTaskName()); if (relevantTask == null || t.getRetryCount() > relevantTask.getRetryCount()) { relevantTasks.put(t.getReferenceTaskName(), t); } } } - Collection loopOver = relevantTasks.values(); + Collection loopOverTasks = relevantTasks.values(); LOGGER.debug( "Workflow {} waiting for tasks {} to complete iteration {}", workflow.getWorkflowId(), - loopOver.stream().map(TaskModel::getReferenceTaskName).collect(Collectors.toList()), - task.getIteration()); - for (TaskModel loopOverTask : loopOver) { + loopOverTasks.stream() + .map(TaskModel::getReferenceTaskName) + .collect(Collectors.toList()), + doWhileTaskModel.getIteration()); + + // if the loopOver collection is empty, no tasks inside the loop have been scheduled. + // so schedule it and exit the method. + if (loopOverTasks.isEmpty()) { + doWhileTaskModel.setIteration(1); + doWhileTaskModel.addOutput("iteration", doWhileTaskModel.getIteration()); + return scheduleNextIteration(doWhileTaskModel, workflow, workflowExecutor); + } + + for (TaskModel loopOverTask : loopOverTasks) { TaskModel.Status taskStatus = loopOverTask.getStatus(); hasFailures = !taskStatus.isSuccessful(); if (hasFailures) { @@ -98,43 +108,53 @@ public boolean execute( break; } } - task.getOutputData().put(String.valueOf(task.getIteration()), output); + doWhileTaskModel + .getOutputData() + .put(String.valueOf(doWhileTaskModel.getIteration()), output); if (hasFailures) { LOGGER.debug( - "taskid {} failed in {} iteration", task.getTaskId(), task.getIteration() + 1); - return updateLoopTask(task, TaskModel.Status.FAILED, failureReason.toString()); + "Task {} failed in {} iteration", + doWhileTaskModel.getTaskId(), + doWhileTaskModel.getIteration() + 1); + return updateLoopTask( + doWhileTaskModel, TaskModel.Status.FAILED, failureReason.toString()); } else if (!allDone) { return false; } boolean shouldContinue; try { - shouldContinue = getEvaluatedCondition(workflow, task, workflowExecutor); - LOGGER.debug("taskid {} condition evaluated to {}", task.getTaskId(), shouldContinue); + shouldContinue = getEvaluatedCondition(workflow, doWhileTaskModel, workflowExecutor); + LOGGER.debug( + "Task {} condition evaluated to {}", + doWhileTaskModel.getTaskId(), + shouldContinue); if (shouldContinue) { - task.setIteration(task.getIteration() + 1); - return scheduleNextIteration(task, workflow, workflowExecutor); + doWhileTaskModel.setIteration(doWhileTaskModel.getIteration() + 1); + doWhileTaskModel.getOutputData().put("iteration", doWhileTaskModel.getIteration()); + return scheduleNextIteration(doWhileTaskModel, workflow, workflowExecutor); } else { LOGGER.debug( - "taskid {} took {} iterations to complete", - task.getTaskId(), - task.getIteration() + 1); - return markLoopTaskSuccess(task); + "Task {} took {} iterations to complete", + doWhileTaskModel.getTaskId(), + doWhileTaskModel.getIteration() + 1); + return markLoopTaskSuccess(doWhileTaskModel); } } catch (ScriptException e) { String message = String.format( "Unable to evaluate condition %s , exception %s", - task.getWorkflowTask().getLoopCondition(), e.getMessage()); + doWhileTaskModel.getWorkflowTask().getLoopCondition(), e.getMessage()); LOGGER.error(message); - LOGGER.error("Marking task {} failed with error.", task.getTaskId()); - return updateLoopTask(task, TaskModel.Status.FAILED_WITH_TERMINAL_ERROR, message); + LOGGER.error("Marking task {} failed with error.", doWhileTaskModel.getTaskId()); + return updateLoopTask( + doWhileTaskModel, TaskModel.Status.FAILED_WITH_TERMINAL_ERROR, message); } } boolean scheduleNextIteration( TaskModel task, WorkflowModel workflow, WorkflowExecutor workflowExecutor) { LOGGER.debug( - "Scheduling loop tasks for taskid {} as condition {} evaluated to true", + "Scheduling loop tasks for task {} as condition {} evaluated to true", task.getTaskId(), task.getWorkflowTask().getLoopCondition()); workflowExecutor.scheduleNextIteration(task, workflow); @@ -150,7 +170,7 @@ boolean updateLoopTask(TaskModel task, TaskModel.Status status, String failureRe boolean markLoopTaskSuccess(TaskModel task) { LOGGER.debug( - "taskid {} took {} iterations to complete", + "task {} took {} iterations to complete", task.getTaskId(), task.getIteration() + 1); task.setStatus(TaskModel.Status.COMPLETED); @@ -198,7 +218,7 @@ boolean getEvaluatedCondition( boolean shouldContinue = false; if (condition != null) { LOGGER.debug("Condition: {} is being evaluated", condition); - // Evaluate the expression by using the Nashhorn based script evaluator + // Evaluate the expression by using the Nashorn based script evaluator shouldContinue = ScriptEvaluator.evalBool(condition, taskInput); } return shouldContinue; diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java index 0dec908c8..5e9a9aef4 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/Event.java @@ -20,6 +20,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.core.events.EventQueues; import com.netflix.conductor.core.events.queue.Message; import com.netflix.conductor.core.events.queue.ObservableQueue; @@ -31,7 +32,6 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.annotations.VisibleForTesting; import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_EVENT; diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java index 890a33ebf..7115dfd1d 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/ExecutionConfig.java @@ -15,9 +15,9 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import com.netflix.conductor.core.utils.SemaphoreUtil; +import org.apache.commons.lang3.concurrent.BasicThreadFactory; -import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.netflix.conductor.core.utils.SemaphoreUtil; class ExecutionConfig { @@ -29,7 +29,7 @@ class ExecutionConfig { this.executorService = Executors.newFixedThreadPool( threadCount, - new ThreadFactoryBuilder().setNameFormat(threadNameFormat).build()); + new BasicThreadFactory.Builder().namingPattern(threadNameFormat).build()); this.semaphoreUtil = new SemaphoreUtil(threadCount); } diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java index e357a80e2..5a5ac33a8 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/IsolatedTaskQueueProducer.java @@ -29,12 +29,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskDef; import com.netflix.conductor.core.utils.QueueUtils; import com.netflix.conductor.service.MetadataService; -import com.google.common.annotations.VisibleForTesting; - import static com.netflix.conductor.core.execution.tasks.SystemTaskRegistry.ASYNC_SYSTEM_TASKS_QUALIFIER; @Component diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java index 04ac69d55..29bf6bb2a 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorker.java @@ -25,6 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.core.LifecycleAwareComponent; import com.netflix.conductor.core.config.ConductorProperties; import com.netflix.conductor.core.execution.AsyncSystemTaskExecutor; @@ -34,8 +35,6 @@ import com.netflix.conductor.metrics.Monitors; import com.netflix.conductor.service.ExecutionService; -import com.google.common.annotations.VisibleForTesting; - /** The worker that polls and executes an async system task. */ @Component @ConditionalOnProperty( diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java index 6992727a1..b1a9ed988 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/SystemTaskWorkerCoordinator.java @@ -23,11 +23,10 @@ import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.core.config.ConductorProperties; import com.netflix.conductor.core.utils.QueueUtils; -import com.google.common.annotations.VisibleForTesting; - import static com.netflix.conductor.core.execution.tasks.SystemTaskRegistry.ASYNC_SYSTEM_TASKS_QUALIFIER; @Component diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java index b23b77c6e..e8db7c6d8 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/WorkflowSystemTask.java @@ -65,7 +65,9 @@ public boolean execute( */ public void cancel(WorkflowModel workflow, TaskModel task, WorkflowExecutor workflowExecutor) {} - /** @return True if the task is supposed to be started asynchronously using internal queues. */ + /** + * @return True if the task is supposed to be started asynchronously using internal queues. + */ public boolean isAsync() { return false; } @@ -86,7 +88,9 @@ public boolean isAsyncComplete(TaskModel task) { } } - /** @return name of the system task */ + /** + * @return name of the system task + */ public String getTaskType() { return taskType; } diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAO.java b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAO.java similarity index 98% rename from contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAO.java rename to core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAO.java index 4b5f22c6b..4a7f427cb 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAO.java +++ b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAO.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.dao.index; +package com.netflix.conductor.core.index; import java.util.Collections; import java.util.List; diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAOConfiguration.java b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAOConfiguration.java similarity index 95% rename from contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAOConfiguration.java rename to core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAOConfiguration.java index b9feec8de..0e9e2466b 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/dao/index/NoopIndexDAOConfiguration.java +++ b/core/src/main/java/com/netflix/conductor/core/index/NoopIndexDAOConfiguration.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.dao.index; +package com.netflix.conductor.core.index; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; diff --git a/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java b/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java index bd761c3b2..b5d3fd400 100644 --- a/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java +++ b/core/src/main/java/com/netflix/conductor/core/metadata/MetadataMapperService.java @@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.SubWorkflowParams; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; @@ -28,14 +29,12 @@ import com.netflix.conductor.core.WorkflowContext; import com.netflix.conductor.core.exception.ApplicationException; import com.netflix.conductor.core.exception.TerminateWorkflowException; +import com.netflix.conductor.core.utils.Utils; import com.netflix.conductor.dao.MetadataDAO; import com.netflix.conductor.metrics.Monitors; import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; - /** * Populates metadata definitions within workflow objects. Benefits of loading and populating * metadata definitions upfront could be: @@ -79,7 +78,7 @@ public WorkflowDef lookupForWorkflowDefinition(String name, Integer version) { @VisibleForTesting Optional lookupWorkflowDefinition(String workflowName, int workflowVersion) { - Preconditions.checkArgument( + Utils.checkArgument( StringUtils.isNotBlank(workflowName), "Workflow name must be specified when searching for a definition"); return metadataDAO.getWorkflowDef(workflowName, workflowVersion); @@ -87,14 +86,14 @@ Optional lookupWorkflowDefinition(String workflowName, int workflow @VisibleForTesting Optional lookupLatestWorkflowDefinition(String workflowName) { - Preconditions.checkArgument( + Utils.checkArgument( StringUtils.isNotBlank(workflowName), "Workflow name must be specified when searching for a definition"); return metadataDAO.getLatestWorkflowDef(workflowName); } public WorkflowModel populateWorkflowWithDefinitions(WorkflowModel workflow) { - Preconditions.checkNotNull(workflow, "workflow cannot be null"); + Utils.checkNotNull(workflow, "workflow cannot be null"); WorkflowDef workflowDefinition = Optional.ofNullable(workflow.getWorkflowDefinition()) .orElseGet( @@ -114,14 +113,14 @@ public WorkflowModel populateWorkflowWithDefinitions(WorkflowModel workflow) { } public WorkflowDef populateTaskDefinitions(WorkflowDef workflowDefinition) { - Preconditions.checkNotNull(workflowDefinition, "workflowDefinition cannot be null"); + Utils.checkNotNull(workflowDefinition, "workflowDefinition cannot be null"); workflowDefinition.collectTasks().forEach(this::populateWorkflowTaskWithDefinition); checkNotEmptyDefinitions(workflowDefinition); return workflowDefinition; } private void populateWorkflowTaskWithDefinition(WorkflowTask workflowTask) { - Preconditions.checkNotNull(workflowTask, "WorkflowTask cannot be null"); + Utils.checkNotNull(workflowTask, "WorkflowTask cannot be null"); if (shouldPopulateTaskDefinition(workflowTask)) { workflowTask.setTaskDefinition(metadataDAO.getTaskDef(workflowTask.getName())); } @@ -131,7 +130,7 @@ private void populateWorkflowTaskWithDefinition(WorkflowTask workflowTask) { } private void populateVersionForSubWorkflow(WorkflowTask workflowTask) { - Preconditions.checkNotNull(workflowTask, "WorkflowTask cannot be null"); + Utils.checkNotNull(workflowTask, "WorkflowTask cannot be null"); SubWorkflowParams subworkflowParams = workflowTask.getSubWorkflowParam(); if (subworkflowParams.getVersion() == null) { String subWorkflowName = subworkflowParams.getName(); @@ -153,7 +152,7 @@ private void populateVersionForSubWorkflow(WorkflowTask workflowTask) { } private void checkNotEmptyDefinitions(WorkflowDef workflowDefinition) { - Preconditions.checkNotNull(workflowDefinition, "WorkflowDefinition cannot be null"); + Utils.checkNotNull(workflowDefinition, "WorkflowDefinition cannot be null"); // Obtain the names of the tasks with missing definitions Set missingTaskDefinitionNames = @@ -179,15 +178,15 @@ private void checkNotEmptyDefinitions(WorkflowDef workflowDefinition) { } public TaskModel populateTaskWithDefinition(TaskModel task) { - Preconditions.checkNotNull(task, "Task cannot be null"); + Utils.checkNotNull(task, "Task cannot be null"); populateWorkflowTaskWithDefinition(task.getWorkflowTask()); return task; } @VisibleForTesting boolean shouldPopulateTaskDefinition(WorkflowTask workflowTask) { - Preconditions.checkNotNull(workflowTask, "WorkflowTask cannot be null"); - Preconditions.checkNotNull(workflowTask.getType(), "WorkflowTask type cannot be null"); + Utils.checkNotNull(workflowTask, "WorkflowTask cannot be null"); + Utils.checkNotNull(workflowTask.getType(), "WorkflowTask type cannot be null"); return workflowTask.getTaskDefinition() == null && StringUtils.isNotBlank(workflowTask.getName()); } diff --git a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java index 5ac05e24f..769fe8ddb 100644 --- a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java +++ b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowRepairService.java @@ -21,6 +21,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.core.config.ConductorProperties; import com.netflix.conductor.core.execution.tasks.SystemTaskRegistry; import com.netflix.conductor.core.execution.tasks.WorkflowSystemTask; @@ -32,8 +33,6 @@ import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; -import com.google.common.annotations.VisibleForTesting; - /** * A helper service that tries to keep ExecutionDAO and QueueDAO in sync, based on the task or * workflow state. diff --git a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java index e21894da1..2d3c1eaa5 100644 --- a/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java +++ b/core/src/main/java/com/netflix/conductor/core/reconciliation/WorkflowSweeper.java @@ -76,11 +76,7 @@ public void sweep(String workflowId) { boolean done = workflowExecutor.decide(workflowId); if (done) { queueDAO.remove(DECIDER_QUEUE, workflowId); - } else { - queueDAO.setUnackTimeout( - DECIDER_QUEUE, - workflowId, - properties.getWorkflowOffsetTimeout().toMillis()); + return; } } catch (ApplicationException e) { if (e.getCode() == ApplicationException.Code.NOT_FOUND) { @@ -89,12 +85,13 @@ public void sweep(String workflowId) { "Workflow NOT found for id:{}. Removed it from decider queue", workflowId, e); + return; } } catch (Exception e) { - queueDAO.setUnackTimeout( - DECIDER_QUEUE, workflowId, properties.getWorkflowOffsetTimeout().toMillis()); Monitors.error(CLASS_NAME, "sweep"); LOGGER.error("Error running sweep for " + workflowId, e); } + queueDAO.setUnackTimeout( + DECIDER_QUEUE, workflowId, properties.getWorkflowOffsetTimeout().toMillis()); } } diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLock.java b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLock.java similarity index 87% rename from contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLock.java rename to core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLock.java index 36cb86ecc..ec5f6eec0 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLock.java +++ b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLock.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.lock; +package com.netflix.conductor.core.sync.local; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; @@ -23,12 +23,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.core.sync.Lock; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.CacheLoader; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; public class LocalOnlyLock implements Lock { @@ -44,7 +44,7 @@ public Semaphore load(String key) { private static final ConcurrentHashMap> SCHEDULEDFUTURES = new ConcurrentHashMap<>(); private static final LoadingCache LOCKIDTOSEMAPHOREMAP = - CacheBuilder.newBuilder().build(LOADER); + Caffeine.newBuilder().build(LOADER); private static final ThreadGroup THREAD_GROUP = new ThreadGroup("LocalOnlyLock-scheduler"); private static final ThreadFactory THREAD_FACTORY = runnable -> new Thread(THREAD_GROUP, runnable); @@ -54,14 +54,14 @@ public Semaphore load(String key) { @Override public void acquireLock(String lockId) { LOGGER.trace("Locking {}", lockId); - LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).acquireUninterruptibly(); + LOCKIDTOSEMAPHOREMAP.get(lockId).acquireUninterruptibly(); } @Override public boolean acquireLock(String lockId, long timeToTry, TimeUnit unit) { try { LOGGER.trace("Locking {} with timeout {} {}", lockId, timeToTry, unit); - return LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).tryAcquire(timeToTry, unit); + return LOCKIDTOSEMAPHOREMAP.get(lockId).tryAcquire(timeToTry, unit); } catch (InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException(e); @@ -100,9 +100,9 @@ public void releaseLock(String lockId) { // The check is here to prevent semaphore getting above 1 // e.g. in case when lease runs out but release is also called synchronized (LOCKIDTOSEMAPHOREMAP) { - if (LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).availablePermits() == 0) { + if (LOCKIDTOSEMAPHOREMAP.get(lockId).availablePermits() == 0) { LOGGER.trace("Releasing {}", lockId); - LOCKIDTOSEMAPHOREMAP.getUnchecked(lockId).release(); + LOCKIDTOSEMAPHOREMAP.get(lockId).release(); removeLeaseExpirationJob(lockId); } } diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLockConfiguration.java b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLockConfiguration.java similarity index 95% rename from contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLockConfiguration.java rename to core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLockConfiguration.java index 431dc0de5..41a025406 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/lock/LocalOnlyLockConfiguration.java +++ b/core/src/main/java/com/netflix/conductor/core/sync/local/LocalOnlyLockConfiguration.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.lock; +package com.netflix.conductor.core.sync.local; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; diff --git a/core/src/main/java/com/netflix/conductor/core/sync/NoopLock.java b/core/src/main/java/com/netflix/conductor/core/sync/noop/NoopLock.java similarity index 92% rename from core/src/main/java/com/netflix/conductor/core/sync/NoopLock.java rename to core/src/main/java/com/netflix/conductor/core/sync/noop/NoopLock.java index 912a23c42..5d492da1e 100644 --- a/core/src/main/java/com/netflix/conductor/core/sync/NoopLock.java +++ b/core/src/main/java/com/netflix/conductor/core/sync/noop/NoopLock.java @@ -10,10 +10,12 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.core.sync; +package com.netflix.conductor.core.sync.noop; import java.util.concurrent.TimeUnit; +import com.netflix.conductor.core.sync.Lock; + public class NoopLock implements Lock { @Override diff --git a/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java b/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java index 1c1227912..eb6e86265 100644 --- a/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java +++ b/core/src/main/java/com/netflix/conductor/core/utils/ExternalPayloadStorageUtils.java @@ -25,6 +25,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import com.netflix.conductor.annotations.VisibleForTesting; import com.netflix.conductor.common.run.ExternalStorageLocation; import com.netflix.conductor.common.utils.ExternalPayloadStorage; import com.netflix.conductor.common.utils.ExternalPayloadStorage.PayloadType; @@ -36,7 +37,6 @@ import com.netflix.conductor.model.WorkflowModel; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.annotations.VisibleForTesting; /** Provides utility functions to upload and download payloads to {@link ExternalPayloadStorage} */ @Component diff --git a/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java b/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java index bc09f1011..813d63aa9 100644 --- a/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java +++ b/core/src/main/java/com/netflix/conductor/core/utils/IDGenerator.java @@ -14,9 +14,27 @@ import java.util.UUID; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +@Component +@ConditionalOnProperty( + name = "conductor.id.generator", + havingValue = "default", + matchIfMissing = true) +/** + * ID Generator used by Conductor Note on overriding the ID Generator: The default ID generator uses + * UUID v4 as the ID format. By overriding this class it is possible to use different scheme for ID + * generation. However, this is not normal and should only be done after very careful consideration. + * + *

Please note, if you use Cassandra persistence, the schema uses UUID as the column type and the + * IDs have to be valid UUIDs supported by Cassandra. + */ public class IDGenerator { - public static String generate() { + public IDGenerator() {} + + public String generate() { return UUID.randomUUID().toString(); } } diff --git a/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java b/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java index b7397807d..e76344ff8 100644 --- a/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java +++ b/core/src/main/java/com/netflix/conductor/core/utils/ParametersUtils.java @@ -34,7 +34,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Preconditions; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.DocumentContext; import com.jayway.jsonpath.JsonPath; @@ -125,6 +124,7 @@ public Map getTaskInputV2( "reasonForIncompletion", task.getReasonForIncompletion()); taskParams.put("callbackAfterSeconds", task.getCallbackAfterSeconds()); taskParams.put("workerId", task.getWorkerId()); + taskParams.put("iteration", task.getIteration()); inputMap.put( task.isLoopOverTask() ? TaskUtils.removeIterationFromTaskRefName( @@ -286,7 +286,7 @@ private Map getTaskInputV1( (paramName, value) -> { String paramPath = "" + value; String[] paramPathComponents = paramPath.split("\\."); - Preconditions.checkArgument( + Utils.checkArgument( paramPathComponents.length == 3, "Invalid input expression for " + paramName diff --git a/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java b/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java index b381ec468..bca477390 100644 --- a/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java +++ b/core/src/main/java/com/netflix/conductor/core/utils/QueueUtils.java @@ -40,14 +40,13 @@ public static String getQueueName(Task task) { } /** - * @param taskType - * @param domain - * @param isolationGroup - * @param executionNameSpace - * @return //domain:taskType@eexecutionNameSpace-isolationGroup + * Creates a queue name string using taskType, domain, + * isolationGroupId and executionNamespace. + * + * @return domain:taskType@eexecutionNameSpace-isolationGroupId. */ public static String getQueueName( - String taskType, String domain, String isolationGroup, String executionNameSpace) { + String taskType, String domain, String isolationGroupId, String executionNamespace) { String queueName; if (domain == null) { @@ -56,12 +55,12 @@ public static String getQueueName( queueName = domain + DOMAIN_SEPARATOR + taskType; } - if (executionNameSpace != null) { - queueName = queueName + EXECUTION_NAME_SPACE_SEPARATOR + executionNameSpace; + if (executionNamespace != null) { + queueName = queueName + EXECUTION_NAME_SPACE_SEPARATOR + executionNamespace; } - if (isolationGroup != null) { - queueName = queueName + ISOLATION_SEPARATOR + isolationGroup; + if (isolationGroupId != null) { + queueName = queueName + ISOLATION_SEPARATOR + isolationGroupId; } return queueName; } diff --git a/core/src/main/java/com/netflix/conductor/core/utils/Utils.java b/core/src/main/java/com/netflix/conductor/core/utils/Utils.java index 013f7dc95..537d1137a 100644 --- a/core/src/main/java/com/netflix/conductor/core/utils/Utils.java +++ b/core/src/main/java/com/netflix/conductor/core/utils/Utils.java @@ -14,18 +14,12 @@ import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import org.apache.commons.lang3.StringUtils; import com.netflix.conductor.core.exception.ApplicationException; -import com.google.common.base.Preconditions; - public class Utils { public static final String DECIDER_QUEUE = "_deciderQueue"; @@ -66,7 +60,7 @@ public static List convertStringToList(String inputStr) { */ public static void checkArgument(boolean condition, String errorMessage) { if (!condition) { - throw new ApplicationException(ApplicationException.Code.INVALID_INPUT, errorMessage); + throw new IllegalArgumentException(errorMessage); } } @@ -104,9 +98,7 @@ public static void checkNotNullOrEmpty(Map map, String errorMessage) { * @throws ApplicationException if input string is not valid */ public static void checkNotNullOrEmpty(String input, String errorMessage) { - try { - Preconditions.checkArgument(StringUtils.isNotBlank(input), errorMessage); - } catch (IllegalArgumentException exception) { + if (StringUtils.isEmpty(input)) { throw new ApplicationException(ApplicationException.Code.INVALID_INPUT, errorMessage); } } @@ -119,10 +111,26 @@ public static void checkNotNullOrEmpty(String input, String errorMessage) { * @throws ApplicationException if input object is not valid */ public static void checkNotNull(Object object, String errorMessage) { - try { - Preconditions.checkNotNull(object, errorMessage); - } catch (NullPointerException exception) { - throw new ApplicationException(ApplicationException.Code.INVALID_INPUT, errorMessage); + if (object == null) { + throw new NullPointerException(errorMessage); + } + } + + /** + * Used to determine if the exception is thrown due to a transient failure and the operation is + * expected to succeed upon retrying. + * + * @param throwable the exception that is thrown + * @return true - if the exception is a transient failure + *

false - if the exception is non-transient + */ + public static boolean isTransientException(Throwable throwable) { + if (throwable != null) { + return !((throwable instanceof UnsupportedOperationException) + || (throwable instanceof ApplicationException + && ((ApplicationException) throwable).getCode() + != ApplicationException.Code.BACKEND_ERROR)); } + return true; } } diff --git a/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java b/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java index fa32024db..6c9dc47a9 100644 --- a/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java +++ b/core/src/main/java/com/netflix/conductor/dao/EventHandlerDAO.java @@ -26,13 +26,19 @@ public interface EventHandlerDAO { */ void addEventHandler(EventHandler eventHandler); - /** @param eventHandler Event handler to be updated. */ + /** + * @param eventHandler Event handler to be updated. + */ void updateEventHandler(EventHandler eventHandler); - /** @param name Removes the event handler from the system */ + /** + * @param name Removes the event handler from the system + */ void removeEventHandler(String name); - /** @return All the event handlers registered in the system */ + /** + * @return All the event handlers registered in the system + */ List getAllEventHandlers(); /** diff --git a/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java b/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java index 967551e6b..8e33cac29 100644 --- a/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java +++ b/core/src/main/java/com/netflix/conductor/dao/ExecutionDAO.java @@ -47,7 +47,9 @@ public interface ExecutionDAO { */ List createTasks(List tasks); - /** @param task Task to be updated */ + /** + * @param task Task to be updated + */ void updateTask(TaskModel task); /** @@ -202,9 +204,13 @@ List getWorkflowsByCorrelationId( */ boolean addEventExecution(EventExecution eventExecution); - /** @param eventExecution Event execution to be updated */ + /** + * @param eventExecution Event execution to be updated + */ void updateEventExecution(EventExecution eventExecution); - /** @param eventExecution Event execution to be removed */ + /** + * @param eventExecution Event execution to be removed + */ void removeEventExecution(EventExecution eventExecution); } diff --git a/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java b/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java index 876f0d8dc..490758d15 100644 --- a/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java +++ b/core/src/main/java/com/netflix/conductor/dao/IndexDAO.java @@ -43,7 +43,9 @@ public interface IndexDAO { */ CompletableFuture asyncIndexWorkflow(WorkflowSummary workflow); - /** @param task Task to be indexed */ + /** + * @param task Task to be indexed + */ void indexTask(TaskSummary task); /** @@ -118,7 +120,9 @@ CompletableFuture asyncUpdateWorkflow( */ String get(String workflowInstanceId, String key); - /** @param logs Task Execution logs to be indexed */ + /** + * @param logs Task Execution logs to be indexed + */ void addTaskExecutionLogs(List logs); /** @@ -133,7 +137,9 @@ CompletableFuture asyncUpdateWorkflow( */ List getTaskExecutionLogs(String taskId); - /** @param eventExecution Event Execution to be indexed */ + /** + * @param eventExecution Event Execution to be indexed + */ void addEventExecution(EventExecution eventExecution); List getEventExecutions(String event); diff --git a/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java b/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java index e6e203c6d..1d6bb7020 100644 --- a/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java +++ b/core/src/main/java/com/netflix/conductor/dao/MetadataDAO.java @@ -21,7 +21,9 @@ /** Data access layer for the workflow metadata - task definitions and workflow definitions */ public interface MetadataDAO { - /** @param taskDef task definition to be created */ + /** + * @param taskDef task definition to be created + */ void createTaskDef(TaskDef taskDef); /** @@ -36,16 +38,24 @@ public interface MetadataDAO { */ TaskDef getTaskDef(String name); - /** @return All the task definitions */ + /** + * @return All the task definitions + */ List getAllTaskDefs(); - /** @param name Name of the task */ + /** + * @param name Name of the task + */ void removeTaskDef(String name); - /** @param def workflow definition */ + /** + * @param def workflow definition + */ void createWorkflowDef(WorkflowDef def); - /** @param def workflow definition */ + /** + * @param def workflow definition + */ void updateWorkflowDef(WorkflowDef def); /** @@ -67,6 +77,8 @@ public interface MetadataDAO { */ void removeWorkflowDef(String name, Integer version); - /** @return List of all the workflow definitions */ + /** + * @return List of all the workflow definitions + */ List getAllWorkflowDefs(); } diff --git a/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java b/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java index d14c7cfb4..70b5857c5 100644 --- a/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java +++ b/core/src/main/java/com/netflix/conductor/dao/QueueDAO.java @@ -110,13 +110,19 @@ public interface QueueDAO { */ boolean setUnackTimeout(String queueName, String messageId, long unackTimeout); - /** @param queueName Name of the queue */ + /** + * @param queueName Name of the queue + */ void flush(String queueName); - /** @return key : queue name, value: size of the queue */ + /** + * @return key : queue name, value: size of the queue + */ Map queuesDetail(); - /** @return key : queue name, value: map of shard name to size and unack queue size */ + /** + * @return key : queue name, value: map of shard name to size and unack queue size + */ Map>> queuesDetailVerbose(); default void processUnacks(String queueName) {} diff --git a/core/src/main/java/com/netflix/conductor/model/TaskModel.java b/core/src/main/java/com/netflix/conductor/model/TaskModel.java index 57071099d..6c207a0dd 100644 --- a/core/src/main/java/com/netflix/conductor/model/TaskModel.java +++ b/core/src/main/java/com/netflix/conductor/model/TaskModel.java @@ -189,14 +189,18 @@ public void setInputData(Map inputData) { this.inputData = inputData; } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @JsonProperty("inputData") @Deprecated public void setRawInputData(Map inputData) { setInputData(inputData); } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @JsonProperty("inputData") @Deprecated public Map getRawInputData() { @@ -395,14 +399,18 @@ public void setOutputData(Map outputData) { this.outputData = outputData; } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @JsonProperty("outputData") @Deprecated public void setRawOutputData(Map inputData) { setOutputData(inputData); } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @JsonProperty("outputData") @Deprecated public Map getRawOutputData() { @@ -538,7 +546,9 @@ public void incrementPollCount() { ++this.pollCount; } - /** @return {@link Optional} containing the task definition if available */ + /** + * @return {@link Optional} containing the task definition if available + */ public Optional getTaskDefinition() { return Optional.ofNullable(this.getWorkflowTask()).map(WorkflowTask::getTaskDefinition); } @@ -547,7 +557,9 @@ public boolean isLoopOverTask() { return iteration > 0; } - /** @return the queueWaitTime */ + /** + * @return the queueWaitTime + */ public long getQueueWaitTime() { if (this.startTime > 0 && this.scheduledTime > 0) { if (this.updateTime > 0 && getCallbackAfterSeconds() > 0) { @@ -562,7 +574,9 @@ public long getQueueWaitTime() { return 0L; } - /** @return a copy of the task instance */ + /** + * @return a copy of the task instance + */ public TaskModel copy() { TaskModel copy = new TaskModel(); BeanUtils.copyProperties(this, copy); diff --git a/core/src/main/java/com/netflix/conductor/model/WorkflowModel.java b/core/src/main/java/com/netflix/conductor/model/WorkflowModel.java index 596872597..315563365 100644 --- a/core/src/main/java/com/netflix/conductor/model/WorkflowModel.java +++ b/core/src/main/java/com/netflix/conductor/model/WorkflowModel.java @@ -20,10 +20,10 @@ import com.netflix.conductor.common.metadata.workflow.WorkflowDef; import com.netflix.conductor.common.run.Workflow; +import com.netflix.conductor.core.utils.Utils; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; -import com.google.common.base.Preconditions; public class WorkflowModel { @@ -197,28 +197,36 @@ public void setOutput(Map output) { this.output = output; } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @Deprecated @JsonProperty("input") public Map getRawInput() { return input; } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @Deprecated @JsonProperty("input") public void setRawInput(Map input) { setInput(input); } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @Deprecated @JsonProperty("output") public Map getRawOutput() { return output; } - /** @deprecated Used only for JSON serialization and deserialization. */ + /** + * @deprecated Used only for JSON serialization and deserialization. + */ @Deprecated @JsonProperty("output") public void setRawOutput(Map output) { @@ -378,7 +386,7 @@ public void setFailedTaskId(String failedTaskId) { * @return the workflow definition name. */ public String getWorkflowName() { - Preconditions.checkNotNull(workflowDefinition, "Workflow definition is null"); + Utils.checkNotNull(workflowDefinition, "Workflow definition is null"); return workflowDefinition.getName(); } @@ -388,7 +396,7 @@ public String getWorkflowName() { * @return the workflow definition version. */ public int getWorkflowVersion() { - Preconditions.checkNotNull(workflowDefinition, "Workflow definition is null"); + Utils.checkNotNull(workflowDefinition, "Workflow definition is null"); return workflowDefinition.getVersion(); } diff --git a/core/src/main/java/com/netflix/conductor/service/ExecutionService.java b/core/src/main/java/com/netflix/conductor/service/ExecutionService.java index 9a4d8ba8d..97f95dbee 100644 --- a/core/src/main/java/com/netflix/conductor/service/ExecutionService.java +++ b/core/src/main/java/com/netflix/conductor/service/ExecutionService.java @@ -197,6 +197,7 @@ public List poll( } executionDAOFacade.updateTaskLastPoll(taskType, domain, workerId); Monitors.recordTaskPoll(queueName); + tasks.forEach(this::ackTaskReceived); return tasks; } @@ -292,11 +293,15 @@ public boolean ackTaskReceived(Task task) { public Map getTaskQueueSizes(List taskDefNames) { Map sizes = new HashMap<>(); for (String taskDefName : taskDefNames) { - sizes.put(taskDefName, queueDAO.getSize(taskDefName)); + sizes.put(taskDefName, getTaskQueueSize(taskDefName)); } return sizes; } + public Integer getTaskQueueSize(String queueName) { + return queueDAO.getSize(queueName); + } + public void removeTaskFromQueue(String taskId) { Task task = getTask(taskId); if (task == null) { diff --git a/core/src/main/java/com/netflix/conductor/service/MetadataService.java b/core/src/main/java/com/netflix/conductor/service/MetadataService.java index d87be2ff7..bf690f809 100644 --- a/core/src/main/java/com/netflix/conductor/service/MetadataService.java +++ b/core/src/main/java/com/netflix/conductor/service/MetadataService.java @@ -29,19 +29,27 @@ @Validated public interface MetadataService { - /** @param taskDefinitions Task Definitions to register */ + /** + * @param taskDefinitions Task Definitions to register + */ void registerTaskDef( @NotNull(message = "TaskDefList cannot be empty or null") @Size(min = 1, message = "TaskDefList is empty") List<@Valid TaskDef> taskDefinitions); - /** @param taskDefinition Task Definition to be updated */ + /** + * @param taskDefinition Task Definition to be updated + */ void updateTaskDef(@NotNull(message = "TaskDef cannot be null") @Valid TaskDef taskDefinition); - /** @param taskType Remove task definition */ + /** + * @param taskType Remove task definition + */ void unregisterTaskDef(@NotEmpty(message = "TaskName cannot be null or empty") String taskType); - /** @return List of all the registered tasks */ + /** + * @return List of all the registered tasks + */ List getTaskDefs(); /** @@ -50,10 +58,14 @@ void registerTaskDef( */ TaskDef getTaskDef(@NotEmpty(message = "TaskType cannot be null or empty") String taskType); - /** @param def Workflow definition to be updated */ + /** + * @param def Workflow definition to be updated + */ void updateWorkflowDef(@NotNull(message = "WorkflowDef cannot be null") @Valid WorkflowDef def); - /** @param workflowDefList Workflow definitions to be updated. */ + /** + * @param workflowDefList Workflow definitions to be updated. + */ void updateWorkflowDef( @NotNull(message = "WorkflowDef list name cannot be null or empty") @Size(min = 1, message = "WorkflowDefList is empty") @@ -96,15 +108,21 @@ void unregisterWorkflowDef( void addEventHandler( @NotNull(message = "EventHandler cannot be null") @Valid EventHandler eventHandler); - /** @param eventHandler Event handler to be updated. */ + /** + * @param eventHandler Event handler to be updated. + */ void updateEventHandler( @NotNull(message = "EventHandler cannot be null") @Valid EventHandler eventHandler); - /** @param name Removes the event handler from the system */ + /** + * @param name Removes the event handler from the system + */ void removeEventHandlerStatus( @NotEmpty(message = "EventName cannot be null or empty") String name); - /** @return All the event handlers registered in the system */ + /** + * @return All the event handlers registered in the system + */ List getAllEventHandlers(); /** diff --git a/core/src/main/java/com/netflix/conductor/service/MetadataServiceImpl.java b/core/src/main/java/com/netflix/conductor/service/MetadataServiceImpl.java index d0e97c478..24ebd0308 100644 --- a/core/src/main/java/com/netflix/conductor/service/MetadataServiceImpl.java +++ b/core/src/main/java/com/netflix/conductor/service/MetadataServiceImpl.java @@ -47,7 +47,9 @@ public MetadataServiceImpl( properties.isOwnerEmailMandatory()); } - /** @param taskDefinitions Task Definitions to register */ + /** + * @param taskDefinitions Task Definitions to register + */ public void registerTaskDef(List taskDefinitions) { for (TaskDef taskDefinition : taskDefinitions) { taskDefinition.setCreatedBy(WorkflowContext.get().getClientApp()); @@ -59,7 +61,9 @@ public void registerTaskDef(List taskDefinitions) { } } - /** @param taskDefinition Task Definition to be updated */ + /** + * @param taskDefinition Task Definition to be updated + */ public void updateTaskDef(TaskDef taskDefinition) { TaskDef existing = metadataDAO.getTaskDef(taskDefinition.getName()); if (existing == null) { @@ -71,12 +75,16 @@ public void updateTaskDef(TaskDef taskDefinition) { metadataDAO.updateTaskDef(taskDefinition); } - /** @param taskType Remove task definition */ + /** + * @param taskType Remove task definition + */ public void unregisterTaskDef(String taskType) { metadataDAO.removeTaskDef(taskType); } - /** @return List of all the registered tasks */ + /** + * @return List of all the registered tasks + */ public List getTaskDefs() { return metadataDAO.getAllTaskDefs(); } @@ -94,13 +102,17 @@ public TaskDef getTaskDef(String taskType) { return taskDef; } - /** @param workflowDef Workflow definition to be updated */ + /** + * @param workflowDef Workflow definition to be updated + */ public void updateWorkflowDef(WorkflowDef workflowDef) { workflowDef.setUpdateTime(System.currentTimeMillis()); metadataDAO.updateWorkflowDef(workflowDef); } - /** @param workflowDefList Workflow definitions to be updated. */ + /** + * @param workflowDefList Workflow definitions to be updated. + */ public void updateWorkflowDef(List workflowDefList) { for (WorkflowDef workflowDef : workflowDefList) { workflowDef.setUpdateTime(System.currentTimeMillis()); @@ -171,17 +183,23 @@ public void addEventHandler(EventHandler eventHandler) { eventHandlerDAO.addEventHandler(eventHandler); } - /** @param eventHandler Event handler to be updated. */ + /** + * @param eventHandler Event handler to be updated. + */ public void updateEventHandler(EventHandler eventHandler) { eventHandlerDAO.updateEventHandler(eventHandler); } - /** @param name Removes the event handler from the system */ + /** + * @param name Removes the event handler from the system + */ public void removeEventHandlerStatus(String name) { eventHandlerDAO.removeEventHandler(name); } - /** @return All the event handlers registered in the system */ + /** + * @return All the event handlers registered in the system + */ public List getAllEventHandlers() { return eventHandlerDAO.getAllEventHandlers(); } diff --git a/core/src/main/java/com/netflix/conductor/service/TaskService.java b/core/src/main/java/com/netflix/conductor/service/TaskService.java index 03e1371aa..7f4f3d0a6 100644 --- a/core/src/main/java/com/netflix/conductor/service/TaskService.java +++ b/core/src/main/java/com/netflix/conductor/service/TaskService.java @@ -164,6 +164,15 @@ void removeTaskFromQueue( */ Map getTaskQueueSizes(List taskTypes); + /** + * Get the queue size for a Task Type. The input can optionally include domain, + * isolationGroupId and executionNamespace. + * + * @return + */ + Integer getTaskQueueSize( + String taskType, String domain, String isolationGroupId, String executionNamespace); + /** * Get the details about each queue. * diff --git a/core/src/main/java/com/netflix/conductor/service/TaskServiceImpl.java b/core/src/main/java/com/netflix/conductor/service/TaskServiceImpl.java index 9865dccd3..333b2e346 100644 --- a/core/src/main/java/com/netflix/conductor/service/TaskServiceImpl.java +++ b/core/src/main/java/com/netflix/conductor/service/TaskServiceImpl.java @@ -34,7 +34,7 @@ import com.netflix.conductor.common.run.SearchResult; import com.netflix.conductor.common.run.TaskSummary; import com.netflix.conductor.common.utils.ExternalPayloadStorage; -import com.netflix.conductor.common.utils.RetryUtil; +import com.netflix.conductor.core.utils.QueueUtils; import com.netflix.conductor.dao.QueueDAO; import com.netflix.conductor.metrics.Monitors; @@ -160,22 +160,9 @@ public String ackTaskReceived(String taskId, String workerId) { */ public boolean ackTaskReceived(String taskId) { LOGGER.debug("Ack received for task: {}", taskId); - String ackTaskDesc = "Ack Task with taskId: " + taskId; - String ackTaskOperation = "ackTaskReceived"; AtomicBoolean ackResult = new AtomicBoolean(false); try { - new RetryUtil<>() - .retryOnException( - () -> { - ackResult.set(executionService.ackTaskReceived(taskId)); - return null; - }, - null, - null, - 3, - ackTaskDesc, - ackTaskOperation); - + ackResult.set(executionService.ackTaskReceived(taskId)); } catch (Exception e) { // Fail the task and let decide reevaluate the workflow, thereby preventing workflow // being stuck from transient ack errors. @@ -268,6 +255,15 @@ public Map getTaskQueueSizes(List taskTypes) { return executionService.getTaskQueueSizes(taskTypes); } + @Override + public Integer getTaskQueueSize( + String taskType, String domain, String isolationGroupId, String executionNamespace) { + String queueName = + QueueUtils.getQueueName(taskType, domain, isolationGroupId, executionNamespace); + + return executionService.getTaskQueueSize(queueName); + } + /** * Get the details about each queue. * diff --git a/core/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/core/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 4a58b5767..b8d811422 100644 --- a/core/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/core/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -90,6 +90,17 @@ "description": "Enables the processor for the default event queues that conductor is configured to listen on.", "sourceType": "com.netflix.conductor.core.events.queue.DefaultEventQueueProcessor", "defaultValue": "true" + }, + { + "name": "conductor.workflow-status-listener.type", + "type": "java.lang.String", + "description": "The implementation of the workflow status listener to be used." + }, + { + "name": "conductor.workflow-execution-lock.type", + "type": "java.lang.String", + "description": "The implementation of the workflow execution lock to be used.", + "defaultValue": "noop_lock" } ], "hints": [ @@ -99,18 +110,28 @@ { "value": "dummy", "description": "Use the dummy no-op implementation as the external payload storage." - }, + } + ] + }, + { + "name": "conductor.workflow-status-listener.type", + "values": [ { - "value": "azureblob", - "description": "Use Azure Blob as the external payload storage." - }, + "value": "stub", + "description": "Use the no-op implementation of the workflow status listener." + } + ] + }, + { + "name": "conductor.workflow-execution-lock.type", + "values": [ { - "value": "s3", - "description": "Use AWS S3 as the external payload storage." + "value": "noop_lock", + "description": "Use the no-op implementation as the lock provider." }, { - "value": "postgres", - "description": "Use PostgreSQL as the external payload storage." + "value": "local_only", + "description": "Use the local in-memory cache based implementation as the lock provider." } ] } diff --git a/core/src/test/groovy/com/netflix/conductor/core/execution/AsyncSystemTaskExecutorTest.groovy b/core/src/test/groovy/com/netflix/conductor/core/execution/AsyncSystemTaskExecutorTest.groovy index dc1e11b57..2cc4a00bb 100644 --- a/core/src/test/groovy/com/netflix/conductor/core/execution/AsyncSystemTaskExecutorTest.groovy +++ b/core/src/test/groovy/com/netflix/conductor/core/execution/AsyncSystemTaskExecutorTest.groovy @@ -66,7 +66,7 @@ class AsyncSystemTaskExecutorTest extends Specification { String subWorkflowId = "subWorkflowId" SubWorkflow subWorkflowTask = new SubWorkflow(new ObjectMapper()) - String task1Id = IDGenerator.generate() + String task1Id = new IDGenerator().generate() TaskModel task1 = new TaskModel() task1.setTaskType(SUB_WORKFLOW.name()) task1.setReferenceTaskName("waitTask") diff --git a/core/src/test/groovy/com/netflix/conductor/core/execution/tasks/DoWhileSpec.groovy b/core/src/test/groovy/com/netflix/conductor/core/execution/tasks/DoWhileSpec.groovy new file mode 100644 index 000000000..cc4d658d5 --- /dev/null +++ b/core/src/test/groovy/com/netflix/conductor/core/execution/tasks/DoWhileSpec.groovy @@ -0,0 +1,313 @@ +/* + * Copyright 2022 Netflix, Inc. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package com.netflix.conductor.core.execution.tasks + +import com.netflix.conductor.common.metadata.workflow.WorkflowDef +import com.netflix.conductor.common.metadata.workflow.WorkflowTask +import com.netflix.conductor.common.utils.TaskUtils +import com.netflix.conductor.core.exception.TerminateWorkflowException +import com.netflix.conductor.core.execution.WorkflowExecutor +import com.netflix.conductor.core.utils.ParametersUtils +import com.netflix.conductor.model.TaskModel +import com.netflix.conductor.model.WorkflowModel + +import com.fasterxml.jackson.databind.ObjectMapper +import spock.lang.Specification +import spock.lang.Subject + +import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_DO_WHILE +import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_HTTP + +class DoWhileSpec extends Specification { + + @Subject + DoWhile doWhile + + ParametersUtils parametersUtils + WorkflowExecutor workflowExecutor + TaskModel doWhileTaskModel + + WorkflowTask task1, task2 + TaskModel taskModel1, taskModel2 + + def setup() { + workflowExecutor = Mock(WorkflowExecutor.class) + parametersUtils = new ParametersUtils(new ObjectMapper()) + + task1 = new WorkflowTask(name: 'task1', taskReferenceName: 'task1') + task2 = new WorkflowTask(name: 'task2', taskReferenceName: 'task2') + + doWhile = new DoWhile(parametersUtils) + } + + def "first iteration"() { + given: + WorkflowTask doWhileWorkflowTask = new WorkflowTask(taskReferenceName: 'doWhileTask', type: TASK_TYPE_DO_WHILE) + doWhileWorkflowTask.loopCondition = "if (\$.doWhileTask['iteration'] < 1) { true; } else { false; }" + doWhileWorkflowTask.loopOver = [task1, task2] + doWhileTaskModel = new TaskModel(workflowTask: doWhileWorkflowTask, taskId: UUID.randomUUID().toString(), + taskType: TASK_TYPE_DO_WHILE, referenceTaskName: doWhileWorkflowTask.taskReferenceName) + + def workflowModel = new WorkflowModel() + workflowModel.tasks = [doWhileTaskModel] + + when: + def retVal = doWhile.execute(workflowModel, doWhileTaskModel, workflowExecutor) + + then: "verify that return value is true, iteration value is updated in DO_WHILE TaskModel" + retVal + + and: "verify the iteration value" + doWhileTaskModel.iteration == 1 + doWhileTaskModel.outputData['iteration'] == 1 + + and: "verify whether the first task is scheduled" + 1 * workflowExecutor.scheduleNextIteration(doWhileTaskModel, workflowModel) + } + + def "next iteration - one iteration of all tasks inside DO_WHILE are complete"() { + given: "WorkflowModel consists of one iteration of tasks inside DO_WHILE already completed" + taskModel1 = createTaskModel(task1) + taskModel2 = createTaskModel(task2) + + WorkflowTask doWhileWorkflowTask = new WorkflowTask(taskReferenceName: 'doWhileTask', type: TASK_TYPE_DO_WHILE) + doWhileWorkflowTask.loopCondition = "if (\$.doWhileTask['iteration'] < 2) { true; } else { false; }" + doWhileWorkflowTask.loopOver = [task1, task2] + + doWhileTaskModel = new TaskModel(workflowTask: doWhileWorkflowTask, taskId: UUID.randomUUID().toString(), + taskType: TASK_TYPE_DO_WHILE, referenceTaskName: doWhileWorkflowTask.taskReferenceName) + doWhileTaskModel.iteration = 1 + doWhileTaskModel.outputData['iteration'] = 1 + doWhileTaskModel.status = TaskModel.Status.IN_PROGRESS + + def workflowModel = new WorkflowModel(workflowDefinition: new WorkflowDef(name: 'test_workflow')) + // setup the WorkflowModel + workflowModel.tasks = [doWhileTaskModel, taskModel1, taskModel2] + + // this is the expected format of iteration 1's output data + def iteration1OutputData = [:] + iteration1OutputData[task1.taskReferenceName] = taskModel1.outputData + iteration1OutputData[task2.taskReferenceName] = taskModel2.outputData + + when: + def retVal = doWhile.execute(workflowModel, doWhileTaskModel, workflowExecutor) + + then: "verify that the return value is true, since the iteration is updated" + retVal + + and: "verify that the DO_WHILE TaskModel is correct" + doWhileTaskModel.iteration == 2 + doWhileTaskModel.outputData['iteration'] == 2 + doWhileTaskModel.outputData['1'] == iteration1OutputData + doWhileTaskModel.status == TaskModel.Status.IN_PROGRESS + + and: "verify whether the first task in the next iteration is scheduled" + 1 * workflowExecutor.scheduleNextIteration(doWhileTaskModel, workflowModel) + + and: "verify that WorkflowExecutor.getTaskDefinition throws TerminateWorkflowException, execute method is not impacted" + 1 * workflowExecutor.getTaskDefinition(doWhileTaskModel) >> { throw new TerminateWorkflowException("") } + } + + def "next iteration - a task failed in the previous iteration"() { + given: "WorkflowModel consists of one iteration of tasks one of which is FAILED" + taskModel1 = createTaskModel(task1) + + taskModel2 = createTaskModel(task2, TaskModel.Status.FAILED) + taskModel2.reasonForIncompletion = 'no specific reason, i am tired of success' + + WorkflowTask doWhileWorkflowTask = new WorkflowTask(taskReferenceName: 'doWhileTask', type: TASK_TYPE_DO_WHILE) + doWhileWorkflowTask.loopCondition = "if (\$.doWhileTask['iteration'] < 2) { true; } else { false; }" + doWhileWorkflowTask.loopOver = [task1, task2] + + doWhileTaskModel = new TaskModel(workflowTask: doWhileWorkflowTask, taskId: UUID.randomUUID().toString(), + taskType: TASK_TYPE_DO_WHILE, referenceTaskName: doWhileWorkflowTask.taskReferenceName) + doWhileTaskModel.iteration = 1 + doWhileTaskModel.outputData['iteration'] = 1 + doWhileTaskModel.status = TaskModel.Status.IN_PROGRESS + + def workflowModel = new WorkflowModel(workflowDefinition: new WorkflowDef(name: 'test_workflow')) + // setup the WorkflowModel + workflowModel.tasks = [doWhileTaskModel, taskModel1, taskModel2] + + // this is the expected format of iteration 1's output data + def iteration1OutputData = [:] + iteration1OutputData[task1.taskReferenceName] = taskModel1.outputData + iteration1OutputData[task2.taskReferenceName] = taskModel2.outputData + + when: + def retVal = doWhile.execute(workflowModel, doWhileTaskModel, workflowExecutor) + + then: "verify that return value is true, status is updated" + retVal + + and: "verify the status and reasonForIncompletion fields" + doWhileTaskModel.iteration == 1 + doWhileTaskModel.outputData['iteration'] == 1 + doWhileTaskModel.outputData['1'] == iteration1OutputData + doWhileTaskModel.status == TaskModel.Status.FAILED + doWhileTaskModel.reasonForIncompletion && doWhileTaskModel.reasonForIncompletion.contains(taskModel2.reasonForIncompletion) + + and: "verify that next iteration is NOT scheduled" + 0 * workflowExecutor.scheduleNextIteration(doWhileTaskModel, workflowModel) + } + + def "next iteration - a task is in progress in the previous iteration"() { + given: "WorkflowModel consists of one iteration of tasks inside DO_WHILE already completed" + taskModel1 = createTaskModel(task1) + taskModel2 = createTaskModel(task2, TaskModel.Status.IN_PROGRESS) + taskModel2.outputData = [:] // no output data, task is in progress + + WorkflowTask doWhileWorkflowTask = new WorkflowTask(taskReferenceName: 'doWhileTask', type: TASK_TYPE_DO_WHILE) + doWhileWorkflowTask.loopCondition = "if (\$.doWhileTask['iteration'] < 2) { true; } else { false; }" + doWhileWorkflowTask.loopOver = [task1, task2] + + doWhileTaskModel = new TaskModel(workflowTask: doWhileWorkflowTask, taskId: UUID.randomUUID().toString(), + taskType: TASK_TYPE_DO_WHILE, referenceTaskName: doWhileWorkflowTask.taskReferenceName) + doWhileTaskModel.iteration = 1 + doWhileTaskModel.outputData['iteration'] = 1 + doWhileTaskModel.status = TaskModel.Status.IN_PROGRESS + + def workflowModel = new WorkflowModel(workflowDefinition: new WorkflowDef(name: 'test_workflow')) + // setup the WorkflowModel + workflowModel.tasks = [doWhileTaskModel, taskModel1, taskModel2] + + // this is the expected format of iteration 1's output data + def iteration1OutputData = [:] + iteration1OutputData[task1.taskReferenceName] = taskModel1.outputData + iteration1OutputData[task2.taskReferenceName] = [:] + + when: + def retVal = doWhile.execute(workflowModel, doWhileTaskModel, workflowExecutor) + + then: "verify that return value is false, since the DO_WHILE task model is not updated" + !retVal + + and: "verify that DO_WHILE task model is not modified" + doWhileTaskModel.iteration == 1 + doWhileTaskModel.outputData['iteration'] == 1 + doWhileTaskModel.outputData['1'] == iteration1OutputData + doWhileTaskModel.status == TaskModel.Status.IN_PROGRESS + + and: "verify that next iteration is NOT scheduled" + 0 * workflowExecutor.scheduleNextIteration(doWhileTaskModel, workflowModel) + } + + def "final step - all iterations are complete and all tasks in them are successful"() { + given: "WorkflowModel consists of one iteration of tasks inside DO_WHILE already completed" + taskModel1 = createTaskModel(task1) + taskModel2 = createTaskModel(task2) + + WorkflowTask doWhileWorkflowTask = new WorkflowTask(taskReferenceName: 'doWhileTask', type: TASK_TYPE_DO_WHILE) + doWhileWorkflowTask.loopCondition = "if (\$.doWhileTask['iteration'] < 1) { true; } else { false; }" + doWhileWorkflowTask.loopOver = [task1, task2] + + doWhileTaskModel = new TaskModel(workflowTask: doWhileWorkflowTask, taskId: UUID.randomUUID().toString(), + taskType: TASK_TYPE_DO_WHILE, referenceTaskName: doWhileWorkflowTask.taskReferenceName) + doWhileTaskModel.iteration = 1 + doWhileTaskModel.outputData['iteration'] = 1 + doWhileTaskModel.status = TaskModel.Status.IN_PROGRESS + + def workflowModel = new WorkflowModel(workflowDefinition: new WorkflowDef(name: 'test_workflow')) + // setup the WorkflowModel + workflowModel.tasks = [doWhileTaskModel, taskModel1, taskModel2] + + // this is the expected format of iteration 1's output data + def iteration1OutputData = [:] + iteration1OutputData[task1.taskReferenceName] = taskModel1.outputData + iteration1OutputData[task2.taskReferenceName] = taskModel2.outputData + + when: + def retVal = doWhile.execute(workflowModel, doWhileTaskModel, workflowExecutor) + + then: "verify that the return value is true, DO_WHILE TaskModel is updated" + retVal + + and: "verify the status and other fields are set correctly" + doWhileTaskModel.iteration == 1 + doWhileTaskModel.outputData['iteration'] == 1 + doWhileTaskModel.outputData['1'] == iteration1OutputData + doWhileTaskModel.status == TaskModel.Status.COMPLETED + + and: "verify that next iteration is not scheduled" + 0 * workflowExecutor.scheduleNextIteration(doWhileTaskModel, workflowModel) + } + + def "next iteration - one iteration of all tasks inside DO_WHILE are complete, but the condition is incorrect"() { + given: "WorkflowModel consists of one iteration of tasks inside DO_WHILE already completed" + taskModel1 = createTaskModel(task1) + taskModel2 = createTaskModel(task2) + + WorkflowTask doWhileWorkflowTask = new WorkflowTask(taskReferenceName: 'doWhileTask', type: TASK_TYPE_DO_WHILE) + // condition will produce a ScriptException + doWhileWorkflowTask.loopCondition = "if (dollar_sign_goes_here.doWhileTask['iteration'] < 2) { true; } else { false; }" + doWhileWorkflowTask.loopOver = [task1, task2] + + doWhileTaskModel = new TaskModel(workflowTask: doWhileWorkflowTask, taskId: UUID.randomUUID().toString(), + taskType: TASK_TYPE_DO_WHILE, referenceTaskName: doWhileWorkflowTask.taskReferenceName) + doWhileTaskModel.iteration = 1 + doWhileTaskModel.outputData['iteration'] = 1 + doWhileTaskModel.status = TaskModel.Status.IN_PROGRESS + + def workflowModel = new WorkflowModel(workflowDefinition: new WorkflowDef(name: 'test_workflow')) + // setup the WorkflowModel + workflowModel.tasks = [doWhileTaskModel, taskModel1, taskModel2] + + // this is the expected format of iteration 1's output data + def iteration1OutputData = [:] + iteration1OutputData[task1.taskReferenceName] = taskModel1.outputData + iteration1OutputData[task2.taskReferenceName] = taskModel2.outputData + + when: + def retVal = doWhile.execute(workflowModel, doWhileTaskModel, workflowExecutor) + + then: "verify that the return value is true since DO_WHILE TaskModel is updated" + retVal + + and: "verify the status of DO_WHILE TaskModel" + doWhileTaskModel.iteration == 1 + doWhileTaskModel.outputData['iteration'] == 1 + doWhileTaskModel.outputData['1'] == iteration1OutputData + doWhileTaskModel.status == TaskModel.Status.FAILED_WITH_TERMINAL_ERROR + doWhileTaskModel.reasonForIncompletion != null + + and: "verify that next iteration is not scheduled" + 0 * workflowExecutor.scheduleNextIteration(doWhileTaskModel, workflowModel) + } + + def "cancel sets the status as CANCELED"() { + given: + doWhileTaskModel = new TaskModel(taskId: UUID.randomUUID().toString(), + taskType: TASK_TYPE_DO_WHILE) + doWhileTaskModel.iteration = 1 + doWhileTaskModel.outputData['iteration'] = 1 + doWhileTaskModel.status = TaskModel.Status.IN_PROGRESS + + when: "cancel is called with null for WorkflowModel and WorkflowExecutor" + // null is used to note that those arguments are not intended to be used by this method + doWhile.cancel(null, doWhileTaskModel, null) + + then: + doWhileTaskModel.status == TaskModel.Status.CANCELED + } + + private static createTaskModel(WorkflowTask workflowTask, TaskModel.Status status = TaskModel.Status.COMPLETED, int iteration = 1) { + TaskModel taskModel1 = new TaskModel(workflowTask: workflowTask, taskType: TASK_TYPE_HTTP) + + taskModel1.status = status + taskModel1.outputData = ['k1': 'v1'] + taskModel1.iteration = iteration + taskModel1.referenceTaskName = TaskUtils.appendIteration(workflowTask.taskReferenceName, iteration) + + return taskModel1 + } +} diff --git a/core/src/test/java/com/netflix/conductor/core/events/TestDefaultEventProcessor.java b/core/src/test/java/com/netflix/conductor/core/events/TestDefaultEventProcessor.java index 2c99279bc..855890402 100644 --- a/core/src/test/java/com/netflix/conductor/core/events/TestDefaultEventProcessor.java +++ b/core/src/test/java/com/netflix/conductor/core/events/TestDefaultEventProcessor.java @@ -12,11 +12,7 @@ */ package com.netflix.conductor.core.events; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -25,8 +21,10 @@ import org.junit.runner.RunWith; import org.mockito.stubbing.Answer; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.retry.support.RetryTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; @@ -37,6 +35,7 @@ import com.netflix.conductor.common.metadata.events.EventHandler.Action.Type; import com.netflix.conductor.common.metadata.events.EventHandler.StartWorkflow; import com.netflix.conductor.common.metadata.events.EventHandler.TaskDetails; +import com.netflix.conductor.core.config.ConductorCoreConfiguration; import com.netflix.conductor.core.config.ConductorProperties; import com.netflix.conductor.core.events.queue.Message; import com.netflix.conductor.core.events.queue.ObservableQueue; @@ -54,19 +53,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyMap; -import static org.mockito.ArgumentMatchers.eq; +import static org.junit.Assert.*; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @ContextConfiguration( classes = { TestObjectMapperConfiguration.class, - TestDefaultEventProcessor.TestConfiguration.class + TestDefaultEventProcessor.TestConfiguration.class, + ConductorCoreConfiguration.class }) @RunWith(SpringRunner.class) public class TestDefaultEventProcessor { @@ -87,6 +82,9 @@ public class TestDefaultEventProcessor { @Autowired private ObjectMapper objectMapper; + @Autowired + private @Qualifier("onTransientErrorRetryTemplate") RetryTemplate retryTemplate; + @Configuration @ComponentScan(basePackageClasses = {Evaluator.class}) // load all Evaluator beans public static class TestConfiguration {} @@ -201,7 +199,8 @@ public void testEventProcessor() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); eventProcessor.handle(queue, message); assertTrue(started.get()); assertTrue(completed.get()); @@ -267,7 +266,8 @@ public void testEventHandlerWithCondition() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); eventProcessor.handle(queue, message); assertTrue(started.get()); } @@ -331,7 +331,8 @@ public void testEventHandlerWithConditionEvaluator() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); eventProcessor.handle(queue, message); assertTrue(started.get()); } @@ -368,7 +369,8 @@ public void testEventProcessorWithRetriableError() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); eventProcessor.handle(queue, message); verify(queue, never()).ack(any()); verify(queue, never()).publish(any()); @@ -407,7 +409,8 @@ public void testEventProcessorWithNonRetriableError() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); eventProcessor.handle(queue, message); verify(queue, atMost(1)).ack(any()); verify(queue, never()).publish(any()); @@ -433,7 +436,8 @@ public void testExecuteInvalidAction() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); EventExecution eventExecution = new EventExecution("id", "messageId"); eventExecution.setName("handler"); eventExecution.setStatus(EventExecution.Status.IN_PROGRESS); @@ -469,7 +473,8 @@ public void testExecuteNonRetriableApplicationException() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); EventExecution eventExecution = new EventExecution("id", "messageId"); eventExecution.setStatus(EventExecution.Status.IN_PROGRESS); eventExecution.setEvent("event"); @@ -506,7 +511,8 @@ public void testExecuteRetriableApplicationException() { jsonUtils, properties, objectMapper, - evaluators); + evaluators, + retryTemplate); EventExecution eventExecution = new EventExecution("id", "messageId"); eventExecution.setStatus(EventExecution.Status.IN_PROGRESS); eventExecution.setEvent("event"); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderOutcomes.java b/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderOutcomes.java index 910446103..9616c845c 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderOutcomes.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderOutcomes.java @@ -61,6 +61,7 @@ import com.netflix.conductor.core.execution.tasks.SystemTaskRegistry; import com.netflix.conductor.core.execution.tasks.WorkflowSystemTask; import com.netflix.conductor.core.utils.ExternalPayloadStorageUtils; +import com.netflix.conductor.core.utils.IDGenerator; import com.netflix.conductor.core.utils.ParametersUtils; import com.netflix.conductor.dao.MetadataDAO; import com.netflix.conductor.model.TaskModel; @@ -160,7 +161,8 @@ public void init() { taskMappers.put(JOIN, new JoinTaskMapper()); taskMappers.put( FORK_JOIN_DYNAMIC, - new ForkJoinDynamicTaskMapper(parametersUtils, objectMapper, metadataDAO)); + new ForkJoinDynamicTaskMapper( + new IDGenerator(), parametersUtils, objectMapper, metadataDAO)); taskMappers.put(USER_DEFINED, new UserDefinedTaskMapper(parametersUtils, metadataDAO)); taskMappers.put(SIMPLE, new SimpleTaskMapper(parametersUtils)); taskMappers.put(SUB_WORKFLOW, new SubWorkflowTaskMapper(parametersUtils, metadataDAO)); @@ -170,6 +172,7 @@ public void init() { this.deciderService = new DeciderService( + new IDGenerator(), parametersUtils, metadataDAO, externalPayloadStorageUtils, diff --git a/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderService.java b/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderService.java index ed44d8cfb..b9b921a49 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderService.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/TestDeciderService.java @@ -52,6 +52,7 @@ import com.netflix.conductor.core.execution.tasks.SystemTaskRegistry; import com.netflix.conductor.core.execution.tasks.WorkflowSystemTask; import com.netflix.conductor.core.utils.ExternalPayloadStorageUtils; +import com.netflix.conductor.core.utils.IDGenerator; import com.netflix.conductor.core.utils.ParametersUtils; import com.netflix.conductor.dao.MetadataDAO; import com.netflix.conductor.model.TaskModel; @@ -113,6 +114,11 @@ public Map taskMapperMap(Collection taskMapper public ParametersUtils parametersUtils(ObjectMapper mapper) { return new ParametersUtils(mapper); } + + @Bean + public IDGenerator idGenerator() { + return new IDGenerator(); + } } private DeciderService deciderService; @@ -153,6 +159,7 @@ public void setup() { deciderService = new DeciderService( + new IDGenerator(), parametersUtils, metadataDAO, externalPayloadStorageUtils, diff --git a/core/src/test/java/com/netflix/conductor/core/execution/TestWorkflowExecutor.java b/core/src/test/java/com/netflix/conductor/core/execution/TestWorkflowExecutor.java index 685677b5b..5a53778d2 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/TestWorkflowExecutor.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/TestWorkflowExecutor.java @@ -14,7 +14,6 @@ import java.time.Duration; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -58,7 +57,6 @@ import com.netflix.conductor.service.ExecutionLockService; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.util.concurrent.Uninterruptibles; import static com.netflix.conductor.common.metadata.tasks.TaskType.*; import static com.netflix.conductor.core.exception.ApplicationException.Code.CONFLICT; @@ -159,6 +157,7 @@ public void init() { externalPayloadStorageUtils = mock(ExternalPayloadStorageUtils.class); executionLockService = mock(ExecutionLockService.class); ParametersUtils parametersUtils = new ParametersUtils(objectMapper); + IDGenerator idGenerator = new IDGenerator(); Map taskMappers = new HashMap<>(); taskMappers.put(DECISION, new DecisionTaskMapper()); taskMappers.put(SWITCH, new SwitchTaskMapper(evaluators)); @@ -167,7 +166,8 @@ public void init() { taskMappers.put(JOIN, new JoinTaskMapper()); taskMappers.put( FORK_JOIN_DYNAMIC, - new ForkJoinDynamicTaskMapper(parametersUtils, objectMapper, metadataDAO)); + new ForkJoinDynamicTaskMapper( + idGenerator, parametersUtils, objectMapper, metadataDAO)); taskMappers.put(USER_DEFINED, new UserDefinedTaskMapper(parametersUtils, metadataDAO)); taskMappers.put(SIMPLE, new SimpleTaskMapper(parametersUtils)); taskMappers.put(SUB_WORKFLOW, new SubWorkflowTaskMapper(parametersUtils, metadataDAO)); @@ -179,6 +179,7 @@ public void init() { DeciderService deciderService = new DeciderService( + idGenerator, parametersUtils, metadataDAO, externalPayloadStorageUtils, @@ -203,11 +204,13 @@ public void init() { properties, executionLockService, systemTaskRegistry, - parametersUtils); + parametersUtils, + idGenerator); } @Test public void testScheduleTask() { + IDGenerator idGenerator = new IDGenerator(); WorkflowSystemTaskStub httpTask = beanFactory.getBean("HTTP", WorkflowSystemTaskStub.class); WorkflowSystemTaskStub http2Task = beanFactory.getBean("HTTP2", WorkflowSystemTaskStub.class); @@ -240,7 +243,7 @@ public void testScheduleTask() { task1.setWorkflowInstanceId(workflow.getWorkflowId()); task1.setCorrelationId(workflow.getCorrelationId()); task1.setScheduledTime(System.currentTimeMillis()); - task1.setTaskId(IDGenerator.generate()); + task1.setTaskId(idGenerator.generate()); task1.setInputData(new HashMap<>()); task1.setStatus(TaskModel.Status.SCHEDULED); task1.setRetryCount(0); @@ -255,7 +258,7 @@ public void testScheduleTask() { task2.setCorrelationId(workflow.getCorrelationId()); task2.setScheduledTime(System.currentTimeMillis()); task2.setInputData(new HashMap<>()); - task2.setTaskId(IDGenerator.generate()); + task2.setTaskId(idGenerator.generate()); task2.setStatus(TaskModel.Status.IN_PROGRESS); task2.setWorkflowTask(taskToSchedule); @@ -266,7 +269,7 @@ public void testScheduleTask() { task3.setWorkflowInstanceId(workflow.getWorkflowId()); task3.setCorrelationId(workflow.getCorrelationId()); task3.setScheduledTime(System.currentTimeMillis()); - task3.setTaskId(IDGenerator.generate()); + task3.setTaskId(idGenerator.generate()); task3.setInputData(new HashMap<>()); task3.setStatus(TaskModel.Status.SCHEDULED); task3.setRetryCount(0); @@ -588,7 +591,7 @@ public void testRestartWorkflow() { workflowDef.setName("testDef"); workflowDef.setVersion(1); workflowDef.setRestartable(true); - workflowDef.getTasks().addAll(Collections.singletonList(workflowTask)); + workflowDef.getTasks().add(workflowTask); TaskModel task_1 = new TaskModel(); task_1.setTaskId(UUID.randomUUID().toString()); @@ -1083,17 +1086,17 @@ public void testRetryWorkflowWithJoinTask() { @Test public void testRetryFromLastFailedSubWorkflowTaskThenStartWithLastFailedTask() { - + IDGenerator idGenerator = new IDGenerator(); // given - String id = IDGenerator.generate(); - String workflowInstanceId = IDGenerator.generate(); + String id = idGenerator.generate(); + String workflowInstanceId = idGenerator.generate(); TaskModel task = new TaskModel(); task.setTaskType(TaskType.SIMPLE.name()); task.setTaskDefName("task"); task.setReferenceTaskName("task_ref"); task.setWorkflowInstanceId(workflowInstanceId); task.setScheduledTime(System.currentTimeMillis()); - task.setTaskId(IDGenerator.generate()); + task.setTaskId(idGenerator.generate()); task.setStatus(TaskModel.Status.COMPLETED); task.setRetryCount(0); task.setWorkflowTask(new WorkflowTask()); @@ -1107,7 +1110,7 @@ public void testRetryFromLastFailedSubWorkflowTaskThenStartWithLastFailedTask() task1.setReferenceTaskName("task1_ref"); task1.setWorkflowInstanceId(workflowInstanceId); task1.setScheduledTime(System.currentTimeMillis()); - task1.setTaskId(IDGenerator.generate()); + task1.setTaskId(idGenerator.generate()); task1.setStatus(TaskModel.Status.FAILED); task1.setRetryCount(0); task1.setWorkflowTask(new WorkflowTask()); @@ -1128,7 +1131,7 @@ public void testRetryFromLastFailedSubWorkflowTaskThenStartWithLastFailedTask() TaskModel task2 = new TaskModel(); task2.setWorkflowInstanceId(subWorkflow.getWorkflowId()); task2.setScheduledTime(System.currentTimeMillis()); - task2.setTaskId(IDGenerator.generate()); + task2.setTaskId(idGenerator.generate()); task2.setStatus(TaskModel.Status.FAILED); task2.setRetryCount(0); task2.setOutputData(new HashMap<>()); @@ -1239,6 +1242,18 @@ public void testRetryTimedOutWorkflowWithoutFailedTasks() { assertEquals(1, updateTasksCalledCounter.get()); } + @Test(expected = ApplicationException.class) + public void testRerunNonTerminalWorkflow() { + WorkflowModel workflow = new WorkflowModel(); + workflow.setWorkflowId("testRetryNonTerminalWorkflow"); + workflow.setStatus(WorkflowModel.Status.RUNNING); + when(executionDAOFacade.getWorkflowModel(anyString(), anyBoolean())).thenReturn(workflow); + + RerunWorkflowRequest rerunWorkflowRequest = new RerunWorkflowRequest(); + rerunWorkflowRequest.setReRunFromWorkflowId(workflow.getWorkflowId()); + workflowExecutor.rerun(rerunWorkflowRequest); + } + @Test public void testRerunWorkflow() { // setup @@ -1305,9 +1320,10 @@ public void testRerunWorkflow() { @Test public void testRerunSubWorkflow() { + IDGenerator idGenerator = new IDGenerator(); // setup - String parentWorkflowId = IDGenerator.generate(); - String subWorkflowId = IDGenerator.generate(); + String parentWorkflowId = idGenerator.generate(); + String subWorkflowId = idGenerator.generate(); // sub workflow setup TaskModel task1 = new TaskModel(); @@ -1316,7 +1332,7 @@ public void testRerunSubWorkflow() { task1.setReferenceTaskName("task1_ref"); task1.setWorkflowInstanceId(subWorkflowId); task1.setScheduledTime(System.currentTimeMillis()); - task1.setTaskId(IDGenerator.generate()); + task1.setTaskId(idGenerator.generate()); task1.setStatus(TaskModel.Status.COMPLETED); task1.setWorkflowTask(new WorkflowTask()); task1.setOutputData(new HashMap<>()); @@ -1327,7 +1343,7 @@ public void testRerunSubWorkflow() { task2.setReferenceTaskName("task2_ref"); task2.setWorkflowInstanceId(subWorkflowId); task2.setScheduledTime(System.currentTimeMillis()); - task2.setTaskId(IDGenerator.generate()); + task2.setTaskId(idGenerator.generate()); task2.setStatus(TaskModel.Status.COMPLETED); task2.setWorkflowTask(new WorkflowTask()); task2.setOutputData(new HashMap<>()); @@ -1347,7 +1363,7 @@ public void testRerunSubWorkflow() { TaskModel task = new TaskModel(); task.setWorkflowInstanceId(parentWorkflowId); task.setScheduledTime(System.currentTimeMillis()); - task.setTaskId(IDGenerator.generate()); + task.setTaskId(idGenerator.generate()); task.setStatus(TaskModel.Status.COMPLETED); task.setOutputData(new HashMap<>()); task.setSubWorkflowId(subWorkflowId); @@ -1453,8 +1469,9 @@ public void testRerunWorkflowWithTaskId() { @Test public void testRerunWorkflowWithSyncSystemTaskId() { + IDGenerator idGenerator = new IDGenerator(); // setup - String workflowId = IDGenerator.generate(); + String workflowId = idGenerator.generate(); TaskModel task1 = new TaskModel(); task1.setTaskType(TaskType.SIMPLE.name()); @@ -1462,7 +1479,7 @@ public void testRerunWorkflowWithSyncSystemTaskId() { task1.setReferenceTaskName("task1_ref"); task1.setWorkflowInstanceId(workflowId); task1.setScheduledTime(System.currentTimeMillis()); - task1.setTaskId(IDGenerator.generate()); + task1.setTaskId(idGenerator.generate()); task1.setStatus(TaskModel.Status.COMPLETED); task1.setWorkflowTask(new WorkflowTask()); task1.setOutputData(new HashMap<>()); @@ -1511,9 +1528,11 @@ public void testRerunWorkflowWithSyncSystemTaskId() { @Test public void testRerunSubWorkflowWithTaskId() { + IDGenerator idGenerator = new IDGenerator(); + // setup - String parentWorkflowId = IDGenerator.generate(); - String subWorkflowId = IDGenerator.generate(); + String parentWorkflowId = idGenerator.generate(); + String subWorkflowId = idGenerator.generate(); // sub workflow setup TaskModel task1 = new TaskModel(); @@ -1522,7 +1541,7 @@ public void testRerunSubWorkflowWithTaskId() { task1.setReferenceTaskName("task1_ref"); task1.setWorkflowInstanceId(subWorkflowId); task1.setScheduledTime(System.currentTimeMillis()); - task1.setTaskId(IDGenerator.generate()); + task1.setTaskId(idGenerator.generate()); task1.setStatus(TaskModel.Status.COMPLETED); task1.setWorkflowTask(new WorkflowTask()); task1.setOutputData(new HashMap<>()); @@ -1533,7 +1552,7 @@ public void testRerunSubWorkflowWithTaskId() { task2.setReferenceTaskName("task2_ref"); task2.setWorkflowInstanceId(subWorkflowId); task2.setScheduledTime(System.currentTimeMillis()); - task2.setTaskId(IDGenerator.generate()); + task2.setTaskId(idGenerator.generate()); task2.setStatus(TaskModel.Status.COMPLETED); task2.setWorkflowTask(new WorkflowTask()); task2.setOutputData(new HashMap<>()); @@ -1553,7 +1572,7 @@ public void testRerunSubWorkflowWithTaskId() { TaskModel task = new TaskModel(); task.setWorkflowInstanceId(parentWorkflowId); task.setScheduledTime(System.currentTimeMillis()); - task.setTaskId(IDGenerator.generate()); + task.setTaskId(idGenerator.generate()); task.setStatus(TaskModel.Status.COMPLETED); task.setOutputData(new HashMap<>()); task.setSubWorkflowId(subWorkflowId); @@ -1595,7 +1614,7 @@ public void testRerunSubWorkflowWithTaskId() { } @Test - public void testGetActiveDomain() { + public void testGetActiveDomain() throws Exception { String taskType = "test-task"; String[] domains = new String[] {"domain1", "domain2"}; @@ -1606,8 +1625,7 @@ public void testGetActiveDomain() { .thenReturn(pollData1); String activeDomain = workflowExecutor.getActiveDomain(taskType, domains); assertEquals(domains[0], activeDomain); - - Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); + Thread.sleep(2000L); PollData pollData2 = new PollData( @@ -1617,7 +1635,7 @@ public void testGetActiveDomain() { activeDomain = workflowExecutor.getActiveDomain(taskType, domains); assertEquals(domains[1], activeDomain); - Uninterruptibles.sleepUninterruptibly(2, TimeUnit.SECONDS); + Thread.sleep(2000L); activeDomain = workflowExecutor.getActiveDomain(taskType, domains); assertEquals(domains[1], activeDomain); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapperTest.java index 5cf059059..cdacc2a25 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/DecisionTaskMapperTest.java @@ -49,6 +49,7 @@ @RunWith(SpringRunner.class) public class DecisionTaskMapperTest { + private IDGenerator idGenerator; private ParametersUtils parametersUtils; private DeciderService deciderService; // Subject @@ -66,6 +67,7 @@ public class DecisionTaskMapperTest { @Before public void setUp() { parametersUtils = new ParametersUtils(objectMapper); + idGenerator = new IDGenerator(); ip1 = new HashMap<>(); ip1.put("p1", "${workflow.input.param1}"); @@ -135,7 +137,7 @@ public void getMappedTasks() { TaskModel theTask = new TaskModel(); theTask.setReferenceTaskName("Foo"); - theTask.setTaskId(IDGenerator.generate()); + theTask.setTaskId(idGenerator.generate()); when(deciderService.getTasksToBeScheduled(workflowModel, task2, 0, null)) .thenReturn(Collections.singletonList(theTask)); @@ -146,7 +148,7 @@ public void getMappedTasks() { .withWorkflowTask(decisionTask) .withTaskInput(input) .withRetryCount(0) - .withTaskId(IDGenerator.generate()) + .withTaskId(idGenerator.generate()) .withDeciderService(deciderService) .build(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapperTest.java index 7601223c0..3c4d4edef 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/DoWhileTaskMapperTest.java @@ -64,7 +64,7 @@ public void setup() { workflowTask.setLoopCondition( "if ($.second_task + $.first_task > 10) { false; } else { true; }"); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); WorkflowDef workflowDef = new WorkflowDef(); workflow = new WorkflowModel(); @@ -95,9 +95,7 @@ public void getMappedTasks() { new DoWhileTaskMapper(metadataDAO).getMappedTasks(taskMapperContext); assertNotNull(mappedTasks); - assertEquals(mappedTasks.size(), 2); - assertEquals("task1__1", mappedTasks.get(1).getReferenceTaskName()); - assertEquals(1, mappedTasks.get(1).getIteration()); + assertEquals(mappedTasks.size(), 1); assertEquals(TASK_TYPE_DO_WHILE, mappedTasks.get(0).getTaskType()); } diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapperTest.java index e24d68729..8066db338 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/DynamicTaskMapperTest.java @@ -70,7 +70,7 @@ public void getMappedTasks() { anyMap(), any(WorkflowModel.class), any(TaskDef.class), anyString())) .thenReturn(taskInput); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); WorkflowModel workflow = new WorkflowModel(); WorkflowDef workflowDef = new WorkflowDef(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/EventTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/EventTaskMapperTest.java index e2258b460..9e5daa1a6 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/EventTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/EventTaskMapperTest.java @@ -42,7 +42,7 @@ public void getMappedTasks() { WorkflowTask taskToBeScheduled = new WorkflowTask(); taskToBeScheduled.setSink("SQSSINK"); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); Map eventTaskInput = new HashMap<>(); eventTaskInput.put("sink", "SQSSINK"); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapperTest.java index fff693888..7c7f74796 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinDynamicTaskMapperTest.java @@ -12,11 +12,7 @@ */ package com.netflix.conductor.core.execution.mapper; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import org.apache.commons.lang3.tuple.Pair; import org.junit.Before; @@ -40,7 +36,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Lists; import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_FORK; import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_JOIN; @@ -55,6 +50,7 @@ @SuppressWarnings("unchecked") public class ForkJoinDynamicTaskMapperTest { + private IDGenerator idGenerator; private ParametersUtils parametersUtils; private ObjectMapper objectMapper; private DeciderService deciderService; @@ -65,12 +61,14 @@ public class ForkJoinDynamicTaskMapperTest { @Before public void setUp() { MetadataDAO metadataDAO = Mockito.mock(MetadataDAO.class); + idGenerator = new IDGenerator(); parametersUtils = Mockito.mock(ParametersUtils.class); objectMapper = Mockito.mock(ObjectMapper.class); deciderService = Mockito.mock(DeciderService.class); forkJoinDynamicTaskMapper = - new ForkJoinDynamicTaskMapper(parametersUtils, objectMapper, metadataDAO); + new ForkJoinDynamicTaskMapper( + idGenerator, parametersUtils, objectMapper, metadataDAO); } @Test @@ -140,7 +138,7 @@ public void getMappedTasksException() { when(deciderService.getTasksToBeScheduled(workflowModel, wt3, 0)) .thenReturn(Collections.singletonList(simpleTask2)); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); TaskMapperContext taskMapperContext = TaskMapperContext.newBuilder() @@ -223,7 +221,7 @@ public void getMappedTasks() { when(deciderService.getTasksToBeScheduled(workflowModel, wt3, 0)) .thenReturn(Collections.singletonList(simpleTask2)); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); TaskMapperContext taskMapperContext = TaskMapperContext.newBuilder() .withWorkflowModel(workflowModel) @@ -484,9 +482,9 @@ public void testDynamicTaskDuplicateTaskRefName() { // Empty list, this is a bad state, workflow should terminate when(deciderService.getTasksToBeScheduled(workflowModel, wt2, 0)) - .thenReturn(Lists.newArrayList()); + .thenReturn(new ArrayList<>()); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); TaskMapperContext taskMapperContext = TaskMapperContext.newBuilder() .withWorkflowModel(workflowModel) diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinTaskMapperTest.java index fb49107c6..e42270fd2 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/ForkJoinTaskMapperTest.java @@ -41,6 +41,7 @@ public class ForkJoinTaskMapperTest { private DeciderService deciderService; private ForkJoinTaskMapper forkJoinTaskMapper; + private IDGenerator idGenerator; @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -48,6 +49,7 @@ public class ForkJoinTaskMapperTest { public void setUp() { deciderService = Mockito.mock(DeciderService.class); forkJoinTaskMapper = new ForkJoinTaskMapper(); + idGenerator = new IDGenerator(); } @Test @@ -115,7 +117,7 @@ public void getMappedTasks() { Mockito.when(deciderService.getTasksToBeScheduled(workflow, wft2, 0)) .thenReturn(Collections.singletonList(task3)); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); TaskMapperContext taskMapperContext = TaskMapperContext.newBuilder() .withWorkflowModel(workflow) @@ -195,7 +197,7 @@ public void getMappedTasksException() { Mockito.when(deciderService.getTasksToBeScheduled(workflow, wft2, 0)) .thenReturn(Collections.singletonList(task3)); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); TaskMapperContext taskMapperContext = TaskMapperContext.newBuilder() diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapperTest.java index 28172cde4..da548e531 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapperTest.java @@ -36,6 +36,7 @@ public class HTTPTaskMapperTest { private HTTPTaskMapper httpTaskMapper; + private IDGenerator idGenerator; @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -44,6 +45,7 @@ public void setUp() { ParametersUtils parametersUtils = mock(ParametersUtils.class); MetadataDAO metadataDAO = mock(MetadataDAO.class); httpTaskMapper = new HTTPTaskMapper(parametersUtils, metadataDAO); + idGenerator = new IDGenerator(); } @Test @@ -53,8 +55,8 @@ public void getMappedTasks() { workflowTask.setName("http_task"); workflowTask.setType(TaskType.HTTP.name()); workflowTask.setTaskDefinition(new TaskDef("http_task")); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowModel workflow = new WorkflowModel(); WorkflowDef workflowDef = new WorkflowDef(); @@ -85,8 +87,8 @@ public void getMappedTasks_WithoutTaskDef() { WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setName("http_task"); workflowTask.setType(TaskType.HTTP.name()); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowModel workflow = new WorkflowModel(); WorkflowDef workflowDef = new WorkflowDef(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/InlineTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/InlineTaskMapperTest.java index fe222b28f..0c6c11872 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/InlineTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/InlineTaskMapperTest.java @@ -55,7 +55,7 @@ public void getMappedTasks() { "function scriptFun() {if ($.input.a==1){return {testValue: true}} else{return " + "{testValue: false} }}; scriptFun();"); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); @@ -89,7 +89,7 @@ public void getMappedTasks_WithoutTaskDef() { "function scriptFun() {if ($.input.a==1){return {testValue: true}} else{return " + "{testValue: false} }}; scriptFun();"); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/JoinTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/JoinTaskMapperTest.java index c708e63f0..4e3be843b 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/JoinTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/JoinTaskMapperTest.java @@ -39,7 +39,7 @@ public void getMappedTasks() { workflowTask.setType(TaskType.JOIN.name()); workflowTask.setJoinOn(Arrays.asList("task1", "task2")); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); WorkflowDef wd = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/JsonJQTransformTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/JsonJQTransformTaskMapperTest.java index 2ac5320f5..ed4d187b1 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/JsonJQTransformTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/JsonJQTransformTaskMapperTest.java @@ -35,6 +35,7 @@ public class JsonJQTransformTaskMapperTest { + private IDGenerator idGenerator; private ParametersUtils parametersUtils; private MetadataDAO metadataDAO; @@ -42,6 +43,7 @@ public class JsonJQTransformTaskMapperTest { public void setUp() { parametersUtils = mock(ParametersUtils.class); metadataDAO = mock(MetadataDAO.class); + idGenerator = new IDGenerator(); } @Test @@ -58,7 +60,7 @@ public void getMappedTasks() { taskInput.put("queryExpression", "{ out: (.in1 + .in2) }"); workflowTask.setInputParameters(taskInput); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); @@ -95,7 +97,7 @@ public void getMappedTasks_WithoutTaskDef() { taskInput.put("queryExpression", "{ out: (.in1 + .in2) }"); workflowTask.setInputParameters(taskInput); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapperTest.java index 18c0ff60d..bd7dd268e 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapperTest.java @@ -35,6 +35,7 @@ public class KafkaPublishTaskMapperTest { + private IDGenerator idGenerator; private KafkaPublishTaskMapper kafkaTaskMapper; @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -44,6 +45,7 @@ public void setUp() { ParametersUtils parametersUtils = mock(ParametersUtils.class); MetadataDAO metadataDAO = mock(MetadataDAO.class); kafkaTaskMapper = new KafkaPublishTaskMapper(parametersUtils, metadataDAO); + idGenerator = new IDGenerator(); } @Test @@ -53,8 +55,8 @@ public void getMappedTasks() { workflowTask.setName("kafka_task"); workflowTask.setType(TaskType.KAFKA_PUBLISH.name()); workflowTask.setTaskDefinition(new TaskDef("kafka_task")); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowModel workflow = new WorkflowModel(); WorkflowDef workflowDef = new WorkflowDef(); @@ -85,8 +87,8 @@ public void getMappedTasks_WithoutTaskDef() { WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setName("kafka_task"); workflowTask.setType(TaskType.KAFKA_PUBLISH.name()); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowModel workflow = new WorkflowModel(); WorkflowDef workflowDef = new WorkflowDef(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/LambdaTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/LambdaTaskMapperTest.java index afd555925..edeef004e 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/LambdaTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/LambdaTaskMapperTest.java @@ -33,6 +33,7 @@ public class LambdaTaskMapperTest { + private IDGenerator idGenerator; private ParametersUtils parametersUtils; private MetadataDAO metadataDAO; @@ -40,6 +41,7 @@ public class LambdaTaskMapperTest { public void setUp() { parametersUtils = mock(ParametersUtils.class); metadataDAO = mock(MetadataDAO.class); + idGenerator = new IDGenerator(); } @Test @@ -52,7 +54,7 @@ public void getMappedTasks() { workflowTask.setScriptExpression( "if ($.input.a==1){return {testValue: true}} else{return {testValue: false} }"); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); @@ -84,7 +86,7 @@ public void getMappedTasks_WithoutTaskDef() { workflowTask.setScriptExpression( "if ($.input.a==1){return {testValue: true}} else{return {testValue: false} }"); - String taskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SetVariableTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SetVariableTaskMapperTest.java index 2105ce209..8d35c00ee 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SetVariableTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SetVariableTaskMapperTest.java @@ -33,7 +33,7 @@ public void getMappedTasks() { WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setType(TaskType.TASK_TYPE_SET_VARIABLE); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SimpleTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SimpleTaskMapperTest.java index e232d6e51..e3cc14d3c 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SimpleTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SimpleTaskMapperTest.java @@ -37,6 +37,8 @@ public class SimpleTaskMapperTest { private SimpleTaskMapper simpleTaskMapper; + private IDGenerator idGenerator = new IDGenerator(); + @Rule public ExpectedException expectedException = ExpectedException.none(); @Before @@ -52,8 +54,8 @@ public void getMappedTasks() { workflowTask.setName("simple_task"); workflowTask.setTaskDefinition(new TaskDef("simple_task")); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); @@ -81,8 +83,8 @@ public void getMappedTasksException() { // Given WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setName("simple_task"); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapperTest.java index 758285d00..9681bc2ea 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SubWorkflowTaskMapperTest.java @@ -46,6 +46,7 @@ public class SubWorkflowTaskMapperTest { private SubWorkflowTaskMapper subWorkflowTaskMapper; private ParametersUtils parametersUtils; private DeciderService deciderService; + private IDGenerator idGenerator; @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -55,6 +56,7 @@ public void setUp() { MetadataDAO metadataDAO = mock(MetadataDAO.class); subWorkflowTaskMapper = new SubWorkflowTaskMapper(parametersUtils, metadataDAO); deciderService = mock(DeciderService.class); + idGenerator = new IDGenerator(); } @Test @@ -91,7 +93,7 @@ public void getMappedTasks() { .withWorkflowTask(workflowTask) .withTaskInput(taskInput) .withRetryCount(0) - .withTaskId(IDGenerator.generate()) + .withTaskId(idGenerator.generate()) .withDeciderService(deciderService) .build(); @@ -142,7 +144,7 @@ public void testTaskToDomain() { .withWorkflowTask(workflowTask) .withTaskInput(taskInput) .withRetryCount(0) - .withTaskId(IDGenerator.generate()) + .withTaskId(new IDGenerator().generate()) .withDeciderService(deciderService) .build(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapperTest.java index 3a8399b99..0b487eda4 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapperTest.java @@ -57,6 +57,7 @@ @RunWith(SpringRunner.class) public class SwitchTaskMapperTest { + private IDGenerator idGenerator; private ParametersUtils parametersUtils; private DeciderService deciderService; // Subject @@ -80,6 +81,7 @@ public static class TestConfiguration {} @Before public void setUp() { parametersUtils = new ParametersUtils(objectMapper); + idGenerator = new IDGenerator(); ip1 = new HashMap<>(); ip1.put("p1", "${workflow.input.param1}"); @@ -149,7 +151,7 @@ public void getMappedTasks() { TaskModel theTask = new TaskModel(); theTask.setReferenceTaskName("Foo"); - theTask.setTaskId(IDGenerator.generate()); + theTask.setTaskId(idGenerator.generate()); when(deciderService.getTasksToBeScheduled(workflowModel, task2, 0, null)) .thenReturn(Collections.singletonList(theTask)); @@ -160,7 +162,7 @@ public void getMappedTasks() { .withWorkflowTask(switchTask) .withTaskInput(input) .withRetryCount(0) - .withTaskId(IDGenerator.generate()) + .withTaskId(idGenerator.generate()) .withDeciderService(deciderService) .build(); @@ -217,7 +219,7 @@ public void getMappedTasksWithValueParamEvaluator() { TaskModel theTask = new TaskModel(); theTask.setReferenceTaskName("Foo"); - theTask.setTaskId(IDGenerator.generate()); + theTask.setTaskId(idGenerator.generate()); when(deciderService.getTasksToBeScheduled(workflowModel, task2, 0, null)) .thenReturn(Collections.singletonList(theTask)); @@ -228,7 +230,7 @@ public void getMappedTasksWithValueParamEvaluator() { .withWorkflowTask(switchTask) .withTaskInput(input) .withRetryCount(0) - .withTaskId(IDGenerator.generate()) + .withTaskId(idGenerator.generate()) .withDeciderService(deciderService) .build(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/TerminateTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/TerminateTaskMapperTest.java index e4bb67235..47e02a12e 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/TerminateTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/TerminateTaskMapperTest.java @@ -43,7 +43,7 @@ public void getMappedTasks() { WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setType(TaskType.TASK_TYPE_TERMINATE); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); WorkflowDef workflowDef = new WorkflowDef(); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/UserDefinedTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/UserDefinedTaskMapperTest.java index 4c299bfea..afdafa28d 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/UserDefinedTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/UserDefinedTaskMapperTest.java @@ -36,6 +36,8 @@ public class UserDefinedTaskMapperTest { + private IDGenerator idGenerator; + private UserDefinedTaskMapper userDefinedTaskMapper; @Rule public ExpectedException expectedException = ExpectedException.none(); @@ -45,6 +47,7 @@ public void setUp() { ParametersUtils parametersUtils = mock(ParametersUtils.class); MetadataDAO metadataDAO = mock(MetadataDAO.class); userDefinedTaskMapper = new UserDefinedTaskMapper(parametersUtils, metadataDAO); + idGenerator = new IDGenerator(); } @Test @@ -54,8 +57,8 @@ public void getMappedTasks() { workflowTask.setName("user_task"); workflowTask.setType(TaskType.USER_DEFINED.name()); workflowTask.setTaskDefinition(new TaskDef("user_task")); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowModel workflow = new WorkflowModel(); WorkflowDef workflowDef = new WorkflowDef(); @@ -86,8 +89,8 @@ public void getMappedTasksException() { WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setName("user_task"); workflowTask.setType(TaskType.USER_DEFINED.name()); - String taskId = IDGenerator.generate(); - String retriedTaskId = IDGenerator.generate(); + String taskId = idGenerator.generate(); + String retriedTaskId = idGenerator.generate(); WorkflowModel workflow = new WorkflowModel(); WorkflowDef workflowDef = new WorkflowDef(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/mapper/WaitTaskMapperTest.java b/core/src/test/java/com/netflix/conductor/core/execution/mapper/WaitTaskMapperTest.java index 0f58b76d3..3b9071cef 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/mapper/WaitTaskMapperTest.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/mapper/WaitTaskMapperTest.java @@ -40,7 +40,7 @@ public void getMappedTasks() { WorkflowTask workflowTask = new WorkflowTask(); workflowTask.setName("Wait_task"); workflowTask.setType(TaskType.WAIT.name()); - String taskId = IDGenerator.generate(); + String taskId = new IDGenerator().generate(); ParametersUtils parametersUtils = mock(ParametersUtils.class); WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestDoWhile.java b/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestDoWhile.java deleted file mode 100644 index 77f7ba07f..000000000 --- a/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestDoWhile.java +++ /dev/null @@ -1,266 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.core.execution.tasks; - -import java.time.Duration; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; - -import org.junit.Before; -import org.junit.Test; - -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.common.metadata.tasks.TaskType; -import com.netflix.conductor.common.metadata.workflow.WorkflowTask; -import com.netflix.conductor.core.config.ConductorProperties; -import com.netflix.conductor.core.dal.ExecutionDAOFacade; -import com.netflix.conductor.core.execution.DeciderService; -import com.netflix.conductor.core.execution.WorkflowExecutor; -import com.netflix.conductor.core.listener.WorkflowStatusListener; -import com.netflix.conductor.core.metadata.MetadataMapperService; -import com.netflix.conductor.core.utils.ParametersUtils; -import com.netflix.conductor.dao.MetadataDAO; -import com.netflix.conductor.dao.QueueDAO; -import com.netflix.conductor.model.TaskModel; -import com.netflix.conductor.model.WorkflowModel; -import com.netflix.conductor.service.ExecutionLockService; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertSame; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -public class TestDoWhile { - - DeciderService deciderService; - MetadataDAO metadataDAO; - QueueDAO queueDAO; - MetadataMapperService metadataMapperService; - WorkflowStatusListener workflowStatusListener; - ExecutionDAOFacade executionDAOFacade; - ExecutionLockService executionLockService; - ConductorProperties properties; - ParametersUtils parametersUtils; - SystemTaskRegistry systemTaskRegistry; - private WorkflowModel workflow; - private TaskModel loopTask; - private TaskDef loopTaskDef; - private WorkflowTask loopWorkflowTask; - private TaskModel task1; - private TaskModel task2; - private WorkflowExecutor provider; - private DoWhile doWhile; - - @SuppressWarnings("unchecked") - @Before - public void setup() { - workflow = mock(WorkflowModel.class); - deciderService = mock(DeciderService.class); - metadataDAO = mock(MetadataDAO.class); - queueDAO = mock(QueueDAO.class); - parametersUtils = mock(ParametersUtils.class); - metadataMapperService = mock(MetadataMapperService.class); - workflowStatusListener = mock(WorkflowStatusListener.class); - executionDAOFacade = mock(ExecutionDAOFacade.class); - executionLockService = mock(ExecutionLockService.class); - properties = mock(ConductorProperties.class); - systemTaskRegistry = mock(SystemTaskRegistry.class); - when(properties.getActiveWorkerLastPollTimeout()).thenReturn(Duration.ofSeconds(100)); - when(properties.getTaskExecutionPostponeDuration()).thenReturn(Duration.ofSeconds(60)); - when(properties.getWorkflowOffsetTimeout()).thenReturn(Duration.ofSeconds(30)); - provider = - spy( - new WorkflowExecutor( - deciderService, - metadataDAO, - queueDAO, - metadataMapperService, - workflowStatusListener, - executionDAOFacade, - properties, - executionLockService, - systemTaskRegistry, - parametersUtils)); - WorkflowTask loopWorkflowTask1 = new WorkflowTask(); - loopWorkflowTask1.setTaskReferenceName("task1"); - loopWorkflowTask1.setName("task1"); - WorkflowTask loopWorkflowTask2 = new WorkflowTask(); - loopWorkflowTask2.setTaskReferenceName("task2"); - loopWorkflowTask2.setName("task2"); - task1 = new TaskModel(); - task1.setWorkflowTask(loopWorkflowTask1); - task1.setReferenceTaskName("task1"); - task1.setStatus(TaskModel.Status.COMPLETED); - task1.setTaskType(TaskType.HTTP.name()); - task1.setInputData(new HashMap<>()); - task1.setIteration(1); - task2 = new TaskModel(); - task2.setWorkflowTask(loopWorkflowTask2); - task2.setReferenceTaskName("task2"); - task2.setStatus(TaskModel.Status.COMPLETED); - task2.setTaskType(TaskType.HTTP.name()); - task2.setInputData(new HashMap<>()); - task2.setIteration(1); - loopTask = new TaskModel(); - loopTask.setReferenceTaskName("loopTask"); - loopTask.setTaskType(TaskType.DO_WHILE.name()); - loopTask.setInputData(new HashMap<>()); - loopTask.setIteration(1); - loopWorkflowTask = new WorkflowTask(); - loopWorkflowTask.setTaskReferenceName("loopTask"); - loopWorkflowTask.setType(TaskType.DO_WHILE.name()); - loopWorkflowTask.setName("loopTask"); - loopWorkflowTask.setLoopCondition( - "if ($.loopTask['iteration'] < 1) { false; } else { true; }"); - loopWorkflowTask.setLoopOver( - Arrays.asList(task1.getWorkflowTask(), task2.getWorkflowTask())); - loopTask.setWorkflowTask(loopWorkflowTask); - doWhile = new DoWhile(parametersUtils); - loopTaskDef = mock(TaskDef.class); - doReturn(loopTaskDef).when(provider).getTaskDefinition(loopTask); - doReturn(task1).when(workflow).getTaskByRefName(task1.getReferenceTaskName()); - doReturn(task2).when(workflow).getTaskByRefName(task2.getReferenceTaskName()); - doReturn(task1).when(workflow).getTaskByRefName("task1__2"); - doReturn(task2).when(workflow).getTaskByRefName("task2__2"); - doReturn(new HashMap<>()) - .when(parametersUtils) - .getTaskInputV2( - isA(Map.class), - isA(WorkflowModel.class), - isA(String.class), - isA(TaskDef.class)); - } - - @Test - public void testSingleSuccessfulIteration() { - doReturn(Arrays.asList(task1, task2)).when(workflow).getTasks(); - loopWorkflowTask.setLoopCondition( - "if ($.loopTask['iteration'] < 1) { true; } else { false; }"); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - verify(provider, times(0)).scheduleNextIteration(loopTask, workflow); - assertEquals(loopTask.getStatus(), TaskModel.Status.COMPLETED); - } - - @Test - public void testSingleFailedIteration() { - task1.setStatus(TaskModel.Status.FAILED); - String reason = "Test"; - task1.setReasonForIncompletion(reason); - doReturn(Arrays.asList(task1, task2, loopTask)).when(workflow).getTasks(); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - assertEquals(loopTask.getStatus(), TaskModel.Status.FAILED); - assertNotEquals(reason, loopTask.getReasonForIncompletion()); - } - - @Test - public void testInProgress() { - loopTask.setStatus(TaskModel.Status.IN_PROGRESS); - task1.setStatus(TaskModel.Status.IN_PROGRESS); - doReturn(Arrays.asList(task1, task2, loopTask)).when(workflow).getTasks(); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertFalse(success); - assertSame(loopTask.getStatus(), TaskModel.Status.IN_PROGRESS); - } - - @Test - public void testSingleIteration() { - loopTask.setStatus(TaskModel.Status.IN_PROGRESS); - doReturn(Arrays.asList(task1, task2)).when(workflow).getTasks(); - loopWorkflowTask.setLoopCondition( - "if ($.loopTask['iteration'] > 1) { false; } else { true; }"); - doNothing().when(provider).scheduleNextIteration(loopTask, workflow); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - assertEquals(loopTask.getIteration(), 2); - verify(provider, times(1)).scheduleNextIteration(loopTask, workflow); - assertSame(loopTask.getStatus(), TaskModel.Status.IN_PROGRESS); - } - - @Test - public void testLoopOverTaskOutputInCondition() { - loopTask.setStatus(TaskModel.Status.IN_PROGRESS); - Map output = new HashMap<>(); - output.put("value", 1); - task1.setOutputData(output); - doReturn(Arrays.asList(task1, task2)).when(workflow).getTasks(); - loopWorkflowTask.setLoopCondition("if ($.task1['value'] == 1) { false; } else { true; }"); - doNothing().when(provider).scheduleNextIteration(loopTask, workflow); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - verify(provider, times(0)).scheduleNextIteration(loopTask, workflow); - assertSame(loopTask.getStatus(), TaskModel.Status.COMPLETED); - } - - @Test - public void testInputParameterInCondition() { - Map output = new HashMap<>(); - output.put("value", 1); - loopTask.setInputData(output); - loopTask.setStatus(TaskModel.Status.IN_PROGRESS); - loopWorkflowTask.setInputParameters(output); - doReturn(output) - .when(parametersUtils) - .getTaskInputV2( - loopTask.getWorkflowTask().getInputParameters(), - workflow, - loopTask.getTaskId(), - loopTaskDef); - doReturn(Arrays.asList(task1, task2)).when(workflow).getTasks(); - loopWorkflowTask.setLoopCondition("if ($.value == 1) { false; } else { true; }"); - doNothing().when(provider).scheduleNextIteration(loopTask, workflow); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - verify(provider, times(0)).scheduleNextIteration(loopTask, workflow); - assertSame(loopTask.getStatus(), TaskModel.Status.COMPLETED); - } - - @Test - public void testSecondIteration() { - loopTask.setStatus(TaskModel.Status.IN_PROGRESS); - doReturn(Arrays.asList(task1, task2)).when(workflow).getTasks(); - loopWorkflowTask.setLoopCondition( - "if ($.loopTask['iteration'] > 1) { false; } else { true; }"); - doNothing().when(provider).scheduleNextIteration(loopTask, workflow); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - doReturn(Arrays.asList(task1, task2)).when(workflow).getTasks(); - task1.setReferenceTaskName("task1__2"); - task2.setReferenceTaskName("task1__2"); - success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - verify(provider, times(1)).scheduleNextIteration(loopTask, workflow); - assertEquals(loopTask.getStatus(), TaskModel.Status.COMPLETED); - } - - @Test - public void testConditionException() { - loopTask.setTaskId("1"); - loopWorkflowTask.setLoopCondition("This will give exception"); - doNothing().when(provider).scheduleNextIteration(loopTask, workflow); - boolean success = doWhile.execute(workflow, loopTask, provider); - assertTrue(success); - assertSame(loopTask.getStatus(), TaskModel.Status.FAILED_WITH_TERMINAL_ERROR); - } -} diff --git a/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestLambda.java b/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestLambda.java index b62a355ca..b6a857fbe 100644 --- a/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestLambda.java +++ b/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestLambda.java @@ -24,7 +24,9 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; -/** @author x-ultra */ +/** + * @author x-ultra + */ public class TestLambda { private final WorkflowModel workflow = new WorkflowModel(); diff --git a/core/src/test/java/com/netflix/conductor/core/metadata/MetadataMapperServiceTest.java b/core/src/test/java/com/netflix/conductor/core/metadata/MetadataMapperServiceTest.java index dbc74e8c2..3d5e0627e 100644 --- a/core/src/test/java/com/netflix/conductor/core/metadata/MetadataMapperServiceTest.java +++ b/core/src/test/java/com/netflix/conductor/core/metadata/MetadataMapperServiceTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -37,8 +37,6 @@ import com.netflix.conductor.core.exception.TerminateWorkflowException; import com.netflix.conductor.dao.MetadataDAO; -import com.google.common.collect.ImmutableList; - import static com.netflix.conductor.TestUtils.getConstraintViolationMessages; import static org.junit.Assert.assertEquals; @@ -89,7 +87,7 @@ public void testMetadataPopulationOnSimpleTask() { when(metadataDAO.getTaskDef(nameTaskDefinition)).thenReturn(taskDefinition); WorkflowDef workflowDefinition = createWorkflowDefinition("testMetadataPopulation"); - workflowDefinition.setTasks(ImmutableList.of(workflowTask)); + workflowDefinition.setTasks(List.of(workflowTask)); metadataMapperService.populateTaskDefinitions(workflowDefinition); @@ -107,7 +105,7 @@ public void testNoMetadataPopulationOnEmbeddedTaskDefinition() { workflowTask.setTaskDefinition(taskDefinition); WorkflowDef workflowDefinition = createWorkflowDefinition("testMetadataPopulation"); - workflowDefinition.setTasks(ImmutableList.of(workflowTask)); + workflowDefinition.setTasks(List.of(workflowTask)); metadataMapperService.populateTaskDefinitions(workflowDefinition); @@ -128,7 +126,7 @@ public void testMetadataPopulationOnlyOnNecessaryWorkflowTasks() { WorkflowTask workflowTask2 = createWorkflowTask(nameTaskDefinition2); WorkflowDef workflowDefinition = createWorkflowDefinition("testMetadataPopulation"); - workflowDefinition.setTasks(ImmutableList.of(workflowTask1, workflowTask2)); + workflowDefinition.setTasks(List.of(workflowTask1, workflowTask2)); when(metadataDAO.getTaskDef(nameTaskDefinition2)).thenReturn(taskDefinition); @@ -154,7 +152,7 @@ public void testMetadataPopulationMissingDefinitions() { TaskDef taskDefinition = createTaskDefinition(nameTaskDefinition1); WorkflowDef workflowDefinition = createWorkflowDefinition("testMetadataPopulation"); - workflowDefinition.setTasks(ImmutableList.of(workflowTask1, workflowTask2)); + workflowDefinition.setTasks(List.of(workflowTask1, workflowTask2)); when(metadataDAO.getTaskDef(nameTaskDefinition1)).thenReturn(taskDefinition); when(metadataDAO.getTaskDef(nameTaskDefinition2)).thenReturn(null); @@ -178,7 +176,7 @@ public void testVersionPopulationForSubworkflowTaskIfVersionIsNotAvailable() { workflowTask.setSubWorkflowParam(subWorkflowParams); WorkflowDef workflowDefinition = createWorkflowDefinition("testMetadataPopulation"); - workflowDefinition.setTasks(ImmutableList.of(workflowTask)); + workflowDefinition.setTasks(List.of(workflowTask)); when(metadataDAO.getLatestWorkflowDef(workflowDefinitionName)) .thenReturn(Optional.of(subWorkflowDefinition)); @@ -211,7 +209,7 @@ public void testNoVersionPopulationForSubworkflowTaskIfAvailable() { workflowTask.setSubWorkflowParam(subWorkflowParams); WorkflowDef workflowDefinition = createWorkflowDefinition("testMetadataPopulation"); - workflowDefinition.setTasks(ImmutableList.of(workflowTask)); + workflowDefinition.setTasks(List.of(workflowTask)); metadataMapperService.populateTaskDefinitions(workflowDefinition); @@ -238,7 +236,7 @@ public void testExceptionWhenWorkflowDefinitionNotAvailable() { workflowTask.setSubWorkflowParam(subWorkflowParams); WorkflowDef workflowDefinition = createWorkflowDefinition("testMetadataPopulation"); - workflowDefinition.setTasks(ImmutableList.of(workflowTask)); + workflowDefinition.setTasks(List.of(workflowTask)); when(metadataDAO.getLatestWorkflowDef(workflowDefinitionName)).thenReturn(Optional.empty()); diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/lock/LocalOnlyLockTest.java b/core/src/test/java/com/netflix/conductor/core/sync/local/LocalOnlyLockTest.java similarity index 84% rename from contribs/src/test/java/com/netflix/conductor/contribs/lock/LocalOnlyLockTest.java rename to core/src/test/java/com/netflix/conductor/core/sync/local/LocalOnlyLockTest.java index c081631b3..25105423b 100644 --- a/contribs/src/test/java/com/netflix/conductor/contribs/lock/LocalOnlyLockTest.java +++ b/core/src/test/java/com/netflix/conductor/core/sync/local/LocalOnlyLockTest.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.lock; +package com.netflix.conductor.core.sync.local; import java.util.concurrent.TimeUnit; @@ -30,14 +30,14 @@ public class LocalOnlyLockTest { @Test public void testLockUnlock() { localOnlyLock.acquireLock("a", 100, 1000, TimeUnit.MILLISECONDS); - assertEquals(localOnlyLock.cache().size(), 1); - assertEquals(localOnlyLock.cache().getUnchecked("a").availablePermits(), 0); + assertEquals(localOnlyLock.cache().estimatedSize(), 1); + assertEquals(localOnlyLock.cache().get("a").availablePermits(), 0); assertEquals(localOnlyLock.scheduledFutures().size(), 1); localOnlyLock.releaseLock("a"); assertEquals(localOnlyLock.scheduledFutures().size(), 0); - assertEquals(localOnlyLock.cache().getUnchecked("a").availablePermits(), 1); + assertEquals(localOnlyLock.cache().get("a").availablePermits(), 1); localOnlyLock.deleteLock("a"); - assertEquals(localOnlyLock.cache().size(), 0); + assertEquals(localOnlyLock.cache().estimatedSize(), 0); } @Test(timeout = 10 * 1000) @@ -57,7 +57,7 @@ public void testLockLeaseTime() { localOnlyLock.acquireLock("a", 1000, 100, TimeUnit.MILLISECONDS); } localOnlyLock.acquireLock("a"); - assertEquals(0, localOnlyLock.cache().getUnchecked("a").availablePermits()); + assertEquals(0, localOnlyLock.cache().get("a").availablePermits()); localOnlyLock.releaseLock("a"); } @@ -70,7 +70,7 @@ public void testLockLeaseWithRelease() throws Exception { Thread.sleep(2000); localOnlyLock.acquireLock("b"); - assertEquals(0, localOnlyLock.cache().getUnchecked("b").availablePermits()); + assertEquals(0, localOnlyLock.cache().get("b").availablePermits()); localOnlyLock.releaseLock("b"); } @@ -78,7 +78,7 @@ public void testLockLeaseWithRelease() throws Exception { public void testRelease() { localOnlyLock.releaseLock("x54as4d2;23'4"); localOnlyLock.releaseLock("x54as4d2;23'4"); - assertEquals(1, localOnlyLock.cache().getUnchecked("x54as4d2;23'4").availablePermits()); + assertEquals(1, localOnlyLock.cache().get("x54as4d2;23'4").availablePermits()); } @Test diff --git a/dependencies.gradle b/dependencies.gradle index e9b39d007..56b92c96b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,5 +1,5 @@ /* - * Copyright 2021 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -16,16 +16,12 @@ */ ext { revActivation = '2.0.0' - revAmqpClient = '5.14.0' revAwaitility = '3.1.6' revAwsSdk = '1.11.86' - revAzureStorageBlobSdk = '12.7.0' revBval = '2.0.5' revCassandra = '3.10.2' revCassandraUnit = '3.11.2.0' revCommonsIo = '2.7' - revCuratorRecipes = '2.4.0' - revCuratorTest = '2.4.0' revDynoQueues = '2.0.20' revElasticSearch6 = '6.8.12' revElasticSearch7 = '7.15.2' @@ -34,7 +30,6 @@ ext { revGroovy = '2.5.13' revGrpc = '1.+' revGuava = '30.0-jre' - revGuavaRetrying = '2.0.0' revHamcrestAllMatchers = '1.8' revHealth = '1.1.+' revJAXB = '2.3.3' @@ -43,13 +38,9 @@ ext { revJsonPath = '2.4.0' revJq = '0.0.13' revJsr311Api = '1.1.1' - revKafka = '2.6.0' - revMicrometer = '1.6.2' - revMockServerClient = '5.11.2' - revNatsStreaming = '0.5.0' + revMockServerClient = '5.12.0' revOpenapi = '1.6.+' revPowerMock = '2.0.9' - revPrometheus = '0.9.0' revProtoBuf = '3.13.0' revProtogenAnnotations = '1.0.0' revProtogenCodegen = '1.4.0' diff --git a/docs/docs/configuration/workflowdef.md b/docs/docs/configuration/workflowdef.md index e957e6d56..9ccca3fd1 100644 --- a/docs/docs/configuration/workflowdef.md +++ b/docs/docs/configuration/workflowdef.md @@ -79,10 +79,10 @@ First we would build these two task definitions. Let's assume that ```shipping i ``` The mail_a_box workflow has 2 tasks: - 1. The first task takes the provided account number, and outpus an address. - 2. The 2nd task takes the address infom and generates a shipping label. + 1. The first task takes the provided account number, and outputs an address. + 2. The 2nd task takes the address info and generates a shipping label. - Upon completion of the 2 tasks, the workflow outpust the trackking number generated in the 2nd task. If the workflow fails, a second workflow named ```shipping_issues``` is run. + Upon completion of the 2 tasks, the workflow outputs the trackking number generated in the 2nd task. If the workflow fails, a second workflow named ```shipping_issues``` is run. ## Fields in a Workflow diff --git a/docs/docs/how-tos/redis.md b/docs/docs/how-tos/redis.md new file mode 100644 index 000000000..c0fb43997 --- /dev/null +++ b/docs/docs/how-tos/redis.md @@ -0,0 +1,38 @@ +# Redis Configuration + +By default conductor runs with an in-memory Redis mock. However, you +can change the configuration by setting the properties `conductor.db.type` and `conductor.redis.hosts`. + +## `conductor.db.type` + +| Value | Description | +|--------------------------------|----------------------------------------------------------------------------------------| +| dynomite | Dynomite Cluster. Dynomite is a proxy layer that provides sharding and replication. | +| memory | Uses an in-memory Redis mock. Should be used only for development and testing purposes.| +| redis_cluster | Redis Cluster configuration. | +| redis_sentinel | Redis Sentinel configuration. | +| redis_standalone | Redis Standalone configuration. | + + + +## `conductor.redis.hosts` + +Expected format is `host:port:rack` separated by semicolon, e.g.: + +```properties +conductor.redis.hosts=host0:6379:us-east-1c;host1:6379:us-east-1c;host2:6379:us-east-1c +``` + +### Auth Support + +Password authentication is supported. The password should be set as the 4th param of the first host `host:port:rack:password`, e.g.: + +```properties +conductor.redis.hosts=host0:6379:us-east-1c:my_str0ng_pazz;host1:6379:us-east-1c;host2:6379:us-east-1c +``` + + +**Notes** + +- In a cluster, all nodes use the same password. +- In a sentinel configuration, sentinels and redis nodes use the same password. diff --git a/docs/docs/reference-docs/do-while-task.md b/docs/docs/reference-docs/do-while-task.md index d585d5009..12d3849b2 100644 --- a/docs/docs/reference-docs/do-while-task.md +++ b/docs/docs/reference-docs/do-while-task.md @@ -14,14 +14,14 @@ When scheduled, each task of this loop will see its `taskReferenceName` concaten Each task output is stored as part of the DO_WHILE task, indexed by the iteration value (see example below), allowing the condition to reference the output of a task for a specific iteration (eg. $.LoopTask['iteration']['first_task']) -The DO_WHILE task is set to `FAILED` as soon as one of the loopTask fails. In such case retry, iteration starts from 1. +The DO_WHILE task is set to `FAILED` as soon as one of the loopOver fails. In such case retry, iteration starts from 1. #### Limitations - Domain or isolation group execution is unsupported; - Nested DO_WHILE is unsupported; -- SUB_WORKFLOW is unsupported; -- Since loopover tasks will be executed in loop inside scope of parent do while task, crossing branching outside of DO_WHILE task is not respected. +- Since loopover tasks will be executed in loop inside scope of parent do while task, crossing branching outside of DO_WHILE task is not respected. +- Nested DO_WHILE tasks are not supported. However, DO_WHILE task supports SUB_WORKFLOW as loopOver task, so we can achieve similar functionality. -Branching inside loopover task is supported. +Branching inside loopOver task is supported. diff --git a/es6-persistence/build.gradle b/es6-persistence/build.gradle index f4d2d430b..2bf0d49c8 100644 --- a/es6-persistence/build.gradle +++ b/es6-persistence/build.gradle @@ -16,6 +16,7 @@ dependencies { implementation project(':conductor-core') compileOnly 'org.springframework.boot:spring-boot-starter' + compileOnly 'org.springframework.retry:spring-retry' implementation "commons-io:commons-io:${revCommonsIo}" implementation "org.apache.commons:commons-lang3" @@ -26,6 +27,7 @@ dependencies { implementation "org.elasticsearch.client:elasticsearch-rest-client" implementation "org.elasticsearch.client:elasticsearch-rest-high-level-client" + testImplementation 'org.springframework.retry:spring-retry' testImplementation "org.awaitility:awaitility:${revAwaitility}" testImplementation "org.testcontainers:elasticsearch:${revTestContainer}" testImplementation project(':conductor-common').sourceSets.test.output diff --git a/es6-persistence/dependencies.lock b/es6-persistence/dependencies.lock index 958e15162..99aa8831c 100644 --- a/es6-persistence/dependencies.lock +++ b/es6-persistence/dependencies.lock @@ -1,30 +1,217 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.guava:guava": { "locked": "30.0-jre" }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, "commons-io:commons-io": { "locked": "2.7" }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] + }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -35,8 +222,108 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { "locked": "6.8.12" @@ -44,210 +331,1179 @@ "org.elasticsearch.client:transport": { "locked": "6.8.12" }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.9", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content", + "org.springframework.boot:spring-boot-starter" + ] } }, "runtimeClasspath": { + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "org.elasticsearch:elasticsearch-x-content" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], "locked": "30.0-jre" }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ + "locked": "2.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] }, "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { "locked": "6.8.12" }, "org.elasticsearch.client:transport": { "locked": "6.8.12" + }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.9", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] } }, "testCompileClasspath": { + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.github.docker-java:docker-java-api" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.guava:guava": { "locked": "30.0-jre" }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, "commons-io:commons-io": { "locked": "2.7" }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.awaitility:awaitility": { "locked": "3.1.6" }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { "locked": "6.8.12" @@ -255,175 +1511,883 @@ "org.elasticsearch.client:transport": { "locked": "6.8.12" }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit", + "org.awaitility:awaitility", + "org.hamcrest:hamcrest-library" + ] + }, + "org.hamcrest:hamcrest-library": { + "locked": "2.2", + "transitive": [ + "org.awaitility:awaitility" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.9", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.awaitility:awaitility", + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.testcontainers:elasticsearch": { "locked": "1.15.3" + }, + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:elasticsearch" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content", + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.github.docker-java:docker-java-api", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "org.elasticsearch:elasticsearch-x-content" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], "locked": "30.0-jre" }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "org.elasticsearch.plugin:transport-netty4-client" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.awaitility:awaitility": { "locked": "3.1.6" }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { "locked": "6.8.12" @@ -431,14 +2395,375 @@ "org.elasticsearch.client:transport": { "locked": "6.8.12" }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit", + "org.awaitility:awaitility", + "org.hamcrest:hamcrest-library" + ] + }, + "org.hamcrest:hamcrest-library": { + "locked": "2.2", + "transitive": [ + "org.awaitility:awaitility" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.9", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.awaitility:awaitility", + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.testcontainers:elasticsearch": { "locked": "1.15.3" + }, + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:elasticsearch" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content", + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/es6-persistence/src/main/java/com/netflix/conductor/es6/config/ElasticSearchV6Configuration.java b/es6-persistence/src/main/java/com/netflix/conductor/es6/config/ElasticSearchV6Configuration.java index 1f5f8469d..a16bea44d 100644 --- a/es6-persistence/src/main/java/com/netflix/conductor/es6/config/ElasticSearchV6Configuration.java +++ b/es6-persistence/src/main/java/com/netflix/conductor/es6/config/ElasticSearchV6Configuration.java @@ -34,10 +34,13 @@ import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.retry.backoff.FixedBackOffPolicy; +import org.springframework.retry.support.RetryTemplate; import com.netflix.conductor.dao.IndexDAO; import com.netflix.conductor.es6.dao.index.ElasticSearchDAOV6; @@ -122,15 +125,29 @@ public RestClientBuilder restClientBuilder(ElasticSearchProperties properties) { public IndexDAO es6IndexRestDAO( RestClientBuilder restClientBuilder, ElasticSearchProperties properties, + @Qualifier("es6RetryTemplate") RetryTemplate retryTemplate, ObjectMapper objectMapper) { - return new ElasticSearchRestDAOV6(restClientBuilder, properties, objectMapper); + return new ElasticSearchRestDAOV6( + restClientBuilder, retryTemplate, properties, objectMapper); } @Bean @Conditional(IsTcpProtocol.class) public IndexDAO es6IndexDAO( - Client client, ElasticSearchProperties properties, ObjectMapper objectMapper) { - return new ElasticSearchDAOV6(client, properties, objectMapper); + Client client, + @Qualifier("es6RetryTemplate") RetryTemplate retryTemplate, + ElasticSearchProperties properties, + ObjectMapper objectMapper) { + return new ElasticSearchDAOV6(client, retryTemplate, properties, objectMapper); + } + + @Bean + public RetryTemplate es6RetryTemplate() { + RetryTemplate retryTemplate = new RetryTemplate(); + FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); + fixedBackOffPolicy.setBackOffPeriod(1000L); + retryTemplate.setBackOffPolicy(fixedBackOffPolicy); + return retryTemplate; } private HttpHost[] convertToHttpHosts(List hosts) { diff --git a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchDAOV6.java b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchDAOV6.java index 0b36f01f9..0d40fd61a 100644 --- a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchDAOV6.java +++ b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchDAOV6.java @@ -31,7 +31,6 @@ import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse; import org.elasticsearch.action.admin.indices.template.get.GetIndexTemplatesResponse; import org.elasticsearch.action.bulk.BulkRequestBuilder; -import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetRequest; @@ -40,7 +39,6 @@ import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.Client; import org.elasticsearch.common.Strings; import org.elasticsearch.common.settings.Settings; @@ -56,6 +54,7 @@ import org.elasticsearch.search.sort.SortOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.retry.support.RetryTemplate; import com.netflix.conductor.annotations.Trace; import com.netflix.conductor.common.metadata.events.EventExecution; @@ -63,7 +62,6 @@ import com.netflix.conductor.common.run.SearchResult; import com.netflix.conductor.common.run.TaskSummary; import com.netflix.conductor.common.run.WorkflowSummary; -import com.netflix.conductor.common.utils.RetryUtil; import com.netflix.conductor.core.events.queue.Message; import com.netflix.conductor.core.exception.ApplicationException; import com.netflix.conductor.dao.IndexDAO; @@ -86,7 +84,6 @@ public class ElasticSearchDAOV6 extends ElasticSearchBaseDAO implements IndexDAO private static final String EVENT_DOC_TYPE = "event"; private static final String MSG_DOC_TYPE = "message"; - private static final int RETRY_COUNT = 3; private static final int CORE_POOL_SIZE = 6; private static final long KEEP_ALIVE_TIME = 1L; private static final int UPDATE_REQUEST_RETRY_COUNT = 5; @@ -117,12 +114,15 @@ public class ElasticSearchDAOV6 extends ElasticSearchBaseDAO implements IndexDAO private final long asyncBufferFlushTimeout; private final ElasticSearchProperties properties; + private final RetryTemplate retryTemplate; + static { SIMPLE_DATE_FORMAT.setTimeZone(GMT); } public ElasticSearchDAOV6( Client elasticSearchClient, + RetryTemplate retryTemplate, ElasticSearchProperties properties, ObjectMapper objectMapper) { this.objectMapper = objectMapper; @@ -182,6 +182,7 @@ public ElasticSearchDAOV6( Executors.newSingleThreadScheduledExecutor() .scheduleAtFixedRate(this::flushBulkRequests, 60, 30, TimeUnit.SECONDS); + this.retryTemplate = retryTemplate; } @PreDestroy @@ -360,14 +361,7 @@ public void indexWorkflow(WorkflowSummary workflow) { StringUtils.isBlank(docTypeOverride) ? WORKFLOW_DOC_TYPE : docTypeOverride; UpdateRequest req = buildUpdateRequest(id, doc, workflowIndexName, docType); - new RetryUtil() - .retryOnException( - () -> elasticSearchClient.update(req).actionGet(), - null, - null, - RETRY_COUNT, - "Indexing workflow document: " + workflow.getWorkflowId(), - "indexWorkflow"); + elasticSearchClient.update(req).actionGet(); long endTime = Instant.now().toEpochMilli(); LOGGER.debug( @@ -461,14 +455,7 @@ public void addTaskExecutionLogs(List taskExecLogs) { request.source(objectMapper.writeValueAsBytes(log), XContentType.JSON); bulkRequestBuilder.add(request); } - new RetryUtil() - .retryOnException( - () -> bulkRequestBuilder.execute().actionGet(5, TimeUnit.SECONDS), - null, - BulkResponse::hasFailures, - RETRY_COUNT, - "Indexing task execution logs", - "addTaskExecutionLogs"); + bulkRequestBuilder.execute().actionGet(5, TimeUnit.SECONDS); long endTime = Instant.now().toEpochMilli(); LOGGER.debug("Time taken {} for indexing taskExecutionLogs", endTime - startTime); Monitors.recordESIndexTime( @@ -656,14 +643,7 @@ private List mapEventExecutionsResponse(SearchResponse response) private void updateWithRetry(BulkRequestBuilderWrapper request, String docType) { try { long startTime = Instant.now().toEpochMilli(); - new RetryUtil() - .retryOnException( - () -> request.execute().actionGet(5, TimeUnit.SECONDS), - null, - BulkResponse::hasFailures, - RETRY_COUNT, - "Bulk Indexing " + docType, - "updateWithRetry"); + retryTemplate.execute(context -> request.execute().actionGet(5, TimeUnit.SECONDS)); long endTime = Instant.now().toEpochMilli(); LOGGER.debug( "Time taken {} for indexing object of type: {}", endTime - startTime, docType); @@ -738,14 +718,7 @@ public void updateWorkflow(String workflowInstanceId, String[] keys, Object[] va "Updating workflow {} in elasticsearch index: {}", workflowInstanceId, workflowIndexName); - new RetryUtil<>() - .retryOnException( - () -> elasticSearchClient.update(request).actionGet(), - null, - null, - RETRY_COUNT, - "Updating index for doc_type workflow", - "updateWorkflow"); + elasticSearchClient.update(request).actionGet(); long endTime = Instant.now().toEpochMilli(); LOGGER.debug( "Time taken {} for updating workflow: {}", endTime - startTime, workflowInstanceId); diff --git a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDAOV6.java b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDAOV6.java index 2e2083ea4..a55d2f7d3 100644 --- a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDAOV6.java +++ b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDAOV6.java @@ -35,17 +35,14 @@ import org.apache.http.util.EntityUtils; import org.elasticsearch.action.DocWriteResponse; import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.delete.DeleteResponse; import org.elasticsearch.action.get.GetRequest; import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.action.update.UpdateResponse; import org.elasticsearch.client.*; import org.elasticsearch.client.core.CountRequest; import org.elasticsearch.client.core.CountResponse; @@ -59,6 +56,7 @@ import org.elasticsearch.search.sort.SortOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.retry.support.RetryTemplate; import com.netflix.conductor.annotations.Trace; import com.netflix.conductor.common.metadata.events.EventExecution; @@ -66,7 +64,6 @@ import com.netflix.conductor.common.run.SearchResult; import com.netflix.conductor.common.run.TaskSummary; import com.netflix.conductor.common.run.WorkflowSummary; -import com.netflix.conductor.common.utils.RetryUtil; import com.netflix.conductor.core.events.queue.Message; import com.netflix.conductor.core.exception.ApplicationException; import com.netflix.conductor.dao.IndexDAO; @@ -86,7 +83,6 @@ public class ElasticSearchRestDAOV6 extends ElasticSearchBaseDAO implements Inde private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchRestDAOV6.class); - private static final int RETRY_COUNT = 3; private static final int CORE_POOL_SIZE = 6; private static final long KEEP_ALIVE_TIME = 1L; @@ -130,12 +126,15 @@ public class ElasticSearchRestDAOV6 extends ElasticSearchBaseDAO implements Inde private final long asyncBufferFlushTimeout; private final ElasticSearchProperties properties; + private final RetryTemplate retryTemplate; + static { SIMPLE_DATE_FORMAT.setTimeZone(GMT); } public ElasticSearchRestDAOV6( RestClientBuilder restClientBuilder, + RetryTemplate retryTemplate, ElasticSearchProperties properties, ObjectMapper objectMapper) { @@ -202,6 +201,7 @@ public ElasticSearchRestDAOV6( Executors.newSingleThreadScheduledExecutor() .scheduleAtFixedRate(this::flushBulkRequests, 60, 30, TimeUnit.SECONDS); + this.retryTemplate = retryTemplate; } @PreDestroy @@ -453,21 +453,7 @@ public void indexWorkflow(WorkflowSummary workflow) { IndexRequest request = new IndexRequest(workflowIndexName, docType, workflowId); request.source(docBytes, XContentType.JSON); - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.index(request); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - null, - RETRY_COUNT, - "Indexing workflow document: " + workflow.getWorkflowId(), - "indexWorkflow"); - + elasticSearchClient.index(request, RequestOptions.DEFAULT); long endTime = Instant.now().toEpochMilli(); LOGGER.debug( "Time taken {} for indexing workflow: {}", endTime - startTime, workflowId); @@ -537,20 +523,7 @@ public void addTaskExecutionLogs(List taskExecLogs) { } try { - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.bulk(bulkRequest); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - BulkResponse::hasFailures, - RETRY_COUNT, - "Indexing task execution logs", - "addTaskExecutionLogs"); + elasticSearchClient.bulk(bulkRequest, RequestOptions.DEFAULT); long endTime = Instant.now().toEpochMilli(); LOGGER.debug("Time taken {} for indexing taskExecutionLogs", endTime - startTime); Monitors.recordESIndexTime( @@ -799,43 +772,38 @@ public CompletableFuture asyncRemoveWorkflow(String workflowId) { @Override public void updateWorkflow(String workflowInstanceId, String[] keys, Object[] values) { - if (keys.length != values.length) { - throw new ApplicationException( - ApplicationException.Code.INVALID_INPUT, - "Number of keys and values do not match"); - } + try { + if (keys.length != values.length) { + throw new ApplicationException( + ApplicationException.Code.INVALID_INPUT, + "Number of keys and values do not match"); + } - long startTime = Instant.now().toEpochMilli(); - String docType = StringUtils.isBlank(docTypeOverride) ? WORKFLOW_DOC_TYPE : docTypeOverride; - UpdateRequest request = new UpdateRequest(workflowIndexName, docType, workflowInstanceId); - Map source = - IntStream.range(0, keys.length) - .boxed() - .collect(Collectors.toMap(i -> keys[i], i -> values[i])); - request.doc(source); - - LOGGER.debug("Updating workflow {} with {}", workflowInstanceId, source); - - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.update(request); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - null, - RETRY_COUNT, - "Updating workflow document: " + workflowInstanceId, - "updateWorkflow"); - long endTime = Instant.now().toEpochMilli(); - LOGGER.debug( - "Time taken {} for updating workflow: {}", endTime - startTime, workflowInstanceId); - Monitors.recordESIndexTime("update_workflow", WORKFLOW_DOC_TYPE, endTime - startTime); - Monitors.recordWorkerQueueSize( - "indexQueue", ((ThreadPoolExecutor) executorService).getQueue().size()); + long startTime = Instant.now().toEpochMilli(); + String docType = + StringUtils.isBlank(docTypeOverride) ? WORKFLOW_DOC_TYPE : docTypeOverride; + UpdateRequest request = + new UpdateRequest(workflowIndexName, docType, workflowInstanceId); + Map source = + IntStream.range(0, keys.length) + .boxed() + .collect(Collectors.toMap(i -> keys[i], i -> values[i])); + request.doc(source); + + LOGGER.debug("Updating workflow {} with {}", workflowInstanceId, source); + elasticSearchClient.update(request, RequestOptions.DEFAULT); + long endTime = Instant.now().toEpochMilli(); + LOGGER.debug( + "Time taken {} for updating workflow: {}", + endTime - startTime, + workflowInstanceId); + Monitors.recordESIndexTime("update_workflow", WORKFLOW_DOC_TYPE, endTime - startTime); + Monitors.recordWorkerQueueSize( + "indexQueue", ((ThreadPoolExecutor) executorService).getQueue().size()); + } catch (Exception e) { + LOGGER.error("Failed to update workflow {}", workflowInstanceId, e); + Monitors.error(className, "update"); + } } @Override @@ -1057,20 +1025,8 @@ private void indexWithRetry( final BulkRequest request, final String operationDescription, String docType) { try { long startTime = Instant.now().toEpochMilli(); - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.bulk(request); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - null, - RETRY_COUNT, - operationDescription, - "indexWithRetry"); + retryTemplate.execute( + context -> elasticSearchClient.bulk(request, RequestOptions.DEFAULT)); long endTime = Instant.now().toEpochMilli(); LOGGER.debug( "Time taken {} for indexing object of type: {}", endTime - startTime, docType); diff --git a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/FilterProvider.java b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/FilterProvider.java index 9dce2d775..3c145975d 100644 --- a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/FilterProvider.java +++ b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/FilterProvider.java @@ -16,6 +16,8 @@ public interface FilterProvider { - /** @return FilterBuilder for elasticsearch */ + /** + * @return FilterBuilder for elasticsearch + */ public QueryBuilder getFilterBuilder(); } diff --git a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/GroupedExpression.java b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/GroupedExpression.java index 84d362caf..90fc3b489 100644 --- a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/GroupedExpression.java +++ b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/GroupedExpression.java @@ -43,7 +43,9 @@ public String toString() { return "(" + expression + ")"; } - /** @return the expression */ + /** + * @return the expression + */ public Expression getExpression() { return expression; } diff --git a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/NameValue.java b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/NameValue.java index 75af2e885..68c1e5af2 100644 --- a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/NameValue.java +++ b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/NameValue.java @@ -72,17 +72,23 @@ public String toString() { return "" + name + op + value; } - /** @return the name */ + /** + * @return the name + */ public Name getName() { return name; } - /** @return the op */ + /** + * @return the op + */ public ComparisonOp getOp() { return op; } - /** @return the value */ + /** + * @return the value + */ public ConstValue getValue() { return value; } diff --git a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/internal/Range.java b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/internal/Range.java index b9d2b083a..aa4c66f7a 100644 --- a/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/internal/Range.java +++ b/es6-persistence/src/main/java/com/netflix/conductor/es6/dao/query/parser/internal/Range.java @@ -55,12 +55,16 @@ private String readNumber(InputStream is) throws Exception { return sb.toString().trim(); } - /** @return the low */ + /** + * @return the low + */ public String getLow() { return low; } - /** @return the high */ + /** + * @return the high + */ public String getHigh() { return high; } diff --git a/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchDaoBaseTest.java b/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchDaoBaseTest.java index 6dc8cd8c4..529f22e12 100644 --- a/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchDaoBaseTest.java +++ b/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchDaoBaseTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at @@ -25,6 +25,7 @@ import org.junit.After; import org.junit.AfterClass; import org.junit.Before; +import org.springframework.retry.support.RetryTemplate; abstract class ElasticSearchDaoBaseTest extends ElasticSearchTest { @@ -45,7 +46,9 @@ public void setup() throws Exception { new TransportAddress( InetAddress.getByName("localhost"), mappedPort)); - indexDAO = new ElasticSearchDAOV6(elasticSearchClient, properties, objectMapper); + indexDAO = + new ElasticSearchDAOV6( + elasticSearchClient, new RetryTemplate(), properties, objectMapper); indexDAO.setup(); } diff --git a/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDaoBaseTest.java b/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDaoBaseTest.java index 1ac35c854..59584e1dc 100644 --- a/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDaoBaseTest.java +++ b/es6-persistence/src/test/java/com/netflix/conductor/es6/dao/index/ElasticSearchRestDaoBaseTest.java @@ -23,6 +23,7 @@ import org.elasticsearch.client.RestClientBuilder; import org.junit.After; import org.junit.Before; +import org.springframework.retry.support.RetryTemplate; abstract class ElasticSearchRestDaoBaseTest extends ElasticSearchTest { @@ -40,7 +41,9 @@ public void setup() throws Exception { RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host, port, "http")); restClient = restClientBuilder.build(); - indexDAO = new ElasticSearchRestDAOV6(restClientBuilder, properties, objectMapper); + indexDAO = + new ElasticSearchRestDAOV6( + restClientBuilder, new RetryTemplate(), properties, objectMapper); indexDAO.setup(); } diff --git a/es6-persistence/src/test/java/com/netflix/conductor/es6/utils/TestUtils.java b/es6-persistence/src/test/java/com/netflix/conductor/es6/utils/TestUtils.java index 87a90276c..1102cd494 100644 --- a/es6-persistence/src/test/java/com/netflix/conductor/es6/utils/TestUtils.java +++ b/es6-persistence/src/test/java/com/netflix/conductor/es6/utils/TestUtils.java @@ -31,7 +31,7 @@ public static WorkflowSummary loadWorkflowSnapshot( ObjectMapper objectMapper, String resourceFileName) { try { String content = loadJsonResource(resourceFileName); - String workflowId = IDGenerator.generate(); + String workflowId = new IDGenerator().generate(); content = content.replace(WORKFLOW_INSTANCE_ID_PLACEHOLDER, workflowId); return objectMapper.readValue(content, WorkflowSummary.class); @@ -43,7 +43,7 @@ public static WorkflowSummary loadWorkflowSnapshot( public static TaskSummary loadTaskSnapshot(ObjectMapper objectMapper, String resourceFileName) { try { String content = loadJsonResource(resourceFileName); - String workflowId = IDGenerator.generate(); + String workflowId = new IDGenerator().generate(); content = content.replace(WORKFLOW_INSTANCE_ID_PLACEHOLDER, workflowId); return objectMapper.readValue(content, TaskSummary.class); diff --git a/es7-persistence/README.md b/es7-persistence/README.md deleted file mode 100644 index 8cf4fd7ab..000000000 --- a/es7-persistence/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# ES7 Persistence - -This module provides ES7 persistence when indexing workflows and tasks. - -## ES Breaking changes - -From ES6 to ES7 there were significant breaking changes which affected ES7-persistence module implementation. -* Mapping type deprecation -* Templates API -* TransportClient deprecation - -More information can be found here: https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking-changes-7.0.html - - -## Build - -1. In order to use the ES7, you must change the following files from ES6 to ES7: - -https://github.com/Netflix/conductor/blob/main/build.gradle -https://github.com/Netflix/conductor/blob/main/server/src/main/resources/application.properties - -In file: - -- /build.gradle - -change ext['elasticsearch.version'] from revElasticSearch6 to revElasticSearch7 - - -In file: - -- /server/src/main/resources/application.properties - -change conductor.elasticsearch.version from 6 to 7 - -Also you need to recreate dependencies.lock files with ES7 dependencies. To do that delete all dependencies.lock files and then run: - -``` -./gradlew generateLock updateLock saveLock -``` - - -2. To use the ES7 for all modules include test-harness, you must change also the following files: - -https://github.com/Netflix/conductor/blob/main/test-harness/build.gradle -https://github.com/Netflix/conductor/blob/main/test-harness/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java - -In file: - -- /test-harness/build.gradle - -* change module inclusion from 'es6-persistence' to 'es7-persistence' - -In file: - -- /test-harness/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java - -* change conductor.elasticsearch.version from 6 to 7 -* change DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch-oss").withTag("6.8.12") to DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch-oss").withTag("7.6.2") - - -## Usage - -This module uses the following configuration options: - -* `conductor.elasticsearch.url` - A comma separated list of schema/host/port of the ES nodes to communicate with. -Schema can be `http` or `https`. If schema is ignored then `http` transport will be used; -Since ES deprecated TransportClient, conductor will use only the REST transport protocol. -* `conductor.elasticsearch.indexPrefix` - The name of the workflow and task index. -Defaults to `conductor` -* `conductor.elasticsearch.asyncWorkerQueueSize` - Worker Queue size used in executor service for async methods in IndexDao -Defaults to `100` -* `conductor.elasticsearch.asyncMaxPoolSize` - Maximum thread pool size in executor service for async methods in IndexDao -Defaults to `12` -* `conductor.elasticsearch.asyncBufferFlushTimeout` - Timeout (in seconds) for the in-memory to be flushed if not explicitly indexed -Defaults to `10` - -### BASIC Authentication -If you need to pass user/password to connect to ES, add the following properties to your config file -* conductor.elasticsearch.username -* conductor.elasticsearch.password - -Example -``` -conductor.elasticsearch.username=someusername -conductor.elasticsearch.password=somepassword -``` diff --git a/es7-persistence/build.gradle b/es7-persistence/build.gradle deleted file mode 100644 index 646a35ea3..000000000 --- a/es7-persistence/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2021 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -plugins { - id 'com.github.johnrengelman.shadow' version '6.1.0' - id 'java' -} - -configurations { - // Prevent shaded dependencies from being published, while keeping them available to tests - shadow.extendsFrom compileOnly - testRuntime.extendsFrom compileOnly -} - -ext['elasticsearch.version'] = revElasticSearch7 - -dependencies { - implementation project(':conductor-common') - implementation project(':conductor-core') - - compileOnly 'org.springframework.boot:spring-boot-starter' - - implementation "commons-io:commons-io:${revCommonsIo}" - implementation "org.apache.commons:commons-lang3" - // SBMTODO: remove guava dep - implementation "com.google.guava:guava:${revGuava}" - - implementation "com.fasterxml.jackson.core:jackson-databind" - implementation "com.fasterxml.jackson.core:jackson-core" - - implementation "org.elasticsearch.client:elasticsearch-rest-client" - implementation "org.elasticsearch.client:elasticsearch-rest-high-level-client" - - testImplementation "org.awaitility:awaitility:${revAwaitility}" - testImplementation "org.testcontainers:elasticsearch:${revTestContainer}" - testImplementation project(':conductor-common').sourceSets.test.output -} - -// Drop the classifier and delete jar task actions to replace the regular jar artifact with the shadow artifact -shadowJar { - configurations = [project.configurations.shadow] - classifier = null - - // Service files are not included by default. - mergeServiceFiles { - include 'META-INF/services/*' - include 'META-INF/maven/*' - } -} - -jar.enabled = false -jar.dependsOn shadowJar diff --git a/es7-persistence/dependencies.lock b/es7-persistence/dependencies.lock deleted file mode 100644 index a1ad2b136..000000000 --- a/es7-persistence/dependencies.lock +++ /dev/null @@ -1,454 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.15.2" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.15.2" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.15.2" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.15.2" - } - }, - "shadow": { - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.awaitility:awaitility": { - "locked": "3.1.6" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.15.2" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.15.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - } - }, - "testRuntime": { - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.awaitility:awaitility": { - "locked": "3.1.6" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.15.2" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.15.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchConditions.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchConditions.java deleted file mode 100644 index 8a4179139..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchConditions.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.config; - -import org.springframework.boot.autoconfigure.condition.AllNestedConditions; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; - -public class ElasticSearchConditions { - - private ElasticSearchConditions() {} - - public static class ElasticSearchV7Enabled extends AllNestedConditions { - - ElasticSearchV7Enabled() { - super(ConfigurationPhase.PARSE_CONFIGURATION); - } - - @SuppressWarnings("unused") - @ConditionalOnProperty( - name = "conductor.indexing.enabled", - havingValue = "true", - matchIfMissing = true) - static class enabledIndexing {} - - @SuppressWarnings("unused") - @ConditionalOnProperty( - name = "conductor.elasticsearch.version", - havingValue = "7", - matchIfMissing = true) - static class enabledES7 {} - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchProperties.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchProperties.java deleted file mode 100644 index 8b15d30b5..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchProperties.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.config; - -import java.net.MalformedURLException; -import java.net.URL; -import java.time.Duration; -import java.time.temporal.ChronoUnit; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.convert.DurationUnit; - -@ConfigurationProperties("conductor.elasticsearch") -public class ElasticSearchProperties { - - /** - * The comma separated list of urls for the elasticsearch cluster. Format -- - * host1:port1,host2:port2 - */ - private String url = "localhost:9300"; - - /** The index prefix to be used when creating indices */ - private String indexPrefix = "conductor"; - - /** The color of the elasticserach cluster to wait for to confirm healthy status */ - private String clusterHealthColor = "green"; - - /** The size of the batch to be used for bulk indexing in async mode */ - private int indexBatchSize = 1; - - /** The size of the queue used for holding async indexing tasks */ - private int asyncWorkerQueueSize = 100; - - /** The maximum number of threads allowed in the async pool */ - private int asyncMaxPoolSize = 12; - - /** - * The time in seconds after which the async buffers will be flushed (if no activity) to prevent - * data loss - */ - @DurationUnit(ChronoUnit.SECONDS) - private Duration asyncBufferFlushTimeout = Duration.ofSeconds(10); - - /** The number of shards that the index will be created with */ - private int indexShardCount = 5; - - /** The number of replicas that the index will be configured to have */ - private int indexReplicasCount = 1; - - /** The number of task log results that will be returned in the response */ - private int taskLogResultLimit = 10; - - /** The timeout in milliseconds used when requesting a connection from the connection manager */ - private int restClientConnectionRequestTimeout = -1; - - /** Used to control if index management is to be enabled or will be controlled externally */ - private boolean autoIndexManagementEnabled = true; - - /** - * Document types are deprecated in ES6 and removed from ES7. This property can be used to - * disable the use of specific document types with an override. This property is currently used - * in ES6 module. - * - *

Note that this property will only take effect if {@link - * ElasticSearchProperties#isAutoIndexManagementEnabled} is set to false and index management is - * handled outside of this module. - */ - private String documentTypeOverride = ""; - - /** Elasticsearch basic auth username */ - private String username; - - /** Elasticsearch basic auth password */ - private String password; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - - public String getIndexPrefix() { - return indexPrefix; - } - - public void setIndexPrefix(String indexPrefix) { - this.indexPrefix = indexPrefix; - } - - public String getClusterHealthColor() { - return clusterHealthColor; - } - - public void setClusterHealthColor(String clusterHealthColor) { - this.clusterHealthColor = clusterHealthColor; - } - - public int getIndexBatchSize() { - return indexBatchSize; - } - - public void setIndexBatchSize(int indexBatchSize) { - this.indexBatchSize = indexBatchSize; - } - - public int getAsyncWorkerQueueSize() { - return asyncWorkerQueueSize; - } - - public void setAsyncWorkerQueueSize(int asyncWorkerQueueSize) { - this.asyncWorkerQueueSize = asyncWorkerQueueSize; - } - - public int getAsyncMaxPoolSize() { - return asyncMaxPoolSize; - } - - public void setAsyncMaxPoolSize(int asyncMaxPoolSize) { - this.asyncMaxPoolSize = asyncMaxPoolSize; - } - - public Duration getAsyncBufferFlushTimeout() { - return asyncBufferFlushTimeout; - } - - public void setAsyncBufferFlushTimeout(Duration asyncBufferFlushTimeout) { - this.asyncBufferFlushTimeout = asyncBufferFlushTimeout; - } - - public int getIndexShardCount() { - return indexShardCount; - } - - public void setIndexShardCount(int indexShardCount) { - this.indexShardCount = indexShardCount; - } - - public int getIndexReplicasCount() { - return indexReplicasCount; - } - - public void setIndexReplicasCount(int indexReplicasCount) { - this.indexReplicasCount = indexReplicasCount; - } - - public int getTaskLogResultLimit() { - return taskLogResultLimit; - } - - public void setTaskLogResultLimit(int taskLogResultLimit) { - this.taskLogResultLimit = taskLogResultLimit; - } - - public int getRestClientConnectionRequestTimeout() { - return restClientConnectionRequestTimeout; - } - - public void setRestClientConnectionRequestTimeout(int restClientConnectionRequestTimeout) { - this.restClientConnectionRequestTimeout = restClientConnectionRequestTimeout; - } - - public boolean isAutoIndexManagementEnabled() { - return autoIndexManagementEnabled; - } - - public void setAutoIndexManagementEnabled(boolean autoIndexManagementEnabled) { - this.autoIndexManagementEnabled = autoIndexManagementEnabled; - } - - public String getDocumentTypeOverride() { - return documentTypeOverride; - } - - public void setDocumentTypeOverride(String documentTypeOverride) { - this.documentTypeOverride = documentTypeOverride; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public List toURLs() { - String clusterAddress = getUrl(); - String[] hosts = clusterAddress.split(","); - return Arrays.stream(hosts) - .map( - host -> - (host.startsWith("http://") || host.startsWith("https://")) - ? toURL(host) - : toURL("http://" + host)) - .collect(Collectors.toList()); - } - - private URL toURL(String url) { - try { - return new URL(url); - } catch (MalformedURLException e) { - throw new IllegalArgumentException(url + "can not be converted to java.net.URL"); - } - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchV7Configuration.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchV7Configuration.java deleted file mode 100644 index bc241b446..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchV7Configuration.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.config; - -import java.net.URL; -import java.util.List; - -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.elasticsearch.client.RestClient; -import org.elasticsearch.client.RestClientBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Conditional; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.dao.IndexDAO; -import com.netflix.conductor.es7.dao.index.ElasticSearchRestDAOV7; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(ElasticSearchProperties.class) -@Conditional(ElasticSearchConditions.ElasticSearchV7Enabled.class) -public class ElasticSearchV7Configuration { - - private static final Logger log = LoggerFactory.getLogger(ElasticSearchV7Configuration.class); - - @Bean - public RestClient restClient(ElasticSearchProperties properties) { - RestClientBuilder restClientBuilder = - RestClient.builder(convertToHttpHosts(properties.toURLs())); - if (properties.getRestClientConnectionRequestTimeout() > 0) { - restClientBuilder.setRequestConfigCallback( - requestConfigBuilder -> - requestConfigBuilder.setConnectionRequestTimeout( - properties.getRestClientConnectionRequestTimeout())); - } - return restClientBuilder.build(); - } - - @Bean - public RestClientBuilder restClientBuilder(ElasticSearchProperties properties) { - RestClientBuilder builder = RestClient.builder(convertToHttpHosts(properties.toURLs())); - - if (properties.getUsername() != null && properties.getPassword() != null) { - log.info( - "Configure ElasticSearch with BASIC authentication. User:{}", - properties.getUsername()); - final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - credentialsProvider.setCredentials( - AuthScope.ANY, - new UsernamePasswordCredentials( - properties.getUsername(), properties.getPassword())); - builder.setHttpClientConfigCallback( - httpClientBuilder -> - httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider)); - } else { - log.info("Configure ElasticSearch with no authentication."); - } - return builder; - } - - @Bean - public IndexDAO es7IndexDAO( - RestClientBuilder restClientBuilder, - ElasticSearchProperties properties, - ObjectMapper objectMapper) { - String url = properties.getUrl(); - return new ElasticSearchRestDAOV7(restClientBuilder, properties, objectMapper); - } - - private HttpHost[] convertToHttpHosts(List hosts) { - return hosts.stream() - .map(host -> new HttpHost(host.getHost(), host.getPort(), host.getProtocol())) - .toArray(HttpHost[]::new); - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/BulkRequestBuilderWrapper.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/BulkRequestBuilderWrapper.java deleted file mode 100644 index b046d3eb6..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/BulkRequestBuilderWrapper.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import java.util.Objects; - -import org.elasticsearch.action.ActionFuture; -import org.elasticsearch.action.bulk.BulkRequestBuilder; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.update.UpdateRequest; -import org.springframework.lang.NonNull; - -/** Thread-safe wrapper for {@link BulkRequestBuilder}. */ -public class BulkRequestBuilderWrapper { - private final BulkRequestBuilder bulkRequestBuilder; - - public BulkRequestBuilderWrapper(@NonNull BulkRequestBuilder bulkRequestBuilder) { - this.bulkRequestBuilder = Objects.requireNonNull(bulkRequestBuilder); - } - - public void add(@NonNull UpdateRequest req) { - synchronized (bulkRequestBuilder) { - bulkRequestBuilder.add(Objects.requireNonNull(req)); - } - } - - public void add(@NonNull IndexRequest req) { - synchronized (bulkRequestBuilder) { - bulkRequestBuilder.add(Objects.requireNonNull(req)); - } - } - - public int numberOfActions() { - synchronized (bulkRequestBuilder) { - return bulkRequestBuilder.numberOfActions(); - } - } - - public ActionFuture execute() { - synchronized (bulkRequestBuilder) { - return bulkRequestBuilder.execute(); - } - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/BulkRequestWrapper.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/BulkRequestWrapper.java deleted file mode 100644 index 38d38d3d6..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/BulkRequestWrapper.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import java.util.Objects; - -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.update.UpdateRequest; -import org.springframework.lang.NonNull; - -/** Thread-safe wrapper for {@link BulkRequest}. */ -class BulkRequestWrapper { - private final BulkRequest bulkRequest; - - BulkRequestWrapper(@NonNull BulkRequest bulkRequest) { - this.bulkRequest = Objects.requireNonNull(bulkRequest); - } - - public void add(@NonNull UpdateRequest req) { - synchronized (bulkRequest) { - bulkRequest.add(Objects.requireNonNull(req)); - } - } - - public void add(@NonNull IndexRequest req) { - synchronized (bulkRequest) { - bulkRequest.add(Objects.requireNonNull(req)); - } - } - - BulkRequest get() { - return bulkRequest; - } - - int numberOfActions() { - synchronized (bulkRequest) { - return bulkRequest.numberOfActions(); - } - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/ElasticSearchBaseDAO.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/ElasticSearchBaseDAO.java deleted file mode 100644 index 02a225bd0..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/ElasticSearchBaseDAO.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import java.io.IOException; -import java.util.ArrayList; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; - -import com.netflix.conductor.dao.IndexDAO; -import com.netflix.conductor.es7.dao.query.parser.Expression; -import com.netflix.conductor.es7.dao.query.parser.internal.ParserException; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; - -abstract class ElasticSearchBaseDAO implements IndexDAO { - - String indexPrefix; - ObjectMapper objectMapper; - - String loadTypeMappingSource(String path) throws IOException { - return applyIndexPrefixToTemplate( - IOUtils.toString(ElasticSearchBaseDAO.class.getResourceAsStream(path))); - } - - private String applyIndexPrefixToTemplate(String text) throws JsonProcessingException { - String indexPatternsFieldName = "index_patterns"; - JsonNode root = objectMapper.readTree(text); - if (root != null) { - JsonNode indexPatternsNodeValue = root.get(indexPatternsFieldName); - if (indexPatternsNodeValue != null && indexPatternsNodeValue.isArray()) { - ArrayList patternsWithPrefix = new ArrayList<>(); - indexPatternsNodeValue.forEach( - v -> { - String patternText = v.asText(); - StringBuilder sb = new StringBuilder(); - if (patternText.startsWith("*")) { - sb.append("*") - .append(indexPrefix) - .append("_") - .append(patternText.substring(1)); - } else { - sb.append(indexPrefix).append("_").append(patternText); - } - patternsWithPrefix.add(sb.toString()); - }); - ((ObjectNode) root) - .set(indexPatternsFieldName, objectMapper.valueToTree(patternsWithPrefix)); - System.out.println( - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(root)); - return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(root); - } - } - return text; - } - - BoolQueryBuilder boolQueryBuilder(String expression, String queryString) - throws ParserException { - QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); - if (StringUtils.isNotEmpty(expression)) { - Expression exp = Expression.fromString(expression); - queryBuilder = exp.getFilterBuilder(); - } - BoolQueryBuilder filterQuery = QueryBuilders.boolQuery().must(queryBuilder); - QueryStringQueryBuilder stringQuery = QueryBuilders.queryStringQuery(queryString); - return QueryBuilders.boolQuery().must(stringQuery).must(filterQuery); - } - - protected String getIndexName(String documentType) { - return indexPrefix + "_" + documentType; - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/ElasticSearchRestDAOV7.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/ElasticSearchRestDAOV7.java deleted file mode 100644 index dd32f3982..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/index/ElasticSearchRestDAOV7.java +++ /dev/null @@ -1,1185 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import java.io.IOException; -import java.io.InputStream; -import java.text.SimpleDateFormat; -import java.time.Instant; -import java.time.LocalDate; -import java.util.*; -import java.util.concurrent.*; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; - -import org.apache.commons.io.IOUtils; -import org.apache.http.HttpEntity; -import org.apache.http.HttpStatus; -import org.apache.http.entity.ContentType; -import org.apache.http.nio.entity.NByteArrayEntity; -import org.apache.http.nio.entity.NStringEntity; -import org.apache.http.util.EntityUtils; -import org.elasticsearch.action.DocWriteResponse; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.action.delete.DeleteRequest; -import org.elasticsearch.action.delete.DeleteResponse; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.index.IndexResponse; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.action.update.UpdateResponse; -import org.elasticsearch.client.*; -import org.elasticsearch.client.core.CountRequest; -import org.elasticsearch.client.core.CountResponse; -import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.builder.SearchSourceBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.joda.time.DateTime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.annotations.Trace; -import com.netflix.conductor.common.metadata.events.EventExecution; -import com.netflix.conductor.common.metadata.tasks.TaskExecLog; -import com.netflix.conductor.common.run.SearchResult; -import com.netflix.conductor.common.run.TaskSummary; -import com.netflix.conductor.common.run.WorkflowSummary; -import com.netflix.conductor.common.utils.RetryUtil; -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.dao.IndexDAO; -import com.netflix.conductor.es7.config.ElasticSearchProperties; -import com.netflix.conductor.es7.dao.query.parser.internal.ParserException; -import com.netflix.conductor.metrics.Monitors; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.type.MapType; -import com.fasterxml.jackson.databind.type.TypeFactory; - -@Trace -public class ElasticSearchRestDAOV7 extends ElasticSearchBaseDAO implements IndexDAO { - - private static final Logger logger = LoggerFactory.getLogger(ElasticSearchRestDAOV7.class); - - private static final int RETRY_COUNT = 3; - private static final int CORE_POOL_SIZE = 6; - private static final long KEEP_ALIVE_TIME = 1L; - - private static final String WORKFLOW_DOC_TYPE = "workflow"; - private static final String TASK_DOC_TYPE = "task"; - private static final String LOG_DOC_TYPE = "task_log"; - private static final String EVENT_DOC_TYPE = "event"; - private static final String MSG_DOC_TYPE = "message"; - - private static final TimeZone GMT = TimeZone.getTimeZone("GMT"); - private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyyMMWW"); - - private @interface HttpMethod { - - String GET = "GET"; - String POST = "POST"; - String PUT = "PUT"; - String HEAD = "HEAD"; - } - - private static final String className = ElasticSearchRestDAOV7.class.getSimpleName(); - - private final String workflowIndexName; - private final String taskIndexName; - private final String eventIndexPrefix; - private String eventIndexName; - private final String messageIndexPrefix; - private String messageIndexName; - private String logIndexName; - private final String logIndexPrefix; - - private final String clusterHealthColor; - private final RestHighLevelClient elasticSearchClient; - private final RestClient elasticSearchAdminClient; - private final ExecutorService executorService; - private final ExecutorService logExecutorService; - private final ConcurrentHashMap bulkRequests; - private final int indexBatchSize; - private final int asyncBufferFlushTimeout; - private final ElasticSearchProperties properties; - - static { - SIMPLE_DATE_FORMAT.setTimeZone(GMT); - } - - public ElasticSearchRestDAOV7( - RestClientBuilder restClientBuilder, - ElasticSearchProperties properties, - ObjectMapper objectMapper) { - - this.objectMapper = objectMapper; - this.elasticSearchAdminClient = restClientBuilder.build(); - this.elasticSearchClient = new RestHighLevelClient(restClientBuilder); - this.clusterHealthColor = properties.getClusterHealthColor(); - this.bulkRequests = new ConcurrentHashMap<>(); - this.indexBatchSize = properties.getIndexBatchSize(); - this.asyncBufferFlushTimeout = (int) properties.getAsyncBufferFlushTimeout().getSeconds(); - this.properties = properties; - - this.indexPrefix = properties.getIndexPrefix(); - - this.workflowIndexName = getIndexName(WORKFLOW_DOC_TYPE); - this.taskIndexName = getIndexName(TASK_DOC_TYPE); - this.logIndexPrefix = this.indexPrefix + "_" + LOG_DOC_TYPE; - this.messageIndexPrefix = this.indexPrefix + "_" + MSG_DOC_TYPE; - this.eventIndexPrefix = this.indexPrefix + "_" + EVENT_DOC_TYPE; - int workerQueueSize = properties.getAsyncWorkerQueueSize(); - int maximumPoolSize = properties.getAsyncMaxPoolSize(); - - // Set up a workerpool for performing async operations. - this.executorService = - new ThreadPoolExecutor( - CORE_POOL_SIZE, - maximumPoolSize, - KEEP_ALIVE_TIME, - TimeUnit.MINUTES, - new LinkedBlockingQueue<>(workerQueueSize), - (runnable, executor) -> { - logger.warn( - "Request {} to async dao discarded in executor {}", - runnable, - executor); - Monitors.recordDiscardedIndexingCount("indexQueue"); - }); - - // Set up a workerpool for performing async operations for task_logs, event_executions, - // message - int corePoolSize = 1; - maximumPoolSize = 2; - long keepAliveTime = 30L; - this.logExecutorService = - new ThreadPoolExecutor( - corePoolSize, - maximumPoolSize, - keepAliveTime, - TimeUnit.SECONDS, - new LinkedBlockingQueue<>(workerQueueSize), - (runnable, executor) -> { - logger.warn( - "Request {} to async log dao discarded in executor {}", - runnable, - executor); - Monitors.recordDiscardedIndexingCount("logQueue"); - }); - - Executors.newSingleThreadScheduledExecutor() - .scheduleAtFixedRate(this::flushBulkRequests, 60, 30, TimeUnit.SECONDS); - } - - @PreDestroy - private void shutdown() { - logger.info("Gracefully shutdown executor service"); - shutdownExecutorService(logExecutorService); - shutdownExecutorService(executorService); - } - - private void shutdownExecutorService(ExecutorService execService) { - try { - execService.shutdown(); - if (execService.awaitTermination(30, TimeUnit.SECONDS)) { - logger.debug("tasks completed, shutting down"); - } else { - logger.warn("Forcing shutdown after waiting for 30 seconds"); - execService.shutdownNow(); - } - } catch (InterruptedException ie) { - logger.warn( - "Shutdown interrupted, invoking shutdownNow on scheduledThreadPoolExecutor for delay queue"); - execService.shutdownNow(); - Thread.currentThread().interrupt(); - } - } - - @Override - @PostConstruct - public void setup() throws Exception { - waitForHealthyCluster(); - - if (properties.isAutoIndexManagementEnabled()) { - createIndexesTemplates(); - createWorkflowIndex(); - createTaskIndex(); - } - } - - private void createIndexesTemplates() { - try { - initIndexesTemplates(); - updateIndexesNames(); - Executors.newScheduledThreadPool(1) - .scheduleAtFixedRate(this::updateIndexesNames, 0, 1, TimeUnit.HOURS); - } catch (Exception e) { - logger.error("Error creating index templates!", e); - } - } - - private void initIndexesTemplates() { - initIndexTemplate(LOG_DOC_TYPE); - initIndexTemplate(EVENT_DOC_TYPE); - initIndexTemplate(MSG_DOC_TYPE); - } - - /** Initializes the index with the required templates and mappings. */ - private void initIndexTemplate(String type) { - String template = "template_" + type; - try { - if (doesResourceNotExist("/_template/" + template)) { - logger.info("Creating the index template '" + template + "'"); - InputStream stream = - ElasticSearchRestDAOV7.class.getResourceAsStream("/" + template + ".json"); - byte[] templateSource = IOUtils.toByteArray(stream); - - HttpEntity entity = - new NByteArrayEntity(templateSource, ContentType.APPLICATION_JSON); - Request request = new Request(HttpMethod.PUT, "/_template/" + template); - request.setEntity(entity); - String test = - IOUtils.toString( - elasticSearchAdminClient - .performRequest(request) - .getEntity() - .getContent()); - } - } catch (Exception e) { - logger.error("Failed to init " + template, e); - } - } - - private void updateIndexesNames() { - logIndexName = updateIndexName(LOG_DOC_TYPE); - eventIndexName = updateIndexName(EVENT_DOC_TYPE); - messageIndexName = updateIndexName(MSG_DOC_TYPE); - } - - private String updateIndexName(String type) { - String indexName = - this.indexPrefix + "_" + type + "_" + SIMPLE_DATE_FORMAT.format(new Date()); - try { - addIndex(indexName); - return indexName; - } catch (IOException e) { - logger.error("Failed to update log index name: {}", indexName, e); - throw new ApplicationException(e.getMessage(), e); - } - } - - private void createWorkflowIndex() { - String indexName = getIndexName(WORKFLOW_DOC_TYPE); - try { - addIndex(indexName, "/mappings_docType_workflow.json"); - } catch (IOException e) { - logger.error("Failed to initialize index '{}'", indexName, e); - } - } - - private void createTaskIndex() { - String indexName = getIndexName(TASK_DOC_TYPE); - try { - addIndex(indexName, "/mappings_docType_task.json"); - } catch (IOException e) { - logger.error("Failed to initialize index '{}'", indexName, e); - } - } - - /** - * Waits for the ES cluster to become green. - * - * @throws Exception If there is an issue connecting with the ES cluster. - */ - private void waitForHealthyCluster() throws Exception { - Map params = new HashMap<>(); - params.put("wait_for_status", this.clusterHealthColor); - params.put("timeout", "30s"); - Request request = new Request("GET", "/_cluster/health"); - request.addParameters(params); - elasticSearchAdminClient.performRequest(request); - } - - /** - * Adds an index to elasticsearch if it does not exist. - * - * @param index The name of the index to create. - * @param mappingFilename Index mapping filename - * @throws IOException If an error occurred during requests to ES. - */ - private void addIndex(String index, final String mappingFilename) throws IOException { - logger.info("Adding index '{}'...", index); - String resourcePath = "/" + index; - if (doesResourceNotExist(resourcePath)) { - try { - ObjectNode setting = objectMapper.createObjectNode(); - ObjectNode indexSetting = objectMapper.createObjectNode(); - ObjectNode root = objectMapper.createObjectNode(); - indexSetting.put("number_of_shards", properties.getIndexShardCount()); - indexSetting.put("number_of_replicas", properties.getIndexReplicasCount()); - JsonNode mappingNodeValue = - objectMapper.readTree(loadTypeMappingSource(mappingFilename)); - root.set("settings", indexSetting); - root.set("mappings", mappingNodeValue); - Request request = new Request(HttpMethod.PUT, resourcePath); - request.setEntity( - new NStringEntity( - objectMapper.writeValueAsString(root), - ContentType.APPLICATION_JSON)); - elasticSearchAdminClient.performRequest(request); - logger.info("Added '{}' index", index); - } catch (ResponseException e) { - - boolean errorCreatingIndex = true; - - Response errorResponse = e.getResponse(); - if (errorResponse.getStatusLine().getStatusCode() == HttpStatus.SC_BAD_REQUEST) { - JsonNode root = - objectMapper.readTree(EntityUtils.toString(errorResponse.getEntity())); - String errorCode = root.get("error").get("type").asText(); - if ("index_already_exists_exception".equals(errorCode)) { - errorCreatingIndex = false; - } - } - - if (errorCreatingIndex) { - throw e; - } - } - } else { - logger.info("Index '{}' already exists", index); - } - } - /** - * Adds an index to elasticsearch if it does not exist. - * - * @param index The name of the index to create. - * @throws IOException If an error occurred during requests to ES. - */ - private void addIndex(final String index) throws IOException { - - logger.info("Adding index '{}'...", index); - - String resourcePath = "/" + index; - - if (doesResourceNotExist(resourcePath)) { - - try { - ObjectNode setting = objectMapper.createObjectNode(); - ObjectNode indexSetting = objectMapper.createObjectNode(); - - indexSetting.put("number_of_shards", properties.getIndexShardCount()); - indexSetting.put("number_of_replicas", properties.getIndexReplicasCount()); - - setting.set("settings", indexSetting); - - Request request = new Request(HttpMethod.PUT, resourcePath); - request.setEntity( - new NStringEntity(setting.toString(), ContentType.APPLICATION_JSON)); - elasticSearchAdminClient.performRequest(request); - logger.info("Added '{}' index", index); - } catch (ResponseException e) { - - boolean errorCreatingIndex = true; - - Response errorResponse = e.getResponse(); - if (errorResponse.getStatusLine().getStatusCode() == HttpStatus.SC_BAD_REQUEST) { - JsonNode root = - objectMapper.readTree(EntityUtils.toString(errorResponse.getEntity())); - String errorCode = root.get("error").get("type").asText(); - if ("index_already_exists_exception".equals(errorCode)) { - errorCreatingIndex = false; - } - } - - if (errorCreatingIndex) { - throw e; - } - } - } else { - logger.info("Index '{}' already exists", index); - } - } - - /** - * Adds a mapping type to an index if it does not exist. - * - * @param index The name of the index. - * @param mappingType The name of the mapping type. - * @param mappingFilename The name of the mapping file to use to add the mapping if it does not - * exist. - * @throws IOException If an error occurred during requests to ES. - */ - private void addMappingToIndex( - final String index, final String mappingType, final String mappingFilename) - throws IOException { - - logger.info("Adding '{}' mapping to index '{}'...", mappingType, index); - - String resourcePath = "/" + index + "/_mapping"; - - if (doesResourceNotExist(resourcePath)) { - HttpEntity entity = - new NByteArrayEntity( - loadTypeMappingSource(mappingFilename).getBytes(), - ContentType.APPLICATION_JSON); - Request request = new Request(HttpMethod.PUT, resourcePath); - request.setEntity(entity); - elasticSearchAdminClient.performRequest(request); - logger.info("Added '{}' mapping", mappingType); - } else { - logger.info("Mapping '{}' already exists", mappingType); - } - } - - /** - * Determines whether a resource exists in ES. This will call a GET method to a particular path - * and return true if status 200; false otherwise. - * - * @param resourcePath The path of the resource to get. - * @return True if it exists; false otherwise. - * @throws IOException If an error occurred during requests to ES. - */ - public boolean doesResourceExist(final String resourcePath) throws IOException { - Request request = new Request(HttpMethod.HEAD, resourcePath); - Response response = elasticSearchAdminClient.performRequest(request); - return response.getStatusLine().getStatusCode() == HttpStatus.SC_OK; - } - - /** - * The inverse of doesResourceExist. - * - * @param resourcePath The path of the resource to check. - * @return True if it does not exist; false otherwise. - * @throws IOException If an error occurred during requests to ES. - */ - public boolean doesResourceNotExist(final String resourcePath) throws IOException { - return !doesResourceExist(resourcePath); - } - - @Override - public void indexWorkflow(WorkflowSummary workflow) { - try { - long startTime = Instant.now().toEpochMilli(); - String workflowId = workflow.getWorkflowId(); - byte[] docBytes = objectMapper.writeValueAsBytes(workflow); - - IndexRequest request = - new IndexRequest(workflowIndexName) - .id(workflowId) - .source(docBytes, XContentType.JSON); - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.index( - request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - null, - RETRY_COUNT, - "Indexing workflow document: " + workflow.getWorkflowId(), - "indexWorkflow"); - - long endTime = Instant.now().toEpochMilli(); - logger.debug( - "Time taken {} for indexing workflow: {}", endTime - startTime, workflowId); - Monitors.recordESIndexTime("index_workflow", WORKFLOW_DOC_TYPE, endTime - startTime); - Monitors.recordWorkerQueueSize( - "indexQueue", ((ThreadPoolExecutor) executorService).getQueue().size()); - } catch (Exception e) { - Monitors.error(className, "indexWorkflow"); - logger.error("Failed to index workflow: {}", workflow.getWorkflowId(), e); - } - } - - @Override - public CompletableFuture asyncIndexWorkflow(WorkflowSummary workflow) { - return CompletableFuture.runAsync(() -> indexWorkflow(workflow), executorService); - } - - @Override - public void indexTask(TaskSummary task) { - try { - long startTime = Instant.now().toEpochMilli(); - String taskId = task.getTaskId(); - - indexObject(taskIndexName, TASK_DOC_TYPE, taskId, task); - long endTime = Instant.now().toEpochMilli(); - logger.debug( - "Time taken {} for indexing task:{} in workflow: {}", - endTime - startTime, - taskId, - task.getWorkflowId()); - Monitors.recordESIndexTime("index_task", TASK_DOC_TYPE, endTime - startTime); - Monitors.recordWorkerQueueSize( - "indexQueue", ((ThreadPoolExecutor) executorService).getQueue().size()); - } catch (Exception e) { - logger.error("Failed to index task: {}", task.getTaskId(), e); - } - } - - @Override - public CompletableFuture asyncIndexTask(TaskSummary task) { - return CompletableFuture.runAsync(() -> indexTask(task), executorService); - } - - @Override - public void addTaskExecutionLogs(List taskExecLogs) { - if (taskExecLogs.isEmpty()) { - return; - } - - long startTime = Instant.now().toEpochMilli(); - BulkRequest bulkRequest = new BulkRequest(); - for (TaskExecLog log : taskExecLogs) { - - byte[] docBytes; - try { - docBytes = objectMapper.writeValueAsBytes(log); - } catch (JsonProcessingException e) { - logger.error("Failed to convert task log to JSON for task {}", log.getTaskId()); - continue; - } - - IndexRequest request = new IndexRequest(logIndexName); - request.source(docBytes, XContentType.JSON); - bulkRequest.add(request); - } - - try { - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.bulk( - bulkRequest, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - BulkResponse::hasFailures, - RETRY_COUNT, - "Indexing task execution logs", - "addTaskExecutionLogs"); - long endTime = Instant.now().toEpochMilli(); - logger.debug("Time taken {} for indexing taskExecutionLogs", endTime - startTime); - Monitors.recordESIndexTime( - "index_task_execution_logs", LOG_DOC_TYPE, endTime - startTime); - Monitors.recordWorkerQueueSize( - "logQueue", ((ThreadPoolExecutor) logExecutorService).getQueue().size()); - } catch (Exception e) { - List taskIds = - taskExecLogs.stream().map(TaskExecLog::getTaskId).collect(Collectors.toList()); - logger.error("Failed to index task execution logs for tasks: {}", taskIds, e); - } - } - - @Override - public CompletableFuture asyncAddTaskExecutionLogs(List logs) { - return CompletableFuture.runAsync(() -> addTaskExecutionLogs(logs), logExecutorService); - } - - @Override - public List getTaskExecutionLogs(String taskId) { - try { - BoolQueryBuilder query = boolQueryBuilder("taskId='" + taskId + "'", "*"); - - // Create the searchObjectIdsViaExpression source - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(query); - searchSourceBuilder.sort(new FieldSortBuilder("createdTime").order(SortOrder.ASC)); - searchSourceBuilder.size(properties.getTaskLogResultLimit()); - - // Generate the actual request to send to ES. - SearchRequest searchRequest = new SearchRequest(logIndexPrefix + "*"); - searchRequest.source(searchSourceBuilder); - - SearchResponse response = - elasticSearchClient.search(searchRequest, RequestOptions.DEFAULT); - - return mapTaskExecLogsResponse(response); - } catch (Exception e) { - logger.error("Failed to get task execution logs for task: {}", taskId, e); - } - return null; - } - - private List mapTaskExecLogsResponse(SearchResponse response) throws IOException { - SearchHit[] hits = response.getHits().getHits(); - List logs = new ArrayList<>(hits.length); - for (SearchHit hit : hits) { - String source = hit.getSourceAsString(); - TaskExecLog tel = objectMapper.readValue(source, TaskExecLog.class); - logs.add(tel); - } - return logs; - } - - @Override - public List getMessages(String queue) { - try { - BoolQueryBuilder query = boolQueryBuilder("queue='" + queue + "'", "*"); - - // Create the searchObjectIdsViaExpression source - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(query); - searchSourceBuilder.sort(new FieldSortBuilder("created").order(SortOrder.ASC)); - - // Generate the actual request to send to ES. - SearchRequest searchRequest = new SearchRequest(messageIndexPrefix + "*"); - searchRequest.source(searchSourceBuilder); - - SearchResponse response = - elasticSearchClient.search(searchRequest, RequestOptions.DEFAULT); - return mapGetMessagesResponse(response); - } catch (Exception e) { - logger.error("Failed to get messages for queue: {}", queue, e); - } - return null; - } - - private List mapGetMessagesResponse(SearchResponse response) throws IOException { - SearchHit[] hits = response.getHits().getHits(); - TypeFactory factory = TypeFactory.defaultInstance(); - MapType type = factory.constructMapType(HashMap.class, String.class, String.class); - List messages = new ArrayList<>(hits.length); - for (SearchHit hit : hits) { - String source = hit.getSourceAsString(); - Map mapSource = objectMapper.readValue(source, type); - Message msg = new Message(mapSource.get("messageId"), mapSource.get("payload"), null); - messages.add(msg); - } - return messages; - } - - @Override - public List getEventExecutions(String event) { - try { - BoolQueryBuilder query = boolQueryBuilder("event='" + event + "'", "*"); - - // Create the searchObjectIdsViaExpression source - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(query); - searchSourceBuilder.sort(new FieldSortBuilder("created").order(SortOrder.ASC)); - - // Generate the actual request to send to ES. - SearchRequest searchRequest = new SearchRequest(eventIndexPrefix + "*"); - searchRequest.source(searchSourceBuilder); - - SearchResponse response = - elasticSearchClient.search(searchRequest, RequestOptions.DEFAULT); - - return mapEventExecutionsResponse(response); - } catch (Exception e) { - logger.error("Failed to get executions for event: {}", event, e); - } - return null; - } - - private List mapEventExecutionsResponse(SearchResponse response) - throws IOException { - SearchHit[] hits = response.getHits().getHits(); - List executions = new ArrayList<>(hits.length); - for (SearchHit hit : hits) { - String source = hit.getSourceAsString(); - EventExecution tel = objectMapper.readValue(source, EventExecution.class); - executions.add(tel); - } - return executions; - } - - @Override - public void addMessage(String queue, Message message) { - try { - long startTime = Instant.now().toEpochMilli(); - Map doc = new HashMap<>(); - doc.put("messageId", message.getId()); - doc.put("payload", message.getPayload()); - doc.put("queue", queue); - doc.put("created", System.currentTimeMillis()); - - indexObject(messageIndexName, MSG_DOC_TYPE, doc); - long endTime = Instant.now().toEpochMilli(); - logger.debug( - "Time taken {} for indexing message: {}", - endTime - startTime, - message.getId()); - Monitors.recordESIndexTime("add_message", MSG_DOC_TYPE, endTime - startTime); - } catch (Exception e) { - logger.error("Failed to index message: {}", message.getId(), e); - } - } - - @Override - public CompletableFuture asyncAddMessage(String queue, Message message) { - return CompletableFuture.runAsync(() -> addMessage(queue, message), executorService); - } - - @Override - public void addEventExecution(EventExecution eventExecution) { - try { - long startTime = Instant.now().toEpochMilli(); - String id = - eventExecution.getName() - + "." - + eventExecution.getEvent() - + "." - + eventExecution.getMessageId() - + "." - + eventExecution.getId(); - - indexObject(eventIndexName, EVENT_DOC_TYPE, id, eventExecution); - long endTime = Instant.now().toEpochMilli(); - logger.debug( - "Time taken {} for indexing event execution: {}", - endTime - startTime, - eventExecution.getId()); - Monitors.recordESIndexTime("add_event_execution", EVENT_DOC_TYPE, endTime - startTime); - Monitors.recordWorkerQueueSize( - "logQueue", ((ThreadPoolExecutor) logExecutorService).getQueue().size()); - } catch (Exception e) { - logger.error("Failed to index event execution: {}", eventExecution.getId(), e); - } - } - - @Override - public CompletableFuture asyncAddEventExecution(EventExecution eventExecution) { - return CompletableFuture.runAsync( - () -> addEventExecution(eventExecution), logExecutorService); - } - - @Override - public SearchResult searchWorkflows( - String query, String freeText, int start, int count, List sort) { - try { - return searchObjectIdsViaExpression( - query, start, count, sort, freeText, WORKFLOW_DOC_TYPE); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, e.getMessage(), e); - } - } - - @Override - public SearchResult searchTasks( - String query, String freeText, int start, int count, List sort) { - try { - return searchObjectIdsViaExpression(query, start, count, sort, freeText, TASK_DOC_TYPE); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, e.getMessage(), e); - } - } - - @Override - public void removeWorkflow(String workflowId) { - long startTime = Instant.now().toEpochMilli(); - DeleteRequest request = new DeleteRequest(workflowIndexName, workflowId); - - try { - DeleteResponse response = elasticSearchClient.delete(request, RequestOptions.DEFAULT); - - if (response.getResult() == DocWriteResponse.Result.NOT_FOUND) { - logger.error("Index removal failed - document not found by id: {}", workflowId); - } - long endTime = Instant.now().toEpochMilli(); - logger.debug( - "Time taken {} for removing workflow: {}", endTime - startTime, workflowId); - Monitors.recordESIndexTime("remove_workflow", WORKFLOW_DOC_TYPE, endTime - startTime); - Monitors.recordWorkerQueueSize( - "indexQueue", ((ThreadPoolExecutor) executorService).getQueue().size()); - } catch (IOException e) { - logger.error("Failed to remove workflow {} from index", workflowId, e); - Monitors.error(className, "remove"); - } - } - - @Override - public CompletableFuture asyncRemoveWorkflow(String workflowId) { - return CompletableFuture.runAsync(() -> removeWorkflow(workflowId), executorService); - } - - @Override - public void updateWorkflow(String workflowInstanceId, String[] keys, Object[] values) { - if (keys.length != values.length) { - throw new ApplicationException( - ApplicationException.Code.INVALID_INPUT, - "Number of keys and values do not match"); - } - - long startTime = Instant.now().toEpochMilli(); - UpdateRequest request = new UpdateRequest(workflowIndexName, workflowInstanceId); - Map source = - IntStream.range(0, keys.length) - .boxed() - .collect(Collectors.toMap(i -> keys[i], i -> values[i])); - request.doc(source); - - logger.debug("Updating workflow {} with {}", workflowInstanceId, source); - - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.update(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - null, - RETRY_COUNT, - "Updating workflow document: " + workflowInstanceId, - "updateWorkflow"); - long endTime = Instant.now().toEpochMilli(); - logger.debug( - "Time taken {} for updating workflow: {}", endTime - startTime, workflowInstanceId); - Monitors.recordESIndexTime("update_workflow", WORKFLOW_DOC_TYPE, endTime - startTime); - Monitors.recordWorkerQueueSize( - "indexQueue", ((ThreadPoolExecutor) executorService).getQueue().size()); - } - - @Override - public CompletableFuture asyncUpdateWorkflow( - String workflowInstanceId, String[] keys, Object[] values) { - return CompletableFuture.runAsync( - () -> updateWorkflow(workflowInstanceId, keys, values), executorService); - } - - @Override - public String get(String workflowInstanceId, String fieldToGet) { - GetRequest request = new GetRequest(workflowIndexName, workflowInstanceId); - GetResponse response; - try { - response = elasticSearchClient.get(request, RequestOptions.DEFAULT); - } catch (IOException e) { - logger.error( - "Unable to get Workflow: {} from ElasticSearch index: {}", - workflowInstanceId, - workflowIndexName, - e); - return null; - } - - if (response.isExists()) { - Map sourceAsMap = response.getSourceAsMap(); - if (sourceAsMap.get(fieldToGet) != null) { - return sourceAsMap.get(fieldToGet).toString(); - } - } - - logger.debug( - "Unable to find Workflow: {} in ElasticSearch index: {}.", - workflowInstanceId, - workflowIndexName); - return null; - } - - private SearchResult searchObjectIdsViaExpression( - String structuredQuery, - int start, - int size, - List sortOptions, - String freeTextQuery, - String docType) - throws ParserException, IOException { - QueryBuilder queryBuilder = boolQueryBuilder(structuredQuery, freeTextQuery); - return searchObjectIds( - getIndexName(docType), queryBuilder, start, size, sortOptions, docType); - } - - private SearchResult searchObjectIds( - String indexName, QueryBuilder queryBuilder, int start, int size, String docType) - throws IOException { - return searchObjectIds(indexName, queryBuilder, start, size, null, docType); - } - - /** - * Tries to find object ids for a given query in an index. - * - * @param indexName The name of the index. - * @param queryBuilder The query to use for searching. - * @param start The start to use. - * @param size The total return size. - * @param sortOptions A list of string options to sort in the form VALUE:ORDER; where ORDER is - * optional and can be either ASC OR DESC. - * @param docType The document type to searchObjectIdsViaExpression for. - * @return The SearchResults which includes the count and IDs that were found. - * @throws IOException If we cannot communicate with ES. - */ - private SearchResult searchObjectIds( - String indexName, - QueryBuilder queryBuilder, - int start, - int size, - List sortOptions, - String docType) - throws IOException { - SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); - searchSourceBuilder.query(queryBuilder); - searchSourceBuilder.from(start); - searchSourceBuilder.size(size); - - if (sortOptions != null && !sortOptions.isEmpty()) { - - for (String sortOption : sortOptions) { - SortOrder order = SortOrder.ASC; - String field = sortOption; - int index = sortOption.indexOf(":"); - if (index > 0) { - field = sortOption.substring(0, index); - order = SortOrder.valueOf(sortOption.substring(index + 1)); - } - searchSourceBuilder.sort(new FieldSortBuilder(field).order(order)); - } - } - - // Generate the actual request to send to ES. - SearchRequest searchRequest = new SearchRequest(indexName); - searchRequest.source(searchSourceBuilder); - - SearchResponse response = elasticSearchClient.search(searchRequest, RequestOptions.DEFAULT); - - List result = new LinkedList<>(); - response.getHits().forEach(hit -> result.add(hit.getId())); - long count = response.getHits().getTotalHits().value; - return new SearchResult<>(count, result); - } - - @Override - public List searchArchivableWorkflows(String indexName, long archiveTtlDays) { - QueryBuilder q = - QueryBuilders.boolQuery() - .must( - QueryBuilders.rangeQuery("endTime") - .lt(LocalDate.now().minusDays(archiveTtlDays).toString()) - .gte( - LocalDate.now() - .minusDays(archiveTtlDays) - .minusDays(1) - .toString())) - .should(QueryBuilders.termQuery("status", "COMPLETED")) - .should(QueryBuilders.termQuery("status", "FAILED")) - .should(QueryBuilders.termQuery("status", "TIMED_OUT")) - .should(QueryBuilders.termQuery("status", "TERMINATED")) - .mustNot(QueryBuilders.existsQuery("archived")) - .minimumShouldMatch(1); - - SearchResult workflowIds; - try { - workflowIds = searchObjectIds(indexName, q, 0, 1000, WORKFLOW_DOC_TYPE); - } catch (IOException e) { - logger.error("Unable to communicate with ES to find archivable workflows", e); - return Collections.emptyList(); - } - - return workflowIds.getResults(); - } - - @Override - public long getWorkflowCount(String query, String freeText) { - try { - return getObjectCounts(query, freeText, WORKFLOW_DOC_TYPE); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, e.getMessage(), e); - } - } - - private long getObjectCounts(String structuredQuery, String freeTextQuery, String docType) - throws ParserException, IOException { - QueryBuilder queryBuilder = boolQueryBuilder(structuredQuery, freeTextQuery); - - String indexName = getIndexName(docType); - CountRequest countRequest = new CountRequest(new String[] {indexName}, queryBuilder); - CountResponse countResponse = - elasticSearchClient.count(countRequest, RequestOptions.DEFAULT); - return countResponse.getCount(); - } - - public List searchRecentRunningWorkflows( - int lastModifiedHoursAgoFrom, int lastModifiedHoursAgoTo) { - DateTime dateTime = new DateTime(); - QueryBuilder q = - QueryBuilders.boolQuery() - .must( - QueryBuilders.rangeQuery("updateTime") - .gt(dateTime.minusHours(lastModifiedHoursAgoFrom))) - .must( - QueryBuilders.rangeQuery("updateTime") - .lt(dateTime.minusHours(lastModifiedHoursAgoTo))) - .must(QueryBuilders.termQuery("status", "RUNNING")); - - SearchResult workflowIds; - try { - workflowIds = - searchObjectIds( - workflowIndexName, - q, - 0, - 5000, - Collections.singletonList("updateTime:ASC"), - WORKFLOW_DOC_TYPE); - } catch (IOException e) { - logger.error("Unable to communicate with ES to find recent running workflows", e); - return Collections.emptyList(); - } - - return workflowIds.getResults(); - } - - private void indexObject(final String index, final String docType, final Object doc) { - indexObject(index, docType, null, doc); - } - - private void indexObject( - final String index, final String docType, final String docId, final Object doc) { - - byte[] docBytes; - try { - docBytes = objectMapper.writeValueAsBytes(doc); - } catch (JsonProcessingException e) { - logger.error("Failed to convert {} '{}' to byte string", docType, docId); - return; - } - IndexRequest request = new IndexRequest(index); - request.id(docId).source(docBytes, XContentType.JSON); - - if (bulkRequests.get(docType) == null) { - bulkRequests.put( - docType, new BulkRequests(System.currentTimeMillis(), new BulkRequest())); - } - - bulkRequests.get(docType).getBulkRequest().add(request); - if (bulkRequests.get(docType).getBulkRequest().numberOfActions() >= this.indexBatchSize) { - indexBulkRequest(docType); - } - } - - private synchronized void indexBulkRequest(String docType) { - if (bulkRequests.get(docType).getBulkRequest() != null - && bulkRequests.get(docType).getBulkRequest().numberOfActions() > 0) { - synchronized (bulkRequests.get(docType).getBulkRequest()) { - indexWithRetry( - bulkRequests.get(docType).getBulkRequest().get(), - "Bulk Indexing " + docType, - docType); - bulkRequests.put( - docType, new BulkRequests(System.currentTimeMillis(), new BulkRequest())); - } - } - } - - /** - * Performs an index operation with a retry. - * - * @param request The index request that we want to perform. - * @param operationDescription The type of operation that we are performing. - */ - private void indexWithRetry( - final BulkRequest request, final String operationDescription, String docType) { - try { - long startTime = Instant.now().toEpochMilli(); - new RetryUtil() - .retryOnException( - () -> { - try { - return elasticSearchClient.bulk( - request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new RuntimeException(e); - } - }, - null, - null, - RETRY_COUNT, - operationDescription, - "indexWithRetry"); - long endTime = Instant.now().toEpochMilli(); - logger.debug( - "Time taken {} for indexing object of type: {}", endTime - startTime, docType); - Monitors.recordESIndexTime("index_object", docType, endTime - startTime); - Monitors.recordWorkerQueueSize( - "indexQueue", ((ThreadPoolExecutor) executorService).getQueue().size()); - Monitors.recordWorkerQueueSize( - "logQueue", ((ThreadPoolExecutor) logExecutorService).getQueue().size()); - } catch (Exception e) { - Monitors.error(className, "index"); - logger.error("Failed to index {} for request type: {}", request, docType, e); - } - } - - /** - * Flush the buffers if bulk requests have not been indexed for the past {@link - * ElasticSearchProperties#getAsyncBufferFlushTimeout()} seconds This is to prevent data loss in - * case the instance is terminated, while the buffer still holds documents to be indexed. - */ - private void flushBulkRequests() { - bulkRequests.entrySet().stream() - .filter( - entry -> - (System.currentTimeMillis() - entry.getValue().getLastFlushTime()) - >= asyncBufferFlushTimeout * 1000) - .filter( - entry -> - entry.getValue().getBulkRequest() != null - && entry.getValue().getBulkRequest().numberOfActions() > 0) - .forEach( - entry -> { - logger.debug( - "Flushing bulk request buffer for type {}, size: {}", - entry.getKey(), - entry.getValue().getBulkRequest().numberOfActions()); - indexBulkRequest(entry.getKey()); - }); - } - - private static class BulkRequests { - - private final long lastFlushTime; - private final BulkRequestWrapper bulkRequest; - - long getLastFlushTime() { - return lastFlushTime; - } - - BulkRequestWrapper getBulkRequest() { - return bulkRequest; - } - - BulkRequests(long lastFlushTime, BulkRequest bulkRequest) { - this.lastFlushTime = lastFlushTime; - this.bulkRequest = new BulkRequestWrapper(bulkRequest); - } - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/Expression.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/Expression.java deleted file mode 100644 index 3892af0ef..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/Expression.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; - -import com.netflix.conductor.es7.dao.query.parser.internal.AbstractNode; -import com.netflix.conductor.es7.dao.query.parser.internal.BooleanOp; -import com.netflix.conductor.es7.dao.query.parser.internal.ParserException; - -/** @author Viren */ -public class Expression extends AbstractNode implements FilterProvider { - - private NameValue nameVal; - - private GroupedExpression ge; - - private BooleanOp op; - - private Expression rhs; - - public Expression(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - byte[] peeked = peek(1); - - if (peeked[0] == '(') { - this.ge = new GroupedExpression(is); - } else { - this.nameVal = new NameValue(is); - } - - peeked = peek(3); - if (isBoolOpr(peeked)) { - // we have an expression next - this.op = new BooleanOp(is); - this.rhs = new Expression(is); - } - } - - public boolean isBinaryExpr() { - return this.op != null; - } - - public BooleanOp getOperator() { - return this.op; - } - - public Expression getRightHandSide() { - return this.rhs; - } - - public boolean isNameValue() { - return this.nameVal != null; - } - - public NameValue getNameValue() { - return this.nameVal; - } - - public GroupedExpression getGroupedExpression() { - return this.ge; - } - - @Override - public QueryBuilder getFilterBuilder() { - QueryBuilder lhs = null; - if (nameVal != null) { - lhs = nameVal.getFilterBuilder(); - } else { - lhs = ge.getFilterBuilder(); - } - - if (this.isBinaryExpr()) { - QueryBuilder rhsFilter = rhs.getFilterBuilder(); - if (this.op.isAnd()) { - return QueryBuilders.boolQuery().must(lhs).must(rhsFilter); - } else { - return QueryBuilders.boolQuery().should(lhs).should(rhsFilter); - } - } else { - return lhs; - } - } - - @Override - public String toString() { - if (isBinaryExpr()) { - return "" + (nameVal == null ? ge : nameVal) + op + rhs; - } else { - return "" + (nameVal == null ? ge : nameVal); - } - } - - public static Expression fromString(String value) throws ParserException { - return new Expression(new BufferedInputStream(new ByteArrayInputStream(value.getBytes()))); - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/FilterProvider.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/FilterProvider.java deleted file mode 100644 index 2fa4a7838..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/FilterProvider.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser; - -import org.elasticsearch.index.query.QueryBuilder; - -/** @author Viren */ -public interface FilterProvider { - - /** @return FilterBuilder for elasticsearch */ - public QueryBuilder getFilterBuilder(); -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/GroupedExpression.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/GroupedExpression.java deleted file mode 100644 index 5f19237fc..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/GroupedExpression.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser; - -import java.io.InputStream; - -import org.elasticsearch.index.query.QueryBuilder; - -import com.netflix.conductor.es7.dao.query.parser.internal.AbstractNode; -import com.netflix.conductor.es7.dao.query.parser.internal.ParserException; - -/** @author Viren */ -public class GroupedExpression extends AbstractNode implements FilterProvider { - - private Expression expression; - - public GroupedExpression(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - byte[] peeked = read(1); - assertExpected(peeked, "("); - - this.expression = new Expression(is); - - peeked = read(1); - assertExpected(peeked, ")"); - } - - @Override - public String toString() { - return "(" + expression + ")"; - } - - /** @return the expression */ - public Expression getExpression() { - return expression; - } - - @Override - public QueryBuilder getFilterBuilder() { - return expression.getFilterBuilder(); - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/NameValue.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/NameValue.java deleted file mode 100644 index 3b2d6dbb5..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/NameValue.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser; - -import java.io.InputStream; - -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; - -import com.netflix.conductor.es7.dao.query.parser.internal.AbstractNode; -import com.netflix.conductor.es7.dao.query.parser.internal.ComparisonOp; -import com.netflix.conductor.es7.dao.query.parser.internal.ComparisonOp.Operators; -import com.netflix.conductor.es7.dao.query.parser.internal.ConstValue; -import com.netflix.conductor.es7.dao.query.parser.internal.ListConst; -import com.netflix.conductor.es7.dao.query.parser.internal.Name; -import com.netflix.conductor.es7.dao.query.parser.internal.ParserException; -import com.netflix.conductor.es7.dao.query.parser.internal.Range; - -/** - * @author Viren - *

- * Represents an expression of the form as below:
- * key OPR value
- * OPR is the comparison operator which could be on the following:
- * 	>, <, = , !=, IN, BETWEEN
- * 
- */ -public class NameValue extends AbstractNode implements FilterProvider { - - private Name name; - - private ComparisonOp op; - - private ConstValue value; - - private Range range; - - private ListConst valueList; - - public NameValue(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - this.name = new Name(is); - this.op = new ComparisonOp(is); - - if (this.op.getOperator().equals(Operators.BETWEEN.value())) { - this.range = new Range(is); - } - if (this.op.getOperator().equals(Operators.IN.value())) { - this.valueList = new ListConst(is); - } else { - this.value = new ConstValue(is); - } - } - - @Override - public String toString() { - return "" + name + op + value; - } - - /** @return the name */ - public Name getName() { - return name; - } - - /** @return the op */ - public ComparisonOp getOp() { - return op; - } - - /** @return the value */ - public ConstValue getValue() { - return value; - } - - @Override - public QueryBuilder getFilterBuilder() { - if (op.getOperator().equals(Operators.EQUALS.value())) { - return QueryBuilders.queryStringQuery( - name.getName() + ":" + value.getValue().toString()); - } else if (op.getOperator().equals(Operators.BETWEEN.value())) { - return QueryBuilders.rangeQuery(name.getName()) - .from(range.getLow()) - .to(range.getHigh()); - } else if (op.getOperator().equals(Operators.IN.value())) { - return QueryBuilders.termsQuery(name.getName(), valueList.getList()); - } else if (op.getOperator().equals(Operators.NOT_EQUALS.value())) { - return QueryBuilders.queryStringQuery( - "NOT " + name.getName() + ":" + value.getValue().toString()); - } else if (op.getOperator().equals(Operators.GREATER_THAN.value())) { - return QueryBuilders.rangeQuery(name.getName()) - .from(value.getValue()) - .includeLower(false) - .includeUpper(false); - } else if (op.getOperator().equals(Operators.IS.value())) { - if (value.getSysConstant().equals(ConstValue.SystemConsts.NULL)) { - return QueryBuilders.boolQuery() - .mustNot( - QueryBuilders.boolQuery() - .must(QueryBuilders.matchAllQuery()) - .mustNot(QueryBuilders.existsQuery(name.getName()))); - } else if (value.getSysConstant().equals(ConstValue.SystemConsts.NOT_NULL)) { - return QueryBuilders.boolQuery() - .mustNot( - QueryBuilders.boolQuery() - .must(QueryBuilders.matchAllQuery()) - .must(QueryBuilders.existsQuery(name.getName()))); - } - } else if (op.getOperator().equals(Operators.LESS_THAN.value())) { - return QueryBuilders.rangeQuery(name.getName()) - .to(value.getValue()) - .includeLower(false) - .includeUpper(false); - } else if (op.getOperator().equals(Operators.STARTS_WITH.value())) { - return QueryBuilders.prefixQuery(name.getName(), value.getUnquotedValue()); - } - - throw new IllegalStateException("Incorrect/unsupported operators"); - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/AbstractNode.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/AbstractNode.java deleted file mode 100644 index d68b072c5..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/AbstractNode.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.InputStream; -import java.math.BigDecimal; -import java.util.HashSet; -import java.util.Set; -import java.util.regex.Pattern; - -/** @author Viren */ -public abstract class AbstractNode { - - public static final Pattern WHITESPACE = Pattern.compile("\\s"); - - protected static Set comparisonOprs = new HashSet(); - - static { - comparisonOprs.add('>'); - comparisonOprs.add('<'); - comparisonOprs.add('='); - } - - protected InputStream is; - - protected AbstractNode(InputStream is) throws ParserException { - this.is = is; - this.parse(); - } - - protected boolean isNumber(String test) { - try { - // If you can convert to a big decimal value, then it is a number. - new BigDecimal(test); - return true; - - } catch (NumberFormatException e) { - // Ignore - } - return false; - } - - protected boolean isBoolOpr(byte[] buffer) { - if (buffer.length > 1 && buffer[0] == 'O' && buffer[1] == 'R') { - return true; - } else if (buffer.length > 2 && buffer[0] == 'A' && buffer[1] == 'N' && buffer[2] == 'D') { - return true; - } - return false; - } - - protected boolean isComparisonOpr(byte[] buffer) { - if (buffer[0] == 'I' && buffer[1] == 'N') { - return true; - } else if (buffer[0] == '!' && buffer[1] == '=') { - return true; - } else { - return comparisonOprs.contains((char) buffer[0]); - } - } - - protected byte[] peek(int length) throws Exception { - return read(length, true); - } - - protected byte[] read(int length) throws Exception { - return read(length, false); - } - - protected String readToken() throws Exception { - skipWhitespace(); - StringBuilder sb = new StringBuilder(); - while (is.available() > 0) { - char c = (char) peek(1)[0]; - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { - is.skip(1); - break; - } else if (c == '=' || c == '>' || c == '<' || c == '!') { - // do not skip - break; - } - sb.append(c); - is.skip(1); - } - return sb.toString().trim(); - } - - protected boolean isNumeric(char c) { - if (c == '-' || c == 'e' || (c >= '0' && c <= '9') || c == '.') { - return true; - } - return false; - } - - protected void assertExpected(byte[] found, String expected) throws ParserException { - assertExpected(new String(found), expected); - } - - protected void assertExpected(String found, String expected) throws ParserException { - if (!found.equals(expected)) { - throw new ParserException("Expected " + expected + ", found " + found); - } - } - - protected void assertExpected(char found, char expected) throws ParserException { - if (found != expected) { - throw new ParserException("Expected " + expected + ", found " + found); - } - } - - protected static void efor(int length, FunctionThrowingException consumer) - throws Exception { - for (int i = 0; i < length; i++) { - consumer.accept(i); - } - } - - protected abstract void _parse() throws Exception; - - // Public stuff here - private void parse() throws ParserException { - // skip white spaces - skipWhitespace(); - try { - _parse(); - } catch (Exception e) { - System.out.println("\t" + this.getClass().getSimpleName() + "->" + this.toString()); - if (!(e instanceof ParserException)) { - throw new ParserException("Error parsing", e); - } else { - throw (ParserException) e; - } - } - skipWhitespace(); - } - - // Private methods - - private byte[] read(int length, boolean peekOnly) throws Exception { - byte[] buf = new byte[length]; - if (peekOnly) { - is.mark(length); - } - efor(length, (Integer c) -> buf[c] = (byte) is.read()); - if (peekOnly) { - is.reset(); - } - return buf; - } - - protected void skipWhitespace() throws ParserException { - try { - while (is.available() > 0) { - byte c = peek(1)[0]; - if (c == ' ' || c == '\t' || c == '\n' || c == '\r') { - // skip - read(1); - } else { - break; - } - } - } catch (Exception e) { - throw new ParserException(e.getMessage(), e); - } - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/BooleanOp.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/BooleanOp.java deleted file mode 100644 index 214cd1bf3..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/BooleanOp.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.InputStream; - -/** @author Viren */ -public class BooleanOp extends AbstractNode { - - private String value; - - public BooleanOp(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - byte[] buffer = peek(3); - if (buffer.length > 1 && buffer[0] == 'O' && buffer[1] == 'R') { - this.value = "OR"; - } else if (buffer.length > 2 && buffer[0] == 'A' && buffer[1] == 'N' && buffer[2] == 'D') { - this.value = "AND"; - } else { - throw new ParserException("No valid boolean operator found..."); - } - read(this.value.length()); - } - - @Override - public String toString() { - return " " + value + " "; - } - - public String getOperator() { - return value; - } - - public boolean isAnd() { - return "AND".equals(value); - } - - public boolean isOr() { - return "OR".equals(value); - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ComparisonOp.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ComparisonOp.java deleted file mode 100644 index 6a34d25d2..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ComparisonOp.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.InputStream; - -/** @author Viren */ -public class ComparisonOp extends AbstractNode { - - public enum Operators { - BETWEEN("BETWEEN"), - EQUALS("="), - LESS_THAN("<"), - GREATER_THAN(">"), - IN("IN"), - NOT_EQUALS("!="), - IS("IS"), - STARTS_WITH("STARTS_WITH"); - - private final String value; - - Operators(String value) { - this.value = value; - } - - public String value() { - return value; - } - } - - static { - int max = 0; - for (Operators op : Operators.values()) { - max = Math.max(max, op.value().length()); - } - maxOperatorLength = max; - } - - private static final int maxOperatorLength; - - private static final int betweenLen = Operators.BETWEEN.value().length(); - private static final int startsWithLen = Operators.STARTS_WITH.value().length(); - - private String value; - - public ComparisonOp(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - byte[] peeked = peek(maxOperatorLength); - if (peeked[0] == '=' || peeked[0] == '>' || peeked[0] == '<') { - this.value = new String(peeked, 0, 1); - } else if (peeked[0] == 'I' && peeked[1] == 'N') { - this.value = "IN"; - } else if (peeked[0] == 'I' && peeked[1] == 'S') { - this.value = "IS"; - } else if (peeked[0] == '!' && peeked[1] == '=') { - this.value = "!="; - } else if (peeked.length >= betweenLen - && peeked[0] == 'B' - && peeked[1] == 'E' - && peeked[2] == 'T' - && peeked[3] == 'W' - && peeked[4] == 'E' - && peeked[5] == 'E' - && peeked[6] == 'N') { - this.value = Operators.BETWEEN.value(); - } else if (peeked.length == startsWithLen - && new String(peeked).equals(Operators.STARTS_WITH.value())) { - this.value = Operators.STARTS_WITH.value(); - } else { - throw new ParserException( - "Expecting an operator (=, >, <, !=, BETWEEN, IN, STARTS_WITH), but found none. Peeked=>" - + new String(peeked)); - } - - read(this.value.length()); - } - - @Override - public String toString() { - return " " + value + " "; - } - - public String getOperator() { - return value; - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ConstValue.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ConstValue.java deleted file mode 100644 index 62128d7e2..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ConstValue.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.InputStream; - -/** - * @author Viren Constant value can be: - *

    - *
  1. List of values (a,b,c) - *
  2. Range of values (m AND n) - *
  3. A value (x) - *
  4. A value is either a string or a number - *
- */ -public class ConstValue extends AbstractNode { - - public static enum SystemConsts { - NULL("null"), - NOT_NULL("not null"); - private String value; - - SystemConsts(String value) { - this.value = value; - } - - public String value() { - return value; - } - } - - private static String QUOTE = "\""; - - private Object value; - - private SystemConsts sysConsts; - - public ConstValue(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - byte[] peeked = peek(4); - String sp = new String(peeked).trim(); - // Read a constant value (number or a string) - if (peeked[0] == '"' || peeked[0] == '\'') { - this.value = readString(is); - } else if (sp.toLowerCase().startsWith("not")) { - this.value = SystemConsts.NOT_NULL.value(); - sysConsts = SystemConsts.NOT_NULL; - read(SystemConsts.NOT_NULL.value().length()); - } else if (sp.equalsIgnoreCase(SystemConsts.NULL.value())) { - this.value = SystemConsts.NULL.value(); - sysConsts = SystemConsts.NULL; - read(SystemConsts.NULL.value().length()); - } else { - this.value = readNumber(is); - } - } - - private String readNumber(InputStream is) throws Exception { - StringBuilder sb = new StringBuilder(); - while (is.available() > 0) { - is.mark(1); - char c = (char) is.read(); - if (!isNumeric(c)) { - is.reset(); - break; - } else { - sb.append(c); - } - } - String numValue = sb.toString().trim(); - return numValue; - } - /** - * Reads an escaped string - * - * @throws Exception - */ - private String readString(InputStream is) throws Exception { - char delim = (char) read(1)[0]; - StringBuilder sb = new StringBuilder(); - boolean valid = false; - while (is.available() > 0) { - char c = (char) is.read(); - if (c == delim) { - valid = true; - break; - } else if (c == '\\') { - // read the next character as part of the value - c = (char) is.read(); - sb.append(c); - } else { - sb.append(c); - } - } - if (!valid) { - throw new ParserException( - "String constant is not quoted with <" + delim + "> : " + sb.toString()); - } - return QUOTE + sb.toString() + QUOTE; - } - - public Object getValue() { - return value; - } - - @Override - public String toString() { - return "" + value; - } - - public String getUnquotedValue() { - String result = toString(); - if (result.length() >= 2 && result.startsWith(QUOTE) && result.endsWith(QUOTE)) { - result = result.substring(1, result.length() - 1); - } - return result; - } - - public boolean isSysConstant() { - return this.sysConsts != null; - } - - public SystemConsts getSysConstant() { - return this.sysConsts; - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/FunctionThrowingException.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/FunctionThrowingException.java deleted file mode 100644 index f07745677..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/FunctionThrowingException.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -/** @author Viren */ -@FunctionalInterface -public interface FunctionThrowingException { - - void accept(T t) throws Exception; -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ListConst.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ListConst.java deleted file mode 100644 index e486954c6..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ListConst.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.InputStream; -import java.util.LinkedList; -import java.util.List; - -/** @author Viren List of constants */ -public class ListConst extends AbstractNode { - - private List values; - - public ListConst(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - byte[] peeked = read(1); - assertExpected(peeked, "("); - this.values = readList(); - } - - private List readList() throws Exception { - List list = new LinkedList(); - boolean valid = false; - char c; - - StringBuilder sb = new StringBuilder(); - while (is.available() > 0) { - c = (char) is.read(); - if (c == ')') { - valid = true; - break; - } else if (c == ',') { - list.add(sb.toString().trim()); - sb = new StringBuilder(); - } else { - sb.append(c); - } - } - list.add(sb.toString().trim()); - if (!valid) { - throw new ParserException("Expected ')' but never encountered in the stream"); - } - return list; - } - - public List getList() { - return (List) values; - } - - @Override - public String toString() { - return values.toString(); - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/Name.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/Name.java deleted file mode 100644 index 8bb5fc09c..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/Name.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.InputStream; - -/** @author Viren Represents the name of the field to be searched against. */ -public class Name extends AbstractNode { - - private String value; - - public Name(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - this.value = readToken(); - } - - @Override - public String toString() { - return value; - } - - public String getName() { - return value; - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ParserException.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ParserException.java deleted file mode 100644 index e95b82f37..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/ParserException.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -/** @author Viren */ -@SuppressWarnings("serial") -public class ParserException extends Exception { - - public ParserException(String message) { - super(message); - } - - public ParserException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/Range.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/Range.java deleted file mode 100644 index 3e871a87e..000000000 --- a/es7-persistence/src/main/java/com/netflix/conductor/es7/dao/query/parser/internal/Range.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.InputStream; - -/** @author Viren */ -public class Range extends AbstractNode { - - private String low; - - private String high; - - public Range(InputStream is) throws ParserException { - super(is); - } - - @Override - protected void _parse() throws Exception { - this.low = readNumber(is); - - skipWhitespace(); - byte[] peeked = read(3); - assertExpected(peeked, "AND"); - skipWhitespace(); - - String num = readNumber(is); - if (num == null || "".equals(num)) { - throw new ParserException("Missing the upper range value..."); - } - this.high = num; - } - - private String readNumber(InputStream is) throws Exception { - StringBuilder sb = new StringBuilder(); - while (is.available() > 0) { - is.mark(1); - char c = (char) is.read(); - if (!isNumeric(c)) { - is.reset(); - break; - } else { - sb.append(c); - } - } - String numValue = sb.toString().trim(); - return numValue; - } - - /** @return the low */ - public String getLow() { - return low; - } - - /** @return the high */ - public String getHigh() { - return high; - } - - @Override - public String toString() { - return low + " AND " + high; - } -} diff --git a/es7-persistence/src/main/resources/mappings_docType_task.json b/es7-persistence/src/main/resources/mappings_docType_task.json deleted file mode 100644 index 3d102a013..000000000 --- a/es7-persistence/src/main/resources/mappings_docType_task.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "properties": { - "correlationId": { - "type": "keyword", - "index": true - }, - "endTime": { - "type": "date", - "format": "strict_date_optional_time||epoch_millis" - }, - "executionTime": { - "type": "long" - }, - "input": { - "type": "text", - "index": true - }, - "output": { - "type": "text", - "index": true - }, - "queueWaitTime": { - "type": "long" - }, - "reasonForIncompletion": { - "type": "keyword", - "index": true - }, - "scheduledTime": { - "type": "date", - "format": "strict_date_optional_time||epoch_millis" - }, - "startTime": { - "type": "date", - "format": "strict_date_optional_time||epoch_millis" - }, - "status": { - "type": "keyword", - "index": true - }, - "taskDefName": { - "type": "keyword", - "index": true - }, - "taskId": { - "type": "keyword", - "index": true - }, - "taskType": { - "type": "keyword", - "index": true - }, - "updateTime": { - "type": "date", - "format": "strict_date_optional_time||epoch_millis" - }, - "workflowId": { - "type": "keyword", - "index": true - }, - "workflowType": { - "type": "keyword", - "index": true - } - } -} diff --git a/es7-persistence/src/main/resources/mappings_docType_workflow.json b/es7-persistence/src/main/resources/mappings_docType_workflow.json deleted file mode 100644 index 51adac631..000000000 --- a/es7-persistence/src/main/resources/mappings_docType_workflow.json +++ /dev/null @@ -1,72 +0,0 @@ -{ - "properties": { - "correlationId": { - "type": "keyword", - "index": true, - "doc_values": true - }, - "endTime": { - "type": "date", - "format": "strict_date_optional_time||epoch_millis", - "doc_values": true - }, - "executionTime": { - "type": "long", - "doc_values": true - }, - "failedReferenceTaskNames": { - "type": "text", - "index": false - }, - "input": { - "type": "text", - "index": true - }, - "output": { - "type": "text", - "index": true - }, - "reasonForIncompletion": { - "type": "keyword", - "index": true, - "doc_values": true - }, - "startTime": { - "type": "date", - "format": "strict_date_optional_time||epoch_millis", - "doc_values": true - }, - "status": { - "type": "keyword", - "index": true, - "doc_values": true - }, - "updateTime": { - "type": "date", - "format": "strict_date_optional_time||epoch_millis", - "doc_values": true - }, - "version": { - "type": "long", - "doc_values": true - }, - "workflowId": { - "type": "keyword", - "index": true, - "doc_values": true - }, - "workflowType": { - "type": "keyword", - "index": true, - "doc_values": true - }, - "rawJSON": { - "type": "text", - "index": false - }, - "event": { - "type": "keyword", - "index": true - } - } -} diff --git a/es7-persistence/src/main/resources/template_event.json b/es7-persistence/src/main/resources/template_event.json deleted file mode 100644 index 3a0150320..000000000 --- a/es7-persistence/src/main/resources/template_event.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "index_patterns": [ "*event*" ], - "template": { - "settings": { - "refresh_interval": "1s" - }, - "mappings": { - "properties": { - "action": { - "type": "keyword", - "index": true - }, - "created": { - "type": "long" - }, - "event": { - "type": "keyword", - "index": true - }, - "id": { - "type": "keyword", - "index": true - }, - "messageId": { - "type": "keyword", - "index": true - }, - "name": { - "type": "keyword", - "index": true - }, - "output": { - "properties": { - "workflowId": { - "type": "keyword", - "index": true - } - } - }, - "status": { - "type": "keyword", - "index": true - } - } - }, - "aliases" : { } - } -} diff --git a/es7-persistence/src/main/resources/template_message.json b/es7-persistence/src/main/resources/template_message.json deleted file mode 100644 index 63d571aea..000000000 --- a/es7-persistence/src/main/resources/template_message.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "index_patterns": [ "*message*" ], - "template": { - "settings": { - "refresh_interval": "1s" - }, - "mappings": { - "properties": { - "created": { - "type": "long" - }, - "messageId": { - "type": "keyword", - "index": true - }, - "payload": { - "type": "keyword", - "index": true - }, - "queue": { - "type": "keyword", - "index": true - } - } - }, - "aliases": { } - } -} diff --git a/es7-persistence/src/main/resources/template_task_log.json b/es7-persistence/src/main/resources/template_task_log.json deleted file mode 100644 index f7ec4bff0..000000000 --- a/es7-persistence/src/main/resources/template_task_log.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "index_patterns": [ "*task*log*" ], - "template": { - "settings": { - "refresh_interval": "1s" - }, - "mappings": { - "properties": { - "createdTime": { - "type": "long" - }, - "log": { - "type": "keyword", - "index": true - }, - "taskId": { - "type": "keyword", - "index": true - } - } - }, - "aliases": { } - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/ElasticSearchRestDaoBaseTest.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/ElasticSearchRestDaoBaseTest.java deleted file mode 100644 index 3541a89e1..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/ElasticSearchRestDaoBaseTest.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; - -import org.apache.http.HttpHost; -import org.elasticsearch.client.Request; -import org.elasticsearch.client.Response; -import org.elasticsearch.client.RestClient; -import org.elasticsearch.client.RestClientBuilder; -import org.junit.After; -import org.junit.Before; - -public abstract class ElasticSearchRestDaoBaseTest extends ElasticSearchTest { - - protected RestClient restClient; - protected ElasticSearchRestDAOV7 indexDAO; - - @Before - public void setup() throws Exception { - String httpHostAddress = container.getHttpHostAddress(); - String host = httpHostAddress.split(":")[0]; - int port = Integer.parseInt(httpHostAddress.split(":")[1]); - - properties.setUrl("http://" + httpHostAddress); - - RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host, port, "http")); - restClient = restClientBuilder.build(); - - indexDAO = new ElasticSearchRestDAOV7(restClientBuilder, properties, objectMapper); - indexDAO.setup(); - } - - @After - public void tearDown() throws Exception { - deleteAllIndices(); - - if (restClient != null) { - restClient.close(); - } - } - - private void deleteAllIndices() throws IOException { - Response beforeResponse = restClient.performRequest(new Request("GET", "/_cat/indices")); - - Reader streamReader = new InputStreamReader(beforeResponse.getEntity().getContent()); - BufferedReader bufferedReader = new BufferedReader(streamReader); - - String line; - while ((line = bufferedReader.readLine()) != null) { - String[] fields = line.split("\\s"); - String endpoint = String.format("/%s", fields[2]); - - restClient.performRequest(new Request("DELETE", endpoint)); - } - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/ElasticSearchTest.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/ElasticSearchTest.java deleted file mode 100644 index 32f715124..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/ElasticSearchTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2021 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; -import org.testcontainers.elasticsearch.ElasticsearchContainer; -import org.testcontainers.utility.DockerImageName; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.es7.config.ElasticSearchProperties; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@ContextConfiguration( - classes = {TestObjectMapperConfiguration.class, ElasticSearchTest.TestConfiguration.class}) -@RunWith(SpringRunner.class) -@TestPropertySource( - properties = {"conductor.indexing.enabled=true", "conductor.elasticsearch.version=7"}) -public abstract class ElasticSearchTest { - - @Configuration - static class TestConfiguration { - - @Bean - public ElasticSearchProperties elasticSearchProperties() { - return new ElasticSearchProperties(); - } - } - - protected static final ElasticsearchContainer container = - new ElasticsearchContainer( - DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch-oss") - .withTag("7.6.2")); // this should match the client version - - @Autowired protected ObjectMapper objectMapper; - - @Autowired protected ElasticSearchProperties properties; - - @BeforeClass - public static void startServer() { - container.start(); - } - - @AfterClass - public static void stopServer() { - container.stop(); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestBulkRequestBuilderWrapper.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestBulkRequestBuilderWrapper.java deleted file mode 100644 index 7fe4fc866..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestBulkRequestBuilderWrapper.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import org.elasticsearch.action.bulk.BulkRequestBuilder; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.update.UpdateRequest; -import org.junit.Test; -import org.mockito.Mockito; - -public class TestBulkRequestBuilderWrapper { - BulkRequestBuilder builder = Mockito.mock(BulkRequestBuilder.class); - BulkRequestBuilderWrapper wrapper = new BulkRequestBuilderWrapper(builder); - - @Test(expected = Exception.class) - public void testAddNullUpdateRequest() { - wrapper.add((UpdateRequest) null); - } - - @Test(expected = Exception.class) - public void testAddNullIndexRequest() { - wrapper.add((IndexRequest) null); - } - - @Test - public void testBuilderCalls() { - IndexRequest indexRequest = new IndexRequest(); - UpdateRequest updateRequest = new UpdateRequest(); - - wrapper.add(indexRequest); - wrapper.add(updateRequest); - wrapper.numberOfActions(); - wrapper.execute(); - - Mockito.verify(builder, Mockito.times(1)).add(indexRequest); - Mockito.verify(builder, Mockito.times(1)).add(updateRequest); - Mockito.verify(builder, Mockito.times(1)).numberOfActions(); - Mockito.verify(builder, Mockito.times(1)).execute(); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestElasticSearchRestDAOV7.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestElasticSearchRestDAOV7.java deleted file mode 100644 index e055025a2..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestElasticSearchRestDAOV7.java +++ /dev/null @@ -1,444 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.function.Supplier; - -import org.joda.time.DateTime; -import org.junit.Test; - -import com.netflix.conductor.common.metadata.events.EventExecution; -import com.netflix.conductor.common.metadata.events.EventHandler; -import com.netflix.conductor.common.metadata.tasks.TaskExecLog; -import com.netflix.conductor.common.run.TaskSummary; -import com.netflix.conductor.common.run.Workflow.WorkflowStatus; -import com.netflix.conductor.common.run.WorkflowSummary; -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.es7.utils.TestUtils; - -import com.google.common.collect.ImmutableMap; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class TestElasticSearchRestDAOV7 extends ElasticSearchRestDaoBaseTest { - - private static final SimpleDateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyyMMWW"); - - private static final String INDEX_PREFIX = "conductor"; - private static final String WORKFLOW_DOC_TYPE = "workflow"; - private static final String TASK_DOC_TYPE = "task"; - private static final String MSG_DOC_TYPE = "message"; - private static final String EVENT_DOC_TYPE = "event"; - private static final String LOG_DOC_TYPE = "task_log"; - - private boolean indexExists(final String index) throws IOException { - return indexDAO.doesResourceExist("/" + index); - } - - private boolean doesMappingExist(final String index, final String mappingName) - throws IOException { - return indexDAO.doesResourceExist("/" + index + "/_mapping/" + mappingName); - } - - @Test - public void assertInitialSetup() throws IOException { - SIMPLE_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); - - String workflowIndex = INDEX_PREFIX + "_" + WORKFLOW_DOC_TYPE; - String taskIndex = INDEX_PREFIX + "_" + TASK_DOC_TYPE; - - String taskLogIndex = - INDEX_PREFIX + "_" + LOG_DOC_TYPE + "_" + SIMPLE_DATE_FORMAT.format(new Date()); - String messageIndex = - INDEX_PREFIX + "_" + MSG_DOC_TYPE + "_" + SIMPLE_DATE_FORMAT.format(new Date()); - String eventIndex = - INDEX_PREFIX + "_" + EVENT_DOC_TYPE + "_" + SIMPLE_DATE_FORMAT.format(new Date()); - - assertTrue("Index 'conductor_workflow' should exist", indexExists(workflowIndex)); - assertTrue("Index 'conductor_task' should exist", indexExists(taskIndex)); - - assertTrue("Index '" + taskLogIndex + "' should exist", indexExists(taskLogIndex)); - assertTrue("Index '" + messageIndex + "' should exist", indexExists(messageIndex)); - assertTrue("Index '" + eventIndex + "' should exist", indexExists(eventIndex)); - - assertTrue( - "Index template for 'message' should exist", - indexDAO.doesResourceExist("/_template/template_" + MSG_DOC_TYPE)); - assertTrue( - "Index template for 'event' should exist", - indexDAO.doesResourceExist("/_template/template_" + EVENT_DOC_TYPE)); - assertTrue( - "Index template for 'task_log' should exist", - indexDAO.doesResourceExist("/_template/template_" + LOG_DOC_TYPE)); - } - - @Test - public void shouldIndexWorkflow() { - WorkflowSummary workflowSummary = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - indexDAO.indexWorkflow(workflowSummary); - - assertWorkflowSummary(workflowSummary.getWorkflowId(), workflowSummary); - } - - @Test - public void shouldIndexWorkflowAsync() throws Exception { - WorkflowSummary workflowSummary = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - indexDAO.asyncIndexWorkflow(workflowSummary).get(); - - assertWorkflowSummary(workflowSummary.getWorkflowId(), workflowSummary); - } - - @Test - public void shouldRemoveWorkflow() { - WorkflowSummary workflowSummary = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - indexDAO.indexWorkflow(workflowSummary); - - // wait for workflow to be indexed - List workflows = - tryFindResults(() -> searchWorkflows(workflowSummary.getWorkflowId()), 1); - assertEquals(1, workflows.size()); - - indexDAO.removeWorkflow(workflowSummary.getWorkflowId()); - - workflows = tryFindResults(() -> searchWorkflows(workflowSummary.getWorkflowId()), 0); - - assertTrue("Workflow was not removed.", workflows.isEmpty()); - } - - @Test - public void shouldAsyncRemoveWorkflow() throws Exception { - WorkflowSummary workflowSummary = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - indexDAO.indexWorkflow(workflowSummary); - - // wait for workflow to be indexed - List workflows = - tryFindResults(() -> searchWorkflows(workflowSummary.getWorkflowId()), 1); - assertEquals(1, workflows.size()); - - indexDAO.asyncRemoveWorkflow(workflowSummary.getWorkflowId()).get(); - - workflows = tryFindResults(() -> searchWorkflows(workflowSummary.getWorkflowId()), 0); - - assertTrue("Workflow was not removed.", workflows.isEmpty()); - } - - @Test - public void shouldUpdateWorkflow() { - WorkflowSummary workflowSummary = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - indexDAO.indexWorkflow(workflowSummary); - - indexDAO.updateWorkflow( - workflowSummary.getWorkflowId(), - new String[] {"status"}, - new Object[] {WorkflowStatus.COMPLETED}); - - workflowSummary.setStatus(WorkflowStatus.COMPLETED); - assertWorkflowSummary(workflowSummary.getWorkflowId(), workflowSummary); - } - - @Test - public void shouldAsyncUpdateWorkflow() throws Exception { - WorkflowSummary workflowSummary = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - indexDAO.indexWorkflow(workflowSummary); - - indexDAO.asyncUpdateWorkflow( - workflowSummary.getWorkflowId(), - new String[] {"status"}, - new Object[] {WorkflowStatus.FAILED}) - .get(); - - workflowSummary.setStatus(WorkflowStatus.FAILED); - assertWorkflowSummary(workflowSummary.getWorkflowId(), workflowSummary); - } - - @Test - public void shouldIndexTask() { - TaskSummary taskSummary = TestUtils.loadTaskSnapshot(objectMapper, "task_summary"); - indexDAO.indexTask(taskSummary); - - List tasks = tryFindResults(() -> searchTasks(taskSummary)); - - assertEquals(taskSummary.getTaskId(), tasks.get(0)); - } - - @Test - public void shouldIndexTaskAsync() throws Exception { - TaskSummary taskSummary = TestUtils.loadTaskSnapshot(objectMapper, "task_summary"); - indexDAO.asyncIndexTask(taskSummary).get(); - - List tasks = tryFindResults(() -> searchTasks(taskSummary)); - - assertEquals(taskSummary.getTaskId(), tasks.get(0)); - } - - @Test - public void shouldAddTaskExecutionLogs() { - List logs = new ArrayList<>(); - String taskId = uuid(); - logs.add(createLog(taskId, "log1")); - logs.add(createLog(taskId, "log2")); - logs.add(createLog(taskId, "log3")); - - indexDAO.addTaskExecutionLogs(logs); - - List indexedLogs = - tryFindResults(() -> indexDAO.getTaskExecutionLogs(taskId), 3); - - assertEquals(3, indexedLogs.size()); - - assertTrue("Not all logs was indexed", indexedLogs.containsAll(logs)); - } - - @Test - public void shouldAddTaskExecutionLogsAsync() throws Exception { - List logs = new ArrayList<>(); - String taskId = uuid(); - logs.add(createLog(taskId, "log1")); - logs.add(createLog(taskId, "log2")); - logs.add(createLog(taskId, "log3")); - - indexDAO.asyncAddTaskExecutionLogs(logs).get(); - - List indexedLogs = - tryFindResults(() -> indexDAO.getTaskExecutionLogs(taskId), 3); - - assertEquals(3, indexedLogs.size()); - - assertTrue("Not all logs was indexed", indexedLogs.containsAll(logs)); - } - - @Test - public void shouldAddMessage() { - String queue = "queue"; - Message message1 = new Message(uuid(), "payload1", null); - Message message2 = new Message(uuid(), "payload2", null); - - indexDAO.addMessage(queue, message1); - indexDAO.addMessage(queue, message2); - - List indexedMessages = tryFindResults(() -> indexDAO.getMessages(queue), 2); - - assertEquals(2, indexedMessages.size()); - - assertTrue( - "Not all messages was indexed", - indexedMessages.containsAll(Arrays.asList(message1, message2))); - } - - @Test - public void shouldAddEventExecution() { - String event = "event"; - EventExecution execution1 = createEventExecution(event); - EventExecution execution2 = createEventExecution(event); - - indexDAO.addEventExecution(execution1); - indexDAO.addEventExecution(execution2); - - List indexedExecutions = - tryFindResults(() -> indexDAO.getEventExecutions(event), 2); - - assertEquals(2, indexedExecutions.size()); - - assertTrue( - "Not all event executions was indexed", - indexedExecutions.containsAll(Arrays.asList(execution1, execution2))); - } - - @Test - public void shouldAsyncAddEventExecution() throws Exception { - String event = "event2"; - EventExecution execution1 = createEventExecution(event); - EventExecution execution2 = createEventExecution(event); - - indexDAO.asyncAddEventExecution(execution1).get(); - indexDAO.asyncAddEventExecution(execution2).get(); - - List indexedExecutions = - tryFindResults(() -> indexDAO.getEventExecutions(event), 2); - - assertEquals(2, indexedExecutions.size()); - - assertTrue( - "Not all event executions was indexed", - indexedExecutions.containsAll(Arrays.asList(execution1, execution2))); - } - - @Test - public void shouldAddIndexPrefixToIndexTemplate() throws Exception { - String json = TestUtils.loadJsonResource("expected_template_task_log"); - String content = indexDAO.loadTypeMappingSource("/template_task_log.json"); - - assertEquals(json, content); - } - - @Test - public void shouldSearchRecentRunningWorkflows() throws Exception { - WorkflowSummary oldWorkflow = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - oldWorkflow.setStatus(WorkflowStatus.RUNNING); - oldWorkflow.setUpdateTime(getFormattedTime(new DateTime().minusHours(2).toDate())); - - WorkflowSummary recentWorkflow = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - recentWorkflow.setStatus(WorkflowStatus.RUNNING); - recentWorkflow.setUpdateTime(getFormattedTime(new DateTime().minusHours(1).toDate())); - - WorkflowSummary tooRecentWorkflow = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - tooRecentWorkflow.setStatus(WorkflowStatus.RUNNING); - tooRecentWorkflow.setUpdateTime(getFormattedTime(new DateTime().toDate())); - - indexDAO.indexWorkflow(oldWorkflow); - indexDAO.indexWorkflow(recentWorkflow); - indexDAO.indexWorkflow(tooRecentWorkflow); - - Thread.sleep(1000); - - List ids = indexDAO.searchRecentRunningWorkflows(2, 1); - - assertEquals(1, ids.size()); - assertEquals(recentWorkflow.getWorkflowId(), ids.get(0)); - } - - @Test - public void shouldCountWorkflows() { - int counts = 1100; - for (int i = 0; i < counts; i++) { - WorkflowSummary workflowSummary = - TestUtils.loadWorkflowSnapshot(objectMapper, "workflow_summary"); - indexDAO.indexWorkflow(workflowSummary); - } - - // wait for workflow to be indexed - long result = tryGetCount(() -> getWorkflowCount("template_workflow", "RUNNING"), counts); - assertEquals(counts, result); - } - - private long tryGetCount(Supplier countFunction, int resultsCount) { - long result = 0; - for (int i = 0; i < 20; i++) { - result = countFunction.get(); - if (result == resultsCount) { - return result; - } - try { - Thread.sleep(100); - } catch (InterruptedException e) { - throw new RuntimeException(e.getMessage(), e); - } - } - return result; - } - - // Get total workflow counts given the name and status - private long getWorkflowCount(String workflowName, String status) { - return indexDAO.getWorkflowCount( - "status=\"" + status + "\" AND workflowType=\"" + workflowName + "\"", "*"); - } - - private void assertWorkflowSummary(String workflowId, WorkflowSummary summary) { - assertEquals(summary.getWorkflowType(), indexDAO.get(workflowId, "workflowType")); - assertEquals(String.valueOf(summary.getVersion()), indexDAO.get(workflowId, "version")); - assertEquals(summary.getWorkflowId(), indexDAO.get(workflowId, "workflowId")); - assertEquals(summary.getCorrelationId(), indexDAO.get(workflowId, "correlationId")); - assertEquals(summary.getStartTime(), indexDAO.get(workflowId, "startTime")); - assertEquals(summary.getUpdateTime(), indexDAO.get(workflowId, "updateTime")); - assertEquals(summary.getEndTime(), indexDAO.get(workflowId, "endTime")); - assertEquals(summary.getStatus().name(), indexDAO.get(workflowId, "status")); - assertEquals(summary.getInput(), indexDAO.get(workflowId, "input")); - assertEquals(summary.getOutput(), indexDAO.get(workflowId, "output")); - assertEquals( - summary.getReasonForIncompletion(), - indexDAO.get(workflowId, "reasonForIncompletion")); - assertEquals( - String.valueOf(summary.getExecutionTime()), - indexDAO.get(workflowId, "executionTime")); - assertEquals(summary.getEvent(), indexDAO.get(workflowId, "event")); - assertEquals( - summary.getFailedReferenceTaskNames(), - indexDAO.get(workflowId, "failedReferenceTaskNames")); - } - - private String getFormattedTime(Date time) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); - sdf.setTimeZone(TimeZone.getTimeZone("GMT")); - return sdf.format(time); - } - - private List tryFindResults(Supplier> searchFunction) { - return tryFindResults(searchFunction, 1); - } - - private List tryFindResults(Supplier> searchFunction, int resultsCount) { - List result = Collections.emptyList(); - for (int i = 0; i < 20; i++) { - result = searchFunction.get(); - if (result.size() == resultsCount) { - return result; - } - try { - Thread.sleep(100); - } catch (InterruptedException e) { - throw new RuntimeException(e.getMessage(), e); - } - } - return result; - } - - private List searchWorkflows(String workflowId) { - return indexDAO.searchWorkflows( - "", "workflowId:\"" + workflowId + "\"", 0, 100, Collections.emptyList()) - .getResults(); - } - - private List searchTasks(TaskSummary taskSummary) { - return indexDAO.searchTasks( - "", - "workflowId:\"" + taskSummary.getWorkflowId() + "\"", - 0, - 100, - Collections.emptyList()) - .getResults(); - } - - private TaskExecLog createLog(String taskId, String log) { - TaskExecLog taskExecLog = new TaskExecLog(log); - taskExecLog.setTaskId(taskId); - return taskExecLog; - } - - private EventExecution createEventExecution(String event) { - EventExecution execution = new EventExecution(uuid(), uuid()); - execution.setName("name"); - execution.setEvent(event); - execution.setCreated(System.currentTimeMillis()); - execution.setStatus(EventExecution.Status.COMPLETED); - execution.setAction(EventHandler.Action.Type.start_workflow); - execution.setOutput(ImmutableMap.of("a", 1, "b", 2, "c", 3)); - return execution; - } - - private String uuid() { - return UUID.randomUUID().toString(); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestElasticSearchRestDAOV7Batch.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestElasticSearchRestDAOV7Batch.java deleted file mode 100644 index 81b5971df..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/index/TestElasticSearchRestDAOV7Batch.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.index; - -import java.util.HashMap; -import java.util.concurrent.TimeUnit; - -import org.junit.Test; -import org.springframework.test.context.TestPropertySource; - -import com.netflix.conductor.common.metadata.tasks.Task.Status; -import com.netflix.conductor.common.run.SearchResult; -import com.netflix.conductor.common.run.TaskSummary; - -import com.fasterxml.jackson.core.JsonProcessingException; - -import static org.awaitility.Awaitility.await; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -@TestPropertySource(properties = "conductor.elasticsearch.indexBatchSize=2") -public class TestElasticSearchRestDAOV7Batch extends ElasticSearchRestDaoBaseTest { - - @Test - public void indexTaskWithBatchSizeTwo() { - String correlationId = "some-correlation-id"; - - TaskSummary taskSummary = new TaskSummary(); - taskSummary.setTaskId("some-task-id"); - taskSummary.setWorkflowId("some-workflow-instance-id"); - taskSummary.setTaskType("some-task-type"); - taskSummary.setStatus(Status.FAILED); - try { - taskSummary.setInput( - objectMapper.writeValueAsString( - new HashMap() { - { - put("input_key", "input_value"); - } - })); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - taskSummary.setCorrelationId(correlationId); - taskSummary.setTaskDefName("some-task-def-name"); - taskSummary.setReasonForIncompletion("some-failure-reason"); - - indexDAO.indexTask(taskSummary); - indexDAO.indexTask(taskSummary); - - await().atMost(5, TimeUnit.SECONDS) - .untilAsserted( - () -> { - SearchResult result = - indexDAO.searchTasks( - "correlationId='" + correlationId + "'", - "*", - 0, - 10000, - null); - - assertTrue( - "should return 1 or more search results", - result.getResults().size() > 0); - assertEquals( - "taskId should match the indexed task", - "some-task-id", - result.getResults().get(0)); - }); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/TestExpression.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/TestExpression.java deleted file mode 100644 index e35d4b657..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/TestExpression.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import org.junit.Test; - -import com.netflix.conductor.es7.dao.query.parser.internal.AbstractParserTest; -import com.netflix.conductor.es7.dao.query.parser.internal.ConstValue; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -/** @author Viren */ -public class TestExpression extends AbstractParserTest { - - @Test - public void test() throws Exception { - String test = - "type='IMAGE' AND subType ='sdp' AND (metadata.width > 50 OR metadata.height > 50)"; - // test = "type='IMAGE' AND subType ='sdp'"; - // test = "(metadata.type = 'IMAGE')"; - InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes())); - Expression expr = new Expression(is); - - System.out.println(expr); - - assertTrue(expr.isBinaryExpr()); - assertNull(expr.getGroupedExpression()); - assertNotNull(expr.getNameValue()); - - NameValue nv = expr.getNameValue(); - assertEquals("type", nv.getName().getName()); - assertEquals("=", nv.getOp().getOperator()); - assertEquals("\"IMAGE\"", nv.getValue().getValue()); - - Expression rhs = expr.getRightHandSide(); - assertNotNull(rhs); - assertTrue(rhs.isBinaryExpr()); - - nv = rhs.getNameValue(); - assertNotNull(nv); // subType = sdp - assertNull(rhs.getGroupedExpression()); - assertEquals("subType", nv.getName().getName()); - assertEquals("=", nv.getOp().getOperator()); - assertEquals("\"sdp\"", nv.getValue().getValue()); - - assertEquals("AND", rhs.getOperator().getOperator()); - rhs = rhs.getRightHandSide(); - assertNotNull(rhs); - assertFalse(rhs.isBinaryExpr()); - GroupedExpression ge = rhs.getGroupedExpression(); - assertNotNull(ge); - expr = ge.getExpression(); - assertNotNull(expr); - - assertTrue(expr.isBinaryExpr()); - nv = expr.getNameValue(); - assertNotNull(nv); - assertEquals("metadata.width", nv.getName().getName()); - assertEquals(">", nv.getOp().getOperator()); - assertEquals("50", nv.getValue().getValue()); - - assertEquals("OR", expr.getOperator().getOperator()); - rhs = expr.getRightHandSide(); - assertNotNull(rhs); - assertFalse(rhs.isBinaryExpr()); - nv = rhs.getNameValue(); - assertNotNull(nv); - - assertEquals("metadata.height", nv.getName().getName()); - assertEquals(">", nv.getOp().getOperator()); - assertEquals("50", nv.getValue().getValue()); - } - - @Test - public void testWithSysConstants() throws Exception { - String test = "type='IMAGE' AND subType ='sdp' AND description IS null"; - InputStream is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes())); - Expression expr = new Expression(is); - - System.out.println(expr); - - assertTrue(expr.isBinaryExpr()); - assertNull(expr.getGroupedExpression()); - assertNotNull(expr.getNameValue()); - - NameValue nv = expr.getNameValue(); - assertEquals("type", nv.getName().getName()); - assertEquals("=", nv.getOp().getOperator()); - assertEquals("\"IMAGE\"", nv.getValue().getValue()); - - Expression rhs = expr.getRightHandSide(); - assertNotNull(rhs); - assertTrue(rhs.isBinaryExpr()); - - nv = rhs.getNameValue(); - assertNotNull(nv); // subType = sdp - assertNull(rhs.getGroupedExpression()); - assertEquals("subType", nv.getName().getName()); - assertEquals("=", nv.getOp().getOperator()); - assertEquals("\"sdp\"", nv.getValue().getValue()); - - assertEquals("AND", rhs.getOperator().getOperator()); - rhs = rhs.getRightHandSide(); - assertNotNull(rhs); - assertFalse(rhs.isBinaryExpr()); - GroupedExpression ge = rhs.getGroupedExpression(); - assertNull(ge); - nv = rhs.getNameValue(); - assertNotNull(nv); - assertEquals("description", nv.getName().getName()); - assertEquals("IS", nv.getOp().getOperator()); - ConstValue cv = nv.getValue(); - assertNotNull(cv); - assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NULL); - - test = "description IS not null"; - is = new BufferedInputStream(new ByteArrayInputStream(test.getBytes())); - expr = new Expression(is); - - System.out.println(expr); - nv = expr.getNameValue(); - assertNotNull(nv); - assertEquals("description", nv.getName().getName()); - assertEquals("IS", nv.getOp().getOperator()); - cv = nv.getValue(); - assertNotNull(cv); - assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NOT_NULL); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/TestGroupedExpression.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/TestGroupedExpression.java deleted file mode 100644 index 5e4116fd6..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/TestGroupedExpression.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser; - -import org.junit.Test; - -/** @author Viren */ -public class TestGroupedExpression { - - @Test - public void test() {} -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/AbstractParserTest.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/AbstractParserTest.java deleted file mode 100644 index 874cd68d5..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/AbstractParserTest.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -/** @author Viren */ -public abstract class AbstractParserTest { - - protected InputStream getInputStream(String expression) { - return new BufferedInputStream(new ByteArrayInputStream(expression.getBytes())); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestBooleanOp.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestBooleanOp.java deleted file mode 100644 index cc04e6564..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestBooleanOp.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** @author Viren */ -public class TestBooleanOp extends AbstractParserTest { - - @Test - public void test() throws Exception { - String[] tests = new String[] {"AND", "OR"}; - for (String test : tests) { - BooleanOp name = new BooleanOp(getInputStream(test)); - String nameVal = name.getOperator(); - assertNotNull(nameVal); - assertEquals(test, nameVal); - } - } - - @Test(expected = ParserException.class) - public void testInvalid() throws Exception { - String test = "<"; - BooleanOp name = new BooleanOp(getInputStream(test)); - String nameVal = name.getOperator(); - assertNotNull(nameVal); - assertEquals(test, nameVal); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestComparisonOp.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestComparisonOp.java deleted file mode 100644 index e21c43250..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestComparisonOp.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** @author Viren */ -public class TestComparisonOp extends AbstractParserTest { - - @Test - public void test() throws Exception { - String[] tests = new String[] {"<", ">", "=", "!=", "IN", "BETWEEN", "STARTS_WITH"}; - for (String test : tests) { - ComparisonOp name = new ComparisonOp(getInputStream(test)); - String nameVal = name.getOperator(); - assertNotNull(nameVal); - assertEquals(test, nameVal); - } - } - - @Test(expected = ParserException.class) - public void testInvalidOp() throws Exception { - String test = "AND"; - ComparisonOp name = new ComparisonOp(getInputStream(test)); - String nameVal = name.getOperator(); - assertNotNull(nameVal); - assertEquals(test, nameVal); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestConstValue.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestConstValue.java deleted file mode 100644 index dbb763344..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestConstValue.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import java.util.List; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** @author Viren */ -public class TestConstValue extends AbstractParserTest { - - @Test - public void testStringConst() throws Exception { - String test = "'string value'"; - String expected = - test.replaceAll( - "'", "\""); // Quotes are removed but then the result is double quoted. - ConstValue cv = new ConstValue(getInputStream(test)); - assertNotNull(cv.getValue()); - assertEquals(expected, cv.getValue()); - assertTrue(cv.getValue() instanceof String); - - test = "\"string value\""; - cv = new ConstValue(getInputStream(test)); - assertNotNull(cv.getValue()); - assertEquals(expected, cv.getValue()); - assertTrue(cv.getValue() instanceof String); - } - - @Test - public void testSystemConst() throws Exception { - String test = "null"; - ConstValue cv = new ConstValue(getInputStream(test)); - assertNotNull(cv.getValue()); - assertTrue(cv.getValue() instanceof String); - assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NULL); - test = "null"; - - test = "not null"; - cv = new ConstValue(getInputStream(test)); - assertNotNull(cv.getValue()); - assertEquals(cv.getSysConstant(), ConstValue.SystemConsts.NOT_NULL); - } - - @Test(expected = ParserException.class) - public void testInvalid() throws Exception { - String test = "'string value"; - new ConstValue(getInputStream(test)); - } - - @Test - public void testNumConst() throws Exception { - String test = "12345.89"; - ConstValue cv = new ConstValue(getInputStream(test)); - assertNotNull(cv.getValue()); - assertTrue( - cv.getValue() - instanceof - String); // Numeric values are stored as string as we are just passing thru - // them to ES - assertEquals(test, cv.getValue()); - } - - @Test - public void testRange() throws Exception { - String test = "50 AND 100"; - Range range = new Range(getInputStream(test)); - assertEquals("50", range.getLow()); - assertEquals("100", range.getHigh()); - } - - @Test(expected = ParserException.class) - public void testBadRange() throws Exception { - String test = "50 AND"; - new Range(getInputStream(test)); - } - - @Test - public void testArray() throws Exception { - String test = "(1, 3, 'name', 'value2')"; - ListConst lc = new ListConst(getInputStream(test)); - List list = lc.getList(); - assertEquals(4, list.size()); - assertTrue(list.contains("1")); - assertEquals("'value2'", list.get(3)); // Values are preserved as it is... - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestName.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestName.java deleted file mode 100644 index 169075d44..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/dao/query/parser/internal/TestName.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2016 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.dao.query.parser.internal; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -/** @author Viren */ -public class TestName extends AbstractParserTest { - - @Test - public void test() throws Exception { - String test = "metadata.en_US.lang "; - Name name = new Name(getInputStream(test)); - String nameVal = name.getName(); - assertNotNull(nameVal); - assertEquals(test.trim(), nameVal); - } -} diff --git a/es7-persistence/src/test/java/com/netflix/conductor/es7/utils/TestUtils.java b/es7-persistence/src/test/java/com/netflix/conductor/es7/utils/TestUtils.java deleted file mode 100644 index e713eb924..000000000 --- a/es7-persistence/src/test/java/com/netflix/conductor/es7/utils/TestUtils.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.es7.utils; - -import org.apache.commons.io.Charsets; - -import com.netflix.conductor.common.run.TaskSummary; -import com.netflix.conductor.common.run.WorkflowSummary; -import com.netflix.conductor.core.utils.IDGenerator; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.io.Resources; - -public class TestUtils { - - private static final String WORKFLOW_SCENARIO_EXTENSION = ".json"; - private static final String WORKFLOW_INSTANCE_ID_PLACEHOLDER = "WORKFLOW_INSTANCE_ID"; - - public static WorkflowSummary loadWorkflowSnapshot( - ObjectMapper objectMapper, String resourceFileName) { - try { - String content = loadJsonResource(resourceFileName); - String workflowId = IDGenerator.generate(); - content = content.replace(WORKFLOW_INSTANCE_ID_PLACEHOLDER, workflowId); - - return objectMapper.readValue(content, WorkflowSummary.class); - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } - } - - public static TaskSummary loadTaskSnapshot(ObjectMapper objectMapper, String resourceFileName) { - try { - String content = loadJsonResource(resourceFileName); - String workflowId = IDGenerator.generate(); - content = content.replace(WORKFLOW_INSTANCE_ID_PLACEHOLDER, workflowId); - - return objectMapper.readValue(content, TaskSummary.class); - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } - } - - public static String loadJsonResource(String resourceFileName) { - try { - return Resources.toString( - TestUtils.class.getResource( - "/" + resourceFileName + WORKFLOW_SCENARIO_EXTENSION), - Charsets.UTF_8); - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } - } -} diff --git a/es7-persistence/src/test/resources/expected_template_task_log.json b/es7-persistence/src/test/resources/expected_template_task_log.json deleted file mode 100644 index ebb8d4a20..000000000 --- a/es7-persistence/src/test/resources/expected_template_task_log.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "index_patterns" : [ "*conductor_task*log*" ], - "template" : { - "settings" : { - "refresh_interval" : "1s" - }, - "mappings" : { - "properties" : { - "createdTime" : { - "type" : "long" - }, - "log" : { - "type" : "keyword", - "index" : true - }, - "taskId" : { - "type" : "keyword", - "index" : true - } - } - }, - "aliases" : { } - } -} \ No newline at end of file diff --git a/es7-persistence/src/test/resources/task_summary.json b/es7-persistence/src/test/resources/task_summary.json deleted file mode 100644 index a409a22f1..000000000 --- a/es7-persistence/src/test/resources/task_summary.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "taskId": "9dea4567-0240-4eab-bde8-99f4535ea3fc", - "taskDefName": "templated_task", - "taskType": "templated_task", - "workflowId": "WORKFLOW_INSTANCE_ID", - "workflowType": "template_workflow", - "correlationId": "testTaskDefTemplate", - "scheduledTime": "2021-08-22T05:18:25.121Z", - "startTime": "0", - "endTime": "0", - "updateTime": "2021-08-23T00:18:25.121Z", - "status": "SCHEDULED", - "workflowPriority": 1, - "queueWaitTime": 0, - "executionTime": 0, - "input": "{http_request={method=GET, vipStack=test_stack, body={requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath, inputPaths=[file://path1, file://path2]}, uri=/get/something}}" -} \ No newline at end of file diff --git a/es7-persistence/src/test/resources/workflow_summary.json b/es7-persistence/src/test/resources/workflow_summary.json deleted file mode 100644 index 443d8464e..000000000 --- a/es7-persistence/src/test/resources/workflow_summary.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "workflowType": "template_workflow", - "version": 1, - "workflowId": "WORKFLOW_INSTANCE_ID", - "priority": 1, - "correlationId": "testTaskDefTemplate", - "startTime": 1534983505050, - "updateTime": 1534983505131, - "endTime": 0, - "status": "RUNNING", - "input": "{path1=file://path1, path2=file://path2, requestDetails={key1=value1, key2=42}, outputPath=s3://bucket/outputPath}" -} diff --git a/grpc-client/dependencies.lock b/grpc-client/dependencies.lock index 1631b8c58..4a8f3ac01 100644 --- a/grpc-client/dependencies.lock +++ b/grpc-client/dependencies.lock @@ -1,15 +1,61 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "30.0-jre", + "transitive": [ + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "io.grpc:grpc-protobuf" + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -17,23 +63,124 @@ "com.netflix.conductor:conductor-grpc": { "project": true }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -44,137 +191,405 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "runtimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "30.0-jre", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.13.0" + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-protobuf" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "project": true + ] }, "com.netflix.conductor:conductor-grpc": { "project": true }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "testCompileClasspath": { + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "30.0-jre", + "transitive": [ + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "io.grpc:grpc-protobuf" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-common": { "project": true @@ -182,174 +597,1062 @@ "com.netflix.conductor:conductor-grpc": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "30.0-jre", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.13.0" + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-protobuf" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "project": true + ] }, "com.netflix.conductor:conductor-grpc": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] }, "org.slf4j:slf4j-api": { - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/grpc-server/dependencies.lock b/grpc-server/dependencies.lock index 095d9db8b..f87a774d2 100644 --- a/grpc-server/dependencies.lock +++ b/grpc-server/dependencies.lock @@ -1,10 +1,62 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.19.2", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "io.grpc:grpc-protobuf" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, @@ -14,20 +66,140 @@ "com.netflix.conductor:conductor-grpc": { "project": true }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services" + ] + }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-stub": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-services" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -38,69 +210,240 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "runtimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "31.0.1-android" + "locked": "31.0.1-android", + "transitive": [ + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.19.2", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.protobuf:protobuf-java-util", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.19.2" + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.protobuf:protobuf-java-util": { + "locked": "3.19.2", + "transitive": [ + "io.grpc:grpc-services" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-grpc" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true @@ -109,126 +452,365 @@ "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services" + ] }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ + "locked": "2.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "testCompileClasspath": { + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.collections:google-collections": { + "locked": "1.0", + "transitive": [ + "org.testinfected.hamcrest-matchers:jpa-matchers" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.19.2", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "io.grpc:grpc-protobuf" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, @@ -238,105 +820,678 @@ "com.netflix.conductor:conductor-grpc": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-testing" + ] + }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-stub": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-services", + "io.grpc:grpc-testing" + ] }, "io.grpc:grpc-testing": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-handler" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.persistence:persistence-api": { + "locked": "1.0", + "transitive": [ + "org.testinfected.hamcrest-matchers:jpa-matchers" + ] + }, + "javax.validation:validation-api": { + "locked": "2.0.1.Final", + "transitive": [ + "org.testinfected.hamcrest-matchers:validation-matchers" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "io.grpc:grpc-testing", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit", + "org.hamcrest:hamcrest-library", + "org.testinfected.hamcrest-matchers:core-matchers", + "org.testinfected.hamcrest-matchers:dom-matchers", + "org.testinfected.hamcrest-matchers:jpa-matchers", + "org.testinfected.hamcrest-matchers:spring-matchers", + "org.testinfected.hamcrest-matchers:validation-matchers" + ] + }, + "org.hamcrest:hamcrest-library": { + "locked": "2.2", + "transitive": [ + "org.testinfected.hamcrest-matchers:dom-matchers", + "org.testinfected.hamcrest-matchers:jpa-matchers", + "org.testinfected.hamcrest-matchers:spring-matchers", + "org.testinfected.hamcrest-matchers:validation-matchers" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.testinfected.hamcrest-matchers:spring-matchers" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.testinfected.hamcrest-matchers:all-matchers": { "locked": "1.8" + }, + "org.testinfected.hamcrest-matchers:core-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers", + "org.testinfected.hamcrest-matchers:dom-matchers", + "org.testinfected.hamcrest-matchers:jpa-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:dom-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:jpa-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:spring-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:validation-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "se.fishtank:css-selectors": { + "locked": "1.0.5", + "transitive": [ + "org.testinfected.hamcrest-matchers:dom-matchers" + ] } }, "testRuntimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-core" + ] + }, + "com.google.collections:google-collections": { + "locked": "1.0", + "transitive": [ + "org.testinfected.hamcrest-matchers:jpa-matchers" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "31.0.1-android" + "locked": "31.0.1-android", + "transitive": [ + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.19.2", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.protobuf:protobuf-java-util", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.19.2" + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.protobuf:protobuf-java-util": { + "locked": "3.19.2", + "transitive": [ + "io.grpc:grpc-services" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-grpc" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true @@ -345,138 +1500,646 @@ "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-testing" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-testing" + ] }, "io.grpc:grpc-netty": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "locked": "1.45.1" + "locked": "1.46.0" }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services", + "io.grpc:grpc-testing" + ] }, "io.grpc:grpc-testing": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] + }, + "javax.persistence:persistence-api": { + "locked": "1.0", + "transitive": [ + "org.testinfected.hamcrest-matchers:jpa-matchers" + ] + }, + "javax.validation:validation-api": { + "locked": "2.0.1.Final", + "transitive": [ + "org.testinfected.hamcrest-matchers:validation-matchers" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "io.grpc:grpc-testing", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-grpc", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit", + "org.hamcrest:hamcrest-library", + "org.testinfected.hamcrest-matchers:core-matchers", + "org.testinfected.hamcrest-matchers:dom-matchers", + "org.testinfected.hamcrest-matchers:jpa-matchers", + "org.testinfected.hamcrest-matchers:spring-matchers", + "org.testinfected.hamcrest-matchers:validation-matchers" + ] + }, + "org.hamcrest:hamcrest-library": { + "locked": "2.2", + "transitive": [ + "org.testinfected.hamcrest-matchers:dom-matchers", + "org.testinfected.hamcrest-matchers:jpa-matchers", + "org.testinfected.hamcrest-matchers:spring-matchers", + "org.testinfected.hamcrest-matchers:validation-matchers" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.testinfected.hamcrest-matchers:spring-matchers" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.testinfected.hamcrest-matchers:all-matchers": { "locked": "1.8" + }, + "org.testinfected.hamcrest-matchers:core-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers", + "org.testinfected.hamcrest-matchers:dom-matchers", + "org.testinfected.hamcrest-matchers:jpa-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:dom-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:jpa-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:spring-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.testinfected.hamcrest-matchers:validation-matchers": { + "locked": "1.8", + "transitive": [ + "org.testinfected.hamcrest-matchers:all-matchers" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "se.fishtank:css-selectors": { + "locked": "1.0.5", + "transitive": [ + "org.testinfected.hamcrest-matchers:dom-matchers" + ] } } } \ No newline at end of file diff --git a/grpc/dependencies.lock b/grpc/dependencies.lock index 9041d5de9..67a114063 100644 --- a/grpc/dependencies.lock +++ b/grpc/dependencies.lock @@ -1,30 +1,108 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.protobuf:protobuf-java": { - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "io.grpc:grpc-protobuf" + ] }, "com.netflix.conductor:conductor-common": { "project": true }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" }, "javax.annotation:javax.annotation-api": { "locked": "1.3.2" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -34,102 +112,217 @@ }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "compileProtoPath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.netflix.conductor:conductor-common", + "io.grpc:grpc-protobuf" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" }, "javax.annotation:javax.annotation-api": { "locked": "1.3.2" }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "protobufToolsLocator_grpc": { "io.grpc:protoc-gen-grpc-java": { - "locked": "1.45.1" + "locked": "1.46.0" } }, "protobufToolsLocator_protoc": { @@ -138,335 +331,1591 @@ } }, "runtimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.netflix.conductor:conductor-common", + "io.grpc:grpc-protobuf" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" }, "javax.annotation:javax.annotation-api": { "locked": "1.3.2" }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "testCompileClasspath": { + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.protobuf:protobuf-java": { - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "io.grpc:grpc-protobuf" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-common": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "javax.annotation:javax.annotation-api": { "locked": "1.3.2" }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "testCompileProtoPath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.netflix.conductor:conductor-common", + "io.grpc:grpc-protobuf" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "javax.annotation:javax.annotation-api": { "locked": "1.3.2" }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.netflix.conductor:conductor-common", + "io.grpc:grpc-protobuf" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "javax.annotation:javax.annotation-api": { "locked": "1.3.2" }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/postgres-external-storage/build.gradle b/http-task/build.gradle similarity index 71% rename from postgres-external-storage/build.gradle rename to http-task/build.gradle index c6d02e790..c525897a7 100644 --- a/postgres-external-storage/build.gradle +++ b/http-task/build.gradle @@ -10,20 +10,15 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ - dependencies { implementation project(':conductor-common') implementation project(':conductor-core') compileOnly 'org.springframework.boot:spring-boot-starter' compileOnly 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.postgresql:postgresql' - implementation 'org.springframework.boot:spring-boot-starter-jdbc' - implementation 'org.flywaydb:flyway-core' - implementation "org.springdoc:springdoc-openapi-ui:${revOpenapi}" + implementation "javax.ws.rs:jsr311-api:${revJsr311Api}" testImplementation 'org.springframework.boot:spring-boot-starter-web' - testImplementation "org.testcontainers:postgresql:${revTestContainer}" - - testImplementation project(':conductor-common').sourceSets.test.output -} + testImplementation "org.testcontainers:mockserver:${revTestContainer}" + testImplementation "org.mock-server:mockserver-client-java:${revMockServerClient}" +} \ No newline at end of file diff --git a/http-task/dependencies.lock b/http-task/dependencies.lock new file mode 100644 index 000000000..bbe8a09a1 --- /dev/null +++ b/http-task/dependencies.lock @@ -0,0 +1,2465 @@ +{ + "annotationProcessor": { + "org.springframework.boot:spring-boot-configuration-processor": { + "locked": "2.3.12.RELEASE" + } + }, + "compileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1" + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-web": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + } + }, + "runtimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-io:commons-io": { + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1" + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + } + }, + "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.github.docker-java:docker-java-api", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-core", + "io.swagger:swagger-models", + "org.mock-server:mockserver-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "org.mock-server:mockserver-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.github.java-json-tools:json-patch", + "com.github.java-json-tools:json-schema-core", + "com.networknt:json-schema-validator", + "io.swagger.core.v3:swagger-core", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-core", + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.uuid:java-uuid-generator": { + "locked": "4.0.1", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.java-json-tools:btf": { + "locked": "1.3", + "transitive": [ + "com.github.java-json-tools:msg-simple" + ] + }, + "com.github.java-json-tools:jackson-coreutils": { + "locked": "2.0", + "transitive": [ + "com.github.java-json-tools:json-patch", + "com.github.java-json-tools:json-schema-core" + ] + }, + "com.github.java-json-tools:jackson-coreutils-equivalence": { + "locked": "1.0", + "transitive": [ + "com.github.java-json-tools:json-schema-core", + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.github.java-json-tools:json-patch": { + "locked": "1.13", + "transitive": [ + "io.swagger:swagger-compat-spec-parser" + ] + }, + "com.github.java-json-tools:json-schema-core": { + "locked": "1.2.14", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.github.java-json-tools:json-schema-validator": { + "locked": "2.2.14", + "transitive": [ + "io.swagger:swagger-compat-spec-parser" + ] + }, + "com.github.java-json-tools:msg-simple": { + "locked": "1.2", + "transitive": [ + "com.github.java-json-tools:json-patch", + "com.github.java-json-tools:uri-template" + ] + }, + "com.github.java-json-tools:uri-template": { + "locked": "0.10", + "transitive": [ + "com.github.java-json-tools:json-schema-core" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.github.java-json-tools:btf", + "com.github.java-json-tools:json-schema-core", + "com.github.java-json-tools:json-schema-validator", + "com.github.java-json-tools:msg-simple", + "com.github.java-json-tools:uri-template", + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.7.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "com.github.java-json-tools:json-schema-core", + "com.github.java-json-tools:json-schema-validator", + "com.github.java-json-tools:uri-template", + "io.swagger:swagger-core", + "org.mock-server:mockserver-client-java", + "org.mock-server:mockserver-core" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.googlecode.libphonenumber:libphonenumber": { + "locked": "8.11.1", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.jcraft:jzlib": { + "locked": "1.1.3", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.lmax:disruptor": { + "locked": "3.4.4", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.networknt:json-schema-validator": { + "locked": "1.0.66", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.sun.mail:mailapi": { + "locked": "1.6.2", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.mock-server:mockserver-core" + ] + }, + "commons-io:commons-io": { + "locked": "2.11.0", + "transitive": [ + "io.swagger.parser.v3:swagger-parser", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-parser", + "org.mock-server:mockserver-core" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.138", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-transport", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.1.13", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.1.13", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v3" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.1.13", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "io.swagger.parser.v3:swagger-parser-core", + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger.parser.v3:swagger-parser-v3" + ] + }, + "io.swagger.parser.v3:swagger-parser": { + "locked": "2.0.30", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "io.swagger.parser.v3:swagger-parser-core": { + "locked": "2.0.30", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger.parser.v3:swagger-parser-v3" + ] + }, + "io.swagger.parser.v3:swagger-parser-v2-converter": { + "locked": "2.0.30", + "transitive": [ + "io.swagger.parser.v3:swagger-parser" + ] + }, + "io.swagger.parser.v3:swagger-parser-v3": { + "locked": "2.0.30", + "transitive": [ + "io.swagger.parser.v3:swagger-parser", + "io.swagger.parser.v3:swagger-parser-v2-converter" + ] + }, + "io.swagger:swagger-annotations": { + "locked": "1.6.5", + "transitive": [ + "io.swagger:swagger-models" + ] + }, + "io.swagger:swagger-compat-spec-parser": { + "locked": "1.0.57", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter" + ] + }, + "io.swagger:swagger-core": { + "locked": "1.6.5", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger:swagger-compat-spec-parser", + "io.swagger:swagger-parser" + ] + }, + "io.swagger:swagger-models": { + "locked": "1.6.5", + "transitive": [ + "io.swagger:swagger-core" + ] + }, + "io.swagger:swagger-parser": { + "locked": "1.0.57", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger:swagger-compat-spec-parser" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.servlet:javax.servlet-api": { + "locked": "4.0.1", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1" + }, + "joda-time:joda-time": { + "locked": "2.10.5", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.javacrumbs.json-unit:json-unit-core": { + "locked": "2.31.0", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.4", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.networknt:json-schema-validator", + "io.swagger.core.v3:swagger-core", + "io.swagger:swagger-core", + "org.apache.velocity:velocity-engine-core", + "org.mock-server:mockserver-client-java", + "org.mock-server:mockserver-core" + ] + }, + "org.apache.commons:commons-text": { + "locked": "1.9", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "io.swagger:swagger-compat-spec-parser" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.velocity:velocity-engine-core": { + "locked": "2.3", + "transitive": [ + "org.apache.velocity:velocity-engine-scripting", + "org.mock-server:mockserver-core" + ] + }, + "org.apache.velocity:velocity-engine-scripting": { + "locked": "2.3", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit", + "net.javacrumbs.json-unit:json-unit-core" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mock-server:mockserver-client-java": { + "locked": "5.12.0" + }, + "org.mock-server:mockserver-core": { + "locked": "5.12.0", + "transitive": [ + "org.mock-server:mockserver-client-java" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mozilla:rhino": { + "locked": "1.7.7.2", + "transitive": [ + "com.github.java-json-tools:json-schema-core" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.fasterxml.uuid:java-uuid-generator", + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "com.networknt:json-schema-validator", + "io.swagger.core.v3:swagger-core", + "io.swagger:swagger-core", + "io.swagger:swagger-models", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.velocity:velocity-engine-core", + "org.mock-server:mockserver-client-java", + "org.mock-server:mockserver-core", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-web": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.testcontainers:mockserver": { + "locked": "1.15.3" + }, + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:mockserver" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-test", + "org.xmlunit:xmlunit-placeholders" + ] + }, + "org.xmlunit:xmlunit-placeholders": { + "locked": "2.7.0", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] + } + }, + "testRuntimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.github.docker-java:docker-java-api", + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-core", + "io.swagger:swagger-models", + "org.mock-server:mockserver-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.mock-server:mockserver-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.github.java-json-tools:jackson-coreutils", + "com.github.java-json-tools:jackson-coreutils-equivalence", + "com.github.java-json-tools:json-patch", + "com.github.java-json-tools:json-schema-core", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "com.networknt:json-schema-validator", + "io.swagger.core.v3:swagger-core", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-core", + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.uuid:java-uuid-generator": { + "locked": "4.0.1", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.java-json-tools:btf": { + "locked": "1.3", + "transitive": [ + "com.github.java-json-tools:msg-simple" + ] + }, + "com.github.java-json-tools:jackson-coreutils": { + "locked": "2.0", + "transitive": [ + "com.github.java-json-tools:jackson-coreutils-equivalence", + "com.github.java-json-tools:json-patch", + "com.github.java-json-tools:json-schema-core" + ] + }, + "com.github.java-json-tools:jackson-coreutils-equivalence": { + "locked": "1.0", + "transitive": [ + "com.github.java-json-tools:json-schema-core", + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.github.java-json-tools:json-patch": { + "locked": "1.13", + "transitive": [ + "io.swagger:swagger-compat-spec-parser" + ] + }, + "com.github.java-json-tools:json-schema-core": { + "locked": "1.2.14", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.github.java-json-tools:json-schema-validator": { + "locked": "2.2.14", + "transitive": [ + "io.swagger:swagger-compat-spec-parser" + ] + }, + "com.github.java-json-tools:msg-simple": { + "locked": "1.2", + "transitive": [ + "com.github.java-json-tools:jackson-coreutils", + "com.github.java-json-tools:json-patch", + "com.github.java-json-tools:uri-template" + ] + }, + "com.github.java-json-tools:uri-template": { + "locked": "0.10", + "transitive": [ + "com.github.java-json-tools:json-schema-core" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.github.java-json-tools:btf", + "com.github.java-json-tools:jackson-coreutils", + "com.github.java-json-tools:json-schema-core", + "com.github.java-json-tools:json-schema-validator", + "com.github.java-json-tools:msg-simple", + "com.github.java-json-tools:uri-template", + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.7.1", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "com.github.java-json-tools:jackson-coreutils-equivalence", + "com.github.java-json-tools:json-schema-core", + "com.github.java-json-tools:json-schema-validator", + "com.github.java-json-tools:uri-template", + "io.swagger:swagger-core", + "org.mock-server:mockserver-client-java", + "org.mock-server:mockserver-core" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.googlecode.libphonenumber:libphonenumber": { + "locked": "8.11.1", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.jcraft:jzlib": { + "locked": "1.1.3", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.lmax:disruptor": { + "locked": "3.4.4", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.networknt:json-schema-validator": { + "locked": "1.0.66", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.sun.activation:jakarta.activation": { + "locked": "1.2.2", + "transitive": [ + "com.sun.xml.bind:jaxb-core" + ] + }, + "com.sun.mail:mailapi": { + "locked": "1.6.2", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "com.sun.xml.bind:jaxb-core": { + "locked": "3.0.2", + "transitive": [ + "com.sun.xml.bind:jaxb-impl" + ] + }, + "com.sun.xml.bind:jaxb-impl": { + "locked": "3.0.2", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.mock-server:mockserver-core" + ] + }, + "commons-io:commons-io": { + "locked": "2.11.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "io.swagger.parser.v3:swagger-parser", + "io.swagger.parser.v3:swagger-parser-v3", + "io.swagger:swagger-parser", + "org.mock-server:mockserver-core" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.138", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-transport", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http", + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-http", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "org.mock-server:mockserver-core" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.1.13", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.1.13", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v3" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.1.13", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "io.swagger.parser.v3:swagger-parser-core", + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger.parser.v3:swagger-parser-v3" + ] + }, + "io.swagger.parser.v3:swagger-parser": { + "locked": "2.0.30", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "io.swagger.parser.v3:swagger-parser-core": { + "locked": "2.0.30", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger.parser.v3:swagger-parser-v3" + ] + }, + "io.swagger.parser.v3:swagger-parser-v2-converter": { + "locked": "2.0.30", + "transitive": [ + "io.swagger.parser.v3:swagger-parser" + ] + }, + "io.swagger.parser.v3:swagger-parser-v3": { + "locked": "2.0.30", + "transitive": [ + "io.swagger.parser.v3:swagger-parser", + "io.swagger.parser.v3:swagger-parser-v2-converter" + ] + }, + "io.swagger:swagger-annotations": { + "locked": "1.6.5", + "transitive": [ + "io.swagger:swagger-models" + ] + }, + "io.swagger:swagger-compat-spec-parser": { + "locked": "1.0.57", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter" + ] + }, + "io.swagger:swagger-core": { + "locked": "1.6.5", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger:swagger-compat-spec-parser", + "io.swagger:swagger-parser" + ] + }, + "io.swagger:swagger-models": { + "locked": "1.6.5", + "transitive": [ + "io.swagger:swagger-core" + ] + }, + "io.swagger:swagger-parser": { + "locked": "1.0.57", + "transitive": [ + "io.swagger.parser.v3:swagger-parser-v2-converter", + "io.swagger:swagger-compat-spec-parser" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "com.sun.xml.bind:jaxb-core", + "io.swagger.core.v3:swagger-core", + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.servlet:javax.servlet-api": { + "locked": "4.0.1", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1" + }, + "joda-time:joda-time": { + "locked": "2.10.5", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.javacrumbs.json-unit:json-unit-core": { + "locked": "2.31.0", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.4", + "transitive": [ + "com.github.java-json-tools:json-schema-validator" + ] + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "com.networknt:json-schema-validator", + "io.swagger.core.v3:swagger-core", + "io.swagger:swagger-core", + "org.apache.velocity:velocity-engine-core", + "org.mock-server:mockserver-client-java", + "org.mock-server:mockserver-core" + ] + }, + "org.apache.commons:commons-text": { + "locked": "1.9", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "io.swagger:swagger-compat-spec-parser" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.velocity:velocity-engine-core": { + "locked": "2.3", + "transitive": [ + "org.apache.velocity:velocity-engine-scripting", + "org.mock-server:mockserver-core" + ] + }, + "org.apache.velocity:velocity-engine-scripting": { + "locked": "2.3", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit", + "net.javacrumbs.json-unit:json-unit-core" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mock-server:mockserver-client-java": { + "locked": "5.12.0" + }, + "org.mock-server:mockserver-core": { + "locked": "5.12.0", + "transitive": [ + "org.mock-server:mockserver-client-java" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mozilla:rhino": { + "locked": "1.7.7.2", + "transitive": [ + "com.github.java-json-tools:json-schema-core" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.fasterxml.uuid:java-uuid-generator", + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "com.networknt:json-schema-validator", + "io.swagger.core.v3:swagger-core", + "io.swagger:swagger-core", + "io.swagger:swagger-models", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.velocity:velocity-engine-core", + "org.mock-server:mockserver-client-java", + "org.mock-server:mockserver-core", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-web": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.testcontainers:mockserver": { + "locked": "1.15.3" + }, + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:mockserver" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.mock-server:mockserver-core", + "org.springframework.boot:spring-boot-starter-test", + "org.xmlunit:xmlunit-placeholders" + ] + }, + "org.xmlunit:xmlunit-placeholders": { + "locked": "2.7.0", + "transitive": [ + "org.mock-server:mockserver-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] + } + } +} \ No newline at end of file diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/HttpTask.java b/http-task/src/main/java/com/netflix/conductor/tasks/http/HttpTask.java similarity index 89% rename from contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/HttpTask.java rename to http-task/src/main/java/com/netflix/conductor/tasks/http/HttpTask.java index f0f42eaf4..6c69554a7 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/HttpTask.java +++ b/http-task/src/main/java/com/netflix/conductor/tasks/http/HttpTask.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.tasks.http; +package com.netflix.conductor.tasks.http; import java.io.IOException; import java.util.Collections; @@ -32,6 +32,7 @@ import com.netflix.conductor.core.utils.Utils; import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; +import com.netflix.conductor.tasks.http.providers.RestTemplateProvider; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; @@ -154,7 +155,12 @@ protected HttpResponse httpCall(Input input) throws Exception { headers.setContentType(MediaType.valueOf(input.getContentType())); headers.setAccept(Collections.singletonList(MediaType.valueOf(input.getAccept()))); - input.headers.forEach((key, value) -> headers.add(key, value.toString())); + input.headers.forEach( + (key, value) -> { + if (value != null) { + headers.add(key, value.toString()); + } + }); HttpEntity request = new HttpEntity<>(input.getBody(), headers); @@ -258,72 +264,100 @@ public static class Input { private Integer connectionTimeOut; private Integer readTimeOut; - /** @return the method */ + /** + * @return the method + */ public HttpMethod getMethod() { return method; } - /** @param method the method to set */ + /** + * @param method the method to set + */ public void setMethod(String method) { this.method = HttpMethod.valueOf(method); } - /** @return the headers */ + /** + * @return the headers + */ public Map getHeaders() { return headers; } - /** @param headers the headers to set */ + /** + * @param headers the headers to set + */ public void setHeaders(Map headers) { this.headers = headers; } - /** @return the body */ + /** + * @return the body + */ public Object getBody() { return body; } - /** @param body the body to set */ + /** + * @param body the body to set + */ public void setBody(Object body) { this.body = body; } - /** @return the uri */ + /** + * @return the uri + */ public String getUri() { return uri; } - /** @param uri the uri to set */ + /** + * @param uri the uri to set + */ public void setUri(String uri) { this.uri = uri; } - /** @return the vipAddress */ + /** + * @return the vipAddress + */ public String getVipAddress() { return vipAddress; } - /** @param vipAddress the vipAddress to set */ + /** + * @param vipAddress the vipAddress to set + */ public void setVipAddress(String vipAddress) { this.vipAddress = vipAddress; } - /** @return the accept */ + /** + * @return the accept + */ public String getAccept() { return accept; } - /** @param accept the accept to set */ + /** + * @param accept the accept to set + */ public void setAccept(String accept) { this.accept = accept; } - /** @return the MIME content type to use for the request */ + /** + * @return the MIME content type to use for the request + */ public String getContentType() { return contentType; } - /** @param contentType the MIME content type to set */ + /** + * @param contentType the MIME content type to set + */ public void setContentType(String contentType) { this.contentType = contentType; } @@ -336,12 +370,16 @@ public void setAppName(String appName) { this.appName = appName; } - /** @return the connectionTimeOut */ + /** + * @return the connectionTimeOut + */ public Integer getConnectionTimeOut() { return connectionTimeOut; } - /** @return the readTimeOut */ + /** + * @return the readTimeOut + */ public Integer getReadTimeOut() { return readTimeOut; } diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/DefaultRestTemplateProvider.java b/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProvider.java similarity index 91% rename from contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/DefaultRestTemplateProvider.java rename to http-task/src/main/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProvider.java index 670f26063..d460e36f6 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/DefaultRestTemplateProvider.java +++ b/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProvider.java @@ -10,21 +10,20 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.tasks.http; +package com.netflix.conductor.tasks.http.providers; import java.time.Duration; import java.util.Optional; -import javax.annotation.Nonnull; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; -import com.netflix.conductor.contribs.tasks.http.HttpTask.Input; +import com.netflix.conductor.tasks.http.HttpTask; /** * Provider for a customized RestTemplateBuilder. This class provides a default {@link @@ -48,7 +47,7 @@ public DefaultRestTemplateProvider( } @Override - public @Nonnull RestTemplate getRestTemplate(@Nonnull Input input) { + public @NonNull RestTemplate getRestTemplate(@NonNull HttpTask.Input input) { RestTemplate restTemplate = threadLocalRestTemplate.get(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/RestTemplateProvider.java b/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/RestTemplateProvider.java similarity index 77% rename from contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/RestTemplateProvider.java rename to http-task/src/main/java/com/netflix/conductor/tasks/http/providers/RestTemplateProvider.java index 95c648b07..968904d2e 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/http/RestTemplateProvider.java +++ b/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/RestTemplateProvider.java @@ -10,14 +10,15 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.tasks.http; - -import javax.annotation.Nonnull; +package com.netflix.conductor.tasks.http.providers; +import org.springframework.lang.NonNull; import org.springframework.web.client.RestTemplate; +import com.netflix.conductor.tasks.http.HttpTask; + @FunctionalInterface public interface RestTemplateProvider { - RestTemplate getRestTemplate(@Nonnull HttpTask.Input input); + RestTemplate getRestTemplate(@NonNull HttpTask.Input input); } diff --git a/http-task/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/http-task/src/main/resources/META-INF/additional-spring-configuration-metadata.json new file mode 100644 index 000000000..17c071f9a --- /dev/null +++ b/http-task/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -0,0 +1,14 @@ +{ + "properties": [ + { + "name": "conductor.tasks.http.readTimeout", + "type": "java.lang.Integer", + "description": "The read timeout of the underlying HttpClient used by the HTTP task." + }, + { + "name": "conductor.tasks.http.connectTimeout", + "type": "java.lang.Integer", + "description": "The connection timeout of the underlying HttpClient used by the HTTP task." + } + ] +} diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/http/HttpTaskTest.java b/http-task/src/test/java/com/netflix/conductor/tasks/http/HttpTaskTest.java similarity index 91% rename from contribs/src/test/java/com/netflix/conductor/contribs/tasks/http/HttpTaskTest.java rename to http-task/src/test/java/com/netflix/conductor/tasks/http/HttpTaskTest.java index 065b49235..f82662556 100644 --- a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/http/HttpTaskTest.java +++ b/http-task/src/test/java/com/netflix/conductor/tasks/http/HttpTaskTest.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.tasks.http; +package com.netflix.conductor.tasks.http; import java.time.Duration; import java.time.Instant; @@ -19,8 +19,13 @@ import java.util.Map; import java.util.Set; -import org.junit.*; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Test; import org.mockserver.client.MockServerClient; +import org.mockserver.model.HttpRequest; +import org.mockserver.model.HttpResponse; import org.mockserver.model.MediaType; import org.testcontainers.containers.MockServerContainer; import org.testcontainers.utility.DockerImageName; @@ -32,10 +37,12 @@ import com.netflix.conductor.core.execution.WorkflowExecutor; import com.netflix.conductor.core.execution.tasks.SystemTaskRegistry; import com.netflix.conductor.core.utils.ExternalPayloadStorageUtils; +import com.netflix.conductor.core.utils.IDGenerator; import com.netflix.conductor.core.utils.ParametersUtils; import com.netflix.conductor.dao.MetadataDAO; import com.netflix.conductor.model.TaskModel; import com.netflix.conductor.model.WorkflowModel; +import com.netflix.conductor.tasks.http.providers.DefaultRestTemplateProvider; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @@ -43,11 +50,8 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.mock; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; @SuppressWarnings("unchecked") -// @Ignore // Test causes "OutOfMemoryError" error during build public class HttpTaskTest { private static final String ERROR_RESPONSE = "Something went wrong!"; @@ -63,7 +67,8 @@ public class HttpTaskTest { @ClassRule public static MockServerContainer mockServer = - new MockServerContainer(DockerImageName.parse("mockserver/mockserver")); + new MockServerContainer( + DockerImageName.parse("mockserver/mockserver").withTag("mockserver-5.12.0")); @BeforeClass public static void init() throws Exception { @@ -76,7 +81,7 @@ public static void init() throws Exception { final TypeReference> mapOfObj = new TypeReference<>() {}; MockServerClient client = new MockServerClient(mockServer.getHost(), mockServer.getServerPort()); - client.when(request().withPath("/post").withMethod("POST")) + client.when(HttpRequest.request().withPath("/post").withMethod("POST")) .respond( request -> { Map reqBody = @@ -84,25 +89,25 @@ public static void init() throws Exception { Set keys = reqBody.keySet(); Map respBody = new HashMap<>(); keys.forEach(k -> respBody.put(k, k)); - return response() + return HttpResponse.response() .withContentType(MediaType.APPLICATION_JSON) .withBody(objectMapper.writeValueAsString(respBody)); }); - client.when(request().withPath("/post2").withMethod("POST")) - .respond(response().withStatusCode(204)); - client.when(request().withPath("/failure").withMethod("GET")) + client.when(HttpRequest.request().withPath("/post2").withMethod("POST")) + .respond(HttpResponse.response().withStatusCode(204)); + client.when(HttpRequest.request().withPath("/failure").withMethod("GET")) .respond( - response() + HttpResponse.response() .withStatusCode(500) .withContentType(MediaType.TEXT_PLAIN) .withBody(ERROR_RESPONSE)); - client.when(request().withPath("/text").withMethod("GET")) - .respond(response().withBody(TEXT_RESPONSE)); - client.when(request().withPath("/numeric").withMethod("GET")) - .respond(response().withBody(String.valueOf(NUM_RESPONSE))); - client.when(request().withPath("/json").withMethod("GET")) + client.when(HttpRequest.request().withPath("/text").withMethod("GET")) + .respond(HttpResponse.response().withBody(TEXT_RESPONSE)); + client.when(HttpRequest.request().withPath("/numeric").withMethod("GET")) + .respond(HttpResponse.response().withBody(String.valueOf(NUM_RESPONSE))); + client.when(HttpRequest.request().withPath("/json").withMethod("GET")) .respond( - response() + HttpResponse.response() .withContentType(MediaType.APPLICATION_JSON) .withBody(JSON_RESPONSE)); } @@ -356,6 +361,7 @@ public void testOptional() { SystemTaskRegistry systemTaskRegistry = mock(SystemTaskRegistry.class); new DeciderService( + new IDGenerator(), parametersUtils, metadataDAO, externalPayloadStorageUtils, diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/http/DefaultRestTemplateProviderTest.java b/http-task/src/test/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProviderTest.java similarity index 92% rename from contribs/src/test/java/com/netflix/conductor/contribs/tasks/http/DefaultRestTemplateProviderTest.java rename to http-task/src/test/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProviderTest.java index 31e5ef2d4..816f5d6f9 100644 --- a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/http/DefaultRestTemplateProviderTest.java +++ b/http-task/src/test/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProviderTest.java @@ -10,16 +10,16 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.tasks.http; +package com.netflix.conductor.tasks.http.providers; import java.time.Duration; import org.junit.Test; import org.springframework.web.client.RestTemplate; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertSame; +import com.netflix.conductor.tasks.http.HttpTask; + +import static org.junit.Assert.*; public class DefaultRestTemplateProviderTest { diff --git a/java-sdk/dependencies.lock b/java-sdk/dependencies.lock index d4ca3a65a..c2119c67e 100644 --- a/java-sdk/dependencies.lock +++ b/java-sdk/dependencies.lock @@ -1,19 +1,61 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { "cglib:cglib": { "locked": "3.3.0" }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" + "locked": "2.11.4" + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { "locked": "30.0-jre" }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.netflix.conductor:conductor-client": { "project": true }, @@ -23,11 +65,32 @@ "com.sun.jersey:jersey-client": { "locked": "1.19.4" }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.sun.jersey:jersey-client" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.sun.jersey:jersey-core" + ] + }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -37,172 +100,543 @@ }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.ow2.asm:asm": { + "locked": "7.1", + "transitive": [ + "cglib:cglib" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "runtimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "cglib:cglib": { "locked": "3.3.0" }, "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ + "locked": "1.11.86", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" + ] + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "30.0-jre" + "locked": "30.0-jre", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-client": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "project": true + ] }, "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ + "locked": "1.10.10", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.conductor:conductor-client", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.4.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.ow2.asm:asm": { + "locked": "7.1", + "transitive": [ + "cglib:cglib" + ] }, "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-client", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } }, "testCompileClasspath": { "cglib:cglib": { "locked": "3.3.0" }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" + "locked": "2.11.4" + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { "locked": "30.0-jre" }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-client": { "project": true }, @@ -212,216 +646,1623 @@ "com.sun.jersey:jersey-client": { "locked": "1.19.4" }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.sun.jersey:jersey-core" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "7.1", + "transitive": [ + "cglib:cglib", + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework:spring-web": { - "locked": "5.3.18" + "locked": "5.2.15.RELEASE" + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "cglib:cglib": { "locked": "3.3.0" }, "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ + "locked": "1.11.86", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" + ] + }, + "com.beust:jcommander": { + "locked": "1.72", + "transitive": [ + "org.testng:testng" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.13.2.2" + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-common", + "com.netflix.eureka:eureka-client" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" + ] + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "30.0-jre" + "locked": "30.0-jre", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "3.13.0" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-client": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "project": true + ] }, "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ + "locked": "1.10.10", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.conductor:conductor-client", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.thoughtworks.xstream:xstream": { + "locked": "1.4.13", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "joda-time:joda-time": { + "locked": "2.8.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.netflix-commons:netflix-infix" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant-junit", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-antlr": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-junit": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant", + "org.codehaus.groovy:groovy-ant" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-common", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovydoc" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.4.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "7.1", + "transitive": [ + "cglib:cglib", + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.7.36" + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-client", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework:spring-web": { - "locked": "5.3.18" + "locked": "5.2.15.RELEASE" + }, + "org.testng:testng": { + "locked": "6.13.1", + "transitive": [ + "org.codehaus.groovy:groovy-testng" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "xpp3:xpp3_min": { + "locked": "1.1.4c", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] } } } \ No newline at end of file diff --git a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/ConductorWorkflow.java b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/ConductorWorkflow.java index 61f346e4c..009aa517a 100644 --- a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/ConductorWorkflow.java +++ b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/ConductorWorkflow.java @@ -30,7 +30,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -/** @param Type of the workflow input */ +/** + * @param Type of the workflow input + */ public class ConductorWorkflow { public static final InputOutputGetter input = @@ -235,7 +237,9 @@ public boolean registerWorkflow(boolean overwrite, boolean registerTasks) { return workflowExecutor.registerWorkflow(workflowDef, overwrite); } - /** @return Convert to the WorkflowDef model used by the Metadata APIs */ + /** + * @return Convert to the WorkflowDef model used by the Metadata APIs + */ public WorkflowDef toWorkflowDef() { WorkflowDef def = new WorkflowDef(); diff --git a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/WorkflowBuilder.java b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/WorkflowBuilder.java index 30d117b06..caf33d8cf 100644 --- a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/WorkflowBuilder.java +++ b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/WorkflowBuilder.java @@ -24,7 +24,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; -/** @param Input type for the workflow */ +/** + * @param Input type for the workflow + */ public class WorkflowBuilder { private String name; diff --git a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Http.java b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Http.java index 0b19b8115..b1685d395 100644 --- a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Http.java +++ b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Http.java @@ -114,72 +114,100 @@ public enum HttpMethod { private Integer connectionTimeOut; private Integer readTimeOut; - /** @return the method */ + /** + * @return the method + */ public HttpMethod getMethod() { return method; } - /** @param method the method to set */ + /** + * @param method the method to set + */ public void setMethod(HttpMethod method) { this.method = method; } - /** @return the headers */ + /** + * @return the headers + */ public Map getHeaders() { return headers; } - /** @param headers the headers to set */ + /** + * @param headers the headers to set + */ public void setHeaders(Map headers) { this.headers = headers; } - /** @return the body */ + /** + * @return the body + */ public Object getBody() { return body; } - /** @param body the body to set */ + /** + * @param body the body to set + */ public void setBody(Object body) { this.body = body; } - /** @return the uri */ + /** + * @return the uri + */ public String getUri() { return uri; } - /** @param uri the uri to set */ + /** + * @param uri the uri to set + */ public void setUri(String uri) { this.uri = uri; } - /** @return the vipAddress */ + /** + * @return the vipAddress + */ public String getVipAddress() { return vipAddress; } - /** @param vipAddress the vipAddress to set */ + /** + * @param vipAddress the vipAddress to set + */ public void setVipAddress(String vipAddress) { this.vipAddress = vipAddress; } - /** @return the accept */ + /** + * @return the accept + */ public String getAccept() { return accept; } - /** @param accept the accept to set */ + /** + * @param accept the accept to set + */ public void setAccept(String accept) { this.accept = accept; } - /** @return the MIME content type to use for the request */ + /** + * @return the MIME content type to use for the request + */ public String getContentType() { return contentType; } - /** @param contentType the MIME content type to set */ + /** + * @param contentType the MIME content type to set + */ public void setContentType(String contentType) { this.contentType = contentType; } @@ -192,12 +220,16 @@ public void setAppName(String appName) { this.appName = appName; } - /** @return the connectionTimeOut */ + /** + * @return the connectionTimeOut + */ public Integer getConnectionTimeOut() { return connectionTimeOut; } - /** @return the readTimeOut */ + /** + * @return the readTimeOut + */ public Integer getReadTimeOut() { return readTimeOut; } diff --git a/java-sdk/testing_framework.md b/java-sdk/testing_framework.md index 7ccc24ff2..18f950cc2 100644 --- a/java-sdk/testing_framework.md +++ b/java-sdk/testing_framework.md @@ -29,7 +29,7 @@ testRunner = new WorkflowTestRunner(8096, "3.5.2"); //Scan the packages for task workers testRunner.init("com.netflix.conductor.testing.workflows"); -//Get the executor instance used for loading workflwos +//Get the executor instance used for loading workflows executor = testRunner.getWorkflowExecutor(); ``` diff --git a/java-sdk/worker_sdk.md b/java-sdk/worker_sdk.md index 15901ae22..c0dac6cc3 100644 --- a/java-sdk/worker_sdk.md +++ b/java-sdk/worker_sdk.md @@ -74,12 +74,12 @@ Output: ``` ## Managing Task Workers -Annotated Workers are managed by [WorkflowExecutor](src/main/java/com/netflix/conductor/sdk/workflow/executor/WorkflowExecutor.java) +Annotated Workers are managed by [WorkflowExecutor](https://github.com/netflix/conductor/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/executor/WorkflowExecutor.java) ### Start Workers ```java WorkflowExecutor executor = new WorkflowExecutor("http://server/api/"); -//List of packages (comma separated) to scan for annonated workers. +//List of packages (comma separated) to scan for annotated workers. // Please note,the worker method MUST be public and the class in which they are defined //MUST have a no-args constructor executor.initWorkers("com.company.package1,com.company.package2"); @@ -95,7 +95,7 @@ executor.shutdown(); Workers implemented with the annotations are regular Java methods can be united tested with any testing framework. #### Mock workers for workflow testing -Create a mock worker in a different pacakge (e.g. test) and scan for these packages when loading up the workers for integration testing. +Create a mock worker in a different package (e.g. test) and scan for these packages when loading up the workers for integration testing. See [Unit Testing Framework](testing_framework.md) for more details on testing. diff --git a/java-sdk/workflow_sdk.md b/java-sdk/workflow_sdk.md index 4331d7e63..ec946446b 100644 --- a/java-sdk/workflow_sdk.md +++ b/java-sdk/workflow_sdk.md @@ -3,7 +3,7 @@ Workflow SDK provides fluent API to create workflows with strongly typed interfa ## APIs ### ConductorWorkflow -[ConductorWorkflow](src/main/java/com/netflix/conductor/sdk/workflow/def/ConductorWorkflow.java) is the SDK representation of a Conductor workflow. +[ConductorWorkflow](https://github.com/Netflix/conductor/blob/main/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/ConductorWorkflow.java) is the SDK representation of a Conductor workflow. #### Create a `ConductorWorkflow` instance ```java @@ -18,7 +18,7 @@ ConductorWorkflow conductorWorkflow = new WorkflowBuilder + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +dependencies { + implementation project(':conductor-common') + implementation project(':conductor-core') + compileOnly 'org.springframework.boot:spring-boot-starter' + + implementation "net.thisptr:jackson-jq:${revJq}" + implementation "com.github.ben-manes.caffeine:caffeine" +} diff --git a/json-jq-task/dependencies.lock b/json-jq-task/dependencies.lock new file mode 100644 index 000000000..a22fcc57b --- /dev/null +++ b/json-jq-task/dependencies.lock @@ -0,0 +1,1240 @@ +{ + "annotationProcessor": { + "org.springframework.boot:spring-boot-configuration-processor": { + "locked": "2.3.12.RELEASE" + } + }, + "compileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8" + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "net.thisptr:jackson-jq": { + "locked": "0.0.13" + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1" + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + } + }, + "runtimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "net.thisptr:jackson-jq" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "commons-io:commons-io": { + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.thisptr:jackson-jq": { + "locked": "0.0.13" + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl" + ] + } + }, + "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8" + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.thisptr:jackson-jq": { + "locked": "0.0.13" + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1" + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + } + }, + "testRuntimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "net.thisptr:jackson-jq" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.13.0", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.conductor:conductor-annotations": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-common" + ] + }, + "com.netflix.conductor:conductor-common": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.netflix.conductor:conductor-core": { + "project": true + }, + "com.netflix.spectator:spectator-api": { + "locked": "0.122.0", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.spotify:completable-futures": { + "locked": "0.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-io:commons-io": { + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "io.reactivex:rxjava": { + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "junit:junit": { + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.thisptr:jackson-jq": { + "locked": "0.0.13" + }, + "org.apache.bval:bval-jsr": { + "locked": "2.0.5", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apache.logging.log4j:log4j-api": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] + }, + "org.apache.logging.log4j:log4j-core": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-jul": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] + }, + "org.apache.logging.log4j:log4j-web": { + "locked": "2.17.1", + "transitive": [ + "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.boot:spring-boot-starter-log4j2": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-test": { + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + } + } +} \ No newline at end of file diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/json/JsonJqTransform.java b/json-jq-task/src/main/java/com/netflix/conductor/tasks/json/JsonJqTransform.java similarity index 88% rename from contribs/src/main/java/com/netflix/conductor/contribs/tasks/json/JsonJqTransform.java rename to json-jq-task/src/main/java/com/netflix/conductor/tasks/json/JsonJqTransform.java index 78d47afd6..ed49c40d2 100644 --- a/contribs/src/main/java/com/netflix/conductor/contribs/tasks/json/JsonJqTransform.java +++ b/json-jq-task/src/main/java/com/netflix/conductor/tasks/json/JsonJqTransform.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.tasks.json; +package com.netflix.conductor.tasks.json; import java.util.ArrayList; import java.util.List; @@ -29,12 +29,11 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; +import com.github.benmanes.caffeine.cache.CacheLoader; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; import net.thisptr.jackson.jq.JsonQuery; import net.thisptr.jackson.jq.Scope; -import net.thisptr.jackson.jq.exception.JsonQueryException; @Component(JsonJqTransform.NAME) public class JsonJqTransform extends WorkflowSystemTask { @@ -103,14 +102,8 @@ public void start(WorkflowModel workflow, TaskModel task, WorkflowExecutor execu } private LoadingCache createQueryCache() { - final CacheLoader loader = - new CacheLoader<>() { - @Override - public JsonQuery load(String query) throws JsonQueryException { - return JsonQuery.compile(query); - } - }; - return CacheBuilder.newBuilder() + final CacheLoader loader = JsonQuery::compile; + return Caffeine.newBuilder() .expireAfterWrite(1, TimeUnit.HOURS) .maximumSize(1000) .build(loader); diff --git a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/json/JsonJqTransformTest.java b/json-jq-task/src/test/java/com/netflix/conductor/tasks/json/JsonJqTransformTest.java similarity index 95% rename from contribs/src/test/java/com/netflix/conductor/contribs/tasks/json/JsonJqTransformTest.java rename to json-jq-task/src/test/java/com/netflix/conductor/tasks/json/JsonJqTransformTest.java index 553130ab8..78db2cca2 100644 --- a/contribs/src/test/java/com/netflix/conductor/contribs/tasks/json/JsonJqTransformTest.java +++ b/json-jq-task/src/test/java/com/netflix/conductor/tasks/json/JsonJqTransformTest.java @@ -10,7 +10,7 @@ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ -package com.netflix.conductor.contribs.tasks.json; +package com.netflix.conductor.tasks.json; import java.util.Collections; import java.util.HashMap; @@ -24,9 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; public class JsonJqTransformTest { diff --git a/mysql-persistence/dependencies.lock b/mysql-persistence/dependencies.lock deleted file mode 100644 index f9976042b..000000000 --- a/mysql-persistence/dependencies.lock +++ /dev/null @@ -1,444 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "mysql:mysql-connector-java": { - "locked": "8.0.28" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "mysql:mysql-connector-java": { - "locked": "8.0.28" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "locked": "8.0.28" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "locked": "8.0.28" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/config/MySQLConfiguration.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/config/MySQLConfiguration.java deleted file mode 100644 index d0ec10820..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/config/MySQLConfiguration.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.config; - -import javax.sql.DataSource; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Import; - -import com.netflix.conductor.mysql.dao.MySQLExecutionDAO; -import com.netflix.conductor.mysql.dao.MySQLMetadataDAO; -import com.netflix.conductor.mysql.dao.MySQLQueueDAO; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(MySQLProperties.class) -@ConditionalOnProperty(name = "conductor.db.type", havingValue = "mysql") -// Import the DataSourceAutoConfiguration when mysql database is selected. -// By default the datasource configuration is excluded in the main module. -@Import(DataSourceAutoConfiguration.class) -public class MySQLConfiguration { - - @Bean - @DependsOn({"flyway", "flywayInitializer"}) - public MySQLMetadataDAO mySqlMetadataDAO( - ObjectMapper objectMapper, DataSource dataSource, MySQLProperties properties) { - return new MySQLMetadataDAO(objectMapper, dataSource, properties); - } - - @Bean - @DependsOn({"flyway", "flywayInitializer"}) - public MySQLExecutionDAO mySqlExecutionDAO(ObjectMapper objectMapper, DataSource dataSource) { - return new MySQLExecutionDAO(objectMapper, dataSource); - } - - @Bean - @DependsOn({"flyway", "flywayInitializer"}) - public MySQLQueueDAO mySqlQueueDAO(ObjectMapper objectMapper, DataSource dataSource) { - return new MySQLQueueDAO(objectMapper, dataSource); - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/config/MySQLProperties.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/config/MySQLProperties.java deleted file mode 100644 index dfef0eb78..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/config/MySQLProperties.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.config; - -import java.time.Duration; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties("conductor.mysql") -public class MySQLProperties { - - /** The time (in seconds) after which the in-memory task definitions cache will be refreshed */ - private Duration taskDefCacheRefreshInterval = Duration.ofSeconds(60); - - public Duration getTaskDefCacheRefreshInterval() { - return taskDefCacheRefreshInterval; - } - - public void setTaskDefCacheRefreshInterval(Duration taskDefCacheRefreshInterval) { - this.taskDefCacheRefreshInterval = taskDefCacheRefreshInterval; - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLBaseDAO.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLBaseDAO.java deleted file mode 100644 index 7302e61b5..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLBaseDAO.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.dao; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.SQLException; -import java.time.Duration; -import java.time.Instant; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; - -import javax.sql.DataSource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.common.utils.RetryUtil; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.mysql.util.ExecuteFunction; -import com.netflix.conductor.mysql.util.LazyToString; -import com.netflix.conductor.mysql.util.Query; -import com.netflix.conductor.mysql.util.QueryFunction; -import com.netflix.conductor.mysql.util.TransactionalFunction; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; - -import static com.netflix.conductor.core.exception.ApplicationException.Code.BACKEND_ERROR; -import static com.netflix.conductor.core.exception.ApplicationException.Code.CONFLICT; -import static com.netflix.conductor.core.exception.ApplicationException.Code.INTERNAL_ERROR; - -import static com.mysql.cj.exceptions.MysqlErrorNumbers.ER_LOCK_DEADLOCK; -import static java.lang.Integer.parseInt; -import static java.lang.System.getProperty; - -public abstract class MySQLBaseDAO { - - private static final String MAX_RETRY_ON_DEADLOCK_PROPERTY_NAME = - "conductor.mysql.deadlock.retry.max"; - private static final String MAX_RETRY_ON_DEADLOCK_PROPERTY_DEFAULT_VALUE = "3"; - private static final int MAX_RETRY_ON_DEADLOCK = getMaxRetriesOnDeadLock(); - private static final List EXCLUDED_STACKTRACE_CLASS = - ImmutableList.of(MySQLBaseDAO.class.getName(), Thread.class.getName()); - - protected final Logger logger = LoggerFactory.getLogger(getClass()); - protected final ObjectMapper objectMapper; - protected final DataSource dataSource; - - protected MySQLBaseDAO(ObjectMapper om, DataSource dataSource) { - this.objectMapper = om; - this.dataSource = dataSource; - } - - protected final LazyToString getCallingMethod() { - return new LazyToString( - () -> - Arrays.stream(Thread.currentThread().getStackTrace()) - .filter( - ste -> - !EXCLUDED_STACKTRACE_CLASS.contains( - ste.getClassName())) - .findFirst() - .map(StackTraceElement::getMethodName) - .orElseThrow(() -> new NullPointerException("Cannot find Caller"))); - } - - protected String toJson(Object value) { - try { - return objectMapper.writeValueAsString(value); - } catch (JsonProcessingException ex) { - throw new ApplicationException(INTERNAL_ERROR, ex); - } - } - - protected T readValue(String json, Class tClass) { - try { - return objectMapper.readValue(json, tClass); - } catch (IOException ex) { - throw new ApplicationException(INTERNAL_ERROR, ex); - } - } - - protected T readValue(String json, TypeReference typeReference) { - try { - return objectMapper.readValue(json, typeReference); - } catch (IOException ex) { - throw new ApplicationException(INTERNAL_ERROR, ex); - } - } - - /** - * Initialize a new transactional {@link Connection} from {@link #dataSource} and pass it to - * {@literal function}. - * - *

Successful executions of {@literal function} will result in a commit and return of {@link - * TransactionalFunction#apply(Connection)}. - * - *

If any {@link Throwable} thrown from {@code TransactionalFunction#apply(Connection)} will - * result in a rollback of the transaction and will be wrapped in an {@link - * ApplicationException} if it is not already one. - * - *

Generally this is used to wrap multiple {@link #execute(Connection, String, - * ExecuteFunction)} or {@link #query(Connection, String, QueryFunction)} invocations that - * produce some expected return value. - * - * @param function The function to apply with a new transactional {@link Connection} - * @param The return type. - * @return The result of {@code TransactionalFunction#apply(Connection)} - * @throws ApplicationException If any errors occur. - */ - private R getWithTransaction(final TransactionalFunction function) { - final Instant start = Instant.now(); - LazyToString callingMethod = getCallingMethod(); - logger.trace("{} : starting transaction", callingMethod); - - try (Connection tx = dataSource.getConnection()) { - boolean previousAutoCommitMode = tx.getAutoCommit(); - tx.setAutoCommit(false); - try { - R result = function.apply(tx); - tx.commit(); - return result; - } catch (Throwable th) { - tx.rollback(); - if (th instanceof ApplicationException) { - throw th; - } - throw new ApplicationException(BACKEND_ERROR, th.getMessage(), th); - } finally { - tx.setAutoCommit(previousAutoCommitMode); - } - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex.getMessage(), ex); - } finally { - logger.trace( - "{} : took {}ms", - callingMethod, - Duration.between(start, Instant.now()).toMillis()); - } - } - - R getWithRetriedTransactions(final TransactionalFunction function) { - try { - return new RetryUtil() - .retryOnException( - () -> getWithTransaction(function), - this::isDeadLockError, - null, - MAX_RETRY_ON_DEADLOCK, - "retry on deadlock", - "transactional"); - } catch (RuntimeException e) { - throw (ApplicationException) e.getCause(); - } - } - - protected R getWithTransactionWithOutErrorPropagation(TransactionalFunction function) { - Instant start = Instant.now(); - LazyToString callingMethod = getCallingMethod(); - logger.trace("{} : starting transaction", callingMethod); - - try (Connection tx = dataSource.getConnection()) { - boolean previousAutoCommitMode = tx.getAutoCommit(); - tx.setAutoCommit(false); - try { - R result = function.apply(tx); - tx.commit(); - return result; - } catch (Throwable th) { - tx.rollback(); - logger.info(CONFLICT + " " + th.getMessage()); - return null; - } finally { - tx.setAutoCommit(previousAutoCommitMode); - } - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex.getMessage(), ex); - } finally { - logger.trace( - "{} : took {}ms", - callingMethod, - Duration.between(start, Instant.now()).toMillis()); - } - } - - /** - * Wraps {@link #getWithRetriedTransactions(TransactionalFunction)} with no return value. - * - *

Generally this is used to wrap multiple {@link #execute(Connection, String, - * ExecuteFunction)} or {@link #query(Connection, String, QueryFunction)} invocations that - * produce no expected return value. - * - * @param consumer The {@link Consumer} callback to pass a transactional {@link Connection} to. - * @throws ApplicationException If any errors occur. - * @see #getWithRetriedTransactions(TransactionalFunction) - */ - protected void withTransaction(Consumer consumer) { - getWithRetriedTransactions( - connection -> { - consumer.accept(connection); - return null; - }); - } - - /** - * Initiate a new transaction and execute a {@link Query} within that context, then return the - * results of {@literal function}. - * - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - * @param The expected return type of {@literal function}. - * @return The results of applying {@literal function}. - */ - protected R queryWithTransaction(String query, QueryFunction function) { - return getWithRetriedTransactions(tx -> query(tx, query, function)); - } - - /** - * Execute a {@link Query} within the context of a given transaction and return the results of - * {@literal function}. - * - * @param tx The transactional {@link Connection} to use. - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - * @param The expected return type of {@literal function}. - * @return The results of applying {@literal function}. - */ - protected R query(Connection tx, String query, QueryFunction function) { - try (Query q = new Query(objectMapper, tx, query)) { - return function.apply(q); - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex); - } - } - - /** - * Execute a statement with no expected return value within a given transaction. - * - * @param tx The transactional {@link Connection} to use. - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - */ - protected void execute(Connection tx, String query, ExecuteFunction function) { - try (Query q = new Query(objectMapper, tx, query)) { - function.apply(q); - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex); - } - } - - /** - * Instantiates a new transactional connection and invokes {@link #execute(Connection, String, - * ExecuteFunction)} - * - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - */ - protected void executeWithTransaction(String query, ExecuteFunction function) { - withTransaction(tx -> execute(tx, query, function)); - } - - private boolean isDeadLockError(Throwable throwable) { - SQLException sqlException = findCauseSQLException(throwable); - if (sqlException == null) { - return false; - } - return ER_LOCK_DEADLOCK == sqlException.getErrorCode(); - } - - private SQLException findCauseSQLException(Throwable throwable) { - Throwable causeException = throwable; - while (null != causeException && !(causeException instanceof SQLException)) { - causeException = causeException.getCause(); - } - return (SQLException) causeException; - } - - private static int getMaxRetriesOnDeadLock() { - try { - return parseInt( - getProperty( - MAX_RETRY_ON_DEADLOCK_PROPERTY_NAME, - MAX_RETRY_ON_DEADLOCK_PROPERTY_DEFAULT_VALUE)); - } catch (Exception e) { - return parseInt(MAX_RETRY_ON_DEADLOCK_PROPERTY_DEFAULT_VALUE); - } - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLExecutionDAO.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLExecutionDAO.java deleted file mode 100644 index 9c50ad7d6..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLExecutionDAO.java +++ /dev/null @@ -1,1071 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.dao; - -import java.sql.Connection; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.stream.Collectors; - -import javax.sql.DataSource; - -import com.netflix.conductor.common.metadata.events.EventExecution; -import com.netflix.conductor.common.metadata.tasks.PollData; -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.dao.ConcurrentExecutionLimitDAO; -import com.netflix.conductor.dao.ExecutionDAO; -import com.netflix.conductor.dao.PollDataDAO; -import com.netflix.conductor.dao.RateLimitingDAO; -import com.netflix.conductor.metrics.Monitors; -import com.netflix.conductor.model.TaskModel; -import com.netflix.conductor.model.WorkflowModel; -import com.netflix.conductor.mysql.util.Query; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; - -import static com.netflix.conductor.core.exception.ApplicationException.Code.BACKEND_ERROR; - -public class MySQLExecutionDAO extends MySQLBaseDAO - implements ExecutionDAO, RateLimitingDAO, PollDataDAO, ConcurrentExecutionLimitDAO { - - private static final String ARCHIVED_FIELD = "archived"; - private static final String RAW_JSON_FIELD = "rawJSON"; - - public MySQLExecutionDAO(ObjectMapper objectMapper, DataSource dataSource) { - super(objectMapper, dataSource); - } - - private static String dateStr(Long timeInMs) { - Date date = new Date(timeInMs); - return dateStr(date); - } - - private static String dateStr(Date date) { - SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); - return format.format(date); - } - - @Override - public List getPendingTasksByWorkflow(String taskDefName, String workflowId) { - // @formatter:off - String GET_IN_PROGRESS_TASKS_FOR_WORKFLOW = - "SELECT json_data FROM task_in_progress tip " - + "INNER JOIN task t ON t.task_id = tip.task_id " - + "WHERE task_def_name = ? AND workflow_id = ?"; - // @formatter:on - - return queryWithTransaction( - GET_IN_PROGRESS_TASKS_FOR_WORKFLOW, - q -> - q.addParameter(taskDefName) - .addParameter(workflowId) - .executeAndFetch(TaskModel.class)); - } - - @Override - public List getTasks(String taskDefName, String startKey, int count) { - List tasks = new ArrayList<>(count); - - List pendingTasks = getPendingTasksForTaskType(taskDefName); - boolean startKeyFound = startKey == null; - int found = 0; - for (TaskModel pendingTask : pendingTasks) { - if (!startKeyFound) { - if (pendingTask.getTaskId().equals(startKey)) { - startKeyFound = true; - // noinspection ConstantConditions - if (startKey != null) { - continue; - } - } - } - if (startKeyFound && found < count) { - tasks.add(pendingTask); - found++; - } - } - - return tasks; - } - - private static String taskKey(TaskModel task) { - return task.getReferenceTaskName() + "_" + task.getRetryCount(); - } - - @Override - public List createTasks(List tasks) { - List created = Lists.newArrayListWithCapacity(tasks.size()); - - withTransaction( - connection -> { - for (TaskModel task : tasks) { - validate(task); - - task.setScheduledTime(System.currentTimeMillis()); - - final String taskKey = taskKey(task); - - boolean scheduledTaskAdded = addScheduledTask(connection, task, taskKey); - - if (!scheduledTaskAdded) { - logger.trace( - "Task already scheduled, skipping the run " - + task.getTaskId() - + ", ref=" - + task.getReferenceTaskName() - + ", key=" - + taskKey); - continue; - } - - insertOrUpdateTaskData(connection, task); - addWorkflowToTaskMapping(connection, task); - addTaskInProgress(connection, task); - updateTask(connection, task); - - created.add(task); - } - }); - - return created; - } - - @Override - public void updateTask(TaskModel task) { - withTransaction(connection -> updateTask(connection, task)); - } - - /** - * This is a dummy implementation and this feature is not for Mysql backed Conductor - * - * @param task: which needs to be evaluated whether it is rateLimited or not - */ - @Override - public boolean exceedsRateLimitPerFrequency(TaskModel task, TaskDef taskDef) { - return false; - } - - @Override - public boolean exceedsLimit(TaskModel task) { - - Optional taskDefinition = task.getTaskDefinition(); - if (taskDefinition.isEmpty()) { - return false; - } - - TaskDef taskDef = taskDefinition.get(); - - int limit = taskDef.concurrencyLimit(); - if (limit <= 0) { - return false; - } - - long current = getInProgressTaskCount(task.getTaskDefName()); - - if (current >= limit) { - Monitors.recordTaskConcurrentExecutionLimited(task.getTaskDefName(), limit); - return true; - } - - logger.info( - "Task execution count for {}: limit={}, current={}", - task.getTaskDefName(), - limit, - getInProgressTaskCount(task.getTaskDefName())); - - String taskId = task.getTaskId(); - - List tasksInProgressInOrderOfArrival = - findAllTasksInProgressInOrderOfArrival(task, limit); - - boolean rateLimited = !tasksInProgressInOrderOfArrival.contains(taskId); - - if (rateLimited) { - logger.info( - "Task execution count limited. {}, limit {}, current {}", - task.getTaskDefName(), - limit, - getInProgressTaskCount(task.getTaskDefName())); - Monitors.recordTaskConcurrentExecutionLimited(task.getTaskDefName(), limit); - } - - return rateLimited; - } - - @Override - public boolean removeTask(String taskId) { - TaskModel task = getTask(taskId); - - if (task == null) { - logger.warn("No such task found by id {}", taskId); - return false; - } - - final String taskKey = taskKey(task); - - withTransaction( - connection -> { - removeScheduledTask(connection, task, taskKey); - removeWorkflowToTaskMapping(connection, task); - removeTaskInProgress(connection, task); - removeTaskData(connection, task); - }); - return true; - } - - @Override - public TaskModel getTask(String taskId) { - String GET_TASK = "SELECT json_data FROM task WHERE task_id = ?"; - return queryWithTransaction( - GET_TASK, q -> q.addParameter(taskId).executeAndFetchFirst(TaskModel.class)); - } - - @Override - public List getTasks(List taskIds) { - if (taskIds.isEmpty()) { - return Lists.newArrayList(); - } - return getWithRetriedTransactions(c -> getTasks(c, taskIds)); - } - - @Override - public List getPendingTasksForTaskType(String taskName) { - Preconditions.checkNotNull(taskName, "task name cannot be null"); - // @formatter:off - String GET_IN_PROGRESS_TASKS_FOR_TYPE = - "SELECT json_data FROM task_in_progress tip " - + "INNER JOIN task t ON t.task_id = tip.task_id " - + "WHERE task_def_name = ?"; - // @formatter:on - - return queryWithTransaction( - GET_IN_PROGRESS_TASKS_FOR_TYPE, - q -> q.addParameter(taskName).executeAndFetch(TaskModel.class)); - } - - @Override - public List getTasksForWorkflow(String workflowId) { - String GET_TASKS_FOR_WORKFLOW = - "SELECT task_id FROM workflow_to_task WHERE workflow_id = ?"; - return getWithRetriedTransactions( - tx -> - query( - tx, - GET_TASKS_FOR_WORKFLOW, - q -> { - List taskIds = - q.addParameter(workflowId) - .executeScalarList(String.class); - return getTasks(tx, taskIds); - })); - } - - @Override - public String createWorkflow(WorkflowModel workflow) { - return insertOrUpdateWorkflow(workflow, false); - } - - @Override - public String updateWorkflow(WorkflowModel workflow) { - return insertOrUpdateWorkflow(workflow, true); - } - - @Override - public boolean removeWorkflow(String workflowId) { - boolean removed = false; - WorkflowModel workflow = getWorkflow(workflowId, true); - if (workflow != null) { - withTransaction( - connection -> { - removeWorkflowDefToWorkflowMapping(connection, workflow); - removeWorkflow(connection, workflowId); - removePendingWorkflow(connection, workflow.getWorkflowName(), workflowId); - }); - removed = true; - - for (TaskModel task : workflow.getTasks()) { - if (!removeTask(task.getTaskId())) { - removed = false; - } - } - } - return removed; - } - - /** - * This is a dummy implementation and this feature is not supported for MySQL backed Conductor - */ - @Override - public boolean removeWorkflowWithExpiry(String workflowId, int ttlSeconds) { - throw new UnsupportedOperationException( - "This method is not implemented in MySQLExecutionDAO. Please use RedisDAO mode instead for using TTLs."); - } - - @Override - public void removeFromPendingWorkflow(String workflowType, String workflowId) { - withTransaction(connection -> removePendingWorkflow(connection, workflowType, workflowId)); - } - - @Override - public WorkflowModel getWorkflow(String workflowId) { - return getWorkflow(workflowId, true); - } - - @Override - public WorkflowModel getWorkflow(String workflowId, boolean includeTasks) { - WorkflowModel workflow = getWithRetriedTransactions(tx -> readWorkflow(tx, workflowId)); - - if (workflow != null) { - if (includeTasks) { - List tasks = getTasksForWorkflow(workflowId); - tasks.sort(Comparator.comparingInt(TaskModel::getSeq)); - workflow.setTasks(tasks); - } - } - return workflow; - } - - /** - * @param workflowName name of the workflow - * @param version the workflow version - * @return list of workflow ids that are in RUNNING state returns workflows of all versions - * for the given workflow name - */ - @Override - public List getRunningWorkflowIds(String workflowName, int version) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - String GET_PENDING_WORKFLOW_IDS = - "SELECT workflow_id FROM workflow_pending WHERE workflow_type = ?"; - - return queryWithTransaction( - GET_PENDING_WORKFLOW_IDS, - q -> q.addParameter(workflowName).executeScalarList(String.class)); - } - - /** - * @param workflowName Name of the workflow - * @param version the workflow version - * @return list of workflows that are in RUNNING state - */ - @Override - public List getPendingWorkflowsByType(String workflowName, int version) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - return getRunningWorkflowIds(workflowName, version).stream() - .map(this::getWorkflow) - .filter(workflow -> workflow.getWorkflowVersion() == version) - .collect(Collectors.toList()); - } - - @Override - public long getPendingWorkflowCount(String workflowName) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - String GET_PENDING_WORKFLOW_COUNT = - "SELECT COUNT(*) FROM workflow_pending WHERE workflow_type = ?"; - - return queryWithTransaction( - GET_PENDING_WORKFLOW_COUNT, q -> q.addParameter(workflowName).executeCount()); - } - - @Override - public long getInProgressTaskCount(String taskDefName) { - String GET_IN_PROGRESS_TASK_COUNT = - "SELECT COUNT(*) FROM task_in_progress WHERE task_def_name = ? AND in_progress_status = true"; - - return queryWithTransaction( - GET_IN_PROGRESS_TASK_COUNT, q -> q.addParameter(taskDefName).executeCount()); - } - - @Override - public List getWorkflowsByType( - String workflowName, Long startTime, Long endTime) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - Preconditions.checkNotNull(startTime, "startTime cannot be null"); - Preconditions.checkNotNull(endTime, "endTime cannot be null"); - - List workflows = new LinkedList<>(); - - withTransaction( - tx -> { - // @formatter:off - String GET_ALL_WORKFLOWS_FOR_WORKFLOW_DEF = - "SELECT workflow_id FROM workflow_def_to_workflow " - + "WHERE workflow_def = ? AND date_str BETWEEN ? AND ?"; - // @formatter:on - - List workflowIds = - query( - tx, - GET_ALL_WORKFLOWS_FOR_WORKFLOW_DEF, - q -> - q.addParameter(workflowName) - .addParameter(dateStr(startTime)) - .addParameter(dateStr(endTime)) - .executeScalarList(String.class)); - workflowIds.forEach( - workflowId -> { - try { - WorkflowModel wf = getWorkflow(workflowId); - if (wf.getCreateTime() >= startTime - && wf.getCreateTime() <= endTime) { - workflows.add(wf); - } - } catch (Exception e) { - logger.error( - "Unable to load workflow id {} with name {}", - workflowId, - workflowName, - e); - } - }); - }); - - return workflows; - } - - @Override - public List getWorkflowsByCorrelationId( - String workflowName, String correlationId, boolean includeTasks) { - Preconditions.checkNotNull(correlationId, "correlationId cannot be null"); - String GET_WORKFLOWS_BY_CORRELATION_ID = - "SELECT w.json_data FROM workflow w left join workflow_def_to_workflow wd on w.workflow_id = wd.workflow_id WHERE w.correlation_id = ? and wd.workflow_def = ?"; - - return queryWithTransaction( - GET_WORKFLOWS_BY_CORRELATION_ID, - q -> - q.addParameter(correlationId) - .addParameter(workflowName) - .executeAndFetch(WorkflowModel.class)); - } - - @Override - public boolean canSearchAcrossWorkflows() { - return true; - } - - @Override - public boolean addEventExecution(EventExecution eventExecution) { - try { - return getWithRetriedTransactions(tx -> insertEventExecution(tx, eventExecution)); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, - "Unable to add event execution " + eventExecution.getId(), - e); - } - } - - @Override - public void removeEventExecution(EventExecution eventExecution) { - try { - withTransaction(tx -> removeEventExecution(tx, eventExecution)); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, - "Unable to remove event execution " + eventExecution.getId(), - e); - } - } - - @Override - public void updateEventExecution(EventExecution eventExecution) { - try { - withTransaction(tx -> updateEventExecution(tx, eventExecution)); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, - "Unable to update event execution " + eventExecution.getId(), - e); - } - } - - public List getEventExecutions( - String eventHandlerName, String eventName, String messageId, int max) { - try { - List executions = Lists.newLinkedList(); - withTransaction( - tx -> { - for (int i = 0; i < max; i++) { - String executionId = - messageId + "_" - + i; // see SimpleEventProcessor.handle to understand - // how the - // execution id is set - EventExecution ee = - readEventExecution( - tx, - eventHandlerName, - eventName, - messageId, - executionId); - if (ee == null) { - break; - } - executions.add(ee); - } - }); - return executions; - } catch (Exception e) { - String message = - String.format( - "Unable to get event executions for eventHandlerName=%s, eventName=%s, messageId=%s", - eventHandlerName, eventName, messageId); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, message, e); - } - } - - @Override - public void updateLastPollData(String taskDefName, String domain, String workerId) { - Preconditions.checkNotNull(taskDefName, "taskDefName name cannot be null"); - PollData pollData = new PollData(taskDefName, domain, workerId, System.currentTimeMillis()); - String effectiveDomain = (domain == null) ? "DEFAULT" : domain; - withTransaction(tx -> insertOrUpdatePollData(tx, pollData, effectiveDomain)); - } - - @Override - public PollData getPollData(String taskDefName, String domain) { - Preconditions.checkNotNull(taskDefName, "taskDefName name cannot be null"); - String effectiveDomain = (domain == null) ? "DEFAULT" : domain; - return getWithRetriedTransactions(tx -> readPollData(tx, taskDefName, effectiveDomain)); - } - - @Override - public List getPollData(String taskDefName) { - Preconditions.checkNotNull(taskDefName, "taskDefName name cannot be null"); - return readAllPollData(taskDefName); - } - - @Override - public List getAllPollData() { - try (Connection tx = dataSource.getConnection()) { - boolean previousAutoCommitMode = tx.getAutoCommit(); - tx.setAutoCommit(true); - try { - String GET_ALL_POLL_DATA = "SELECT json_data FROM poll_data ORDER BY queue_name"; - return query(tx, GET_ALL_POLL_DATA, q -> q.executeAndFetch(PollData.class)); - } catch (Throwable th) { - throw new ApplicationException(BACKEND_ERROR, th.getMessage(), th); - } finally { - tx.setAutoCommit(previousAutoCommitMode); - } - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex.getMessage(), ex); - } - } - - private List getTasks(Connection connection, List taskIds) { - if (taskIds.isEmpty()) { - return Lists.newArrayList(); - } - - // Generate a formatted query string with a variable number of bind params based - // on taskIds.size() - final String GET_TASKS_FOR_IDS = - String.format( - "SELECT json_data FROM task WHERE task_id IN (%s) AND json_data IS NOT NULL", - Query.generateInBindings(taskIds.size())); - - return query( - connection, - GET_TASKS_FOR_IDS, - q -> q.addParameters(taskIds).executeAndFetch(TaskModel.class)); - } - - private String insertOrUpdateWorkflow(WorkflowModel workflow, boolean update) { - Preconditions.checkNotNull(workflow, "workflow object cannot be null"); - - boolean terminal = workflow.getStatus().isTerminal(); - - List tasks = workflow.getTasks(); - workflow.setTasks(Lists.newLinkedList()); - - withTransaction( - tx -> { - if (!update) { - addWorkflow(tx, workflow); - addWorkflowDefToWorkflowMapping(tx, workflow); - } else { - updateWorkflow(tx, workflow); - } - - if (terminal) { - removePendingWorkflow( - tx, workflow.getWorkflowName(), workflow.getWorkflowId()); - } else { - addPendingWorkflow( - tx, workflow.getWorkflowName(), workflow.getWorkflowId()); - } - }); - - workflow.setTasks(tasks); - return workflow.getWorkflowId(); - } - - private void updateTask(Connection connection, TaskModel task) { - Optional taskDefinition = task.getTaskDefinition(); - - if (taskDefinition.isPresent() && taskDefinition.get().concurrencyLimit() > 0) { - boolean inProgress = - task.getStatus() != null - && task.getStatus().equals(TaskModel.Status.IN_PROGRESS); - updateInProgressStatus(connection, task, inProgress); - } - - insertOrUpdateTaskData(connection, task); - - if (task.getStatus() != null && task.getStatus().isTerminal()) { - removeTaskInProgress(connection, task); - } - - addWorkflowToTaskMapping(connection, task); - } - - private WorkflowModel readWorkflow(Connection connection, String workflowId) { - String GET_WORKFLOW = "SELECT json_data FROM workflow WHERE workflow_id = ?"; - - return query( - connection, - GET_WORKFLOW, - q -> q.addParameter(workflowId).executeAndFetchFirst(WorkflowModel.class)); - } - - private void addWorkflow(Connection connection, WorkflowModel workflow) { - String INSERT_WORKFLOW = - "INSERT INTO workflow (workflow_id, correlation_id, json_data) VALUES (?, ?, ?)"; - - execute( - connection, - INSERT_WORKFLOW, - q -> - q.addParameter(workflow.getWorkflowId()) - .addParameter(workflow.getCorrelationId()) - .addJsonParameter(workflow) - .executeUpdate()); - } - - private void updateWorkflow(Connection connection, WorkflowModel workflow) { - String UPDATE_WORKFLOW = - "UPDATE workflow SET json_data = ?, modified_on = CURRENT_TIMESTAMP WHERE workflow_id = ?"; - - execute( - connection, - UPDATE_WORKFLOW, - q -> - q.addJsonParameter(workflow) - .addParameter(workflow.getWorkflowId()) - .executeUpdate()); - } - - private void removeWorkflow(Connection connection, String workflowId) { - String REMOVE_WORKFLOW = "DELETE FROM workflow WHERE workflow_id = ?"; - execute(connection, REMOVE_WORKFLOW, q -> q.addParameter(workflowId).executeDelete()); - } - - private void addPendingWorkflow(Connection connection, String workflowType, String workflowId) { - - String EXISTS_PENDING_WORKFLOW = - "SELECT EXISTS(SELECT 1 FROM workflow_pending WHERE workflow_type = ? AND workflow_id = ?)"; - - boolean exists = - query( - connection, - EXISTS_PENDING_WORKFLOW, - q -> q.addParameter(workflowType).addParameter(workflowId).exists()); - - if (!exists) { - String INSERT_PENDING_WORKFLOW = - "INSERT IGNORE INTO workflow_pending (workflow_type, workflow_id) VALUES (?, ?)"; - - execute( - connection, - INSERT_PENDING_WORKFLOW, - q -> q.addParameter(workflowType).addParameter(workflowId).executeUpdate()); - } - } - - private void removePendingWorkflow( - Connection connection, String workflowType, String workflowId) { - String REMOVE_PENDING_WORKFLOW = - "DELETE FROM workflow_pending WHERE workflow_type = ? AND workflow_id = ?"; - - execute( - connection, - REMOVE_PENDING_WORKFLOW, - q -> q.addParameter(workflowType).addParameter(workflowId).executeDelete()); - } - - private void insertOrUpdateTaskData(Connection connection, TaskModel task) { - /* - * Most times the row will be updated so let's try the update first. This used to be an 'INSERT/ON DUPLICATE KEY update' sql statement. The problem with that - * is that if we try the INSERT first, the sequence will be increased even if the ON DUPLICATE KEY happens. - */ - String UPDATE_TASK = - "UPDATE task SET json_data=?, modified_on=CURRENT_TIMESTAMP WHERE task_id=?"; - int rowsUpdated = - query( - connection, - UPDATE_TASK, - q -> - q.addJsonParameter(task) - .addParameter(task.getTaskId()) - .executeUpdate()); - - if (rowsUpdated == 0) { - String INSERT_TASK = - "INSERT INTO task (task_id, json_data, modified_on) VALUES (?, ?, CURRENT_TIMESTAMP) ON DUPLICATE KEY UPDATE json_data=VALUES(json_data), modified_on=VALUES(modified_on)"; - execute( - connection, - INSERT_TASK, - q -> q.addParameter(task.getTaskId()).addJsonParameter(task).executeUpdate()); - } - } - - private void removeTaskData(Connection connection, TaskModel task) { - String REMOVE_TASK = "DELETE FROM task WHERE task_id = ?"; - execute(connection, REMOVE_TASK, q -> q.addParameter(task.getTaskId()).executeDelete()); - } - - private void addWorkflowToTaskMapping(Connection connection, TaskModel task) { - - String EXISTS_WORKFLOW_TO_TASK = - "SELECT EXISTS(SELECT 1 FROM workflow_to_task WHERE workflow_id = ? AND task_id = ?)"; - - boolean exists = - query( - connection, - EXISTS_WORKFLOW_TO_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(task.getTaskId()) - .exists()); - - if (!exists) { - String INSERT_WORKFLOW_TO_TASK = - "INSERT IGNORE INTO workflow_to_task (workflow_id, task_id) VALUES (?, ?)"; - - execute( - connection, - INSERT_WORKFLOW_TO_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(task.getTaskId()) - .executeUpdate()); - } - } - - private void removeWorkflowToTaskMapping(Connection connection, TaskModel task) { - String REMOVE_WORKFLOW_TO_TASK = - "DELETE FROM workflow_to_task WHERE workflow_id = ? AND task_id = ?"; - - execute( - connection, - REMOVE_WORKFLOW_TO_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(task.getTaskId()) - .executeDelete()); - } - - private void addWorkflowDefToWorkflowMapping(Connection connection, WorkflowModel workflow) { - String INSERT_WORKFLOW_DEF_TO_WORKFLOW = - "INSERT INTO workflow_def_to_workflow (workflow_def, date_str, workflow_id) VALUES (?, ?, ?)"; - - execute( - connection, - INSERT_WORKFLOW_DEF_TO_WORKFLOW, - q -> - q.addParameter(workflow.getWorkflowName()) - .addParameter(dateStr(workflow.getCreateTime())) - .addParameter(workflow.getWorkflowId()) - .executeUpdate()); - } - - private void removeWorkflowDefToWorkflowMapping(Connection connection, WorkflowModel workflow) { - String REMOVE_WORKFLOW_DEF_TO_WORKFLOW = - "DELETE FROM workflow_def_to_workflow WHERE workflow_def = ? AND date_str = ? AND workflow_id = ?"; - - execute( - connection, - REMOVE_WORKFLOW_DEF_TO_WORKFLOW, - q -> - q.addParameter(workflow.getWorkflowName()) - .addParameter(dateStr(workflow.getCreateTime())) - .addParameter(workflow.getWorkflowId()) - .executeUpdate()); - } - - @VisibleForTesting - boolean addScheduledTask(Connection connection, TaskModel task, String taskKey) { - - final String EXISTS_SCHEDULED_TASK = - "SELECT EXISTS(SELECT 1 FROM task_scheduled where workflow_id = ? AND task_key = ?)"; - - boolean exists = - query( - connection, - EXISTS_SCHEDULED_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(taskKey) - .exists()); - - if (!exists) { - final String INSERT_IGNORE_SCHEDULED_TASK = - "INSERT IGNORE INTO task_scheduled (workflow_id, task_key, task_id) VALUES (?, ?, ?)"; - - int count = - query( - connection, - INSERT_IGNORE_SCHEDULED_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(taskKey) - .addParameter(task.getTaskId()) - .executeUpdate()); - return count > 0; - } else { - return false; - } - } - - private void removeScheduledTask(Connection connection, TaskModel task, String taskKey) { - String REMOVE_SCHEDULED_TASK = - "DELETE FROM task_scheduled WHERE workflow_id = ? AND task_key = ?"; - execute( - connection, - REMOVE_SCHEDULED_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(taskKey) - .executeDelete()); - } - - private void addTaskInProgress(Connection connection, TaskModel task) { - String EXISTS_IN_PROGRESS_TASK = - "SELECT EXISTS(SELECT 1 FROM task_in_progress WHERE task_def_name = ? AND task_id = ?)"; - - boolean exists = - query( - connection, - EXISTS_IN_PROGRESS_TASK, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .exists()); - - if (!exists) { - String INSERT_IN_PROGRESS_TASK = - "INSERT INTO task_in_progress (task_def_name, task_id, workflow_id) VALUES (?, ?, ?)"; - - execute( - connection, - INSERT_IN_PROGRESS_TASK, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .addParameter(task.getWorkflowInstanceId()) - .executeUpdate()); - } - } - - private void removeTaskInProgress(Connection connection, TaskModel task) { - String REMOVE_IN_PROGRESS_TASK = - "DELETE FROM task_in_progress WHERE task_def_name = ? AND task_id = ?"; - - execute( - connection, - REMOVE_IN_PROGRESS_TASK, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .executeUpdate()); - } - - private void updateInProgressStatus(Connection connection, TaskModel task, boolean inProgress) { - String UPDATE_IN_PROGRESS_TASK_STATUS = - "UPDATE task_in_progress SET in_progress_status = ?, modified_on = CURRENT_TIMESTAMP " - + "WHERE task_def_name = ? AND task_id = ?"; - - execute( - connection, - UPDATE_IN_PROGRESS_TASK_STATUS, - q -> - q.addParameter(inProgress) - .addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .executeUpdate()); - } - - private boolean insertEventExecution(Connection connection, EventExecution eventExecution) { - - String INSERT_EVENT_EXECUTION = - "INSERT INTO event_execution (event_handler_name, event_name, message_id, execution_id, json_data) " - + "VALUES (?, ?, ?, ?, ?)"; - int count = - query( - connection, - INSERT_EVENT_EXECUTION, - q -> - q.addParameter(eventExecution.getName()) - .addParameter(eventExecution.getEvent()) - .addParameter(eventExecution.getMessageId()) - .addParameter(eventExecution.getId()) - .addJsonParameter(eventExecution) - .executeUpdate()); - return count > 0; - } - - private void updateEventExecution(Connection connection, EventExecution eventExecution) { - // @formatter:off - String UPDATE_EVENT_EXECUTION = - "UPDATE event_execution SET " - + "json_data = ?, " - + "modified_on = CURRENT_TIMESTAMP " - + "WHERE event_handler_name = ? " - + "AND event_name = ? " - + "AND message_id = ? " - + "AND execution_id = ?"; - // @formatter:on - - execute( - connection, - UPDATE_EVENT_EXECUTION, - q -> - q.addJsonParameter(eventExecution) - .addParameter(eventExecution.getName()) - .addParameter(eventExecution.getEvent()) - .addParameter(eventExecution.getMessageId()) - .addParameter(eventExecution.getId()) - .executeUpdate()); - } - - private void removeEventExecution(Connection connection, EventExecution eventExecution) { - String REMOVE_EVENT_EXECUTION = - "DELETE FROM event_execution " - + "WHERE event_handler_name = ? " - + "AND event_name = ? " - + "AND message_id = ? " - + "AND execution_id = ?"; - - execute( - connection, - REMOVE_EVENT_EXECUTION, - q -> - q.addParameter(eventExecution.getName()) - .addParameter(eventExecution.getEvent()) - .addParameter(eventExecution.getMessageId()) - .addParameter(eventExecution.getId()) - .executeUpdate()); - } - - private EventExecution readEventExecution( - Connection connection, - String eventHandlerName, - String eventName, - String messageId, - String executionId) { - // @formatter:off - String GET_EVENT_EXECUTION = - "SELECT json_data FROM event_execution " - + "WHERE event_handler_name = ? " - + "AND event_name = ? " - + "AND message_id = ? " - + "AND execution_id = ?"; - // @formatter:on - return query( - connection, - GET_EVENT_EXECUTION, - q -> - q.addParameter(eventHandlerName) - .addParameter(eventName) - .addParameter(messageId) - .addParameter(executionId) - .executeAndFetchFirst(EventExecution.class)); - } - - private void insertOrUpdatePollData(Connection connection, PollData pollData, String domain) { - - /* - * Most times the row will be updated so let's try the update first. This used to be an 'INSERT/ON DUPLICATE KEY update' sql statement. The problem with that - * is that if we try the INSERT first, the sequence will be increased even if the ON DUPLICATE KEY happens. Since polling happens *a lot*, the sequence can increase - * dramatically even though it won't be used. - */ - String UPDATE_POLL_DATA = - "UPDATE poll_data SET json_data=?, modified_on=CURRENT_TIMESTAMP WHERE queue_name=? AND domain=?"; - int rowsUpdated = - query( - connection, - UPDATE_POLL_DATA, - q -> - q.addJsonParameter(pollData) - .addParameter(pollData.getQueueName()) - .addParameter(domain) - .executeUpdate()); - - if (rowsUpdated == 0) { - String INSERT_POLL_DATA = - "INSERT INTO poll_data (queue_name, domain, json_data, modified_on) VALUES (?, ?, ?, CURRENT_TIMESTAMP) ON DUPLICATE KEY UPDATE json_data=VALUES(json_data), modified_on=VALUES(modified_on)"; - execute( - connection, - INSERT_POLL_DATA, - q -> - q.addParameter(pollData.getQueueName()) - .addParameter(domain) - .addJsonParameter(pollData) - .executeUpdate()); - } - } - - private PollData readPollData(Connection connection, String queueName, String domain) { - String GET_POLL_DATA = - "SELECT json_data FROM poll_data WHERE queue_name = ? AND domain = ?"; - return query( - connection, - GET_POLL_DATA, - q -> - q.addParameter(queueName) - .addParameter(domain) - .executeAndFetchFirst(PollData.class)); - } - - private List readAllPollData(String queueName) { - String GET_ALL_POLL_DATA = "SELECT json_data FROM poll_data WHERE queue_name = ?"; - return queryWithTransaction( - GET_ALL_POLL_DATA, q -> q.addParameter(queueName).executeAndFetch(PollData.class)); - } - - private List findAllTasksInProgressInOrderOfArrival(TaskModel task, int limit) { - String GET_IN_PROGRESS_TASKS_WITH_LIMIT = - "SELECT task_id FROM task_in_progress WHERE task_def_name = ? ORDER BY created_on LIMIT ?"; - - return queryWithTransaction( - GET_IN_PROGRESS_TASKS_WITH_LIMIT, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(limit) - .executeScalarList(String.class)); - } - - private void validate(TaskModel task) { - Preconditions.checkNotNull(task, "task object cannot be null"); - Preconditions.checkNotNull(task.getTaskId(), "Task id cannot be null"); - Preconditions.checkNotNull( - task.getWorkflowInstanceId(), "Workflow instance id cannot be null"); - Preconditions.checkNotNull( - task.getReferenceTaskName(), "Task reference name cannot be null"); - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLMetadataDAO.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLMetadataDAO.java deleted file mode 100644 index 775c82588..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLMetadataDAO.java +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.dao; - -import java.sql.Connection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -import javax.sql.DataSource; - -import com.netflix.conductor.common.metadata.events.EventHandler; -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.dao.EventHandlerDAO; -import com.netflix.conductor.dao.MetadataDAO; -import com.netflix.conductor.metrics.Monitors; -import com.netflix.conductor.mysql.config.MySQLProperties; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Preconditions; - -public class MySQLMetadataDAO extends MySQLBaseDAO implements MetadataDAO, EventHandlerDAO { - - private final ConcurrentHashMap taskDefCache = new ConcurrentHashMap<>(); - private static final String CLASS_NAME = MySQLMetadataDAO.class.getSimpleName(); - - public MySQLMetadataDAO( - ObjectMapper objectMapper, DataSource dataSource, MySQLProperties properties) { - super(objectMapper, dataSource); - - long cacheRefreshTime = properties.getTaskDefCacheRefreshInterval().getSeconds(); - Executors.newSingleThreadScheduledExecutor() - .scheduleWithFixedDelay( - this::refreshTaskDefs, - cacheRefreshTime, - cacheRefreshTime, - TimeUnit.SECONDS); - } - - @Override - public void createTaskDef(TaskDef taskDef) { - validate(taskDef); - insertOrUpdateTaskDef(taskDef); - } - - @Override - public String updateTaskDef(TaskDef taskDef) { - validate(taskDef); - return insertOrUpdateTaskDef(taskDef); - } - - @Override - public TaskDef getTaskDef(String name) { - Preconditions.checkNotNull(name, "TaskDef name cannot be null"); - TaskDef taskDef = taskDefCache.get(name); - if (taskDef == null) { - if (logger.isTraceEnabled()) { - logger.trace("Cache miss: {}", name); - } - taskDef = getTaskDefFromDB(name); - } - - return taskDef; - } - - @Override - public List getAllTaskDefs() { - return getWithRetriedTransactions(this::findAllTaskDefs); - } - - @Override - public void removeTaskDef(String name) { - final String DELETE_TASKDEF_QUERY = "DELETE FROM meta_task_def WHERE name = ?"; - - executeWithTransaction( - DELETE_TASKDEF_QUERY, - q -> { - if (!q.addParameter(name).executeDelete()) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, "No such task definition"); - } - - taskDefCache.remove(name); - }); - } - - @Override - public void createWorkflowDef(WorkflowDef def) { - validate(def); - - withTransaction( - tx -> { - if (workflowExists(tx, def)) { - throw new ApplicationException( - ApplicationException.Code.CONFLICT, - "Workflow with " + def.key() + " already exists!"); - } - - insertOrUpdateWorkflowDef(tx, def); - }); - } - - @Override - public void updateWorkflowDef(WorkflowDef def) { - validate(def); - withTransaction(tx -> insertOrUpdateWorkflowDef(tx, def)); - } - - @Override - public Optional getLatestWorkflowDef(String name) { - final String GET_LATEST_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE NAME = ? AND " - + "version = latest_version"; - - return Optional.ofNullable( - queryWithTransaction( - GET_LATEST_WORKFLOW_DEF_QUERY, - q -> q.addParameter(name).executeAndFetchFirst(WorkflowDef.class))); - } - - @Override - public Optional getWorkflowDef(String name, int version) { - final String GET_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE NAME = ? AND version = ?"; - return Optional.ofNullable( - queryWithTransaction( - GET_WORKFLOW_DEF_QUERY, - q -> - q.addParameter(name) - .addParameter(version) - .executeAndFetchFirst(WorkflowDef.class))); - } - - @Override - public void removeWorkflowDef(String name, Integer version) { - final String DELETE_WORKFLOW_QUERY = - "DELETE from meta_workflow_def WHERE name = ? AND version = ?"; - - withTransaction( - tx -> { - // remove specified workflow - execute( - tx, - DELETE_WORKFLOW_QUERY, - q -> { - if (!q.addParameter(name).addParameter(version).executeDelete()) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, - String.format( - "No such workflow definition: %s version: %d", - name, version)); - } - }); - // reset latest version based on remaining rows for this workflow - Optional maxVersion = getLatestVersion(tx, name); - maxVersion.ifPresent(newVersion -> updateLatestVersion(tx, name, newVersion)); - }); - } - - public List findAll() { - final String FIND_ALL_WORKFLOW_DEF_QUERY = "SELECT DISTINCT name FROM meta_workflow_def"; - return queryWithTransaction( - FIND_ALL_WORKFLOW_DEF_QUERY, q -> q.executeAndFetch(String.class)); - } - - @Override - public List getAllWorkflowDefs() { - final String GET_ALL_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def ORDER BY name, version"; - - return queryWithTransaction( - GET_ALL_WORKFLOW_DEF_QUERY, q -> q.executeAndFetch(WorkflowDef.class)); - } - - public List getAllLatest() { - final String GET_ALL_LATEST_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE version = " + "latest_version"; - - return queryWithTransaction( - GET_ALL_LATEST_WORKFLOW_DEF_QUERY, q -> q.executeAndFetch(WorkflowDef.class)); - } - - public List getAllVersions(String name) { - final String GET_ALL_VERSIONS_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE name = ? " + "ORDER BY version"; - - return queryWithTransaction( - GET_ALL_VERSIONS_WORKFLOW_DEF_QUERY, - q -> q.addParameter(name).executeAndFetch(WorkflowDef.class)); - } - - @Override - public void addEventHandler(EventHandler eventHandler) { - Preconditions.checkNotNull(eventHandler.getName(), "EventHandler name cannot be null"); - - final String INSERT_EVENT_HANDLER_QUERY = - "INSERT INTO meta_event_handler (name, event, active, json_data) " - + "VALUES (?, ?, ?, ?)"; - - withTransaction( - tx -> { - if (getEventHandler(tx, eventHandler.getName()) != null) { - throw new ApplicationException( - ApplicationException.Code.CONFLICT, - "EventHandler with name " - + eventHandler.getName() - + " already exists!"); - } - - execute( - tx, - INSERT_EVENT_HANDLER_QUERY, - q -> - q.addParameter(eventHandler.getName()) - .addParameter(eventHandler.getEvent()) - .addParameter(eventHandler.isActive()) - .addJsonParameter(eventHandler) - .executeUpdate()); - }); - } - - @Override - public void updateEventHandler(EventHandler eventHandler) { - Preconditions.checkNotNull(eventHandler.getName(), "EventHandler name cannot be null"); - - // @formatter:off - final String UPDATE_EVENT_HANDLER_QUERY = - "UPDATE meta_event_handler SET " - + "event = ?, active = ?, json_data = ?, " - + "modified_on = CURRENT_TIMESTAMP WHERE name = ?"; - // @formatter:on - - withTransaction( - tx -> { - EventHandler existing = getEventHandler(tx, eventHandler.getName()); - if (existing == null) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, - "EventHandler with name " + eventHandler.getName() + " not found!"); - } - - execute( - tx, - UPDATE_EVENT_HANDLER_QUERY, - q -> - q.addParameter(eventHandler.getEvent()) - .addParameter(eventHandler.isActive()) - .addJsonParameter(eventHandler) - .addParameter(eventHandler.getName()) - .executeUpdate()); - }); - } - - @Override - public void removeEventHandler(String name) { - final String DELETE_EVENT_HANDLER_QUERY = "DELETE FROM meta_event_handler WHERE name = ?"; - - withTransaction( - tx -> { - EventHandler existing = getEventHandler(tx, name); - if (existing == null) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, - "EventHandler with name " + name + " not found!"); - } - - execute( - tx, - DELETE_EVENT_HANDLER_QUERY, - q -> q.addParameter(name).executeDelete()); - }); - } - - @Override - public List getAllEventHandlers() { - final String READ_ALL_EVENT_HANDLER_QUERY = "SELECT json_data FROM meta_event_handler"; - return queryWithTransaction( - READ_ALL_EVENT_HANDLER_QUERY, q -> q.executeAndFetch(EventHandler.class)); - } - - @Override - public List getEventHandlersForEvent(String event, boolean activeOnly) { - final String READ_ALL_EVENT_HANDLER_BY_EVENT_QUERY = - "SELECT json_data FROM meta_event_handler WHERE event = ?"; - return queryWithTransaction( - READ_ALL_EVENT_HANDLER_BY_EVENT_QUERY, - q -> { - q.addParameter(event); - return q.executeAndFetch( - rs -> { - List handlers = new ArrayList<>(); - while (rs.next()) { - EventHandler h = readValue(rs.getString(1), EventHandler.class); - if (!activeOnly || h.isActive()) { - handlers.add(h); - } - } - - return handlers; - }); - }); - } - - /** - * Use {@link Preconditions} to check for required {@link TaskDef} fields, throwing a Runtime - * exception if validations fail. - * - * @param taskDef The {@code TaskDef} to check. - */ - private void validate(TaskDef taskDef) { - Preconditions.checkNotNull(taskDef, "TaskDef object cannot be null"); - Preconditions.checkNotNull(taskDef.getName(), "TaskDef name cannot be null"); - } - - /** - * Use {@link Preconditions} to check for required {@link WorkflowDef} fields, throwing a - * Runtime exception if validations fail. - * - * @param def The {@code WorkflowDef} to check. - */ - private void validate(WorkflowDef def) { - Preconditions.checkNotNull(def, "WorkflowDef object cannot be null"); - Preconditions.checkNotNull(def.getName(), "WorkflowDef name cannot be null"); - } - - /** - * Retrieve a {@link EventHandler} by {@literal name}. - * - * @param connection The {@link Connection} to use for queries. - * @param name The {@code EventHandler} name to look for. - * @return {@literal null} if nothing is found, otherwise the {@code EventHandler}. - */ - private EventHandler getEventHandler(Connection connection, String name) { - final String READ_ONE_EVENT_HANDLER_QUERY = - "SELECT json_data FROM meta_event_handler WHERE name = ?"; - - return query( - connection, - READ_ONE_EVENT_HANDLER_QUERY, - q -> q.addParameter(name).executeAndFetchFirst(EventHandler.class)); - } - - /** - * Check if a {@link WorkflowDef} with the same {@literal name} and {@literal version} already - * exist. - * - * @param connection The {@link Connection} to use for queries. - * @param def The {@code WorkflowDef} to check for. - * @return {@literal true} if a {@code WorkflowDef} already exists with the same values. - */ - private Boolean workflowExists(Connection connection, WorkflowDef def) { - final String CHECK_WORKFLOW_DEF_EXISTS_QUERY = - "SELECT COUNT(*) FROM meta_workflow_def WHERE name = ? AND " + "version = ?"; - - return query( - connection, - CHECK_WORKFLOW_DEF_EXISTS_QUERY, - q -> q.addParameter(def.getName()).addParameter(def.getVersion()).exists()); - } - - /** - * Return the latest version that exists for the provided {@code name}. - * - * @param tx The {@link Connection} to use for queries. - * @param name The {@code name} to check for. - * @return {@code Optional.empty()} if no versions exist, otherwise the max {@link - * WorkflowDef#getVersion} found. - */ - private Optional getLatestVersion(Connection tx, String name) { - final String GET_LATEST_WORKFLOW_DEF_VERSION = - "SELECT max(version) AS version FROM meta_workflow_def WHERE " + "name = ?"; - - Integer val = - query( - tx, - GET_LATEST_WORKFLOW_DEF_VERSION, - q -> { - q.addParameter(name); - return q.executeAndFetch( - rs -> { - if (!rs.next()) { - return null; - } - - return rs.getInt(1); - }); - }); - - return Optional.ofNullable(val); - } - - /** - * Update the latest version for the workflow with name {@code WorkflowDef} to the version - * provided in {@literal version}. - * - * @param tx The {@link Connection} to use for queries. - * @param name Workflow def name to update - * @param version The new latest {@code version} value. - */ - private void updateLatestVersion(Connection tx, String name, int version) { - final String UPDATE_WORKFLOW_DEF_LATEST_VERSION_QUERY = - "UPDATE meta_workflow_def SET latest_version = ? " + "WHERE name = ?"; - - execute( - tx, - UPDATE_WORKFLOW_DEF_LATEST_VERSION_QUERY, - q -> q.addParameter(version).addParameter(name).executeUpdate()); - } - - private void insertOrUpdateWorkflowDef(Connection tx, WorkflowDef def) { - final String INSERT_WORKFLOW_DEF_QUERY = - "INSERT INTO meta_workflow_def (name, version, json_data) VALUES (?," + " ?, ?)"; - - Optional version = getLatestVersion(tx, def.getName()); - if (!workflowExists(tx, def)) { - execute( - tx, - INSERT_WORKFLOW_DEF_QUERY, - q -> - q.addParameter(def.getName()) - .addParameter(def.getVersion()) - .addJsonParameter(def) - .executeUpdate()); - } else { - // @formatter:off - final String UPDATE_WORKFLOW_DEF_QUERY = - "UPDATE meta_workflow_def " - + "SET json_data = ?, modified_on = CURRENT_TIMESTAMP " - + "WHERE name = ? AND version = ?"; - // @formatter:on - - execute( - tx, - UPDATE_WORKFLOW_DEF_QUERY, - q -> - q.addJsonParameter(def) - .addParameter(def.getName()) - .addParameter(def.getVersion()) - .executeUpdate()); - } - int maxVersion = def.getVersion(); - if (version.isPresent() && version.get() > def.getVersion()) { - maxVersion = version.get(); - } - - updateLatestVersion(tx, def.getName(), maxVersion); - } - - /** - * Query persistence for all defined {@link TaskDef} data, and cache it in {@link - * #taskDefCache}. - */ - private void refreshTaskDefs() { - try { - withTransaction( - tx -> { - Map map = new HashMap<>(); - findAllTaskDefs(tx).forEach(taskDef -> map.put(taskDef.getName(), taskDef)); - - synchronized (taskDefCache) { - taskDefCache.clear(); - taskDefCache.putAll(map); - } - - if (logger.isTraceEnabled()) { - logger.trace("Refreshed {} TaskDefs", taskDefCache.size()); - } - }); - } catch (Exception e) { - Monitors.error(CLASS_NAME, "refreshTaskDefs"); - logger.error("refresh TaskDefs failed ", e); - } - } - - /** - * Query persistence for all defined {@link TaskDef} data. - * - * @param tx The {@link Connection} to use for queries. - * @return A new {@code List} with all the {@code TaskDef} data that was retrieved. - */ - private List findAllTaskDefs(Connection tx) { - final String READ_ALL_TASKDEF_QUERY = "SELECT json_data FROM meta_task_def"; - - return query(tx, READ_ALL_TASKDEF_QUERY, q -> q.executeAndFetch(TaskDef.class)); - } - - /** - * Explicitly retrieves a {@link TaskDef} from persistence, avoiding {@link #taskDefCache}. - * - * @param name The name of the {@code TaskDef} to query for. - * @return {@literal null} if nothing is found, otherwise the {@code TaskDef}. - */ - private TaskDef getTaskDefFromDB(String name) { - final String READ_ONE_TASKDEF_QUERY = "SELECT json_data FROM meta_task_def WHERE name = ?"; - - return queryWithTransaction( - READ_ONE_TASKDEF_QUERY, - q -> q.addParameter(name).executeAndFetchFirst(TaskDef.class)); - } - - private String insertOrUpdateTaskDef(TaskDef taskDef) { - final String UPDATE_TASKDEF_QUERY = - "UPDATE meta_task_def SET json_data = ?, modified_on = CURRENT_TIMESTAMP WHERE name = ?"; - - final String INSERT_TASKDEF_QUERY = - "INSERT INTO meta_task_def (name, json_data) VALUES (?, ?)"; - - return getWithRetriedTransactions( - tx -> { - execute( - tx, - UPDATE_TASKDEF_QUERY, - update -> { - int result = - update.addJsonParameter(taskDef) - .addParameter(taskDef.getName()) - .executeUpdate(); - if (result == 0) { - execute( - tx, - INSERT_TASKDEF_QUERY, - insert -> - insert.addParameter(taskDef.getName()) - .addJsonParameter(taskDef) - .executeUpdate()); - } - }); - - taskDefCache.put(taskDef.getName(), taskDef); - return taskDef.getName(); - }); - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLQueueDAO.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLQueueDAO.java deleted file mode 100644 index e6164eab7..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/dao/MySQLQueueDAO.java +++ /dev/null @@ -1,392 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.dao; - -import java.sql.Connection; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import javax.sql.DataSource; - -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.dao.QueueDAO; -import com.netflix.conductor.mysql.util.Query; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.google.common.util.concurrent.Uninterruptibles; - -public class MySQLQueueDAO extends MySQLBaseDAO implements QueueDAO { - - private static final Long UNACK_SCHEDULE_MS = 60_000L; - - public MySQLQueueDAO(ObjectMapper objectMapper, DataSource dataSource) { - super(objectMapper, dataSource); - - Executors.newSingleThreadScheduledExecutor() - .scheduleAtFixedRate( - this::processAllUnacks, - UNACK_SCHEDULE_MS, - UNACK_SCHEDULE_MS, - TimeUnit.MILLISECONDS); - logger.debug(MySQLQueueDAO.class.getName() + " is ready to serve"); - } - - @Override - public void push(String queueName, String messageId, long offsetTimeInSecond) { - push(queueName, messageId, 0, offsetTimeInSecond); - } - - @Override - public void push(String queueName, String messageId, int priority, long offsetTimeInSecond) { - withTransaction( - tx -> pushMessage(tx, queueName, messageId, null, priority, offsetTimeInSecond)); - } - - @Override - public void push(String queueName, List messages) { - withTransaction( - tx -> - messages.forEach( - message -> - pushMessage( - tx, - queueName, - message.getId(), - message.getPayload(), - message.getPriority(), - 0))); - } - - @Override - public boolean pushIfNotExists(String queueName, String messageId, long offsetTimeInSecond) { - return pushIfNotExists(queueName, messageId, 0, offsetTimeInSecond); - } - - @Override - public boolean pushIfNotExists( - String queueName, String messageId, int priority, long offsetTimeInSecond) { - return getWithRetriedTransactions( - tx -> { - if (!existsMessage(tx, queueName, messageId)) { - pushMessage(tx, queueName, messageId, null, priority, offsetTimeInSecond); - return true; - } - return false; - }); - } - - @Override - public List pop(String queueName, int count, int timeout) { - List messages = - getWithTransactionWithOutErrorPropagation( - tx -> popMessages(tx, queueName, count, timeout)); - if (messages == null) { - return new ArrayList<>(); - } - return messages.stream().map(Message::getId).collect(Collectors.toList()); - } - - @Override - public List pollMessages(String queueName, int count, int timeout) { - List messages = - getWithTransactionWithOutErrorPropagation( - tx -> popMessages(tx, queueName, count, timeout)); - if (messages == null) { - return new ArrayList<>(); - } - return messages; - } - - @Override - public void remove(String queueName, String messageId) { - withTransaction(tx -> removeMessage(tx, queueName, messageId)); - } - - @Override - public int getSize(String queueName) { - final String GET_QUEUE_SIZE = "SELECT COUNT(*) FROM queue_message WHERE queue_name = ?"; - return queryWithTransaction( - GET_QUEUE_SIZE, q -> ((Long) q.addParameter(queueName).executeCount()).intValue()); - } - - @Override - public boolean ack(String queueName, String messageId) { - return getWithRetriedTransactions(tx -> removeMessage(tx, queueName, messageId)); - } - - @Override - public boolean setUnackTimeout(String queueName, String messageId, long unackTimeout) { - long updatedOffsetTimeInSecond = unackTimeout / 1000; - - final String UPDATE_UNACK_TIMEOUT = - "UPDATE queue_message SET offset_time_seconds = ?, deliver_on = TIMESTAMPADD(SECOND, ?, CURRENT_TIMESTAMP) WHERE queue_name = ? AND message_id = ?"; - - return queryWithTransaction( - UPDATE_UNACK_TIMEOUT, - q -> - q.addParameter(updatedOffsetTimeInSecond) - .addParameter(updatedOffsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .executeUpdate()) - == 1; - } - - @Override - public void flush(String queueName) { - final String FLUSH_QUEUE = "DELETE FROM queue_message WHERE queue_name = ?"; - executeWithTransaction(FLUSH_QUEUE, q -> q.addParameter(queueName).executeDelete()); - } - - @Override - public Map queuesDetail() { - final String GET_QUEUES_DETAIL = - "SELECT queue_name, (SELECT count(*) FROM queue_message WHERE popped = false AND queue_name = q.queue_name) AS size FROM queue q"; - return queryWithTransaction( - GET_QUEUES_DETAIL, - q -> - q.executeAndFetch( - rs -> { - Map detail = Maps.newHashMap(); - while (rs.next()) { - String queueName = rs.getString("queue_name"); - Long size = rs.getLong("size"); - detail.put(queueName, size); - } - return detail; - })); - } - - @Override - public Map>> queuesDetailVerbose() { - // @formatter:off - final String GET_QUEUES_DETAIL_VERBOSE = - "SELECT queue_name, \n" - + " (SELECT count(*) FROM queue_message WHERE popped = false AND queue_name = q.queue_name) AS size,\n" - + " (SELECT count(*) FROM queue_message WHERE popped = true AND queue_name = q.queue_name) AS uacked \n" - + "FROM queue q"; - // @formatter:on - - return queryWithTransaction( - GET_QUEUES_DETAIL_VERBOSE, - q -> - q.executeAndFetch( - rs -> { - Map>> result = - Maps.newHashMap(); - while (rs.next()) { - String queueName = rs.getString("queue_name"); - Long size = rs.getLong("size"); - Long queueUnacked = rs.getLong("uacked"); - result.put( - queueName, - ImmutableMap.of( - "a", - ImmutableMap - .of( // sharding not implemented, - // returning only - // one shard with all the - // info - "size", - size, - "uacked", - queueUnacked))); - } - return result; - })); - } - - /** - * Un-pop all un-acknowledged messages for all queues. - * - * @since 1.11.6 - */ - public void processAllUnacks() { - - logger.trace("processAllUnacks started"); - - final String PROCESS_ALL_UNACKS = - "UPDATE queue_message SET popped = false WHERE popped = true AND TIMESTAMPADD(SECOND,-60,CURRENT_TIMESTAMP) > deliver_on"; - executeWithTransaction(PROCESS_ALL_UNACKS, Query::executeUpdate); - } - - @Override - public void processUnacks(String queueName) { - final String PROCESS_UNACKS = - "UPDATE queue_message SET popped = false WHERE queue_name = ? AND popped = true AND TIMESTAMPADD(SECOND,-60,CURRENT_TIMESTAMP) > deliver_on"; - executeWithTransaction(PROCESS_UNACKS, q -> q.addParameter(queueName).executeUpdate()); - } - - @Override - public boolean resetOffsetTime(String queueName, String messageId) { - long offsetTimeInSecond = 0; // Reset to 0 - final String SET_OFFSET_TIME = - "UPDATE queue_message SET offset_time_seconds = ?, deliver_on = TIMESTAMPADD(SECOND,?,CURRENT_TIMESTAMP) \n" - + "WHERE queue_name = ? AND message_id = ?"; - - return queryWithTransaction( - SET_OFFSET_TIME, - q -> - q.addParameter(offsetTimeInSecond) - .addParameter(offsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .executeUpdate() - == 1); - } - - private boolean existsMessage(Connection connection, String queueName, String messageId) { - final String EXISTS_MESSAGE = - "SELECT EXISTS(SELECT 1 FROM queue_message WHERE queue_name = ? AND message_id = ?)"; - return query( - connection, - EXISTS_MESSAGE, - q -> q.addParameter(queueName).addParameter(messageId).exists()); - } - - private void pushMessage( - Connection connection, - String queueName, - String messageId, - String payload, - Integer priority, - long offsetTimeInSecond) { - - createQueueIfNotExists(connection, queueName); - - String UPDATE_MESSAGE = - "UPDATE queue_message SET payload=?, deliver_on=TIMESTAMPADD(SECOND,?,CURRENT_TIMESTAMP) WHERE queue_name = ? AND message_id = ?"; - int rowsUpdated = - query( - connection, - UPDATE_MESSAGE, - q -> - q.addParameter(payload) - .addParameter(offsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .executeUpdate()); - - if (rowsUpdated == 0) { - String PUSH_MESSAGE = - "INSERT INTO queue_message (deliver_on, queue_name, message_id, priority, offset_time_seconds, payload) VALUES (TIMESTAMPADD(SECOND,?,CURRENT_TIMESTAMP), ?, ?,?,?,?) ON DUPLICATE KEY UPDATE payload=VALUES(payload), deliver_on=VALUES(deliver_on)"; - execute( - connection, - PUSH_MESSAGE, - q -> - q.addParameter(offsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .addParameter(priority) - .addParameter(offsetTimeInSecond) - .addParameter(payload) - .executeUpdate()); - } - } - - private boolean removeMessage(Connection connection, String queueName, String messageId) { - final String REMOVE_MESSAGE = - "DELETE FROM queue_message WHERE queue_name = ? AND message_id = ?"; - return query( - connection, - REMOVE_MESSAGE, - q -> q.addParameter(queueName).addParameter(messageId).executeDelete()); - } - - private List peekMessages(Connection connection, String queueName, int count) { - if (count < 1) { - return Collections.emptyList(); - } - - final String PEEK_MESSAGES = - "SELECT message_id, priority, payload FROM queue_message use index(combo_queue_message) WHERE queue_name = ? AND popped = false AND deliver_on <= TIMESTAMPADD(MICROSECOND, 1000, CURRENT_TIMESTAMP) ORDER BY priority DESC, deliver_on, created_on LIMIT ?"; - - return query( - connection, - PEEK_MESSAGES, - p -> - p.addParameter(queueName) - .addParameter(count) - .executeAndFetch( - rs -> { - List results = new ArrayList<>(); - while (rs.next()) { - Message m = new Message(); - m.setId(rs.getString("message_id")); - m.setPriority(rs.getInt("priority")); - m.setPayload(rs.getString("payload")); - results.add(m); - } - return results; - })); - } - - private List popMessages( - Connection connection, String queueName, int count, int timeout) { - long start = System.currentTimeMillis(); - List messages = peekMessages(connection, queueName, count); - - while (messages.size() < count && ((System.currentTimeMillis() - start) < timeout)) { - Uninterruptibles.sleepUninterruptibly(200, TimeUnit.MILLISECONDS); - messages = peekMessages(connection, queueName, count); - } - - if (messages.isEmpty()) { - return messages; - } - - List poppedMessages = new ArrayList<>(); - for (Message message : messages) { - final String POP_MESSAGE = - "UPDATE queue_message SET popped = true WHERE queue_name = ? AND message_id = ? AND popped = false"; - int result = - query( - connection, - POP_MESSAGE, - q -> - q.addParameter(queueName) - .addParameter(message.getId()) - .executeUpdate()); - - if (result == 1) { - poppedMessages.add(message); - } - } - return poppedMessages; - } - - private void createQueueIfNotExists(Connection connection, String queueName) { - logger.trace("Creating new queue '{}'", queueName); - final String EXISTS_QUEUE = "SELECT EXISTS(SELECT 1 FROM queue WHERE queue_name = ?)"; - boolean exists = query(connection, EXISTS_QUEUE, q -> q.addParameter(queueName).exists()); - if (!exists) { - final String CREATE_QUEUE = "INSERT IGNORE INTO queue (queue_name) VALUES (?)"; - execute(connection, CREATE_QUEUE, q -> q.addParameter(queueName).executeUpdate()); - } - } - - @Override - public boolean containsMessage(String queueName, String messageId) { - final String EXISTS_QUEUE = - "SELECT EXISTS(SELECT 1 FROM queue_message WHERE queue_name = ? AND message_id = ? )"; - return queryWithTransaction( - EXISTS_QUEUE, q -> q.addParameter(queueName).addParameter(messageId).exists()); - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/LazyToString.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/LazyToString.java deleted file mode 100644 index 52aea4321..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/LazyToString.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.util; - -import java.util.function.Supplier; - -/** Functional class to support the lazy execution of a String result. */ -public class LazyToString { - - private final Supplier supplier; - - /** @param supplier Supplier to execute when {@link #toString()} is called. */ - public LazyToString(Supplier supplier) { - this.supplier = supplier; - } - - @Override - public String toString() { - return supplier.get(); - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/Query.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/Query.java deleted file mode 100644 index 64a52cf2e..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/Query.java +++ /dev/null @@ -1,624 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.util; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.Date; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.commons.lang3.math.NumberUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.core.exception.ApplicationException.Code; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Represents a {@link PreparedStatement} that is wrapped with convenience methods and utilities. - * - *

This class simulates a parameter building pattern and all {@literal addParameter(*)} methods - * must be called in the proper order of their expected binding sequence. - * - * @author mustafa - */ -public class Query implements AutoCloseable { - private final Logger logger = LoggerFactory.getLogger(getClass()); - - /** The {@link ObjectMapper} instance to use for serializing/deserializing JSON. */ - protected final ObjectMapper objectMapper; - - /** The initial supplied query String that was used to prepare {@link #statement}. */ - private final String rawQuery; - - /** - * Parameter index for the {@code ResultSet#set*(*)} methods, gets incremented every time a - * parameter is added to the {@code PreparedStatement} {@link #statement}. - */ - private final AtomicInteger index = new AtomicInteger(1); - - /** The {@link PreparedStatement} that will be managed and executed by this class. */ - private final PreparedStatement statement; - - public Query(ObjectMapper objectMapper, Connection connection, String query) { - this.rawQuery = query; - this.objectMapper = objectMapper; - - try { - this.statement = connection.prepareStatement(query); - } catch (SQLException ex) { - throw new ApplicationException( - Code.BACKEND_ERROR, - "Cannot prepare statement for query: " + ex.getMessage(), - ex); - } - } - - /** - * Generate a String with {@literal count} number of '?' placeholders for {@link - * PreparedStatement} queries. - * - * @param count The number of '?' chars to generate. - * @return a comma delimited string of {@literal count} '?' binding placeholders. - */ - public static String generateInBindings(int count) { - String[] questions = new String[count]; - for (int i = 0; i < count; i++) { - questions[i] = "?"; - } - - return String.join(", ", questions); - } - - public Query addParameter(final String value) { - return addParameterInternal((ps, idx) -> ps.setString(idx, value)); - } - - public Query addParameter(final int value) { - return addParameterInternal((ps, idx) -> ps.setInt(idx, value)); - } - - public Query addParameter(final boolean value) { - return addParameterInternal(((ps, idx) -> ps.setBoolean(idx, value))); - } - - public Query addParameter(final long value) { - return addParameterInternal((ps, idx) -> ps.setLong(idx, value)); - } - - public Query addParameter(final double value) { - return addParameterInternal((ps, idx) -> ps.setDouble(idx, value)); - } - - public Query addParameter(Date date) { - return addParameterInternal((ps, idx) -> ps.setDate(idx, date)); - } - - public Query addParameter(Timestamp timestamp) { - return addParameterInternal((ps, idx) -> ps.setTimestamp(idx, timestamp)); - } - - /** - * Serializes {@literal value} to a JSON string for persistence. - * - * @param value The value to serialize. - * @return {@literal this} - */ - public Query addJsonParameter(Object value) { - return addParameter(toJson(value)); - } - - /** - * Bind the given {@link java.util.Date} to the PreparedStatement as a {@link java.sql.Date}. - * - * @param date The {@literal java.util.Date} to bind. - * @return {@literal this} - */ - public Query addDateParameter(java.util.Date date) { - return addParameter(new Date(date.getTime())); - } - - /** - * Bind the given {@link java.util.Date} to the PreparedStatement as a {@link - * java.sql.Timestamp}. - * - * @param date The {@literal java.util.Date} to bind. - * @return {@literal this} - */ - public Query addTimestampParameter(java.util.Date date) { - return addParameter(new Timestamp(date.getTime())); - } - - /** - * Bind the given epoch millis to the PreparedStatement as a {@link java.sql.Timestamp}. - * - * @param epochMillis The epoch ms to create a new {@literal Timestamp} from. - * @return {@literal this} - */ - public Query addTimestampParameter(long epochMillis) { - return addParameter(new Timestamp(epochMillis)); - } - - /** - * Add a collection of primitive values at once, in the order of the collection. - * - * @param values The values to bind to the prepared statement. - * @return {@literal this} - * @throws IllegalArgumentException If a non-primitive/unsupported type is encountered in the - * collection. - * @see #addParameters(Object...) - */ - public Query addParameters(Collection values) { - return addParameters(values.toArray()); - } - - /** - * Add many primitive values at once. - * - * @param values The values to bind to the prepared statement. - * @return {@literal this} - * @throws IllegalArgumentException If a non-primitive/unsupported type is encountered. - */ - public Query addParameters(Object... values) { - for (Object v : values) { - if (v instanceof String) { - addParameter((String) v); - } else if (v instanceof Integer) { - addParameter((Integer) v); - } else if (v instanceof Long) { - addParameter((Long) v); - } else if (v instanceof Double) { - addParameter((Double) v); - } else if (v instanceof Boolean) { - addParameter((Boolean) v); - } else if (v instanceof Date) { - addParameter((Date) v); - } else if (v instanceof Timestamp) { - addParameter((Timestamp) v); - } else { - throw new IllegalArgumentException( - "Type " - + v.getClass().getName() - + " is not supported by automatic property assignment"); - } - } - - return this; - } - - /** - * Utility method for evaluating the prepared statement as a query to check the existence of a - * record using a numeric count or boolean return value. - * - *

The {@link #rawQuery} provided must result in a {@link Number} or {@link Boolean} result. - * - * @return {@literal true} If a count query returned more than 0 or an exists query returns - * {@literal true}. - * @throws ApplicationException If an unexpected return type cannot be evaluated to a {@code - * Boolean} result. - */ - public boolean exists() { - Object val = executeScalar(); - if (null == val) { - return false; - } - - if (val instanceof Number) { - return convertLong(val) > 0; - } - - if (val instanceof Boolean) { - return (Boolean) val; - } - - if (val instanceof String) { - return convertBoolean(val); - } - - throw new ApplicationException( - Code.BACKEND_ERROR, - "Expected a Numeric or Boolean scalar return value from the query, received " - + val.getClass().getName()); - } - - /** - * Convenience method for executing delete statements. - * - * @return {@literal true} if the statement affected 1 or more rows. - * @see #executeUpdate() - */ - public boolean executeDelete() { - int count = executeUpdate(); - if (count > 1) { - logger.trace("Removed {} row(s) for query {}", count, rawQuery); - } - - return count > 0; - } - - /** - * Convenience method for executing statements that return a single numeric value, typically - * {@literal SELECT COUNT...} style queries. - * - * @return The result of the query as a {@literal long}. - */ - public long executeCount() { - return executeScalar(Long.class); - } - - /** @return The result of {@link PreparedStatement#executeUpdate()} */ - public int executeUpdate() { - try { - - Long start = null; - if (logger.isTraceEnabled()) { - start = System.currentTimeMillis(); - } - - final int val = this.statement.executeUpdate(); - - if (null != start && logger.isTraceEnabled()) { - long end = System.currentTimeMillis(); - logger.trace("[{}ms] {}: {}", (end - start), val, rawQuery); - } - - return val; - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex.getMessage(), ex); - } - } - - /** - * Execute a query from the PreparedStatement and return the ResultSet. - * - *

NOTE: The returned ResultSet must be closed/managed by the calling methods. - * - * @return {@link PreparedStatement#executeQuery()} - * @throws ApplicationException If any SQL errors occur. - */ - public ResultSet executeQuery() { - Long start = null; - if (logger.isTraceEnabled()) { - start = System.currentTimeMillis(); - } - - try { - return this.statement.executeQuery(); - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } finally { - if (null != start && logger.isTraceEnabled()) { - long end = System.currentTimeMillis(); - logger.trace("[{}ms] {}", (end - start), rawQuery); - } - } - } - - /** @return The single result of the query as an Object. */ - public Object executeScalar() { - try (ResultSet rs = executeQuery()) { - if (!rs.next()) { - return null; - } - return rs.getObject(1); - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the PreparedStatement and return a single 'primitive' value from the ResultSet. - * - * @param returnType The type to return. - * @param The type parameter to return a List of. - * @return A single result from the execution of the statement, as a type of {@literal - * returnType}. - * @throws ApplicationException {@literal returnType} is unsupported, cannot be cast to from the - * result, or any SQL errors occur. - */ - public V executeScalar(Class returnType) { - try (ResultSet rs = executeQuery()) { - if (!rs.next()) { - Object value = null; - if (Integer.class == returnType) { - value = 0; - } else if (Long.class == returnType) { - value = 0L; - } else if (Boolean.class == returnType) { - value = false; - } - return returnType.cast(value); - } else { - return getScalarFromResultSet(rs, returnType); - } - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the PreparedStatement and return a List of 'primitive' values from the ResultSet. - * - * @param returnType The type Class return a List of. - * @param The type parameter to return a List of. - * @return A {@code List}. - * @throws ApplicationException {@literal returnType} is unsupported, cannot be cast to from the - * result, or any SQL errors occur. - */ - public List executeScalarList(Class returnType) { - try (ResultSet rs = executeQuery()) { - List values = new ArrayList<>(); - while (rs.next()) { - values.add(getScalarFromResultSet(rs, returnType)); - } - return values; - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the statement and return only the first record from the result set. - * - * @param returnType The Class to return. - * @param The type parameter. - * @return An instance of {@literal } from the result set. - */ - public V executeAndFetchFirst(Class returnType) { - Object o = executeScalar(); - if (null == o) { - return null; - } - return convert(o, returnType); - } - - /** - * Execute the PreparedStatement and return a List of {@literal returnType} values from the - * ResultSet. - * - * @param returnType The type Class return a List of. - * @param The type parameter to return a List of. - * @return A {@code List}. - * @throws ApplicationException {@literal returnType} is unsupported, cannot be cast to from the - * result, or any SQL errors occur. - */ - public List executeAndFetch(Class returnType) { - try (ResultSet rs = executeQuery()) { - List list = new ArrayList<>(); - while (rs.next()) { - list.add(convert(rs.getObject(1), returnType)); - } - return list; - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the query and pass the {@link ResultSet} to the given handler. - * - * @param handler The {@link ResultSetHandler} to execute. - * @param The return type of this method. - * @return The results of {@link ResultSetHandler#apply(ResultSet)}. - */ - public V executeAndFetch(ResultSetHandler handler) { - try (ResultSet rs = executeQuery()) { - return handler.apply(rs); - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - @Override - public void close() { - try { - if (null != statement && !statement.isClosed()) { - statement.close(); - } - } catch (SQLException ex) { - logger.warn("Error closing prepared statement: {}", ex.getMessage()); - } - } - - protected final Query addParameterInternal(InternalParameterSetter setter) { - int index = getAndIncrementIndex(); - try { - setter.apply(this.statement, index); - return this; - } catch (SQLException ex) { - throw new ApplicationException( - Code.BACKEND_ERROR, "Could not apply bind parameter at index " + index, ex); - } - } - - protected V getScalarFromResultSet(ResultSet rs, Class returnType) throws SQLException { - Object value = null; - - if (Integer.class == returnType) { - value = rs.getInt(1); - } else if (Long.class == returnType) { - value = rs.getLong(1); - } else if (String.class == returnType) { - value = rs.getString(1); - } else if (Boolean.class == returnType) { - value = rs.getBoolean(1); - } else if (Double.class == returnType) { - value = rs.getDouble(1); - } else if (Date.class == returnType) { - value = rs.getDate(1); - } else if (Timestamp.class == returnType) { - value = rs.getTimestamp(1); - } else { - value = rs.getObject(1); - } - - if (null == value) { - throw new NullPointerException( - "Cannot get value from ResultSet of type " + returnType.getName()); - } - - return returnType.cast(value); - } - - protected V convert(Object value, Class returnType) { - if (Boolean.class == returnType) { - return returnType.cast(convertBoolean(value)); - } else if (Integer.class == returnType) { - return returnType.cast(convertInt(value)); - } else if (Long.class == returnType) { - return returnType.cast(convertLong(value)); - } else if (Double.class == returnType) { - return returnType.cast(convertDouble(value)); - } else if (String.class == returnType) { - return returnType.cast(convertString(value)); - } else if (value instanceof String) { - return fromJson((String) value, returnType); - } - - final String vName = value.getClass().getName(); - final String rName = returnType.getName(); - throw new ApplicationException( - Code.BACKEND_ERROR, "Cannot convert type " + vName + " to " + rName); - } - - protected Integer convertInt(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Integer) { - return (Integer) value; - } - - if (value instanceof Number) { - return ((Number) value).intValue(); - } - - return NumberUtils.toInt(value.toString()); - } - - protected Double convertDouble(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Double) { - return (Double) value; - } - - if (value instanceof Number) { - return ((Number) value).doubleValue(); - } - - return NumberUtils.toDouble(value.toString()); - } - - protected Long convertLong(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Long) { - return (Long) value; - } - - if (value instanceof Number) { - return ((Number) value).longValue(); - } - return NumberUtils.toLong(value.toString()); - } - - protected String convertString(Object value) { - if (null == value) { - return null; - } - - if (value instanceof String) { - return (String) value; - } - - return value.toString().trim(); - } - - protected Boolean convertBoolean(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Boolean) { - return (Boolean) value; - } - - if (value instanceof Number) { - return ((Number) value).intValue() != 0; - } - - String text = value.toString().trim(); - return "Y".equalsIgnoreCase(text) - || "YES".equalsIgnoreCase(text) - || "TRUE".equalsIgnoreCase(text) - || "T".equalsIgnoreCase(text) - || "1".equalsIgnoreCase(text); - } - - protected String toJson(Object value) { - if (null == value) { - return null; - } - - try { - return objectMapper.writeValueAsString(value); - } catch (JsonProcessingException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - protected V fromJson(String value, Class returnType) { - if (null == value) { - return null; - } - - try { - return objectMapper.readValue(value, returnType); - } catch (IOException ex) { - throw new ApplicationException( - Code.BACKEND_ERROR, - "Could not convert JSON '" + value + "' to " + returnType.getName(), - ex); - } - } - - protected final int getIndex() { - return index.get(); - } - - protected final int getAndIncrementIndex() { - return index.getAndIncrement(); - } - - @FunctionalInterface - private interface InternalParameterSetter { - - void apply(PreparedStatement ps, int idx) throws SQLException; - } -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/QueryFunction.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/QueryFunction.java deleted file mode 100644 index 6a0755072..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/QueryFunction.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.util; - -import java.sql.SQLException; - -/** - * Functional interface for {@link Query} executions that return results. - * - * @author mustafa - */ -@FunctionalInterface -public interface QueryFunction { - - R apply(Query query) throws SQLException; -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ResultSetHandler.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ResultSetHandler.java deleted file mode 100644 index 7e7b422b3..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/ResultSetHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.util; - -import java.sql.ResultSet; -import java.sql.SQLException; - -/** - * Functional interface for {@link Query#executeAndFetch(ResultSetHandler)}. - * - * @author mustafa - */ -@FunctionalInterface -public interface ResultSetHandler { - - R apply(ResultSet resultSet) throws SQLException; -} diff --git a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/TransactionalFunction.java b/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/TransactionalFunction.java deleted file mode 100644 index aad7a1f90..000000000 --- a/mysql-persistence/src/main/java/com/netflix/conductor/mysql/util/TransactionalFunction.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.util; - -import java.sql.Connection; -import java.sql.SQLException; - -/** - * Functional interface for operations within a transactional context. - * - * @author mustafa - */ -@FunctionalInterface -public interface TransactionalFunction { - - R apply(Connection tx) throws SQLException; -} diff --git a/mysql-persistence/src/main/resources/db/migration/V1__initial_schema.sql b/mysql-persistence/src/main/resources/db/migration/V1__initial_schema.sql deleted file mode 100644 index 246b55ecd..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V1__initial_schema.sql +++ /dev/null @@ -1,172 +0,0 @@ - --- -------------------------------------------------------------------------------------------------------------- --- SCHEMA FOR METADATA DAO --- -------------------------------------------------------------------------------------------------------------- - -CREATE TABLE meta_event_handler ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - name varchar(255) NOT NULL, - event varchar(255) NOT NULL, - active boolean NOT NULL, - json_data mediumtext NOT NULL, - PRIMARY KEY (id), - KEY event_handler_name_index (name), - KEY event_handler_event_index (event) -); - -CREATE TABLE meta_task_def ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - name varchar(255) NOT NULL, - json_data mediumtext NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_task_def_name (name) -); - -CREATE TABLE meta_workflow_def ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - name varchar(255) NOT NULL, - version int(11) NOT NULL, - latest_version int(11) NOT NULL DEFAULT 0, - json_data mediumtext NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_name_version (name,version), - KEY workflow_def_name_index (name) -); - --- -------------------------------------------------------------------------------------------------------------- --- SCHEMA FOR EXECUTION DAO --- -------------------------------------------------------------------------------------------------------------- - -CREATE TABLE event_execution ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - event_handler_name varchar(255) NOT NULL, - event_name varchar(255) NOT NULL, - message_id varchar(255) NOT NULL, - execution_id varchar(255) NOT NULL, - json_data mediumtext NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_event_execution (event_handler_name,event_name,message_id) -); - -CREATE TABLE poll_data ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - queue_name varchar(255) NOT NULL, - domain varchar(255) NOT NULL, - json_data mediumtext NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_poll_data (queue_name,domain), - KEY (queue_name) -); - -CREATE TABLE task_scheduled ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_id varchar(255) NOT NULL, - task_key varchar(255) NOT NULL, - task_id varchar(255) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_workflow_id_task_key (workflow_id,task_key) -); - -CREATE TABLE task_in_progress ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - task_def_name varchar(255) NOT NULL, - task_id varchar(255) NOT NULL, - workflow_id varchar(255) NOT NULL, - in_progress_status boolean NOT NULL DEFAULT false, - PRIMARY KEY (id), - UNIQUE KEY unique_task_def_task_id1 (task_def_name,task_id) -); - -CREATE TABLE task ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - task_id varchar(255) NOT NULL, - json_data mediumtext NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_task_id (task_id) -); - -CREATE TABLE workflow ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_id varchar(255) NOT NULL, - correlation_id varchar(255), - json_data mediumtext NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_workflow_id (workflow_id) -); - -CREATE TABLE workflow_def_to_workflow ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_def varchar(255) NOT NULL, - date_str integer NOT NULL, - workflow_id varchar(255) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_workflow_def_date_str (workflow_def,date_str,workflow_id) -); - -CREATE TABLE workflow_pending ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_type varchar(255) NOT NULL, - workflow_id varchar(255) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_workflow_type_workflow_id (workflow_type,workflow_id), - KEY workflow_type_index (workflow_type) -); - -CREATE TABLE workflow_to_task ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_id varchar(255) NOT NULL, - task_id varchar(255) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_workflow_to_task_id (workflow_id,task_id), - KEY workflow_id_index (workflow_id) -); - --- -------------------------------------------------------------------------------------------------------------- --- SCHEMA FOR QUEUE DAO --- -------------------------------------------------------------------------------------------------------------- - -CREATE TABLE queue ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - queue_name varchar(255) NOT NULL, - PRIMARY KEY (id), - UNIQUE KEY unique_queue_name (queue_name) -); - -CREATE TABLE queue_message ( - id int(11) unsigned NOT NULL AUTO_INCREMENT, - created_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - deliver_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - queue_name varchar(255) NOT NULL, - message_id varchar(255) NOT NULL, - popped boolean DEFAULT false, - offset_time_seconds long, - payload mediumtext, - PRIMARY KEY (id), - UNIQUE KEY unique_queue_name_message_id (queue_name,message_id), - KEY combo_queue_message (queue_name,popped,deliver_on,created_on) -); diff --git a/mysql-persistence/src/main/resources/db/migration/V2__queue_message_timestamps.sql b/mysql-persistence/src/main/resources/db/migration/V2__queue_message_timestamps.sql deleted file mode 100644 index ecf7956be..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V2__queue_message_timestamps.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `queue_message` CHANGE `created_on` `created_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP; -ALTER TABLE `queue_message` CHANGE `deliver_on` `deliver_on` TIMESTAMP DEFAULT CURRENT_TIMESTAMP; diff --git a/mysql-persistence/src/main/resources/db/migration/V3__queue_add_priority.sql b/mysql-persistence/src/main/resources/db/migration/V3__queue_add_priority.sql deleted file mode 100644 index 2764df8b3..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V3__queue_add_priority.sql +++ /dev/null @@ -1,17 +0,0 @@ -SET @dbname = DATABASE(); -SET @tablename = "queue_message"; -SET @columnname = "priority"; -SET @preparedStatement = (SELECT IF( - ( - SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS - WHERE - (table_name = @tablename) - AND (table_schema = @dbname) - AND (column_name = @columnname) - ) > 0, - "SELECT 1", - CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " TINYINT DEFAULT 0 AFTER `message_id`") -)); -PREPARE addColumnIfNotExist FROM @preparedStatement; -EXECUTE addColumnIfNotExist; -DEALLOCATE PREPARE addColumnIfNotExist; \ No newline at end of file diff --git a/mysql-persistence/src/main/resources/db/migration/V4__1009_Fix_MySQLExecutionDAO_Index.sql b/mysql-persistence/src/main/resources/db/migration/V4__1009_Fix_MySQLExecutionDAO_Index.sql deleted file mode 100644 index 8787961a8..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V4__1009_Fix_MySQLExecutionDAO_Index.sql +++ /dev/null @@ -1,14 +0,0 @@ -# Drop the 'unique_event_execution' index if it exists -SET @exist := (SELECT COUNT(INDEX_NAME) - FROM information_schema.STATISTICS - WHERE `TABLE_NAME` = 'event_execution' - AND `INDEX_NAME` = 'unique_event_execution' - AND TABLE_SCHEMA = database()); -SET @sqlstmt := IF(@exist > 0, 'ALTER TABLE `event_execution` DROP INDEX `unique_event_execution`', - 'SELECT ''INFO: Index already exists.'''); -PREPARE stmt FROM @sqlstmt; -EXECUTE stmt; - -# Create the 'unique_event_execution' index with execution_id column instead of 'message_id' so events can be executed multiple times. -ALTER TABLE `event_execution` - ADD CONSTRAINT `unique_event_execution` UNIQUE (event_handler_name, event_name, execution_id); diff --git a/mysql-persistence/src/main/resources/db/migration/V5__correlation_id_index.sql b/mysql-persistence/src/main/resources/db/migration/V5__correlation_id_index.sql deleted file mode 100644 index 2f13789f3..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V5__correlation_id_index.sql +++ /dev/null @@ -1,13 +0,0 @@ -# Drop the 'workflow_corr_id_index' index if it exists -SET @exist := (SELECT COUNT(INDEX_NAME) - FROM information_schema.STATISTICS - WHERE `TABLE_NAME` = 'workflow' - AND `INDEX_NAME` = 'workflow_corr_id_index' - AND TABLE_SCHEMA = database()); -SET @sqlstmt := IF(@exist > 0, 'ALTER TABLE `workflow` DROP INDEX `workflow_corr_id_index`', - 'SELECT ''INFO: Index already exists.'''); -PREPARE stmt FROM @sqlstmt; -EXECUTE stmt; - -# Create the 'workflow_corr_id_index' index with correlation_id column because correlation_id queries are slow in large databases. -CREATE INDEX workflow_corr_id_index ON workflow (correlation_id); diff --git a/mysql-persistence/src/main/resources/db/migration/V6__new_qm_index_with_priority.sql b/mysql-persistence/src/main/resources/db/migration/V6__new_qm_index_with_priority.sql deleted file mode 100644 index de591f972..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V6__new_qm_index_with_priority.sql +++ /dev/null @@ -1,13 +0,0 @@ -# Drop the 'combo_queue_message' index if it exists -SET @exist := (SELECT COUNT(INDEX_NAME) - FROM information_schema.STATISTICS - WHERE `TABLE_NAME` = 'queue_message' - AND `INDEX_NAME` = 'combo_queue_message' - AND TABLE_SCHEMA = database()); -SET @sqlstmt := IF(@exist > 0, 'ALTER TABLE `queue_message` DROP INDEX `combo_queue_message`', - 'SELECT ''INFO: Index already exists.'''); -PREPARE stmt FROM @sqlstmt; -EXECUTE stmt; - -# Re-create the 'combo_queue_message' index to add priority column because queries that order by priority are slow in large databases. -CREATE INDEX combo_queue_message ON queue_message (queue_name,priority,popped,deliver_on,created_on); diff --git a/mysql-persistence/src/main/resources/db/migration/V7__new_queue_message_pk.sql b/mysql-persistence/src/main/resources/db/migration/V7__new_queue_message_pk.sql deleted file mode 100644 index afad02024..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V7__new_queue_message_pk.sql +++ /dev/null @@ -1,24 +0,0 @@ -# no longer need separate index if pk is queue_name, message_id -SET @idx_exists := (SELECT COUNT(INDEX_NAME) - FROM information_schema.STATISTICS - WHERE `TABLE_NAME` = 'queue_message' - AND `INDEX_NAME` = 'unique_queue_name_message_id' - AND TABLE_SCHEMA = database()); -SET @idxstmt := IF(@idx_exists > 0, 'ALTER TABLE `queue_message` DROP INDEX `unique_queue_name_message_id`', - 'SELECT ''INFO: Index unique_queue_name_message_id does not exist.'''); -PREPARE stmt1 FROM @idxstmt; -EXECUTE stmt1; - -# remove id column -set @col_exists := (SELECT COUNT(*) - FROM information_schema.COLUMNS - WHERE `TABLE_NAME` = 'queue_message' - AND `COLUMN_NAME` = 'id' - AND TABLE_SCHEMA = database()); -SET @colstmt := IF(@col_exists > 0, 'ALTER TABLE `queue_message` DROP COLUMN `id`', - 'SELECT ''INFO: Column id does not exist.''') ; -PREPARE stmt2 from @colstmt; -EXECUTE stmt2; - -# set primary key to queue_name, message_id -ALTER TABLE queue_message ADD PRIMARY KEY (queue_name, message_id); diff --git a/mysql-persistence/src/main/resources/db/migration/V8__update_pk.sql b/mysql-persistence/src/main/resources/db/migration/V8__update_pk.sql deleted file mode 100644 index f1ed4f7ad..000000000 --- a/mysql-persistence/src/main/resources/db/migration/V8__update_pk.sql +++ /dev/null @@ -1,103 +0,0 @@ -DELIMITER $$ -DROP PROCEDURE IF EXISTS `DropIndexIfExists`$$ -CREATE PROCEDURE `DropIndexIfExists`(IN tableName VARCHAR(128), IN indexName VARCHAR(128)) -BEGIN - - DECLARE index_exists INT DEFAULT 0; - - SELECT COUNT(1) INTO index_exists - FROM INFORMATION_SCHEMA.STATISTICS - WHERE TABLE_NAME = tableName - AND INDEX_NAME = indexName - AND TABLE_SCHEMA = database(); - - IF index_exists > 0 THEN - - SELECT CONCAT('INFO: Dropping Index ', indexName, ' on table ', tableName); - SET @stmt = CONCAT('ALTER TABLE ', tableName, ' DROP INDEX ', indexName); - PREPARE st FROM @stmt; - EXECUTE st; - DEALLOCATE PREPARE st; - - ELSE - SELECT CONCAT('INFO: Index ', indexName, ' does not exists on table ', tableName); - END IF; - -END$$ - -DROP PROCEDURE IF EXISTS `FixPkIfNeeded`$$ -CREATE PROCEDURE `FixPkIfNeeded`(IN tableName VARCHAR(128), IN columns VARCHAR(128)) -BEGIN - - DECLARE col_exists INT DEFAULT 0; - - SELECT COUNT(1) INTO col_exists - FROM INFORMATION_SCHEMA.COLUMNS - WHERE TABLE_NAME = tableName - AND COLUMN_NAME = 'id' - AND TABLE_SCHEMA = database(); - - IF col_exists > 0 THEN - - SELECT CONCAT('INFO: Updating PK on table ', tableName); - - SET @stmt = CONCAT('ALTER TABLE ', tableName, ' MODIFY id INT'); - PREPARE st FROM @stmt; - EXECUTE st; - DEALLOCATE PREPARE st; - - SET @stmt = CONCAT('ALTER TABLE ', tableName, ' DROP PRIMARY KEY, ADD PRIMARY KEY (', columns, ')'); - PREPARE st FROM @stmt; - EXECUTE st; - DEALLOCATE PREPARE st; - - SET @stmt = CONCAT('ALTER TABLE ', tableName, ' DROP COLUMN id'); - PREPARE st FROM @stmt; - EXECUTE st; - DEALLOCATE PREPARE st; - - ELSE - SELECT CONCAT('INFO: Column id does not exists on table ', tableName); - END IF; - -END$$ -DELIMITER ; - -CALL DropIndexIfExists('queue_message', 'unique_queue_name_message_id'); -CALL FixPkIfNeeded('queue_message','queue_name, message_id'); - -CALL DropIndexIfExists('queue', 'unique_queue_name'); -CALL FixPkIfNeeded('queue','queue_name'); - -CALL DropIndexIfExists('workflow_to_task', 'unique_workflow_to_task_id'); -CALL FixPkIfNeeded('workflow_to_task', 'workflow_id, task_id'); - -CALL DropIndexIfExists('workflow_pending', 'unique_workflow_type_workflow_id'); -CALL FixPkIfNeeded('workflow_pending', 'workflow_type, workflow_id'); - -CALL DropIndexIfExists('workflow_def_to_workflow', 'unique_workflow_def_date_str'); -CALL FixPkIfNeeded('workflow_def_to_workflow', 'workflow_def, date_str, workflow_id'); - -CALL DropIndexIfExists('workflow', 'unique_workflow_id'); -CALL FixPkIfNeeded('workflow', 'workflow_id'); - -CALL DropIndexIfExists('task', 'unique_task_id'); -CALL FixPkIfNeeded('task', 'task_id'); - -CALL DropIndexIfExists('task_in_progress', 'unique_task_def_task_id1'); -CALL FixPkIfNeeded('task_in_progress', 'task_def_name, task_id'); - -CALL DropIndexIfExists('task_scheduled', 'unique_workflow_id_task_key'); -CALL FixPkIfNeeded('task_scheduled', 'workflow_id, task_key'); - -CALL DropIndexIfExists('poll_data', 'unique_poll_data'); -CALL FixPkIfNeeded('poll_data','queue_name, domain'); - -CALL DropIndexIfExists('event_execution', 'unique_event_execution'); -CALL FixPkIfNeeded('event_execution', 'event_handler_name, event_name, execution_id'); - -CALL DropIndexIfExists('meta_workflow_def', 'unique_name_version'); -CALL FixPkIfNeeded('meta_workflow_def', 'name, version'); - -CALL DropIndexIfExists('meta_task_def', 'unique_task_def_name'); -CALL FixPkIfNeeded('meta_task_def','name'); \ No newline at end of file diff --git a/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLExecutionDAOTest.java b/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLExecutionDAOTest.java deleted file mode 100644 index da0769e42..000000000 --- a/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLExecutionDAOTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.dao; - -import java.util.List; - -import org.flywaydb.core.Flyway; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.dao.ExecutionDAO; -import com.netflix.conductor.dao.ExecutionDAOTest; -import com.netflix.conductor.model.WorkflowModel; -import com.netflix.conductor.mysql.config.MySQLConfiguration; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -@ContextConfiguration( - classes = { - TestObjectMapperConfiguration.class, - MySQLConfiguration.class, - FlywayAutoConfiguration.class - }) -@RunWith(SpringRunner.class) -@SpringBootTest -public class MySQLExecutionDAOTest extends ExecutionDAOTest { - - @Autowired private MySQLExecutionDAO executionDAO; - - @Autowired Flyway flyway; - - // clean the database between tests. - @Before - public void before() { - flyway.clean(); - flyway.migrate(); - } - - @Test - public void testPendingByCorrelationId() { - - WorkflowDef def = new WorkflowDef(); - def.setName("pending_count_correlation_jtest"); - - WorkflowModel workflow = createTestWorkflow(); - workflow.setWorkflowDefinition(def); - - generateWorkflows(workflow, 10); - - List bycorrelationId = - getExecutionDAO() - .getWorkflowsByCorrelationId( - "pending_count_correlation_jtest", "corr001", true); - assertNotNull(bycorrelationId); - assertEquals(10, bycorrelationId.size()); - } - - @Override - public ExecutionDAO getExecutionDAO() { - return executionDAO; - } -} diff --git a/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLMetadataDAOTest.java b/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLMetadataDAOTest.java deleted file mode 100644 index 34250b2c1..000000000 --- a/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLMetadataDAOTest.java +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright 2021 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.dao; - -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.flywaydb.core.Flyway; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.common.metadata.events.EventHandler; -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.mysql.config.MySQLConfiguration; - -import static com.netflix.conductor.core.exception.ApplicationException.Code.CONFLICT; -import static com.netflix.conductor.core.exception.ApplicationException.Code.NOT_FOUND; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; - -@ContextConfiguration( - classes = { - TestObjectMapperConfiguration.class, - MySQLConfiguration.class, - FlywayAutoConfiguration.class - }) -@RunWith(SpringRunner.class) -@SpringBootTest -public class MySQLMetadataDAOTest { - - @Autowired private MySQLMetadataDAO metadataDAO; - - @Autowired Flyway flyway; - - // clean the database between tests. - @Before - public void before() { - flyway.clean(); - flyway.migrate(); - } - - @Test - public void testDuplicateWorkflowDef() { - - WorkflowDef def = new WorkflowDef(); - def.setName("testDuplicate"); - def.setVersion(1); - - metadataDAO.createWorkflowDef(def); - - ApplicationException applicationException = - assertThrows(ApplicationException.class, () -> metadataDAO.createWorkflowDef(def)); - assertEquals( - "Workflow with testDuplicate.1 already exists!", applicationException.getMessage()); - assertEquals(CONFLICT, applicationException.getCode()); - } - - @Test - public void testRemoveNotExistingWorkflowDef() { - ApplicationException applicationException = - assertThrows( - ApplicationException.class, () -> metadataDAO.removeWorkflowDef("test", 1)); - assertEquals( - "No such workflow definition: test version: 1", applicationException.getMessage()); - assertEquals(NOT_FOUND, applicationException.getCode()); - } - - @Test - public void testWorkflowDefOperations() { - WorkflowDef def = new WorkflowDef(); - def.setName("test"); - def.setVersion(1); - def.setDescription("description"); - def.setCreatedBy("unit_test"); - def.setCreateTime(1L); - def.setOwnerApp("ownerApp"); - def.setUpdatedBy("unit_test2"); - def.setUpdateTime(2L); - - metadataDAO.createWorkflowDef(def); - - List all = metadataDAO.getAllWorkflowDefs(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals(1, all.get(0).getVersion()); - - WorkflowDef found = metadataDAO.getWorkflowDef("test", 1).get(); - assertTrue(EqualsBuilder.reflectionEquals(def, found)); - - def.setVersion(3); - metadataDAO.createWorkflowDef(def); - - all = metadataDAO.getAllWorkflowDefs(); - assertNotNull(all); - assertEquals(2, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals(1, all.get(0).getVersion()); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(def.getVersion(), found.getVersion()); - assertEquals(3, found.getVersion()); - - all = metadataDAO.getAllLatest(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals(3, all.get(0).getVersion()); - - all = metadataDAO.getAllVersions(def.getName()); - assertNotNull(all); - assertEquals(2, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals("test", all.get(1).getName()); - assertEquals(1, all.get(0).getVersion()); - assertEquals(3, all.get(1).getVersion()); - - def.setDescription("updated"); - metadataDAO.updateWorkflowDef(def); - found = metadataDAO.getWorkflowDef(def.getName(), def.getVersion()).get(); - assertEquals(def.getDescription(), found.getDescription()); - - List allnames = metadataDAO.findAll(); - assertNotNull(allnames); - assertEquals(1, allnames.size()); - assertEquals(def.getName(), allnames.get(0)); - - def.setVersion(2); - metadataDAO.createWorkflowDef(def); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(3, found.getVersion()); - - metadataDAO.removeWorkflowDef("test", 3); - Optional deleted = metadataDAO.getWorkflowDef("test", 3); - assertFalse(deleted.isPresent()); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(2, found.getVersion()); - - metadataDAO.removeWorkflowDef("test", 1); - deleted = metadataDAO.getWorkflowDef("test", 1); - assertFalse(deleted.isPresent()); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(2, found.getVersion()); - } - - @Test - public void testTaskDefOperations() { - TaskDef def = new TaskDef("taskA"); - def.setDescription("description"); - def.setCreatedBy("unit_test"); - def.setCreateTime(1L); - def.setInputKeys(Arrays.asList("a", "b", "c")); - def.setOutputKeys(Arrays.asList("01", "o2")); - def.setOwnerApp("ownerApp"); - def.setRetryCount(3); - def.setRetryDelaySeconds(100); - def.setRetryLogic(TaskDef.RetryLogic.FIXED); - def.setTimeoutPolicy(TaskDef.TimeoutPolicy.ALERT_ONLY); - def.setUpdatedBy("unit_test2"); - def.setUpdateTime(2L); - - metadataDAO.createTaskDef(def); - - TaskDef found = metadataDAO.getTaskDef(def.getName()); - assertTrue(EqualsBuilder.reflectionEquals(def, found)); - - def.setDescription("updated description"); - metadataDAO.updateTaskDef(def); - found = metadataDAO.getTaskDef(def.getName()); - assertTrue(EqualsBuilder.reflectionEquals(def, found)); - assertEquals("updated description", found.getDescription()); - - for (int i = 0; i < 9; i++) { - TaskDef tdf = new TaskDef("taskA" + i); - metadataDAO.createTaskDef(tdf); - } - - List all = metadataDAO.getAllTaskDefs(); - assertNotNull(all); - assertEquals(10, all.size()); - Set allnames = all.stream().map(TaskDef::getName).collect(Collectors.toSet()); - assertEquals(10, allnames.size()); - List sorted = allnames.stream().sorted().collect(Collectors.toList()); - assertEquals(def.getName(), sorted.get(0)); - - for (int i = 0; i < 9; i++) { - assertEquals(def.getName() + i, sorted.get(i + 1)); - } - - for (int i = 0; i < 9; i++) { - metadataDAO.removeTaskDef(def.getName() + i); - } - all = metadataDAO.getAllTaskDefs(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals(def.getName(), all.get(0).getName()); - } - - @Test - public void testRemoveNotExistingTaskDef() { - ApplicationException applicationException = - assertThrows( - ApplicationException.class, - () -> metadataDAO.removeTaskDef("test" + UUID.randomUUID().toString())); - assertEquals("No such task definition", applicationException.getMessage()); - assertEquals(NOT_FOUND, applicationException.getCode()); - } - - @Test - public void testEventHandlers() { - String event1 = "SQS::arn:account090:sqstest1"; - String event2 = "SQS::arn:account090:sqstest2"; - - EventHandler eventHandler = new EventHandler(); - eventHandler.setName(UUID.randomUUID().toString()); - eventHandler.setActive(false); - EventHandler.Action action = new EventHandler.Action(); - action.setAction(EventHandler.Action.Type.start_workflow); - action.setStart_workflow(new EventHandler.StartWorkflow()); - action.getStart_workflow().setName("workflow_x"); - eventHandler.getActions().add(action); - eventHandler.setEvent(event1); - - metadataDAO.addEventHandler(eventHandler); - List all = metadataDAO.getAllEventHandlers(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals(eventHandler.getName(), all.get(0).getName()); - assertEquals(eventHandler.getEvent(), all.get(0).getEvent()); - - List byEvents = metadataDAO.getEventHandlersForEvent(event1, true); - assertNotNull(byEvents); - assertEquals(0, byEvents.size()); // event is marked as in-active - - eventHandler.setActive(true); - eventHandler.setEvent(event2); - metadataDAO.updateEventHandler(eventHandler); - - all = metadataDAO.getAllEventHandlers(); - assertNotNull(all); - assertEquals(1, all.size()); - - byEvents = metadataDAO.getEventHandlersForEvent(event1, true); - assertNotNull(byEvents); - assertEquals(0, byEvents.size()); - - byEvents = metadataDAO.getEventHandlersForEvent(event2, true); - assertNotNull(byEvents); - assertEquals(1, byEvents.size()); - } -} diff --git a/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLQueueDAOTest.java b/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLQueueDAOTest.java deleted file mode 100644 index 93b32de69..000000000 --- a/mysql-persistence/src/test/java/com/netflix/conductor/mysql/dao/MySQLQueueDAOTest.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright 2021 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.mysql.dao; - -import java.sql.Connection; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.sql.DataSource; - -import org.flywaydb.core.Flyway; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.mysql.config.MySQLConfiguration; -import com.netflix.conductor.mysql.util.Query; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -@ContextConfiguration( - classes = { - TestObjectMapperConfiguration.class, - MySQLConfiguration.class, - FlywayAutoConfiguration.class - }) -@RunWith(SpringRunner.class) -@SpringBootTest -public class MySQLQueueDAOTest { - - private static final Logger LOGGER = LoggerFactory.getLogger(MySQLQueueDAOTest.class); - - @Autowired private MySQLQueueDAO queueDAO; - - @Autowired private ObjectMapper objectMapper; - - @Qualifier("dataSource") - @Autowired - private DataSource dataSource; - - @Autowired Flyway flyway; - - // clean the database between tests. - @Before - public void before() { - flyway.clean(); - flyway.migrate(); - } - - @Test - public void complexQueueTest() { - String queueName = "TestQueue"; - long offsetTimeInSecond = 0; - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.push(queueName, messageId, offsetTimeInSecond); - } - int size = queueDAO.getSize(queueName); - assertEquals(10, size); - Map details = queueDAO.queuesDetail(); - assertEquals(1, details.size()); - assertEquals(10L, details.get(queueName).longValue()); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.pushIfNotExists(queueName, messageId, offsetTimeInSecond); - } - - List popped = queueDAO.pop(queueName, 10, 100); - assertNotNull(popped); - assertEquals(10, popped.size()); - - Map>> verbose = queueDAO.queuesDetailVerbose(); - assertEquals(1, verbose.size()); - long shardSize = verbose.get(queueName).get("a").get("size"); - long unackedSize = verbose.get(queueName).get("a").get("uacked"); - assertEquals(0, shardSize); - assertEquals(10, unackedSize); - - popped.forEach(messageId -> queueDAO.ack(queueName, messageId)); - - verbose = queueDAO.queuesDetailVerbose(); - assertEquals(1, verbose.size()); - shardSize = verbose.get(queueName).get("a").get("size"); - unackedSize = verbose.get(queueName).get("a").get("uacked"); - assertEquals(0, shardSize); - assertEquals(0, unackedSize); - - popped = queueDAO.pop(queueName, 10, 100); - assertNotNull(popped); - assertEquals(0, popped.size()); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.pushIfNotExists(queueName, messageId, offsetTimeInSecond); - } - size = queueDAO.getSize(queueName); - assertEquals(10, size); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - assertTrue(queueDAO.containsMessage(queueName, messageId)); - queueDAO.remove(queueName, messageId); - } - - size = queueDAO.getSize(queueName); - assertEquals(0, size); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.pushIfNotExists(queueName, messageId, offsetTimeInSecond); - } - queueDAO.flush(queueName); - size = queueDAO.getSize(queueName); - assertEquals(0, size); - } - - /** Test fix for https://github.com/Netflix/conductor/issues/1892 */ - @Test - public void containsMessageTest() { - String queueName = "TestQueue"; - long offsetTimeInSecond = 0; - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.push(queueName, messageId, offsetTimeInSecond); - } - int size = queueDAO.getSize(queueName); - assertEquals(10, size); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - assertTrue(queueDAO.containsMessage(queueName, messageId)); - queueDAO.remove(queueName, messageId); - } - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - assertFalse(queueDAO.containsMessage(queueName, messageId)); - } - } - - /** - * Test fix for https://github.com/Netflix/conductor/issues/399 - * - * @since 1.8.2-rc5 - */ - @Test - public void pollMessagesTest() { - final List messages = new ArrayList<>(); - final String queueName = "issue399_testQueue"; - final int totalSize = 10; - - for (int i = 0; i < totalSize; i++) { - String payload = "{\"id\": " + i + ", \"msg\":\"test " + i + "\"}"; - Message m = new Message("testmsg-" + i, payload, ""); - if (i % 2 == 0) { - // Set priority on message with pair id - m.setPriority(99 - i); - } - messages.add(m); - } - - // Populate the queue with our test message batch - queueDAO.push(queueName, ImmutableList.copyOf(messages)); - - // Assert that all messages were persisted and no extras are in there - assertEquals("Queue size mismatch", totalSize, queueDAO.getSize(queueName)); - - final int firstPollSize = 3; - List firstPoll = queueDAO.pollMessages(queueName, firstPollSize, 10_000); - assertNotNull("First poll was null", firstPoll); - assertFalse("First poll was empty", firstPoll.isEmpty()); - assertEquals("First poll size mismatch", firstPollSize, firstPoll.size()); - - final int secondPollSize = 4; - List secondPoll = queueDAO.pollMessages(queueName, secondPollSize, 10_000); - assertNotNull("Second poll was null", secondPoll); - assertFalse("Second poll was empty", secondPoll.isEmpty()); - assertEquals("Second poll size mismatch", secondPollSize, secondPoll.size()); - - // Assert that the total queue size hasn't changed - assertEquals( - "Total queue size should have remained the same", - totalSize, - queueDAO.getSize(queueName)); - - // Assert that our un-popped messages match our expected size - final long expectedSize = totalSize - firstPollSize - secondPollSize; - try (Connection c = dataSource.getConnection()) { - String UNPOPPED = - "SELECT COUNT(*) FROM queue_message WHERE queue_name = ? AND popped = false"; - try (Query q = new Query(objectMapper, c, UNPOPPED)) { - long count = q.addParameter(queueName).executeCount(); - assertEquals("Remaining queue size mismatch", expectedSize, count); - } - } catch (Exception ex) { - fail(ex.getMessage()); - } - } - - /** - * Test fix for https://github.com/Netflix/conductor/issues/448 - * - * @since 1.8.2-rc5 - */ - @Test - public void pollDeferredMessagesTest() throws InterruptedException { - final List messages = new ArrayList<>(); - final String queueName = "issue448_testQueue"; - final int totalSize = 10; - - for (int i = 0; i < totalSize; i++) { - int offset = 0; - if (i < 5) { - offset = 0; - } else if (i == 6 || i == 7) { - // Purposefully skipping id:5 to test out of order deliveries - // Set id:6 and id:7 for a 2s delay to be picked up in the second polling batch - offset = 5; - } else { - // Set all other queue messages to have enough of a delay that they won't - // accidentally - // be picked up. - offset = 10_000 + i; - } - - String payload = "{\"id\": " + i + ",\"offset_time_seconds\":" + offset + "}"; - Message m = new Message("testmsg-" + i, payload, ""); - messages.add(m); - queueDAO.push(queueName, "testmsg-" + i, offset); - } - - // Assert that all messages were persisted and no extras are in there - assertEquals("Queue size mismatch", totalSize, queueDAO.getSize(queueName)); - - final int firstPollSize = 4; - List firstPoll = queueDAO.pollMessages(queueName, firstPollSize, 100); - assertNotNull("First poll was null", firstPoll); - assertFalse("First poll was empty", firstPoll.isEmpty()); - assertEquals("First poll size mismatch", firstPollSize, firstPoll.size()); - - List firstPollMessageIds = - messages.stream() - .map(Message::getId) - .collect(Collectors.toList()) - .subList(0, firstPollSize + 1); - - for (int i = 0; i < firstPollSize; i++) { - String actual = firstPoll.get(i).getId(); - assertTrue("Unexpected Id: " + actual, firstPollMessageIds.contains(actual)); - } - - final int secondPollSize = 3; - - // Sleep a bit to get the next batch of messages - LOGGER.debug("Sleeping for second poll..."); - Thread.sleep(5_000); - - // Poll for many more messages than expected - List secondPoll = queueDAO.pollMessages(queueName, secondPollSize + 10, 100); - assertNotNull("Second poll was null", secondPoll); - assertFalse("Second poll was empty", secondPoll.isEmpty()); - assertEquals("Second poll size mismatch", secondPollSize, secondPoll.size()); - - List expectedIds = Arrays.asList("testmsg-4", "testmsg-6", "testmsg-7"); - for (int i = 0; i < secondPollSize; i++) { - String actual = secondPoll.get(i).getId(); - assertTrue("Unexpected Id: " + actual, expectedIds.contains(actual)); - } - - // Assert that the total queue size hasn't changed - assertEquals( - "Total queue size should have remained the same", - totalSize, - queueDAO.getSize(queueName)); - - // Assert that our un-popped messages match our expected size - final long expectedSize = totalSize - firstPollSize - secondPollSize; - try (Connection c = dataSource.getConnection()) { - String UNPOPPED = - "SELECT COUNT(*) FROM queue_message WHERE queue_name = ? AND popped = false"; - try (Query q = new Query(objectMapper, c, UNPOPPED)) { - long count = q.addParameter(queueName).executeCount(); - assertEquals("Remaining queue size mismatch", expectedSize, count); - } - } catch (Exception ex) { - fail(ex.getMessage()); - } - } - - @Test - public void processUnacksTest() { - final String queueName = "process_unacks_test"; - // Count of messages in the queue(s) - final int count = 10; - // Number of messages to process acks for - final int unackedCount = 4; - // A secondary queue to make sure we don't accidentally process other queues - final String otherQueueName = "process_unacks_test_other_queue"; - - // Create testing queue with some messages (but not all) that will be popped/acked. - for (int i = 0; i < count; i++) { - int offset = 0; - if (i >= unackedCount) { - offset = 1_000_000; - } - - queueDAO.push(queueName, "unack-" + i, offset); - } - - // Create a second queue to make sure that unacks don't occur for it - for (int i = 0; i < count; i++) { - queueDAO.push(otherQueueName, "other-" + i, 0); - } - - // Poll for first batch of messages (should be equal to unackedCount) - List polled = queueDAO.pollMessages(queueName, 100, 10_000); - assertNotNull(polled); - assertFalse(polled.isEmpty()); - assertEquals(unackedCount, polled.size()); - - // Poll messages from the other queue so we know they don't get unacked later - queueDAO.pollMessages(otherQueueName, 100, 10_000); - - // Ack one of the polled messages - assertTrue(queueDAO.ack(queueName, "unack-1")); - - // Should have one less un-acked popped message in the queue - Long uacked = queueDAO.queuesDetailVerbose().get(queueName).get("a").get("uacked"); - assertNotNull(uacked); - assertEquals(uacked.longValue(), unackedCount - 1); - - // Process unacks - queueDAO.processUnacks(queueName); - - // Check uacks for both queues after processing - Map>> details = queueDAO.queuesDetailVerbose(); - uacked = details.get(queueName).get("a").get("uacked"); - assertNotNull(uacked); - assertEquals( - "The messages that were polled should be unacked still", - uacked.longValue(), - unackedCount - 1); - - Long otherUacked = details.get(otherQueueName).get("a").get("uacked"); - assertNotNull(otherUacked); - assertEquals( - "Other queue should have all unacked messages", otherUacked.longValue(), count); - - Long size = queueDAO.queuesDetail().get(queueName); - assertNotNull(size); - assertEquals(size.longValue(), count - unackedCount); - } -} diff --git a/mysql-persistence/src/test/resources/application.properties b/mysql-persistence/src/test/resources/application.properties deleted file mode 100644 index 1abda5a9c..000000000 --- a/mysql-persistence/src/test/resources/application.properties +++ /dev/null @@ -1,6 +0,0 @@ -conductor.db.type=mysql -spring.datasource.url=jdbc:tc:mysql:///conductor -spring.datasource.username=root -spring.datasource.password=root -spring.datasource.hikari.maximum-pool-size=8 -spring.datasource.hikari.auto-commit=false diff --git a/postgres-external-storage/README.md b/postgres-external-storage/README.md deleted file mode 100644 index 341d545c3..000000000 --- a/postgres-external-storage/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# PostgreSQL External Storage Module - -This module use PostgreSQL to store and retrieve workflows/tasks input/output payload that -went over the thresholds defined in properties named `conductor.[workflow|task].[input|output].payload.threshold.kb`. - -## Configuration - -### Usage - -Cf. Documentation [External Payload Storage](https://netflix.github.io/conductor/externalpayloadstorage/#postgresql-storage) - -### Example - -```properties -conductor.external-payload-storage.type=postgres -conductor.external-payload-storage.postgres.conductor-url=http://localhost:8080 -conductor.external-payload-storage.postgres.url=jdbc:postgresql://postgresql:5432/conductor?charset=utf8&parseTime=true&interpolateParams=true -conductor.external-payload-storage.postgres.username=postgres -conductor.external-payload-storage.postgres.password=postgres -conductor.external-payload-storage.postgres.max-data-rows=1000000 -conductor.external-payload-storage.postgres.max-data-days=0 -conductor.external-payload-storage.postgres.max-data-months=0 -conductor.external-payload-storage.postgres.max-data-years=1 -``` \ No newline at end of file diff --git a/postgres-external-storage/dependencies.lock b/postgres-external-storage/dependencies.lock deleted file mode 100644 index c1ad5736b..000000000 --- a/postgres-external-storage/dependencies.lock +++ /dev/null @@ -1,441 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/config/PostgresPayloadConfiguration.java b/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/config/PostgresPayloadConfiguration.java deleted file mode 100644 index 5da986bff..000000000 --- a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/config/PostgresPayloadConfiguration.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.config; - -import java.util.Map; - -import javax.annotation.PostConstruct; -import javax.sql.DataSource; - -import org.flywaydb.core.Flyway; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.common.utils.ExternalPayloadStorage; -import com.netflix.conductor.postgres.storage.PostgresPayloadStorage; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(PostgresPayloadProperties.class) -@ConditionalOnProperty(name = "conductor.external-payload-storage.type", havingValue = "postgres") -public class PostgresPayloadConfiguration { - - PostgresPayloadProperties properties; - - public PostgresPayloadConfiguration(PostgresPayloadProperties properties) { - this.properties = properties; - } - - @Bean(initMethod = "migrate") - @PostConstruct - public Flyway flywayForExternalDb() { - return Flyway.configure() - .locations("classpath:db/migration_external_postgres") - .schemas("external") - .baselineOnMigrate(true) - .placeholderReplacement(true) - .placeholders( - Map.of( - "tableName", - properties.getTableName(), - "maxDataRows", - String.valueOf(properties.getMaxDataRows()), - "maxDataDays", - "'" + properties.getMaxDataDays() + "'", - "maxDataMonths", - "'" + properties.getMaxDataMonths() + "'", - "maxDataYears", - "'" + properties.getMaxDataYears() + "'")) - .dataSource( - DataSourceBuilder.create() - .driverClassName("org.postgresql.Driver") - .url(properties.getUrl()) - .username(properties.getUsername()) - .password(properties.getPassword()) - .build()) - .load(); - } - - @Bean - public ExternalPayloadStorage postgresExternalPayloadStorage( - PostgresPayloadProperties properties) { - DataSource dataSource = - DataSourceBuilder.create() - .driverClassName("org.postgresql.Driver") - .url(properties.getUrl()) - .username(properties.getUsername()) - .password(properties.getPassword()) - .build(); - return new PostgresPayloadStorage(properties, dataSource); - } -} diff --git a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/config/PostgresPayloadProperties.java b/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/config/PostgresPayloadProperties.java deleted file mode 100644 index 28a33c118..000000000 --- a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/config/PostgresPayloadProperties.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.config; - -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties("conductor.external-payload-storage.postgres") -public class PostgresPayloadProperties { - - /** The PostgreSQL schema and table name where the payloads will be stored */ - private String tableName = "external.external_payload"; - - /** Username for connecting to PostgreSQL database */ - private String username; - - /** Password for connecting to PostgreSQL database */ - private String password; - - /** URL for connecting to PostgreSQL database */ - private String url; - - /** - * Maximum count of data rows in PostgreSQL database. After overcoming this limit, the oldest - * data will be deleted. - */ - private long maxDataRows = Long.MAX_VALUE; - - /** - * Maximum count of days of data age in PostgreSQL database. After overcoming limit, the oldest - * data will be deleted. - */ - private int maxDataDays = 0; - - /** - * Maximum count of months of data age in PostgreSQL database. After overcoming limit, the - * oldest data will be deleted. - */ - private int maxDataMonths = 0; - - /** - * Maximum count of years of data age in PostgreSQL database. After overcoming limit, the oldest - * data will be deleted. - */ - private int maxDataYears = 1; - - /** - * URL, that can be used to pull the json configurations, that will be downloaded from - * PostgreSQL to the conductor server. For example: for local development it is - * "http://localhost:8080" - */ - private String conductorUrl = ""; - - public String getTableName() { - return tableName; - } - - public String getUsername() { - return username; - } - - public String getPassword() { - return password; - } - - public String getUrl() { - return url; - } - - public String getConductorUrl() { - return conductorUrl; - } - - public long getMaxDataRows() { - return maxDataRows; - } - - public int getMaxDataDays() { - return maxDataDays; - } - - public int getMaxDataMonths() { - return maxDataMonths; - } - - public int getMaxDataYears() { - return maxDataYears; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - public void setUsername(String username) { - this.username = username; - } - - public void setPassword(String password) { - this.password = password; - } - - public void setUrl(String url) { - this.url = url; - } - - public void setConductorUrl(String conductorUrl) { - this.conductorUrl = conductorUrl; - } - - public void setMaxDataRows(long maxDataRows) { - this.maxDataRows = maxDataRows; - } - - public void setMaxDataDays(int maxDataDays) { - this.maxDataDays = maxDataDays; - } - - public void setMaxDataMonths(int maxDataMonths) { - this.maxDataMonths = maxDataMonths; - } - - public void setMaxDataYears(int maxDataYears) { - this.maxDataYears = maxDataYears; - } -} diff --git a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/controller/ExternalPostgresPayloadResource.java b/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/controller/ExternalPostgresPayloadResource.java deleted file mode 100644 index 7ed4917e2..000000000 --- a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/controller/ExternalPostgresPayloadResource.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.controller; - -import java.io.InputStream; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.netflix.conductor.common.utils.ExternalPayloadStorage; - -import io.swagger.v3.oas.annotations.Operation; - -/** - * REST controller for pulling payload stream of data by key (externalPayloadPath) from PostgreSQL - * database - */ -@RestController -@RequestMapping(value = "/api/external/postgres") -@ConditionalOnProperty(name = "conductor.external-payload-storage.type", havingValue = "postgres") -public class ExternalPostgresPayloadResource { - - private final ExternalPayloadStorage postgresService; - - public ExternalPostgresPayloadResource( - @Qualifier("postgresExternalPayloadStorage") ExternalPayloadStorage postgresService) { - this.postgresService = postgresService; - } - - @GetMapping("/{externalPayloadPath}") - @Operation( - summary = - "Get task or workflow by externalPayloadPath from External PostgreSQL Storage") - public ResponseEntity getExternalStorageData( - @PathVariable("externalPayloadPath") String externalPayloadPath) { - InputStream inputStream = postgresService.download(externalPayloadPath); - InputStreamResource outputStreamBody = new InputStreamResource(inputStream); - return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(outputStreamBody); - } -} diff --git a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/storage/PostgresPayloadStorage.java b/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/storage/PostgresPayloadStorage.java deleted file mode 100644 index 0dc423616..000000000 --- a/postgres-external-storage/src/main/java/com/netflix/conductor/postgres/storage/PostgresPayloadStorage.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.storage; - -import java.io.InputStream; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -import javax.sql.DataSource; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.common.run.ExternalStorageLocation; -import com.netflix.conductor.common.utils.ExternalPayloadStorage; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.core.utils.IDGenerator; -import com.netflix.conductor.postgres.config.PostgresPayloadProperties; - -/** - * Store and pull the external payload which consists of key and stream of data in PostgreSQL - * database - */ -public class PostgresPayloadStorage implements ExternalPayloadStorage { - - private static final Logger LOGGER = LoggerFactory.getLogger(PostgresPayloadStorage.class); - - private final DataSource postgresDataSource; - private final String tableName; - private final String conductorUrl; - - public PostgresPayloadStorage(PostgresPayloadProperties properties, DataSource dataSource) { - tableName = properties.getTableName(); - conductorUrl = properties.getConductorUrl(); - this.postgresDataSource = dataSource; - LOGGER.info("PostgreSQL Extenal Payload Storage initialized."); - } - - /** - * @param operation the type of {@link Operation} to be performed - * @param payloadType the {@link PayloadType} that is being accessed - * @return a {@link ExternalStorageLocation} object which contains the pre-signed URL and the - * PostgreSQL object key for the json payload - */ - @Override - public ExternalStorageLocation getLocation( - Operation operation, PayloadType payloadType, String path) { - - ExternalStorageLocation externalStorageLocation = new ExternalStorageLocation(); - String objectKey; - if (StringUtils.isNotBlank(path)) { - objectKey = path; - } else { - objectKey = IDGenerator.generate() + ".json"; - } - String uri = conductorUrl + "/api/external/postgres/" + objectKey; - externalStorageLocation.setUri(uri); - externalStorageLocation.setPath(objectKey); - LOGGER.debug("External storage location URI: {}, location path: {}", uri, objectKey); - return externalStorageLocation; - } - - /** - * Uploads the payload to the given PostgreSQL object key. It is expected that the caller - * retrieves the object key using {@link #getLocation(Operation, PayloadType, String)} before - * making this call. - * - * @param key the PostgreSQL key of the object to be uploaded - * @param payload an {@link InputStream} containing the json payload which is to be uploaded - * @param payloadSize the size of the json payload in bytes - */ - @Override - public void upload(String key, InputStream payload, long payloadSize) { - try (Connection conn = postgresDataSource.getConnection(); - PreparedStatement stmt = - conn.prepareStatement("INSERT INTO " + tableName + " VALUES (?, ?)")) { - stmt.setString(1, key); - stmt.setBinaryStream(2, payload, payloadSize); - stmt.executeUpdate(); - LOGGER.debug( - "External PostgreSQL uploaded key: {}, payload size: {}", key, payloadSize); - } catch (SQLException e) { - String msg = "Error uploading data into External PostgreSQL"; - LOGGER.error(msg, e); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); - } - } - - /** - * Downloads the payload stored in the PostgreSQL. - * - * @param key the PostgreSQL key of the object - * @return an input stream containing the contents of the object. Caller is expected to close - * the input stream. - */ - @Override - public InputStream download(String key) { - InputStream inputStream; - try (Connection conn = postgresDataSource.getConnection(); - PreparedStatement stmt = - conn.prepareStatement("SELECT data FROM " + tableName + " WHERE id = ?")) { - stmt.setString(1, key); - ResultSet rs = stmt.executeQuery(); - rs.next(); - inputStream = rs.getBinaryStream(1); - rs.close(); - LOGGER.debug("External PostgreSQL downloaded key: {}", key); - } catch (SQLException e) { - String msg = "Error downloading data from external PostgreSQL"; - LOGGER.error(msg, e); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e); - } - return inputStream; - } -} diff --git a/postgres-external-storage/src/main/resources/db/migration_external_postgres/R__initial_schema.sql b/postgres-external-storage/src/main/resources/db/migration_external_postgres/R__initial_schema.sql deleted file mode 100644 index 0d0d20dfa..000000000 --- a/postgres-external-storage/src/main/resources/db/migration_external_postgres/R__initial_schema.sql +++ /dev/null @@ -1,56 +0,0 @@ --- --- Copyright 2022 Netflix, Inc. --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- - - --- -------------------------------------------------------------------------------------------------------------- --- SCHEMA FOR EXTERNAL PAYLOAD POSTGRES STORAGE --- -------------------------------------------------------------------------------------------------------------- - -CREATE TABLE IF NOT EXISTS ${tableName} -( - id TEXT, - data bytea NOT NULL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (id) -); - -ALTER TABLE ${tableName} ALTER COLUMN data SET STORAGE EXTERNAL; - --- Delete trigger to delete the oldest external_payload rows, --- when there are too many or there are too old. - -DROP TRIGGER IF EXISTS tr_keep_row_number_steady ON ${tableName}; - -CREATE OR REPLACE FUNCTION keep_row_number_steady() - RETURNS TRIGGER AS -$body$ -DECLARE - time_interval interval := concat(${maxDataYears},' years ',${maxDataMonths},' mons ',${maxDataDays},' days' ); -BEGIN - WHILE ((SELECT count(id) FROM ${tableName}) > ${maxDataRows}) OR - ((SELECT min(created_on) FROM ${tableName}) < (CURRENT_TIMESTAMP - time_interval)) - LOOP - DELETE FROM ${tableName} - WHERE created_on = (SELECT min(created_on) FROM ${tableName}); - END LOOP; - RETURN NULL; -END; -$body$ - LANGUAGE plpgsql; - -CREATE TRIGGER tr_keep_row_number_steady - AFTER INSERT ON ${tableName} - FOR EACH ROW EXECUTE PROCEDURE keep_row_number_steady(); \ No newline at end of file diff --git a/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/controller/ExternalPostgresPayloadResourceTest.java b/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/controller/ExternalPostgresPayloadResourceTest.java deleted file mode 100644 index 2b5bd77c9..000000000 --- a/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/controller/ExternalPostgresPayloadResourceTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.controller; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.ResponseEntity; - -import com.netflix.conductor.postgres.storage.PostgresPayloadStorage; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class ExternalPostgresPayloadResourceTest { - - private PostgresPayloadStorage mockPayloadStorage; - private ExternalPostgresPayloadResource postgresResource; - - @Before - public void before() { - this.mockPayloadStorage = mock(PostgresPayloadStorage.class); - this.postgresResource = new ExternalPostgresPayloadResource(this.mockPayloadStorage); - } - - @Test - public void testGetExternalStorageData() throws IOException { - String data = "Dummy data"; - InputStream inputStreamData = - new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8)); - when(mockPayloadStorage.download(anyString())).thenReturn(inputStreamData); - ResponseEntity response = - postgresResource.getExternalStorageData("dummyKey.json"); - assertNotNull(response.getBody()); - assertEquals( - data, - new String( - response.getBody().getInputStream().readAllBytes(), - StandardCharsets.UTF_8)); - } -} diff --git a/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/storage/PostgresPayloadStorageTest.java b/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/storage/PostgresPayloadStorageTest.java deleted file mode 100644 index 0d31215b5..000000000 --- a/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/storage/PostgresPayloadStorageTest.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.storage; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.utility.DockerImageName; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; - -import static org.junit.Assert.assertEquals; - -@ContextConfiguration(classes = {TestObjectMapperConfiguration.class}) -@RunWith(SpringRunner.class) -public class PostgresPayloadStorageTest { - - private PostgresPayloadTestUtil testPostgres; - private PostgresPayloadStorage executionPostgres; - - public PostgreSQLContainer postgreSQLContainer; - - private final String inputString = - "Lorem Ipsum is simply dummy text of the printing and typesetting industry." - + " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s."; - private final InputStream inputData; - private final String key = "dummyKey.json"; - - public PostgresPayloadStorageTest() { - inputData = new ByteArrayInputStream(inputString.getBytes(StandardCharsets.UTF_8)); - } - - @Before - public void setup() { - postgreSQLContainer = - new PostgreSQLContainer<>(DockerImageName.parse("postgres")) - .withDatabaseName("conductor"); - postgreSQLContainer.start(); - testPostgres = new PostgresPayloadTestUtil(postgreSQLContainer); - executionPostgres = - new PostgresPayloadStorage( - testPostgres.getTestProperties(), testPostgres.getDataSource()); - } - - @Test - public void testWriteInputStreamToDb() throws IOException, SQLException { - executionPostgres.upload(key, inputData, inputData.available()); - - PreparedStatement stmt = - testPostgres - .getDataSource() - .getConnection() - .prepareStatement( - "SELECT data FROM external.external_payload WHERE id = 'dummyKey.json'"); - ResultSet rs = stmt.executeQuery(); - rs.next(); - assertEquals( - inputString, - new String(rs.getBinaryStream(1).readAllBytes(), StandardCharsets.UTF_8)); - } - - @Test - public void testReadInputStreamFromDb() throws IOException, SQLException { - PreparedStatement stmt = - testPostgres - .getDataSource() - .getConnection() - .prepareStatement("INSERT INTO external.external_payload VALUES (?, ?)"); - stmt.setString(1, key); - stmt.setBinaryStream(2, inputData, inputData.available()); - stmt.executeUpdate(); - - assertEquals( - inputString, - new String(executionPostgres.download(key).readAllBytes(), StandardCharsets.UTF_8)); - } - - @Test - public void testMaxRowInTable() throws IOException, SQLException { - executionPostgres.upload(key, inputData, inputData.available()); - executionPostgres.upload("dummyKey2.json", inputData, inputData.available()); - executionPostgres.upload("dummyKey3.json", inputData, inputData.available()); - executionPostgres.upload("dummyKey4.json", inputData, inputData.available()); - executionPostgres.upload("dummyKey5.json", inputData, inputData.available()); - executionPostgres.upload("dummyKey6.json", inputData, inputData.available()); - executionPostgres.upload("dummyKey7.json", inputData, inputData.available()); - - PreparedStatement stmt = - testPostgres - .getDataSource() - .getConnection() - .prepareStatement("SELECT count(id) FROM external.external_payload"); - ResultSet rs = stmt.executeQuery(); - rs.next(); - assertEquals(5, rs.getInt(1)); - stmt.close(); - } - - @After - public void teardown() throws SQLException { - testPostgres.getDataSource().getConnection().close(); - } -} diff --git a/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/storage/PostgresPayloadTestUtil.java b/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/storage/PostgresPayloadTestUtil.java deleted file mode 100644 index 1bd0b5e49..000000000 --- a/postgres-external-storage/src/test/java/com/netflix/conductor/postgres/storage/PostgresPayloadTestUtil.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.storage; - -import java.nio.file.Paths; -import java.util.Map; - -import javax.sql.DataSource; - -import org.flywaydb.core.Flyway; -import org.flywaydb.core.api.configuration.FluentConfiguration; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.testcontainers.containers.PostgreSQLContainer; - -import com.netflix.conductor.postgres.config.PostgresPayloadProperties; - -public class PostgresPayloadTestUtil { - - private final DataSource dataSource; - private final PostgresPayloadProperties properties = new PostgresPayloadProperties(); - - public PostgresPayloadTestUtil(PostgreSQLContainer postgreSQLContainer) { - - this.dataSource = - DataSourceBuilder.create() - .url(postgreSQLContainer.getJdbcUrl()) - .username(postgreSQLContainer.getUsername()) - .password(postgreSQLContainer.getPassword()) - .build(); - flywayMigrate(dataSource); - } - - private void flywayMigrate(DataSource dataSource) { - FluentConfiguration fluentConfiguration = - Flyway.configure() - .schemas("external") - .locations(Paths.get("db/migration_external_postgres").toString()) - .dataSource(dataSource) - .placeholderReplacement(true) - .placeholders( - Map.of( - "tableName", - "external.external_payload", - "maxDataRows", - "5", - "maxDataDays", - "'1'", - "maxDataMonths", - "'1'", - "maxDataYears", - "'1'")); - - Flyway flyway = fluentConfiguration.load(); - flyway.migrate(); - } - - public DataSource getDataSource() { - return dataSource; - } - - public PostgresPayloadProperties getTestProperties() { - return properties; - } -} diff --git a/postgres-persistence/build.gradle b/postgres-persistence/build.gradle deleted file mode 100644 index d07299bf9..000000000 --- a/postgres-persistence/build.gradle +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2021 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ - -dependencies { - implementation project(':conductor-common') - implementation project(':conductor-core') - compileOnly 'org.springframework.boot:spring-boot-starter' - - // SBMTODO: remove guava dep - implementation "com.google.guava:guava:${revGuava}" - - implementation "com.fasterxml.jackson.core:jackson-databind" - implementation "com.fasterxml.jackson.core:jackson-core" - - implementation "org.apache.commons:commons-lang3" - implementation "org.postgresql:postgresql" - implementation "org.springframework.boot:spring-boot-starter-jdbc" - implementation "org.flywaydb:flyway-core" - - testImplementation "org.testcontainers:postgresql:${revTestContainer}" - - testImplementation project(':conductor-core').sourceSets.test.output - testImplementation project(':conductor-common').sourceSets.test.output -} - -test { - //the SQL unit tests must run within the same JVM to share the same embedded DB - maxParallelForks = 1 -} diff --git a/postgres-persistence/dependencies.lock b/postgres-persistence/dependencies.lock deleted file mode 100644 index f05686bec..000000000 --- a/postgres-persistence/dependencies.lock +++ /dev/null @@ -1,444 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.flywaydb:flyway-core": { - "locked": "8.0.5" - }, - "org.postgresql:postgresql": { - "locked": "42.3.3" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/config/PostgresConfiguration.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/config/PostgresConfiguration.java deleted file mode 100644 index c1b9e533d..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/config/PostgresConfiguration.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.config; - -import javax.annotation.PostConstruct; -import javax.sql.DataSource; - -import org.flywaydb.core.Flyway; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.DependsOn; -import org.springframework.context.annotation.Import; - -import com.netflix.conductor.postgres.dao.PostgresExecutionDAO; -import com.netflix.conductor.postgres.dao.PostgresMetadataDAO; -import com.netflix.conductor.postgres.dao.PostgresQueueDAO; - -import com.fasterxml.jackson.databind.ObjectMapper; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(PostgresProperties.class) -@ConditionalOnProperty(name = "conductor.db.type", havingValue = "postgres") -// Import the DataSourceAutoConfiguration when postgres database is selected. -// By default, the datasource configuration is excluded in the main module. -@Import(DataSourceAutoConfiguration.class) -public class PostgresConfiguration { - - DataSource dataSource; - - public PostgresConfiguration(DataSource dataSource) { - this.dataSource = dataSource; - } - - @Bean(initMethod = "migrate") - @PostConstruct - public Flyway flywayForPrimaryDb() { - return Flyway.configure() - .locations("classpath:db/migration_postgres") - .schemas("public") - .dataSource(dataSource) - .baselineOnMigrate(true) - .load(); - } - - @Bean - @DependsOn({"flywayForPrimaryDb"}) - public PostgresMetadataDAO postgresMetadataDAO( - ObjectMapper objectMapper, PostgresProperties properties) { - return new PostgresMetadataDAO(objectMapper, dataSource, properties); - } - - @Bean - @DependsOn({"flywayForPrimaryDb"}) - public PostgresExecutionDAO postgresExecutionDAO(ObjectMapper objectMapper) { - return new PostgresExecutionDAO(objectMapper, dataSource); - } - - @Bean - @DependsOn({"flywayForPrimaryDb"}) - public PostgresQueueDAO postgresQueueDAO(ObjectMapper objectMapper) { - return new PostgresQueueDAO(objectMapper, dataSource); - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/config/PostgresProperties.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/config/PostgresProperties.java deleted file mode 100644 index 93f0442d0..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/config/PostgresProperties.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.config; - -import java.time.Duration; -import java.time.temporal.ChronoUnit; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.convert.DurationUnit; - -@ConfigurationProperties("conductor.postgres") -public class PostgresProperties { - - /** The time in seconds after which the in-memory task definitions cache will be refreshed */ - @DurationUnit(ChronoUnit.SECONDS) - private Duration taskDefCacheRefreshInterval = Duration.ofSeconds(60); - - public Duration getTaskDefCacheRefreshInterval() { - return taskDefCacheRefreshInterval; - } - - public void setTaskDefCacheRefreshInterval(Duration taskDefCacheRefreshInterval) { - this.taskDefCacheRefreshInterval = taskDefCacheRefreshInterval; - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresBaseDAO.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresBaseDAO.java deleted file mode 100644 index 173cad887..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresBaseDAO.java +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.dao; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.SQLException; -import java.time.Duration; -import java.time.Instant; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; - -import javax.sql.DataSource; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.common.utils.RetryUtil; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.postgres.util.ExecuteFunction; -import com.netflix.conductor.postgres.util.LazyToString; -import com.netflix.conductor.postgres.util.Query; -import com.netflix.conductor.postgres.util.QueryFunction; -import com.netflix.conductor.postgres.util.TransactionalFunction; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; - -import static com.netflix.conductor.core.exception.ApplicationException.Code.BACKEND_ERROR; -import static com.netflix.conductor.core.exception.ApplicationException.Code.CONFLICT; -import static com.netflix.conductor.core.exception.ApplicationException.Code.INTERNAL_ERROR; - -import static java.lang.Integer.parseInt; -import static java.lang.System.getProperty; - -public abstract class PostgresBaseDAO { - - private static final String ER_LOCK_DEADLOCK = "40P01"; - private static final String ER_SERIALIZATION_FAILURE = "40001"; - private static final String MAX_RETRY_ON_DEADLOCK_PROPERTY_NAME = - "conductor.postgres.deadlock.retry.max"; - private static final String MAX_RETRY_ON_DEADLOCK_PROPERTY_DEFAULT_VALUE = "3"; - private static final int MAX_RETRY_ON_DEADLOCK = getMaxRetriesOnDeadLock(); - private static final List EXCLUDED_STACKTRACE_CLASS = - ImmutableList.of(PostgresBaseDAO.class.getName(), Thread.class.getName()); - - protected final Logger logger = LoggerFactory.getLogger(getClass()); - protected final ObjectMapper objectMapper; - protected final DataSource dataSource; - - protected PostgresBaseDAO(ObjectMapper objectMapper, DataSource dataSource) { - this.objectMapper = objectMapper; - this.dataSource = dataSource; - } - - protected final LazyToString getCallingMethod() { - return new LazyToString( - () -> - Arrays.stream(Thread.currentThread().getStackTrace()) - .filter( - ste -> - !EXCLUDED_STACKTRACE_CLASS.contains( - ste.getClassName())) - .findFirst() - .map(StackTraceElement::getMethodName) - .orElseThrow(() -> new NullPointerException("Cannot find Caller"))); - } - - protected String toJson(Object value) { - try { - return objectMapper.writeValueAsString(value); - } catch (JsonProcessingException ex) { - throw new ApplicationException(INTERNAL_ERROR, ex); - } - } - - protected T readValue(String json, Class tClass) { - try { - return objectMapper.readValue(json, tClass); - } catch (IOException ex) { - throw new ApplicationException(INTERNAL_ERROR, ex); - } - } - - protected T readValue(String json, TypeReference typeReference) { - try { - return objectMapper.readValue(json, typeReference); - } catch (IOException ex) { - throw new ApplicationException(INTERNAL_ERROR, ex); - } - } - - /** - * Initialize a new transactional {@link Connection} from {@link #dataSource} and pass it to - * {@literal function}. - * - *

Successful executions of {@literal function} will result in a commit and return of {@link - * TransactionalFunction#apply(Connection)}. - * - *

If any {@link Throwable} thrown from {@code TransactionalFunction#apply(Connection)} will - * result in a rollback of the transaction and will be wrapped in an {@link - * ApplicationException} if it is not already one. - * - *

Generally this is used to wrap multiple {@link #execute(Connection, String, - * ExecuteFunction)} or {@link #query(Connection, String, QueryFunction)} invocations that - * produce some expected return value. - * - * @param function The function to apply with a new transactional {@link Connection} - * @param The return type. - * @return The result of {@code TransactionalFunction#apply(Connection)} - * @throws ApplicationException If any errors occur. - */ - private R getWithTransaction(final TransactionalFunction function) { - final Instant start = Instant.now(); - LazyToString callingMethod = getCallingMethod(); - logger.trace("{} : starting transaction", callingMethod); - - try (Connection tx = dataSource.getConnection()) { - boolean previousAutoCommitMode = tx.getAutoCommit(); - tx.setAutoCommit(false); - try { - R result = function.apply(tx); - tx.commit(); - return result; - } catch (Throwable th) { - tx.rollback(); - if (th instanceof ApplicationException) { - throw th; - } - throw new ApplicationException(BACKEND_ERROR, th.getMessage(), th); - } finally { - tx.setAutoCommit(previousAutoCommitMode); - } - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex.getMessage(), ex); - } finally { - logger.trace( - "{} : took {}ms", - callingMethod, - Duration.between(start, Instant.now()).toMillis()); - } - } - - R getWithRetriedTransactions(final TransactionalFunction function) { - try { - return new RetryUtil() - .retryOnException( - () -> getWithTransaction(function), - this::isDeadLockError, - null, - MAX_RETRY_ON_DEADLOCK, - "retry on deadlock", - "transactional"); - } catch (RuntimeException e) { - throw (ApplicationException) e.getCause(); - } - } - - protected R getWithTransactionWithOutErrorPropagation(TransactionalFunction function) { - Instant start = Instant.now(); - LazyToString callingMethod = getCallingMethod(); - logger.trace("{} : starting transaction", callingMethod); - - try (Connection tx = dataSource.getConnection()) { - boolean previousAutoCommitMode = tx.getAutoCommit(); - tx.setAutoCommit(false); - try { - R result = function.apply(tx); - tx.commit(); - return result; - } catch (Throwable th) { - tx.rollback(); - logger.info(CONFLICT + " " + th.getMessage()); - return null; - } finally { - tx.setAutoCommit(previousAutoCommitMode); - } - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex.getMessage(), ex); - } finally { - logger.trace( - "{} : took {}ms", - callingMethod, - Duration.between(start, Instant.now()).toMillis()); - } - } - - /** - * Wraps {@link #getWithRetriedTransactions(TransactionalFunction)} with no return value. - * - *

Generally this is used to wrap multiple {@link #execute(Connection, String, - * ExecuteFunction)} or {@link #query(Connection, String, QueryFunction)} invocations that - * produce no expected return value. - * - * @param consumer The {@link Consumer} callback to pass a transactional {@link Connection} to. - * @throws ApplicationException If any errors occur. - * @see #getWithRetriedTransactions(TransactionalFunction) - */ - protected void withTransaction(Consumer consumer) { - getWithRetriedTransactions( - connection -> { - consumer.accept(connection); - return null; - }); - } - - /** - * Initiate a new transaction and execute a {@link Query} within that context, then return the - * results of {@literal function}. - * - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - * @param The expected return type of {@literal function}. - * @return The results of applying {@literal function}. - */ - protected R queryWithTransaction(String query, QueryFunction function) { - return getWithRetriedTransactions(tx -> query(tx, query, function)); - } - - /** - * Execute a {@link Query} within the context of a given transaction and return the results of - * {@literal function}. - * - * @param tx The transactional {@link Connection} to use. - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - * @param The expected return type of {@literal function}. - * @return The results of applying {@literal function}. - */ - protected R query(Connection tx, String query, QueryFunction function) { - try (Query q = new Query(objectMapper, tx, query)) { - return function.apply(q); - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex); - } - } - - /** - * Execute a statement with no expected return value within a given transaction. - * - * @param tx The transactional {@link Connection} to use. - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - */ - protected void execute(Connection tx, String query, ExecuteFunction function) { - try (Query q = new Query(objectMapper, tx, query)) { - function.apply(q); - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex); - } - } - - /** - * Instantiates a new transactional connection and invokes {@link #execute(Connection, String, - * ExecuteFunction)} - * - * @param query The query string to prepare. - * @param function The functional callback to pass a {@link Query} to. - */ - protected void executeWithTransaction(String query, ExecuteFunction function) { - withTransaction(tx -> execute(tx, query, function)); - } - - private boolean isDeadLockError(Throwable throwable) { - SQLException sqlException = findCauseSQLException(throwable); - if (sqlException == null) { - return false; - } - return ER_LOCK_DEADLOCK.equals(sqlException.getSQLState()) - || ER_SERIALIZATION_FAILURE.equals(sqlException.getSQLState()); - } - - private SQLException findCauseSQLException(Throwable throwable) { - Throwable causeException = throwable; - while (null != causeException && !(causeException instanceof SQLException)) { - causeException = causeException.getCause(); - } - return (SQLException) causeException; - } - - private static int getMaxRetriesOnDeadLock() { - try { - return parseInt( - getProperty( - MAX_RETRY_ON_DEADLOCK_PROPERTY_NAME, - MAX_RETRY_ON_DEADLOCK_PROPERTY_DEFAULT_VALUE)); - } catch (Exception e) { - return parseInt(MAX_RETRY_ON_DEADLOCK_PROPERTY_DEFAULT_VALUE); - } - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresExecutionDAO.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresExecutionDAO.java deleted file mode 100644 index 510563d36..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresExecutionDAO.java +++ /dev/null @@ -1,1072 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.dao; - -import java.sql.Connection; -import java.sql.Date; -import java.sql.SQLException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.stream.Collectors; - -import javax.sql.DataSource; - -import com.netflix.conductor.common.metadata.events.EventExecution; -import com.netflix.conductor.common.metadata.tasks.PollData; -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.dao.ConcurrentExecutionLimitDAO; -import com.netflix.conductor.dao.ExecutionDAO; -import com.netflix.conductor.dao.PollDataDAO; -import com.netflix.conductor.dao.RateLimitingDAO; -import com.netflix.conductor.metrics.Monitors; -import com.netflix.conductor.model.TaskModel; -import com.netflix.conductor.model.WorkflowModel; -import com.netflix.conductor.postgres.util.Query; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; - -import static com.netflix.conductor.core.exception.ApplicationException.Code.BACKEND_ERROR; - -public class PostgresExecutionDAO extends PostgresBaseDAO - implements ExecutionDAO, RateLimitingDAO, PollDataDAO, ConcurrentExecutionLimitDAO { - - private static final String ARCHIVED_FIELD = "archived"; - private static final String RAW_JSON_FIELD = "rawJSON"; - - public PostgresExecutionDAO(ObjectMapper objectMapper, DataSource dataSource) { - super(objectMapper, dataSource); - } - - private static String dateStr(Long timeInMs) { - Date date = new Date(timeInMs); - return dateStr(date); - } - - private static String dateStr(Date date) { - SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); - return format.format(date); - } - - @Override - public List getPendingTasksByWorkflow(String taskDefName, String workflowId) { - // @formatter:off - String GET_IN_PROGRESS_TASKS_FOR_WORKFLOW = - "SELECT json_data FROM task_in_progress tip " - + "INNER JOIN task t ON t.task_id = tip.task_id " - + "WHERE task_def_name = ? AND workflow_id = ? FOR SHARE"; - // @formatter:on - - return queryWithTransaction( - GET_IN_PROGRESS_TASKS_FOR_WORKFLOW, - q -> - q.addParameter(taskDefName) - .addParameter(workflowId) - .executeAndFetch(TaskModel.class)); - } - - @Override - public List getTasks(String taskDefName, String startKey, int count) { - List tasks = new ArrayList<>(count); - - List pendingTasks = getPendingTasksForTaskType(taskDefName); - boolean startKeyFound = startKey == null; - int found = 0; - for (TaskModel pendingTask : pendingTasks) { - if (!startKeyFound) { - if (pendingTask.getTaskId().equals(startKey)) { - startKeyFound = true; - // noinspection ConstantConditions - if (startKey != null) { - continue; - } - } - } - if (startKeyFound && found < count) { - tasks.add(pendingTask); - found++; - } - } - - return tasks; - } - - private static String taskKey(TaskModel task) { - return task.getReferenceTaskName() + "_" + task.getRetryCount(); - } - - @Override - public List createTasks(List tasks) { - List created = Lists.newArrayListWithCapacity(tasks.size()); - - for (TaskModel task : tasks) { - withTransaction( - connection -> { - validate(task); - - task.setScheduledTime(System.currentTimeMillis()); - - final String taskKey = taskKey(task); - - boolean scheduledTaskAdded = addScheduledTask(connection, task, taskKey); - - if (!scheduledTaskAdded) { - logger.trace( - "Task already scheduled, skipping the run " - + task.getTaskId() - + ", ref=" - + task.getReferenceTaskName() - + ", key=" - + taskKey); - return; - } - - insertOrUpdateTaskData(connection, task); - addWorkflowToTaskMapping(connection, task); - addTaskInProgress(connection, task); - updateTask(connection, task); - - created.add(task); - }); - } - - return created; - } - - @Override - public void updateTask(TaskModel task) { - withTransaction(connection -> updateTask(connection, task)); - } - - /** - * This is a dummy implementation and this feature is not for Postgres backed Conductor - * - * @param task: which needs to be evaluated whether it is rateLimited or not - */ - @Override - public boolean exceedsRateLimitPerFrequency(TaskModel task, TaskDef taskDef) { - return false; - } - - @Override - public boolean exceedsLimit(TaskModel task) { - - Optional taskDefinition = task.getTaskDefinition(); - if (taskDefinition.isEmpty()) { - return false; - } - - TaskDef taskDef = taskDefinition.get(); - - int limit = taskDef.concurrencyLimit(); - if (limit <= 0) { - return false; - } - - long current = getInProgressTaskCount(task.getTaskDefName()); - - if (current >= limit) { - Monitors.recordTaskConcurrentExecutionLimited(task.getTaskDefName(), limit); - return true; - } - - logger.info( - "Task execution count for {}: limit={}, current={}", - task.getTaskDefName(), - limit, - getInProgressTaskCount(task.getTaskDefName())); - - String taskId = task.getTaskId(); - - List tasksInProgressInOrderOfArrival = - findAllTasksInProgressInOrderOfArrival(task, limit); - - boolean rateLimited = !tasksInProgressInOrderOfArrival.contains(taskId); - - if (rateLimited) { - logger.info( - "Task execution count limited. {}, limit {}, current {}", - task.getTaskDefName(), - limit, - getInProgressTaskCount(task.getTaskDefName())); - Monitors.recordTaskConcurrentExecutionLimited(task.getTaskDefName(), limit); - } - - return rateLimited; - } - - @Override - public boolean removeTask(String taskId) { - TaskModel task = getTask(taskId); - - if (task == null) { - logger.warn("No such task found by id {}", taskId); - return false; - } - - final String taskKey = taskKey(task); - - withTransaction( - connection -> { - removeScheduledTask(connection, task, taskKey); - removeWorkflowToTaskMapping(connection, task); - removeTaskInProgress(connection, task); - removeTaskData(connection, task); - }); - return true; - } - - @Override - public TaskModel getTask(String taskId) { - String GET_TASK = "SELECT json_data FROM task WHERE task_id = ?"; - return queryWithTransaction( - GET_TASK, q -> q.addParameter(taskId).executeAndFetchFirst(TaskModel.class)); - } - - @Override - public List getTasks(List taskIds) { - if (taskIds.isEmpty()) { - return Lists.newArrayList(); - } - return getWithRetriedTransactions(c -> getTasks(c, taskIds)); - } - - @Override - public List getPendingTasksForTaskType(String taskName) { - Preconditions.checkNotNull(taskName, "task name cannot be null"); - // @formatter:off - String GET_IN_PROGRESS_TASKS_FOR_TYPE = - "SELECT json_data FROM task_in_progress tip " - + "INNER JOIN task t ON t.task_id = tip.task_id " - + "WHERE task_def_name = ? FOR UPDATE SKIP LOCKED"; - // @formatter:on - - return queryWithTransaction( - GET_IN_PROGRESS_TASKS_FOR_TYPE, - q -> q.addParameter(taskName).executeAndFetch(TaskModel.class)); - } - - @Override - public List getTasksForWorkflow(String workflowId) { - String GET_TASKS_FOR_WORKFLOW = - "SELECT task_id FROM workflow_to_task WHERE workflow_id = ? FOR SHARE"; - return getWithRetriedTransactions( - tx -> - query( - tx, - GET_TASKS_FOR_WORKFLOW, - q -> { - List taskIds = - q.addParameter(workflowId) - .executeScalarList(String.class); - return getTasks(tx, taskIds); - })); - } - - @Override - public String createWorkflow(WorkflowModel workflow) { - return insertOrUpdateWorkflow(workflow, false); - } - - @Override - public String updateWorkflow(WorkflowModel workflow) { - return insertOrUpdateWorkflow(workflow, true); - } - - @Override - public boolean removeWorkflow(String workflowId) { - boolean removed = false; - WorkflowModel workflow = getWorkflow(workflowId, true); - if (workflow != null) { - withTransaction( - connection -> { - removeWorkflowDefToWorkflowMapping(connection, workflow); - removeWorkflow(connection, workflowId); - removePendingWorkflow(connection, workflow.getWorkflowName(), workflowId); - }); - removed = true; - - for (TaskModel task : workflow.getTasks()) { - if (!removeTask(task.getTaskId())) { - removed = false; - } - } - } - return removed; - } - - /** - * This is a dummy implementation and this feature is not supported for Postgres backed - * Conductor - */ - @Override - public boolean removeWorkflowWithExpiry(String workflowId, int ttlSeconds) { - throw new UnsupportedOperationException( - "This method is not implemented in MySQLExecutionDAO. Please use RedisDAO mode instead for using TTLs."); - } - - @Override - public void removeFromPendingWorkflow(String workflowType, String workflowId) { - withTransaction(connection -> removePendingWorkflow(connection, workflowType, workflowId)); - } - - @Override - public WorkflowModel getWorkflow(String workflowId) { - return getWorkflow(workflowId, true); - } - - @Override - public WorkflowModel getWorkflow(String workflowId, boolean includeTasks) { - WorkflowModel workflow = getWithRetriedTransactions(tx -> readWorkflow(tx, workflowId)); - - if (workflow != null) { - if (includeTasks) { - List tasks = getTasksForWorkflow(workflowId); - tasks.sort(Comparator.comparingInt(TaskModel::getSeq)); - workflow.setTasks(tasks); - } - } - return workflow; - } - - /** - * @param workflowName name of the workflow - * @param version the workflow version - * @return list of workflow ids that are in RUNNING state returns workflows of all versions - * for the given workflow name - */ - @Override - public List getRunningWorkflowIds(String workflowName, int version) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - String GET_PENDING_WORKFLOW_IDS = - "SELECT workflow_id FROM workflow_pending WHERE workflow_type = ? FOR SHARE SKIP LOCKED"; - - return queryWithTransaction( - GET_PENDING_WORKFLOW_IDS, - q -> q.addParameter(workflowName).executeScalarList(String.class)); - } - - /** - * @param workflowName Name of the workflow - * @param version the workflow version - * @return list of workflows that are in RUNNING state - */ - @Override - public List getPendingWorkflowsByType(String workflowName, int version) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - return getRunningWorkflowIds(workflowName, version).stream() - .map(this::getWorkflow) - .filter(workflow -> workflow.getWorkflowVersion() == version) - .collect(Collectors.toList()); - } - - @Override - public long getPendingWorkflowCount(String workflowName) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - String GET_PENDING_WORKFLOW_COUNT = - "SELECT COUNT(*) FROM workflow_pending WHERE workflow_type = ?"; - - return queryWithTransaction( - GET_PENDING_WORKFLOW_COUNT, q -> q.addParameter(workflowName).executeCount()); - } - - @Override - public long getInProgressTaskCount(String taskDefName) { - String GET_IN_PROGRESS_TASK_COUNT = - "SELECT COUNT(*) FROM task_in_progress WHERE task_def_name = ? AND in_progress_status = true"; - - return queryWithTransaction( - GET_IN_PROGRESS_TASK_COUNT, q -> q.addParameter(taskDefName).executeCount()); - } - - @Override - public List getWorkflowsByType( - String workflowName, Long startTime, Long endTime) { - Preconditions.checkNotNull(workflowName, "workflowName cannot be null"); - Preconditions.checkNotNull(startTime, "startTime cannot be null"); - Preconditions.checkNotNull(endTime, "endTime cannot be null"); - - List workflows = new LinkedList<>(); - - withTransaction( - tx -> { - // @formatter:off - String GET_ALL_WORKFLOWS_FOR_WORKFLOW_DEF = - "SELECT workflow_id FROM workflow_def_to_workflow " - + "WHERE workflow_def = ? AND date_str BETWEEN ? AND ? FOR SHARE SKIP LOCKED"; - // @formatter:on - - List workflowIds = - query( - tx, - GET_ALL_WORKFLOWS_FOR_WORKFLOW_DEF, - q -> - q.addParameter(workflowName) - .addParameter(dateStr(startTime)) - .addParameter(dateStr(endTime)) - .executeScalarList(String.class)); - workflowIds.forEach( - workflowId -> { - try { - WorkflowModel wf = getWorkflow(workflowId); - if (wf.getCreateTime() >= startTime - && wf.getCreateTime() <= endTime) { - workflows.add(wf); - } - } catch (Exception e) { - logger.error( - "Unable to load workflow id {} with name {}", - workflowId, - workflowName, - e); - } - }); - }); - - return workflows; - } - - @Override - public List getWorkflowsByCorrelationId( - String workflowName, String correlationId, boolean includeTasks) { - Preconditions.checkNotNull(correlationId, "correlationId cannot be null"); - String GET_WORKFLOWS_BY_CORRELATION_ID = - "SELECT w.json_data FROM workflow w left join workflow_def_to_workflow wd on w.workflow_id = wd.workflow_id WHERE w.correlation_id = ? and wd.workflow_def = ? FOR SHARE SKIP LOCKED"; - - return queryWithTransaction( - GET_WORKFLOWS_BY_CORRELATION_ID, - q -> - q.addParameter(correlationId) - .addParameter(workflowName) - .executeAndFetch(WorkflowModel.class)); - } - - @Override - public boolean canSearchAcrossWorkflows() { - return true; - } - - @Override - public boolean addEventExecution(EventExecution eventExecution) { - try { - return getWithRetriedTransactions(tx -> insertEventExecution(tx, eventExecution)); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, - "Unable to add event execution " + eventExecution.getId(), - e); - } - } - - @Override - public void removeEventExecution(EventExecution eventExecution) { - try { - withTransaction(tx -> removeEventExecution(tx, eventExecution)); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, - "Unable to remove event execution " + eventExecution.getId(), - e); - } - } - - @Override - public void updateEventExecution(EventExecution eventExecution) { - try { - withTransaction(tx -> updateEventExecution(tx, eventExecution)); - } catch (Exception e) { - throw new ApplicationException( - ApplicationException.Code.BACKEND_ERROR, - "Unable to update event execution " + eventExecution.getId(), - e); - } - } - - public List getEventExecutions( - String eventHandlerName, String eventName, String messageId, int max) { - try { - List executions = Lists.newLinkedList(); - withTransaction( - tx -> { - for (int i = 0; i < max; i++) { - String executionId = - messageId + "_" - + i; // see SimpleEventProcessor.handle to understand - // how the - // execution id is set - EventExecution ee = - readEventExecution( - tx, - eventHandlerName, - eventName, - messageId, - executionId); - if (ee == null) { - break; - } - executions.add(ee); - } - }); - return executions; - } catch (Exception e) { - String message = - String.format( - "Unable to get event executions for eventHandlerName=%s, eventName=%s, messageId=%s", - eventHandlerName, eventName, messageId); - throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, message, e); - } - } - - @Override - public void updateLastPollData(String taskDefName, String domain, String workerId) { - Preconditions.checkNotNull(taskDefName, "taskDefName name cannot be null"); - PollData pollData = new PollData(taskDefName, domain, workerId, System.currentTimeMillis()); - String effectiveDomain = (domain == null) ? "DEFAULT" : domain; - withTransaction(tx -> insertOrUpdatePollData(tx, pollData, effectiveDomain)); - } - - @Override - public PollData getPollData(String taskDefName, String domain) { - Preconditions.checkNotNull(taskDefName, "taskDefName name cannot be null"); - String effectiveDomain = (domain == null) ? "DEFAULT" : domain; - return getWithRetriedTransactions(tx -> readPollData(tx, taskDefName, effectiveDomain)); - } - - @Override - public List getPollData(String taskDefName) { - Preconditions.checkNotNull(taskDefName, "taskDefName name cannot be null"); - return readAllPollData(taskDefName); - } - - @Override - public List getAllPollData() { - try (Connection tx = dataSource.getConnection()) { - boolean previousAutoCommitMode = tx.getAutoCommit(); - tx.setAutoCommit(true); - try { - String GET_ALL_POLL_DATA = "SELECT json_data FROM poll_data ORDER BY queue_name"; - return query(tx, GET_ALL_POLL_DATA, q -> q.executeAndFetch(PollData.class)); - } catch (Throwable th) { - throw new ApplicationException(BACKEND_ERROR, th.getMessage(), th); - } finally { - tx.setAutoCommit(previousAutoCommitMode); - } - } catch (SQLException ex) { - throw new ApplicationException(BACKEND_ERROR, ex.getMessage(), ex); - } - } - - private List getTasks(Connection connection, List taskIds) { - if (taskIds.isEmpty()) { - return Lists.newArrayList(); - } - - // Generate a formatted query string with a variable number of bind params based - // on taskIds.size() - final String GET_TASKS_FOR_IDS = - String.format( - "SELECT json_data FROM task WHERE task_id IN (%s) AND json_data IS NOT NULL", - Query.generateInBindings(taskIds.size())); - - return query( - connection, - GET_TASKS_FOR_IDS, - q -> q.addParameters(taskIds).executeAndFetch(TaskModel.class)); - } - - private String insertOrUpdateWorkflow(WorkflowModel workflow, boolean update) { - Preconditions.checkNotNull(workflow, "workflow object cannot be null"); - - boolean terminal = workflow.getStatus().isTerminal(); - - List tasks = workflow.getTasks(); - workflow.setTasks(Lists.newLinkedList()); - - withTransaction( - tx -> { - if (!update) { - addWorkflow(tx, workflow); - addWorkflowDefToWorkflowMapping(tx, workflow); - } else { - updateWorkflow(tx, workflow); - } - - if (terminal) { - removePendingWorkflow( - tx, workflow.getWorkflowName(), workflow.getWorkflowId()); - } else { - addPendingWorkflow( - tx, workflow.getWorkflowName(), workflow.getWorkflowId()); - } - }); - - workflow.setTasks(tasks); - return workflow.getWorkflowId(); - } - - private void updateTask(Connection connection, TaskModel task) { - Optional taskDefinition = task.getTaskDefinition(); - - if (taskDefinition.isPresent() && taskDefinition.get().concurrencyLimit() > 0) { - boolean inProgress = - task.getStatus() != null - && task.getStatus().equals(TaskModel.Status.IN_PROGRESS); - updateInProgressStatus(connection, task, inProgress); - } - - insertOrUpdateTaskData(connection, task); - - if (task.getStatus() != null && task.getStatus().isTerminal()) { - removeTaskInProgress(connection, task); - } - - addWorkflowToTaskMapping(connection, task); - } - - private WorkflowModel readWorkflow(Connection connection, String workflowId) { - String GET_WORKFLOW = "SELECT json_data FROM workflow WHERE workflow_id = ?"; - - return query( - connection, - GET_WORKFLOW, - q -> q.addParameter(workflowId).executeAndFetchFirst(WorkflowModel.class)); - } - - private void addWorkflow(Connection connection, WorkflowModel workflow) { - String INSERT_WORKFLOW = - "INSERT INTO workflow (workflow_id, correlation_id, json_data) VALUES (?, ?, ?)"; - - execute( - connection, - INSERT_WORKFLOW, - q -> - q.addParameter(workflow.getWorkflowId()) - .addParameter(workflow.getCorrelationId()) - .addJsonParameter(workflow) - .executeUpdate()); - } - - private void updateWorkflow(Connection connection, WorkflowModel workflow) { - String UPDATE_WORKFLOW = - "UPDATE workflow SET json_data = ?, modified_on = CURRENT_TIMESTAMP WHERE workflow_id = ?"; - - execute( - connection, - UPDATE_WORKFLOW, - q -> - q.addJsonParameter(workflow) - .addParameter(workflow.getWorkflowId()) - .executeUpdate()); - } - - private void removeWorkflow(Connection connection, String workflowId) { - String REMOVE_WORKFLOW = "DELETE FROM workflow WHERE workflow_id = ?"; - execute(connection, REMOVE_WORKFLOW, q -> q.addParameter(workflowId).executeDelete()); - } - - private void addPendingWorkflow(Connection connection, String workflowType, String workflowId) { - - String EXISTS_PENDING_WORKFLOW = - "SELECT EXISTS(SELECT 1 FROM workflow_pending WHERE workflow_type = ? AND workflow_id = ?)"; - - boolean exists = - query( - connection, - EXISTS_PENDING_WORKFLOW, - q -> q.addParameter(workflowType).addParameter(workflowId).exists()); - - if (!exists) { - String INSERT_PENDING_WORKFLOW = - "INSERT INTO workflow_pending (workflow_type, workflow_id) VALUES (?, ?) ON CONFLICT (workflow_type,workflow_id) DO NOTHING"; - - execute( - connection, - INSERT_PENDING_WORKFLOW, - q -> q.addParameter(workflowType).addParameter(workflowId).executeUpdate()); - } - } - - private void removePendingWorkflow( - Connection connection, String workflowType, String workflowId) { - String REMOVE_PENDING_WORKFLOW = - "DELETE FROM workflow_pending WHERE workflow_type = ? AND workflow_id = ?"; - - execute( - connection, - REMOVE_PENDING_WORKFLOW, - q -> q.addParameter(workflowType).addParameter(workflowId).executeDelete()); - } - - private void insertOrUpdateTaskData(Connection connection, TaskModel task) { - /* - * Most times the row will be updated so let's try the update first. This used to be an 'INSERT/ON CONFLICT do update' sql statement. The problem with that - * is that if we try the INSERT first, the sequence will be increased even if the ON CONFLICT happens. - */ - String UPDATE_TASK = - "UPDATE task SET json_data=?, modified_on=CURRENT_TIMESTAMP WHERE task_id=?"; - int rowsUpdated = - query( - connection, - UPDATE_TASK, - q -> - q.addJsonParameter(task) - .addParameter(task.getTaskId()) - .executeUpdate()); - - if (rowsUpdated == 0) { - String INSERT_TASK = - "INSERT INTO task (task_id, json_data, modified_on) VALUES (?, ?, CURRENT_TIMESTAMP) ON CONFLICT (task_id) DO UPDATE SET json_data=excluded.json_data, modified_on=excluded.modified_on"; - execute( - connection, - INSERT_TASK, - q -> q.addParameter(task.getTaskId()).addJsonParameter(task).executeUpdate()); - } - } - - private void removeTaskData(Connection connection, TaskModel task) { - String REMOVE_TASK = "DELETE FROM task WHERE task_id = ?"; - execute(connection, REMOVE_TASK, q -> q.addParameter(task.getTaskId()).executeDelete()); - } - - private void addWorkflowToTaskMapping(Connection connection, TaskModel task) { - - String EXISTS_WORKFLOW_TO_TASK = - "SELECT EXISTS(SELECT 1 FROM workflow_to_task WHERE workflow_id = ? AND task_id = ?)"; - - boolean exists = - query( - connection, - EXISTS_WORKFLOW_TO_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(task.getTaskId()) - .exists()); - - if (!exists) { - String INSERT_WORKFLOW_TO_TASK = - "INSERT INTO workflow_to_task (workflow_id, task_id) VALUES (?, ?) ON CONFLICT (workflow_id,task_id) DO NOTHING"; - - execute( - connection, - INSERT_WORKFLOW_TO_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(task.getTaskId()) - .executeUpdate()); - } - } - - private void removeWorkflowToTaskMapping(Connection connection, TaskModel task) { - String REMOVE_WORKFLOW_TO_TASK = - "DELETE FROM workflow_to_task WHERE workflow_id = ? AND task_id = ?"; - - execute( - connection, - REMOVE_WORKFLOW_TO_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(task.getTaskId()) - .executeDelete()); - } - - private void addWorkflowDefToWorkflowMapping(Connection connection, WorkflowModel workflow) { - String INSERT_WORKFLOW_DEF_TO_WORKFLOW = - "INSERT INTO workflow_def_to_workflow (workflow_def, date_str, workflow_id) VALUES (?, ?, ?)"; - - execute( - connection, - INSERT_WORKFLOW_DEF_TO_WORKFLOW, - q -> - q.addParameter(workflow.getWorkflowName()) - .addParameter(dateStr(workflow.getCreateTime())) - .addParameter(workflow.getWorkflowId()) - .executeUpdate()); - } - - private void removeWorkflowDefToWorkflowMapping(Connection connection, WorkflowModel workflow) { - String REMOVE_WORKFLOW_DEF_TO_WORKFLOW = - "DELETE FROM workflow_def_to_workflow WHERE workflow_def = ? AND date_str = ? AND workflow_id = ?"; - - execute( - connection, - REMOVE_WORKFLOW_DEF_TO_WORKFLOW, - q -> - q.addParameter(workflow.getWorkflowName()) - .addParameter(dateStr(workflow.getCreateTime())) - .addParameter(workflow.getWorkflowId()) - .executeUpdate()); - } - - @VisibleForTesting - boolean addScheduledTask(Connection connection, TaskModel task, String taskKey) { - - final String EXISTS_SCHEDULED_TASK = - "SELECT EXISTS(SELECT 1 FROM task_scheduled where workflow_id = ? AND task_key = ?)"; - - boolean exists = - query( - connection, - EXISTS_SCHEDULED_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(taskKey) - .exists()); - - if (!exists) { - final String INSERT_IGNORE_SCHEDULED_TASK = - "INSERT INTO task_scheduled (workflow_id, task_key, task_id) VALUES (?, ?, ?) ON CONFLICT (workflow_id,task_key) DO NOTHING"; - - int count = - query( - connection, - INSERT_IGNORE_SCHEDULED_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(taskKey) - .addParameter(task.getTaskId()) - .executeUpdate()); - return count > 0; - } else { - return false; - } - } - - private void removeScheduledTask(Connection connection, TaskModel task, String taskKey) { - String REMOVE_SCHEDULED_TASK = - "DELETE FROM task_scheduled WHERE workflow_id = ? AND task_key = ?"; - execute( - connection, - REMOVE_SCHEDULED_TASK, - q -> - q.addParameter(task.getWorkflowInstanceId()) - .addParameter(taskKey) - .executeDelete()); - } - - private void addTaskInProgress(Connection connection, TaskModel task) { - String EXISTS_IN_PROGRESS_TASK = - "SELECT EXISTS(SELECT 1 FROM task_in_progress WHERE task_def_name = ? AND task_id = ?)"; - - boolean exists = - query( - connection, - EXISTS_IN_PROGRESS_TASK, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .exists()); - - if (!exists) { - String INSERT_IN_PROGRESS_TASK = - "INSERT INTO task_in_progress (task_def_name, task_id, workflow_id) VALUES (?, ?, ?)"; - - execute( - connection, - INSERT_IN_PROGRESS_TASK, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .addParameter(task.getWorkflowInstanceId()) - .executeUpdate()); - } - } - - private void removeTaskInProgress(Connection connection, TaskModel task) { - String REMOVE_IN_PROGRESS_TASK = - "DELETE FROM task_in_progress WHERE task_def_name = ? AND task_id = ?"; - - execute( - connection, - REMOVE_IN_PROGRESS_TASK, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .executeUpdate()); - } - - private void updateInProgressStatus(Connection connection, TaskModel task, boolean inProgress) { - String UPDATE_IN_PROGRESS_TASK_STATUS = - "UPDATE task_in_progress SET in_progress_status = ?, modified_on = CURRENT_TIMESTAMP " - + "WHERE task_def_name = ? AND task_id = ?"; - - execute( - connection, - UPDATE_IN_PROGRESS_TASK_STATUS, - q -> - q.addParameter(inProgress) - .addParameter(task.getTaskDefName()) - .addParameter(task.getTaskId()) - .executeUpdate()); - } - - private boolean insertEventExecution(Connection connection, EventExecution eventExecution) { - - String INSERT_EVENT_EXECUTION = - "INSERT INTO event_execution (event_handler_name, event_name, message_id, execution_id, json_data) " - + "VALUES (?, ?, ?, ?, ?)"; - int count = - query( - connection, - INSERT_EVENT_EXECUTION, - q -> - q.addParameter(eventExecution.getName()) - .addParameter(eventExecution.getEvent()) - .addParameter(eventExecution.getMessageId()) - .addParameter(eventExecution.getId()) - .addJsonParameter(eventExecution) - .executeUpdate()); - return count > 0; - } - - private void updateEventExecution(Connection connection, EventExecution eventExecution) { - // @formatter:off - String UPDATE_EVENT_EXECUTION = - "UPDATE event_execution SET " - + "json_data = ?, " - + "modified_on = CURRENT_TIMESTAMP " - + "WHERE event_handler_name = ? " - + "AND event_name = ? " - + "AND message_id = ? " - + "AND execution_id = ?"; - // @formatter:on - - execute( - connection, - UPDATE_EVENT_EXECUTION, - q -> - q.addJsonParameter(eventExecution) - .addParameter(eventExecution.getName()) - .addParameter(eventExecution.getEvent()) - .addParameter(eventExecution.getMessageId()) - .addParameter(eventExecution.getId()) - .executeUpdate()); - } - - private void removeEventExecution(Connection connection, EventExecution eventExecution) { - String REMOVE_EVENT_EXECUTION = - "DELETE FROM event_execution " - + "WHERE event_handler_name = ? " - + "AND event_name = ? " - + "AND message_id = ? " - + "AND execution_id = ?"; - - execute( - connection, - REMOVE_EVENT_EXECUTION, - q -> - q.addParameter(eventExecution.getName()) - .addParameter(eventExecution.getEvent()) - .addParameter(eventExecution.getMessageId()) - .addParameter(eventExecution.getId()) - .executeUpdate()); - } - - private EventExecution readEventExecution( - Connection connection, - String eventHandlerName, - String eventName, - String messageId, - String executionId) { - // @formatter:off - String GET_EVENT_EXECUTION = - "SELECT json_data FROM event_execution " - + "WHERE event_handler_name = ? " - + "AND event_name = ? " - + "AND message_id = ? " - + "AND execution_id = ?"; - // @formatter:on - return query( - connection, - GET_EVENT_EXECUTION, - q -> - q.addParameter(eventHandlerName) - .addParameter(eventName) - .addParameter(messageId) - .addParameter(executionId) - .executeAndFetchFirst(EventExecution.class)); - } - - private void insertOrUpdatePollData(Connection connection, PollData pollData, String domain) { - /* - * Most times the row will be updated so let's try the update first. This used to be an 'INSERT/ON CONFLICT do update' sql statement. The problem with that - * is that if we try the INSERT first, the sequence will be increased even if the ON CONFLICT happens. Since polling happens *a lot*, the sequence can increase - * dramatically even though it won't be used. - */ - String UPDATE_POLL_DATA = - "UPDATE poll_data SET json_data=?, modified_on=CURRENT_TIMESTAMP WHERE queue_name=? AND domain=?"; - int rowsUpdated = - query( - connection, - UPDATE_POLL_DATA, - q -> - q.addJsonParameter(pollData) - .addParameter(pollData.getQueueName()) - .addParameter(domain) - .executeUpdate()); - - if (rowsUpdated == 0) { - String INSERT_POLL_DATA = - "INSERT INTO poll_data (queue_name, domain, json_data, modified_on) VALUES (?, ?, ?, CURRENT_TIMESTAMP) ON CONFLICT (queue_name,domain) DO UPDATE SET json_data=excluded.json_data, modified_on=excluded.modified_on"; - execute( - connection, - INSERT_POLL_DATA, - q -> - q.addParameter(pollData.getQueueName()) - .addParameter(domain) - .addJsonParameter(pollData) - .executeUpdate()); - } - } - - private PollData readPollData(Connection connection, String queueName, String domain) { - String GET_POLL_DATA = - "SELECT json_data FROM poll_data WHERE queue_name = ? AND domain = ?"; - return query( - connection, - GET_POLL_DATA, - q -> - q.addParameter(queueName) - .addParameter(domain) - .executeAndFetchFirst(PollData.class)); - } - - private List readAllPollData(String queueName) { - String GET_ALL_POLL_DATA = "SELECT json_data FROM poll_data WHERE queue_name = ?"; - return queryWithTransaction( - GET_ALL_POLL_DATA, q -> q.addParameter(queueName).executeAndFetch(PollData.class)); - } - - private List findAllTasksInProgressInOrderOfArrival(TaskModel task, int limit) { - String GET_IN_PROGRESS_TASKS_WITH_LIMIT = - "SELECT task_id FROM task_in_progress WHERE task_def_name = ? ORDER BY created_on LIMIT ?"; - - return queryWithTransaction( - GET_IN_PROGRESS_TASKS_WITH_LIMIT, - q -> - q.addParameter(task.getTaskDefName()) - .addParameter(limit) - .executeScalarList(String.class)); - } - - private void validate(TaskModel task) { - Preconditions.checkNotNull(task, "task object cannot be null"); - Preconditions.checkNotNull(task.getTaskId(), "Task id cannot be null"); - Preconditions.checkNotNull( - task.getWorkflowInstanceId(), "Workflow instance id cannot be null"); - Preconditions.checkNotNull( - task.getReferenceTaskName(), "Task reference name cannot be null"); - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresMetadataDAO.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresMetadataDAO.java deleted file mode 100644 index b461a399e..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresMetadataDAO.java +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.dao; - -import java.sql.Connection; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; - -import javax.sql.DataSource; - -import com.netflix.conductor.common.metadata.events.EventHandler; -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.dao.EventHandlerDAO; -import com.netflix.conductor.dao.MetadataDAO; -import com.netflix.conductor.metrics.Monitors; -import com.netflix.conductor.postgres.config.PostgresProperties; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Preconditions; - -public class PostgresMetadataDAO extends PostgresBaseDAO implements MetadataDAO, EventHandlerDAO { - - private final ConcurrentHashMap taskDefCache = new ConcurrentHashMap<>(); - private static final String CLASS_NAME = PostgresMetadataDAO.class.getSimpleName(); - - public PostgresMetadataDAO( - ObjectMapper objectMapper, DataSource dataSource, PostgresProperties properties) { - super(objectMapper, dataSource); - - long cacheRefreshTime = properties.getTaskDefCacheRefreshInterval().getSeconds(); - Executors.newSingleThreadScheduledExecutor() - .scheduleWithFixedDelay( - this::refreshTaskDefs, - cacheRefreshTime, - cacheRefreshTime, - TimeUnit.SECONDS); - } - - @Override - public void createTaskDef(TaskDef taskDef) { - validate(taskDef); - insertOrUpdateTaskDef(taskDef); - } - - @Override - public String updateTaskDef(TaskDef taskDef) { - validate(taskDef); - return insertOrUpdateTaskDef(taskDef); - } - - @Override - public TaskDef getTaskDef(String name) { - Preconditions.checkNotNull(name, "TaskDef name cannot be null"); - TaskDef taskDef = taskDefCache.get(name); - if (taskDef == null) { - if (logger.isTraceEnabled()) { - logger.trace("Cache miss: {}", name); - } - taskDef = getTaskDefFromDB(name); - } - - return taskDef; - } - - @Override - public List getAllTaskDefs() { - return getWithRetriedTransactions(this::findAllTaskDefs); - } - - @Override - public void removeTaskDef(String name) { - final String DELETE_TASKDEF_QUERY = "DELETE FROM meta_task_def WHERE name = ?"; - - executeWithTransaction( - DELETE_TASKDEF_QUERY, - q -> { - if (!q.addParameter(name).executeDelete()) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, "No such task definition"); - } - - taskDefCache.remove(name); - }); - } - - @Override - public void createWorkflowDef(WorkflowDef def) { - validate(def); - - withTransaction( - tx -> { - if (workflowExists(tx, def)) { - throw new ApplicationException( - ApplicationException.Code.CONFLICT, - "Workflow with " + def.key() + " already exists!"); - } - - insertOrUpdateWorkflowDef(tx, def); - }); - } - - @Override - public void updateWorkflowDef(WorkflowDef def) { - validate(def); - withTransaction(tx -> insertOrUpdateWorkflowDef(tx, def)); - } - - @Override - public Optional getLatestWorkflowDef(String name) { - final String GET_LATEST_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE NAME = ? AND " - + "version = latest_version"; - - return Optional.ofNullable( - queryWithTransaction( - GET_LATEST_WORKFLOW_DEF_QUERY, - q -> q.addParameter(name).executeAndFetchFirst(WorkflowDef.class))); - } - - @Override - public Optional getWorkflowDef(String name, int version) { - final String GET_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE NAME = ? AND version = ?"; - return Optional.ofNullable( - queryWithTransaction( - GET_WORKFLOW_DEF_QUERY, - q -> - q.addParameter(name) - .addParameter(version) - .executeAndFetchFirst(WorkflowDef.class))); - } - - @Override - public void removeWorkflowDef(String name, Integer version) { - final String DELETE_WORKFLOW_QUERY = - "DELETE from meta_workflow_def WHERE name = ? AND version = ?"; - - withTransaction( - tx -> { - // remove specified workflow - execute( - tx, - DELETE_WORKFLOW_QUERY, - q -> { - if (!q.addParameter(name).addParameter(version).executeDelete()) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, - String.format( - "No such workflow definition: %s version: %d", - name, version)); - } - }); - // reset latest version based on remaining rows for this workflow - Optional maxVersion = getLatestVersion(tx, name); - maxVersion.ifPresent(newVersion -> updateLatestVersion(tx, name, newVersion)); - }); - } - - public List findAll() { - final String FIND_ALL_WORKFLOW_DEF_QUERY = "SELECT DISTINCT name FROM meta_workflow_def"; - return queryWithTransaction( - FIND_ALL_WORKFLOW_DEF_QUERY, q -> q.executeAndFetch(String.class)); - } - - @Override - public List getAllWorkflowDefs() { - final String GET_ALL_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def ORDER BY name, version"; - - return queryWithTransaction( - GET_ALL_WORKFLOW_DEF_QUERY, q -> q.executeAndFetch(WorkflowDef.class)); - } - - public List getAllLatest() { - final String GET_ALL_LATEST_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE version = " + "latest_version"; - - return queryWithTransaction( - GET_ALL_LATEST_WORKFLOW_DEF_QUERY, q -> q.executeAndFetch(WorkflowDef.class)); - } - - public List getAllVersions(String name) { - final String GET_ALL_VERSIONS_WORKFLOW_DEF_QUERY = - "SELECT json_data FROM meta_workflow_def WHERE name = ? " + "ORDER BY version"; - - return queryWithTransaction( - GET_ALL_VERSIONS_WORKFLOW_DEF_QUERY, - q -> q.addParameter(name).executeAndFetch(WorkflowDef.class)); - } - - @Override - public void addEventHandler(EventHandler eventHandler) { - Preconditions.checkNotNull(eventHandler.getName(), "EventHandler name cannot be null"); - - final String INSERT_EVENT_HANDLER_QUERY = - "INSERT INTO meta_event_handler (name, event, active, json_data) " - + "VALUES (?, ?, ?, ?)"; - - withTransaction( - tx -> { - if (getEventHandler(tx, eventHandler.getName()) != null) { - throw new ApplicationException( - ApplicationException.Code.CONFLICT, - "EventHandler with name " - + eventHandler.getName() - + " already exists!"); - } - - execute( - tx, - INSERT_EVENT_HANDLER_QUERY, - q -> - q.addParameter(eventHandler.getName()) - .addParameter(eventHandler.getEvent()) - .addParameter(eventHandler.isActive()) - .addJsonParameter(eventHandler) - .executeUpdate()); - }); - } - - @Override - public void updateEventHandler(EventHandler eventHandler) { - Preconditions.checkNotNull(eventHandler.getName(), "EventHandler name cannot be null"); - - // @formatter:off - final String UPDATE_EVENT_HANDLER_QUERY = - "UPDATE meta_event_handler SET " - + "event = ?, active = ?, json_data = ?, " - + "modified_on = CURRENT_TIMESTAMP WHERE name = ?"; - // @formatter:on - - withTransaction( - tx -> { - EventHandler existing = getEventHandler(tx, eventHandler.getName()); - if (existing == null) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, - "EventHandler with name " + eventHandler.getName() + " not found!"); - } - - execute( - tx, - UPDATE_EVENT_HANDLER_QUERY, - q -> - q.addParameter(eventHandler.getEvent()) - .addParameter(eventHandler.isActive()) - .addJsonParameter(eventHandler) - .addParameter(eventHandler.getName()) - .executeUpdate()); - }); - } - - @Override - public void removeEventHandler(String name) { - final String DELETE_EVENT_HANDLER_QUERY = "DELETE FROM meta_event_handler WHERE name = ?"; - - withTransaction( - tx -> { - EventHandler existing = getEventHandler(tx, name); - if (existing == null) { - throw new ApplicationException( - ApplicationException.Code.NOT_FOUND, - "EventHandler with name " + name + " not found!"); - } - - execute( - tx, - DELETE_EVENT_HANDLER_QUERY, - q -> q.addParameter(name).executeDelete()); - }); - } - - @Override - public List getAllEventHandlers() { - final String READ_ALL_EVENT_HANDLER_QUERY = "SELECT json_data FROM meta_event_handler"; - return queryWithTransaction( - READ_ALL_EVENT_HANDLER_QUERY, q -> q.executeAndFetch(EventHandler.class)); - } - - @Override - public List getEventHandlersForEvent(String event, boolean activeOnly) { - final String READ_ALL_EVENT_HANDLER_BY_EVENT_QUERY = - "SELECT json_data FROM meta_event_handler WHERE event = ?"; - return queryWithTransaction( - READ_ALL_EVENT_HANDLER_BY_EVENT_QUERY, - q -> { - q.addParameter(event); - return q.executeAndFetch( - rs -> { - List handlers = new ArrayList<>(); - while (rs.next()) { - EventHandler h = readValue(rs.getString(1), EventHandler.class); - if (!activeOnly || h.isActive()) { - handlers.add(h); - } - } - - return handlers; - }); - }); - } - - /** - * Use {@link Preconditions} to check for required {@link TaskDef} fields, throwing a Runtime - * exception if validations fail. - * - * @param taskDef The {@code TaskDef} to check. - */ - private void validate(TaskDef taskDef) { - Preconditions.checkNotNull(taskDef, "TaskDef object cannot be null"); - Preconditions.checkNotNull(taskDef.getName(), "TaskDef name cannot be null"); - } - - /** - * Use {@link Preconditions} to check for required {@link WorkflowDef} fields, throwing a - * Runtime exception if validations fail. - * - * @param def The {@code WorkflowDef} to check. - */ - private void validate(WorkflowDef def) { - Preconditions.checkNotNull(def, "WorkflowDef object cannot be null"); - Preconditions.checkNotNull(def.getName(), "WorkflowDef name cannot be null"); - } - - /** - * Retrieve a {@link EventHandler} by {@literal name}. - * - * @param connection The {@link Connection} to use for queries. - * @param name The {@code EventHandler} name to look for. - * @return {@literal null} if nothing is found, otherwise the {@code EventHandler}. - */ - private EventHandler getEventHandler(Connection connection, String name) { - final String READ_ONE_EVENT_HANDLER_QUERY = - "SELECT json_data FROM meta_event_handler WHERE name = ?"; - - return query( - connection, - READ_ONE_EVENT_HANDLER_QUERY, - q -> q.addParameter(name).executeAndFetchFirst(EventHandler.class)); - } - - /** - * Check if a {@link WorkflowDef} with the same {@literal name} and {@literal version} already - * exist. - * - * @param connection The {@link Connection} to use for queries. - * @param def The {@code WorkflowDef} to check for. - * @return {@literal true} if a {@code WorkflowDef} already exists with the same values. - */ - private Boolean workflowExists(Connection connection, WorkflowDef def) { - final String CHECK_WORKFLOW_DEF_EXISTS_QUERY = - "SELECT COUNT(*) FROM meta_workflow_def WHERE name = ? AND " + "version = ?"; - - return query( - connection, - CHECK_WORKFLOW_DEF_EXISTS_QUERY, - q -> q.addParameter(def.getName()).addParameter(def.getVersion()).exists()); - } - - /** - * Return the latest version that exists for the provided {@code name}. - * - * @param tx The {@link Connection} to use for queries. - * @param name The {@code name} to check for. - * @return {@code Optional.empty()} if no versions exist, otherwise the max {@link - * WorkflowDef#getVersion} found. - */ - private Optional getLatestVersion(Connection tx, String name) { - final String GET_LATEST_WORKFLOW_DEF_VERSION = - "SELECT max(version) AS version FROM meta_workflow_def WHERE " + "name = ?"; - - Integer val = - query( - tx, - GET_LATEST_WORKFLOW_DEF_VERSION, - q -> { - q.addParameter(name); - return q.executeAndFetch( - rs -> { - if (!rs.next()) { - return null; - } - - return rs.getInt(1); - }); - }); - - return Optional.ofNullable(val); - } - - /** - * Update the latest version for the workflow with name {@code WorkflowDef} to the version - * provided in {@literal version}. - * - * @param tx The {@link Connection} to use for queries. - * @param name Workflow def name to update - * @param version The new latest {@code version} value. - */ - private void updateLatestVersion(Connection tx, String name, int version) { - final String UPDATE_WORKFLOW_DEF_LATEST_VERSION_QUERY = - "UPDATE meta_workflow_def SET latest_version = ? " + "WHERE name = ?"; - - execute( - tx, - UPDATE_WORKFLOW_DEF_LATEST_VERSION_QUERY, - q -> q.addParameter(version).addParameter(name).executeUpdate()); - } - - private void insertOrUpdateWorkflowDef(Connection tx, WorkflowDef def) { - final String INSERT_WORKFLOW_DEF_QUERY = - "INSERT INTO meta_workflow_def (name, version, json_data) VALUES (?," + " ?, ?)"; - - Optional version = getLatestVersion(tx, def.getName()); - if (!workflowExists(tx, def)) { - execute( - tx, - INSERT_WORKFLOW_DEF_QUERY, - q -> - q.addParameter(def.getName()) - .addParameter(def.getVersion()) - .addJsonParameter(def) - .executeUpdate()); - } else { - // @formatter:off - final String UPDATE_WORKFLOW_DEF_QUERY = - "UPDATE meta_workflow_def " - + "SET json_data = ?, modified_on = CURRENT_TIMESTAMP " - + "WHERE name = ? AND version = ?"; - // @formatter:on - - execute( - tx, - UPDATE_WORKFLOW_DEF_QUERY, - q -> - q.addJsonParameter(def) - .addParameter(def.getName()) - .addParameter(def.getVersion()) - .executeUpdate()); - } - int maxVersion = def.getVersion(); - if (version.isPresent() && version.get() > def.getVersion()) { - maxVersion = version.get(); - } - - updateLatestVersion(tx, def.getName(), maxVersion); - } - - /** - * Query persistence for all defined {@link TaskDef} data, and cache it in {@link - * #taskDefCache}. - */ - private void refreshTaskDefs() { - try { - withTransaction( - tx -> { - Map map = new HashMap<>(); - findAllTaskDefs(tx).forEach(taskDef -> map.put(taskDef.getName(), taskDef)); - - synchronized (taskDefCache) { - taskDefCache.clear(); - taskDefCache.putAll(map); - } - - if (logger.isTraceEnabled()) { - logger.trace("Refreshed {} TaskDefs", taskDefCache.size()); - } - }); - } catch (Exception e) { - Monitors.error(CLASS_NAME, "refreshTaskDefs"); - logger.error("refresh TaskDefs failed ", e); - } - } - - /** - * Query persistence for all defined {@link TaskDef} data. - * - * @param tx The {@link Connection} to use for queries. - * @return A new {@code List} with all the {@code TaskDef} data that was retrieved. - */ - private List findAllTaskDefs(Connection tx) { - final String READ_ALL_TASKDEF_QUERY = "SELECT json_data FROM meta_task_def"; - - return query(tx, READ_ALL_TASKDEF_QUERY, q -> q.executeAndFetch(TaskDef.class)); - } - - /** - * Explicitly retrieves a {@link TaskDef} from persistence, avoiding {@link #taskDefCache}. - * - * @param name The name of the {@code TaskDef} to query for. - * @return {@literal null} if nothing is found, otherwise the {@code TaskDef}. - */ - private TaskDef getTaskDefFromDB(String name) { - final String READ_ONE_TASKDEF_QUERY = "SELECT json_data FROM meta_task_def WHERE name = ?"; - - return queryWithTransaction( - READ_ONE_TASKDEF_QUERY, - q -> q.addParameter(name).executeAndFetchFirst(TaskDef.class)); - } - - private String insertOrUpdateTaskDef(TaskDef taskDef) { - final String UPDATE_TASKDEF_QUERY = - "UPDATE meta_task_def SET json_data = ?, modified_on = CURRENT_TIMESTAMP WHERE name = ?"; - - final String INSERT_TASKDEF_QUERY = - "INSERT INTO meta_task_def (name, json_data) VALUES (?, ?)"; - - return getWithRetriedTransactions( - tx -> { - execute( - tx, - UPDATE_TASKDEF_QUERY, - update -> { - int result = - update.addJsonParameter(taskDef) - .addParameter(taskDef.getName()) - .executeUpdate(); - if (result == 0) { - execute( - tx, - INSERT_TASKDEF_QUERY, - insert -> - insert.addParameter(taskDef.getName()) - .addJsonParameter(taskDef) - .executeUpdate()); - } - }); - - taskDefCache.put(taskDef.getName(), taskDef); - return taskDef.getName(); - }); - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresQueueDAO.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresQueueDAO.java deleted file mode 100644 index 8b4175f65..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresQueueDAO.java +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.dao; - -import java.sql.Connection; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - -import javax.sql.DataSource; - -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.dao.QueueDAO; -import com.netflix.conductor.postgres.util.Query; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.google.common.util.concurrent.Uninterruptibles; - -public class PostgresQueueDAO extends PostgresBaseDAO implements QueueDAO { - - private static final Long UNACK_SCHEDULE_MS = 60_000L; - - public PostgresQueueDAO(ObjectMapper om, DataSource ds) { - super(om, ds); - - Executors.newSingleThreadScheduledExecutor() - .scheduleAtFixedRate( - this::processAllUnacks, - UNACK_SCHEDULE_MS, - UNACK_SCHEDULE_MS, - TimeUnit.MILLISECONDS); - logger.debug(PostgresQueueDAO.class.getName() + " is ready to serve"); - } - - @Override - public void push(String queueName, String messageId, long offsetTimeInSecond) { - push(queueName, messageId, 0, offsetTimeInSecond); - } - - @Override - public void push(String queueName, String messageId, int priority, long offsetTimeInSecond) { - withTransaction( - tx -> pushMessage(tx, queueName, messageId, null, priority, offsetTimeInSecond)); - } - - @Override - public void push(String queueName, List messages) { - withTransaction( - tx -> - messages.forEach( - message -> - pushMessage( - tx, - queueName, - message.getId(), - message.getPayload(), - message.getPriority(), - 0))); - } - - @Override - public boolean pushIfNotExists(String queueName, String messageId, long offsetTimeInSecond) { - return pushIfNotExists(queueName, messageId, 0, offsetTimeInSecond); - } - - @Override - public boolean pushIfNotExists( - String queueName, String messageId, int priority, long offsetTimeInSecond) { - return getWithRetriedTransactions( - tx -> { - if (!existsMessage(tx, queueName, messageId)) { - pushMessage(tx, queueName, messageId, null, priority, offsetTimeInSecond); - return true; - } - return false; - }); - } - - @Override - public List pop(String queueName, int count, int timeout) { - return pollMessages(queueName, count, timeout).stream() - .map(Message::getId) - .collect(Collectors.toList()); - } - - @Override - public List pollMessages(String queueName, int count, int timeout) { - if (timeout < 1) { - List messages = - getWithTransactionWithOutErrorPropagation( - tx -> popMessages(tx, queueName, count, timeout)); - if (messages == null) { - return new ArrayList<>(); - } - return messages; - } - - long start = System.currentTimeMillis(); - final List messages = new ArrayList<>(); - - while (true) { - List messagesSlice = - getWithTransactionWithOutErrorPropagation( - tx -> popMessages(tx, queueName, count - messages.size(), timeout)); - if (messagesSlice == null) { - logger.warn( - "Unable to poll {} messages from {} due to tx conflict, only {} popped", - count, - queueName, - messages.size()); - // conflict could have happened, returned messages popped so far - return messages; - } - - messages.addAll(messagesSlice); - if (messages.size() >= count || ((System.currentTimeMillis() - start) > timeout)) { - return messages; - } - Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS); - } - } - - @Override - public void remove(String queueName, String messageId) { - withTransaction(tx -> removeMessage(tx, queueName, messageId)); - } - - @Override - public int getSize(String queueName) { - final String GET_QUEUE_SIZE = "SELECT COUNT(*) FROM queue_message WHERE queue_name = ?"; - return queryWithTransaction( - GET_QUEUE_SIZE, q -> ((Long) q.addParameter(queueName).executeCount()).intValue()); - } - - @Override - public boolean ack(String queueName, String messageId) { - return getWithRetriedTransactions(tx -> removeMessage(tx, queueName, messageId)); - } - - @Override - public boolean setUnackTimeout(String queueName, String messageId, long unackTimeout) { - long updatedOffsetTimeInSecond = unackTimeout / 1000; - - final String UPDATE_UNACK_TIMEOUT = - "UPDATE queue_message SET offset_time_seconds = ?, deliver_on = (current_timestamp + (? ||' seconds')::interval) WHERE queue_name = ? AND message_id = ?"; - - return queryWithTransaction( - UPDATE_UNACK_TIMEOUT, - q -> - q.addParameter(updatedOffsetTimeInSecond) - .addParameter(updatedOffsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .executeUpdate()) - == 1; - } - - @Override - public void flush(String queueName) { - final String FLUSH_QUEUE = "DELETE FROM queue_message WHERE queue_name = ?"; - executeWithTransaction(FLUSH_QUEUE, q -> q.addParameter(queueName).executeDelete()); - } - - @Override - public Map queuesDetail() { - final String GET_QUEUES_DETAIL = - "SELECT queue_name, (SELECT count(*) FROM queue_message WHERE popped = false AND queue_name = q.queue_name) AS size FROM queue q FOR SHARE SKIP LOCKED"; - return queryWithTransaction( - GET_QUEUES_DETAIL, - q -> - q.executeAndFetch( - rs -> { - Map detail = Maps.newHashMap(); - while (rs.next()) { - String queueName = rs.getString("queue_name"); - Long size = rs.getLong("size"); - detail.put(queueName, size); - } - return detail; - })); - } - - @Override - public Map>> queuesDetailVerbose() { - // @formatter:off - final String GET_QUEUES_DETAIL_VERBOSE = - "SELECT queue_name, \n" - + " (SELECT count(*) FROM queue_message WHERE popped = false AND queue_name = q.queue_name) AS size,\n" - + " (SELECT count(*) FROM queue_message WHERE popped = true AND queue_name = q.queue_name) AS uacked \n" - + "FROM queue q FOR SHARE SKIP LOCKED"; - // @formatter:on - - return queryWithTransaction( - GET_QUEUES_DETAIL_VERBOSE, - q -> - q.executeAndFetch( - rs -> { - Map>> result = - Maps.newHashMap(); - while (rs.next()) { - String queueName = rs.getString("queue_name"); - Long size = rs.getLong("size"); - Long queueUnacked = rs.getLong("uacked"); - result.put( - queueName, - ImmutableMap.of( - "a", - ImmutableMap - .of( // sharding not implemented, - // returning only - // one shard with all the - // info - "size", - size, - "uacked", - queueUnacked))); - } - return result; - })); - } - - /** - * Un-pop all un-acknowledged messages for all queues. - * - * @since 1.11.6 - */ - public void processAllUnacks() { - logger.trace("processAllUnacks started"); - - getWithRetriedTransactions( - tx -> { - String LOCK_TASKS = - "SELECT queue_name, message_id FROM queue_message WHERE popped = true AND (deliver_on + (60 ||' seconds')::interval) < current_timestamp limit 1000 FOR UPDATE SKIP LOCKED"; - - List messages = - query( - tx, - LOCK_TASKS, - p -> - p.executeAndFetch( - rs -> { - List results = - new ArrayList(); - while (rs.next()) { - QueueMessage qm = new QueueMessage(); - qm.queueName = - rs.getString("queue_name"); - qm.messageId = - rs.getString("message_id"); - results.add(qm); - } - return results; - })); - - if (messages.size() == 0) { - return 0; - } - - Map> queueMessageMap = new HashMap>(); - for (QueueMessage qm : messages) { - if (!queueMessageMap.containsKey(qm.queueName)) { - queueMessageMap.put(qm.queueName, new ArrayList()); - } - queueMessageMap.get(qm.queueName).add(qm.messageId); - } - - int totalUnacked = 0; - for (String queueName : queueMessageMap.keySet()) { - Integer unacked = 0; - ; - try { - final List msgIds = queueMessageMap.get(queueName); - final String UPDATE_POPPED = - String.format( - "UPDATE queue_message SET popped = false WHERE queue_name = ? and message_id IN (%s)", - Query.generateInBindings(msgIds.size())); - - unacked = - query( - tx, - UPDATE_POPPED, - q -> - q.addParameter(queueName) - .addParameters(msgIds) - .executeUpdate()); - } catch (Exception e) { - e.printStackTrace(); - } - totalUnacked += unacked; - logger.debug("Unacked {} messages from all queues", unacked); - } - - if (totalUnacked > 0) { - logger.debug("Unacked {} messages from all queues", totalUnacked); - } - return totalUnacked; - }); - } - - @Override - public void processUnacks(String queueName) { - final String PROCESS_UNACKS = - "UPDATE queue_message SET popped = false WHERE queue_name = ? AND popped = true AND (current_timestamp - (60 ||' seconds')::interval) > deliver_on"; - executeWithTransaction(PROCESS_UNACKS, q -> q.addParameter(queueName).executeUpdate()); - } - - @Override - public boolean resetOffsetTime(String queueName, String messageId) { - long offsetTimeInSecond = 0; // Reset to 0 - final String SET_OFFSET_TIME = - "UPDATE queue_message SET offset_time_seconds = ?, deliver_on = (current_timestamp + (? ||' seconds')::interval) \n" - + "WHERE queue_name = ? AND message_id = ?"; - - return queryWithTransaction( - SET_OFFSET_TIME, - q -> - q.addParameter(offsetTimeInSecond) - .addParameter(offsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .executeUpdate() - == 1); - } - - private boolean existsMessage(Connection connection, String queueName, String messageId) { - final String EXISTS_MESSAGE = - "SELECT EXISTS(SELECT 1 FROM queue_message WHERE queue_name = ? AND message_id = ?) FOR SHARE"; - return query( - connection, - EXISTS_MESSAGE, - q -> q.addParameter(queueName).addParameter(messageId).exists()); - } - - private void pushMessage( - Connection connection, - String queueName, - String messageId, - String payload, - Integer priority, - long offsetTimeInSecond) { - - createQueueIfNotExists(connection, queueName); - - String UPDATE_MESSAGE = - "UPDATE queue_message SET payload=?, deliver_on=(current_timestamp + (? ||' seconds')::interval) WHERE queue_name = ? AND message_id = ?"; - int rowsUpdated = - query( - connection, - UPDATE_MESSAGE, - q -> - q.addParameter(payload) - .addParameter(offsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .executeUpdate()); - - if (rowsUpdated == 0) { - String PUSH_MESSAGE = - "INSERT INTO queue_message (deliver_on, queue_name, message_id, priority, offset_time_seconds, payload) VALUES ((current_timestamp + (? ||' seconds')::interval), ?,?,?,?,?) ON CONFLICT (queue_name,message_id) DO UPDATE SET payload=excluded.payload, deliver_on=excluded.deliver_on"; - execute( - connection, - PUSH_MESSAGE, - q -> - q.addParameter(offsetTimeInSecond) - .addParameter(queueName) - .addParameter(messageId) - .addParameter(priority) - .addParameter(offsetTimeInSecond) - .addParameter(payload) - .executeUpdate()); - } - } - - private boolean removeMessage(Connection connection, String queueName, String messageId) { - final String REMOVE_MESSAGE = - "DELETE FROM queue_message WHERE queue_name = ? AND message_id = ?"; - return query( - connection, - REMOVE_MESSAGE, - q -> q.addParameter(queueName).addParameter(messageId).executeDelete()); - } - - private List peekMessages(Connection connection, String queueName, int count) { - if (count < 1) { - return Collections.emptyList(); - } - - final String PEEK_MESSAGES = - "SELECT message_id, priority, payload FROM queue_message WHERE queue_name = ? AND popped = false AND deliver_on <= (current_timestamp + (1000 ||' microseconds')::interval) ORDER BY priority DESC, deliver_on, created_on LIMIT ? FOR UPDATE SKIP LOCKED"; - - return query( - connection, - PEEK_MESSAGES, - p -> - p.addParameter(queueName) - .addParameter(count) - .executeAndFetch( - rs -> { - List results = new ArrayList<>(); - while (rs.next()) { - Message m = new Message(); - m.setId(rs.getString("message_id")); - m.setPriority(rs.getInt("priority")); - m.setPayload(rs.getString("payload")); - results.add(m); - } - return results; - })); - } - - private List popMessages( - Connection connection, String queueName, int count, int timeout) { - List messages = peekMessages(connection, queueName, count); - - if (messages.isEmpty()) { - return messages; - } - - List poppedMessages = new ArrayList<>(); - for (Message message : messages) { - final String POP_MESSAGE = - "UPDATE queue_message SET popped = true WHERE queue_name = ? AND message_id = ? AND popped = false"; - int result = - query( - connection, - POP_MESSAGE, - q -> - q.addParameter(queueName) - .addParameter(message.getId()) - .executeUpdate()); - - if (result == 1) { - poppedMessages.add(message); - } - } - return poppedMessages; - } - - @Override - public boolean containsMessage(String queueName, String messageId) { - return getWithRetriedTransactions(tx -> existsMessage(tx, queueName, messageId)); - } - - private void createQueueIfNotExists(Connection connection, String queueName) { - logger.trace("Creating new queue '{}'", queueName); - final String EXISTS_QUEUE = - "SELECT EXISTS(SELECT 1 FROM queue WHERE queue_name = ?) FOR SHARE"; - boolean exists = query(connection, EXISTS_QUEUE, q -> q.addParameter(queueName).exists()); - if (!exists) { - final String CREATE_QUEUE = - "INSERT INTO queue (queue_name) VALUES (?) ON CONFLICT (queue_name) DO NOTHING"; - execute(connection, CREATE_QUEUE, q -> q.addParameter(queueName).executeUpdate()); - } - } - - private class QueueMessage { - public String queueName; - public String messageId; - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/ExecuteFunction.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/ExecuteFunction.java deleted file mode 100644 index 97bc85bec..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/ExecuteFunction.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.util; - -import java.sql.SQLException; - -/** - * Functional interface for {@link Query} executions with no expected result. - * - * @author mustafa - */ -@FunctionalInterface -public interface ExecuteFunction { - - void apply(Query query) throws SQLException; -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/LazyToString.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/LazyToString.java deleted file mode 100644 index 6d6ec55c7..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/LazyToString.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.util; - -import java.util.function.Supplier; - -/** Functional class to support the lazy execution of a String result. */ -public class LazyToString { - - private final Supplier supplier; - - /** @param supplier Supplier to execute when {@link #toString()} is called. */ - public LazyToString(Supplier supplier) { - this.supplier = supplier; - } - - @Override - public String toString() { - return supplier.get(); - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/Query.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/Query.java deleted file mode 100644 index 6c4fa0e58..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/Query.java +++ /dev/null @@ -1,624 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.util; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.Date; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import org.apache.commons.lang3.math.NumberUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.core.exception.ApplicationException.Code; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Represents a {@link PreparedStatement} that is wrapped with convenience methods and utilities. - * - *

This class simulates a parameter building pattern and all {@literal addParameter(*)} methods - * must be called in the proper order of their expected binding sequence. - * - * @author mustafa - */ -public class Query implements AutoCloseable { - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - /** The {@link ObjectMapper} instance to use for serializing/deserializing JSON. */ - protected final ObjectMapper objectMapper; - - /** The initial supplied query String that was used to prepare {@link #statement}. */ - private final String rawQuery; - - /** - * Parameter index for the {@code ResultSet#set*(*)} methods, gets incremented every time a - * parameter is added to the {@code PreparedStatement} {@link #statement}. - */ - private final AtomicInteger index = new AtomicInteger(1); - - /** The {@link PreparedStatement} that will be managed and executed by this class. */ - private final PreparedStatement statement; - - public Query(ObjectMapper objectMapper, Connection connection, String query) { - this.rawQuery = query; - this.objectMapper = objectMapper; - - try { - this.statement = connection.prepareStatement(query); - } catch (SQLException ex) { - throw new ApplicationException( - Code.BACKEND_ERROR, - "Cannot prepare statement for query: " + ex.getMessage(), - ex); - } - } - - /** - * Generate a String with {@literal count} number of '?' placeholders for {@link - * PreparedStatement} queries. - * - * @param count The number of '?' chars to generate. - * @return a comma delimited string of {@literal count} '?' binding placeholders. - */ - public static String generateInBindings(int count) { - String[] questions = new String[count]; - for (int i = 0; i < count; i++) { - questions[i] = "?"; - } - - return String.join(", ", questions); - } - - public Query addParameter(final String value) { - return addParameterInternal((ps, idx) -> ps.setString(idx, value)); - } - - public Query addParameter(final int value) { - return addParameterInternal((ps, idx) -> ps.setInt(idx, value)); - } - - public Query addParameter(final boolean value) { - return addParameterInternal(((ps, idx) -> ps.setBoolean(idx, value))); - } - - public Query addParameter(final long value) { - return addParameterInternal((ps, idx) -> ps.setLong(idx, value)); - } - - public Query addParameter(final double value) { - return addParameterInternal((ps, idx) -> ps.setDouble(idx, value)); - } - - public Query addParameter(Date date) { - return addParameterInternal((ps, idx) -> ps.setDate(idx, date)); - } - - public Query addParameter(Timestamp timestamp) { - return addParameterInternal((ps, idx) -> ps.setTimestamp(idx, timestamp)); - } - - /** - * Serializes {@literal value} to a JSON string for persistence. - * - * @param value The value to serialize. - * @return {@literal this} - */ - public Query addJsonParameter(Object value) { - return addParameter(toJson(value)); - } - - /** - * Bind the given {@link java.util.Date} to the PreparedStatement as a {@link Date}. - * - * @param date The {@literal java.util.Date} to bind. - * @return {@literal this} - */ - public Query addDateParameter(java.util.Date date) { - return addParameter(new Date(date.getTime())); - } - - /** - * Bind the given {@link java.util.Date} to the PreparedStatement as a {@link Timestamp}. - * - * @param date The {@literal java.util.Date} to bind. - * @return {@literal this} - */ - public Query addTimestampParameter(java.util.Date date) { - return addParameter(new Timestamp(date.getTime())); - } - - /** - * Bind the given epoch millis to the PreparedStatement as a {@link Timestamp}. - * - * @param epochMillis The epoch ms to create a new {@literal Timestamp} from. - * @return {@literal this} - */ - public Query addTimestampParameter(long epochMillis) { - return addParameter(new Timestamp(epochMillis)); - } - - /** - * Add a collection of primitive values at once, in the order of the collection. - * - * @param values The values to bind to the prepared statement. - * @return {@literal this} - * @throws IllegalArgumentException If a non-primitive/unsupported type is encountered in the - * collection. - * @see #addParameters(Object...) - */ - public Query addParameters(Collection values) { - return addParameters(values.toArray()); - } - - /** - * Add many primitive values at once. - * - * @param values The values to bind to the prepared statement. - * @return {@literal this} - * @throws IllegalArgumentException If a non-primitive/unsupported type is encountered. - */ - public Query addParameters(Object... values) { - for (Object v : values) { - if (v instanceof String) { - addParameter((String) v); - } else if (v instanceof Integer) { - addParameter((Integer) v); - } else if (v instanceof Long) { - addParameter((Long) v); - } else if (v instanceof Double) { - addParameter((Double) v); - } else if (v instanceof Boolean) { - addParameter((Boolean) v); - } else if (v instanceof Date) { - addParameter((Date) v); - } else if (v instanceof Timestamp) { - addParameter((Timestamp) v); - } else { - throw new IllegalArgumentException( - "Type " - + v.getClass().getName() - + " is not supported by automatic property assignment"); - } - } - - return this; - } - - /** - * Utility method for evaluating the prepared statement as a query to check the existence of a - * record using a numeric count or boolean return value. - * - *

The {@link #rawQuery} provided must result in a {@link Number} or {@link Boolean} result. - * - * @return {@literal true} If a count query returned more than 0 or an exists query returns - * {@literal true}. - * @throws ApplicationException If an unexpected return type cannot be evaluated to a {@code - * Boolean} result. - */ - public boolean exists() { - Object val = executeScalar(); - if (null == val) { - return false; - } - - if (val instanceof Number) { - return convertLong(val) > 0; - } - - if (val instanceof Boolean) { - return (Boolean) val; - } - - if (val instanceof String) { - return convertBoolean(val); - } - - throw new ApplicationException( - Code.BACKEND_ERROR, - "Expected a Numeric or Boolean scalar return value from the query, received " - + val.getClass().getName()); - } - - /** - * Convenience method for executing delete statements. - * - * @return {@literal true} if the statement affected 1 or more rows. - * @see #executeUpdate() - */ - public boolean executeDelete() { - int count = executeUpdate(); - if (count > 1) { - logger.trace("Removed {} row(s) for query {}", count, rawQuery); - } - - return count > 0; - } - - /** - * Convenience method for executing statements that return a single numeric value, typically - * {@literal SELECT COUNT...} style queries. - * - * @return The result of the query as a {@literal long}. - */ - public long executeCount() { - return executeScalar(Long.class); - } - - /** @return The result of {@link PreparedStatement#executeUpdate()} */ - public int executeUpdate() { - try { - - Long start = null; - if (logger.isTraceEnabled()) { - start = System.currentTimeMillis(); - } - - final int val = this.statement.executeUpdate(); - - if (null != start && logger.isTraceEnabled()) { - long end = System.currentTimeMillis(); - logger.trace("[{}ms] {}: {}", (end - start), val, rawQuery); - } - - return val; - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex.getMessage(), ex); - } - } - - /** - * Execute a query from the PreparedStatement and return the ResultSet. - * - *

NOTE: The returned ResultSet must be closed/managed by the calling methods. - * - * @return {@link PreparedStatement#executeQuery()} - * @throws ApplicationException If any SQL errors occur. - */ - public ResultSet executeQuery() { - Long start = null; - if (logger.isTraceEnabled()) { - start = System.currentTimeMillis(); - } - - try { - return this.statement.executeQuery(); - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } finally { - if (null != start && logger.isTraceEnabled()) { - long end = System.currentTimeMillis(); - logger.trace("[{}ms] {}", (end - start), rawQuery); - } - } - } - - /** @return The single result of the query as an Object. */ - public Object executeScalar() { - try (ResultSet rs = executeQuery()) { - if (!rs.next()) { - return null; - } - return rs.getObject(1); - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the PreparedStatement and return a single 'primitive' value from the ResultSet. - * - * @param returnType The type to return. - * @param The type parameter to return a List of. - * @return A single result from the execution of the statement, as a type of {@literal - * returnType}. - * @throws ApplicationException {@literal returnType} is unsupported, cannot be cast to from the - * result, or any SQL errors occur. - */ - public V executeScalar(Class returnType) { - try (ResultSet rs = executeQuery()) { - if (!rs.next()) { - Object value = null; - if (Integer.class == returnType) { - value = 0; - } else if (Long.class == returnType) { - value = 0L; - } else if (Boolean.class == returnType) { - value = false; - } - return returnType.cast(value); - } else { - return getScalarFromResultSet(rs, returnType); - } - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the PreparedStatement and return a List of 'primitive' values from the ResultSet. - * - * @param returnType The type Class return a List of. - * @param The type parameter to return a List of. - * @return A {@code List}. - * @throws ApplicationException {@literal returnType} is unsupported, cannot be cast to from the - * result, or any SQL errors occur. - */ - public List executeScalarList(Class returnType) { - try (ResultSet rs = executeQuery()) { - List values = new ArrayList<>(); - while (rs.next()) { - values.add(getScalarFromResultSet(rs, returnType)); - } - return values; - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the statement and return only the first record from the result set. - * - * @param returnType The Class to return. - * @param The type parameter. - * @return An instance of {@literal } from the result set. - */ - public V executeAndFetchFirst(Class returnType) { - Object o = executeScalar(); - if (null == o) { - return null; - } - return convert(o, returnType); - } - - /** - * Execute the PreparedStatement and return a List of {@literal returnType} values from the - * ResultSet. - * - * @param returnType The type Class return a List of. - * @param The type parameter to return a List of. - * @return A {@code List}. - * @throws ApplicationException {@literal returnType} is unsupported, cannot be cast to from the - * result, or any SQL errors occur. - */ - public List executeAndFetch(Class returnType) { - try (ResultSet rs = executeQuery()) { - List list = new ArrayList<>(); - while (rs.next()) { - list.add(convert(rs.getObject(1), returnType)); - } - return list; - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - /** - * Execute the query and pass the {@link ResultSet} to the given handler. - * - * @param handler The {@link ResultSetHandler} to execute. - * @param The return type of this method. - * @return The results of {@link ResultSetHandler#apply(ResultSet)}. - */ - public V executeAndFetch(ResultSetHandler handler) { - try (ResultSet rs = executeQuery()) { - return handler.apply(rs); - } catch (SQLException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - @Override - public void close() { - try { - if (null != statement && !statement.isClosed()) { - statement.close(); - } - } catch (SQLException ex) { - logger.warn("Error closing prepared statement: {}", ex.getMessage()); - } - } - - protected final Query addParameterInternal(InternalParameterSetter setter) { - int index = getAndIncrementIndex(); - try { - setter.apply(this.statement, index); - return this; - } catch (SQLException ex) { - throw new ApplicationException( - Code.BACKEND_ERROR, "Could not apply bind parameter at index " + index, ex); - } - } - - protected V getScalarFromResultSet(ResultSet rs, Class returnType) throws SQLException { - Object value = null; - - if (Integer.class == returnType) { - value = rs.getInt(1); - } else if (Long.class == returnType) { - value = rs.getLong(1); - } else if (String.class == returnType) { - value = rs.getString(1); - } else if (Boolean.class == returnType) { - value = rs.getBoolean(1); - } else if (Double.class == returnType) { - value = rs.getDouble(1); - } else if (Date.class == returnType) { - value = rs.getDate(1); - } else if (Timestamp.class == returnType) { - value = rs.getTimestamp(1); - } else { - value = rs.getObject(1); - } - - if (null == value) { - throw new NullPointerException( - "Cannot get value from ResultSet of type " + returnType.getName()); - } - - return returnType.cast(value); - } - - protected V convert(Object value, Class returnType) { - if (Boolean.class == returnType) { - return returnType.cast(convertBoolean(value)); - } else if (Integer.class == returnType) { - return returnType.cast(convertInt(value)); - } else if (Long.class == returnType) { - return returnType.cast(convertLong(value)); - } else if (Double.class == returnType) { - return returnType.cast(convertDouble(value)); - } else if (String.class == returnType) { - return returnType.cast(convertString(value)); - } else if (value instanceof String) { - return fromJson((String) value, returnType); - } - - final String vName = value.getClass().getName(); - final String rName = returnType.getName(); - throw new ApplicationException( - Code.BACKEND_ERROR, "Cannot convert type " + vName + " to " + rName); - } - - protected Integer convertInt(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Integer) { - return (Integer) value; - } - - if (value instanceof Number) { - return ((Number) value).intValue(); - } - - return NumberUtils.toInt(value.toString()); - } - - protected Double convertDouble(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Double) { - return (Double) value; - } - - if (value instanceof Number) { - return ((Number) value).doubleValue(); - } - - return NumberUtils.toDouble(value.toString()); - } - - protected Long convertLong(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Long) { - return (Long) value; - } - - if (value instanceof Number) { - return ((Number) value).longValue(); - } - return NumberUtils.toLong(value.toString()); - } - - protected String convertString(Object value) { - if (null == value) { - return null; - } - - if (value instanceof String) { - return (String) value; - } - - return value.toString().trim(); - } - - protected Boolean convertBoolean(Object value) { - if (null == value) { - return null; - } - - if (value instanceof Boolean) { - return (Boolean) value; - } - - if (value instanceof Number) { - return ((Number) value).intValue() != 0; - } - - String text = value.toString().trim(); - return "Y".equalsIgnoreCase(text) - || "YES".equalsIgnoreCase(text) - || "TRUE".equalsIgnoreCase(text) - || "T".equalsIgnoreCase(text) - || "1".equalsIgnoreCase(text); - } - - protected String toJson(Object value) { - if (null == value) { - return null; - } - - try { - return objectMapper.writeValueAsString(value); - } catch (JsonProcessingException ex) { - throw new ApplicationException(Code.BACKEND_ERROR, ex); - } - } - - protected V fromJson(String value, Class returnType) { - if (null == value) { - return null; - } - - try { - return objectMapper.readValue(value, returnType); - } catch (IOException ex) { - throw new ApplicationException( - Code.BACKEND_ERROR, - "Could not convert JSON '" + value + "' to " + returnType.getName(), - ex); - } - } - - protected final int getIndex() { - return index.get(); - } - - protected final int getAndIncrementIndex() { - return index.getAndIncrement(); - } - - @FunctionalInterface - private interface InternalParameterSetter { - - void apply(PreparedStatement ps, int idx) throws SQLException; - } -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueryFunction.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueryFunction.java deleted file mode 100644 index fd9a4f658..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueryFunction.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.util; - -import java.sql.SQLException; - -/** - * Functional interface for {@link Query} executions that return results. - * - * @author mustafa - */ -@FunctionalInterface -public interface QueryFunction { - - R apply(Query query) throws SQLException; -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/ResultSetHandler.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/ResultSetHandler.java deleted file mode 100644 index b823dfecc..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/ResultSetHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.util; - -import java.sql.ResultSet; -import java.sql.SQLException; - -/** - * Functional interface for {@link Query#executeAndFetch(ResultSetHandler)}. - * - * @author mustafa - */ -@FunctionalInterface -public interface ResultSetHandler { - - R apply(ResultSet resultSet) throws SQLException; -} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/TransactionalFunction.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/TransactionalFunction.java deleted file mode 100644 index 0d08c69ac..000000000 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/TransactionalFunction.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.util; - -import java.sql.Connection; -import java.sql.SQLException; - -/** - * Functional interface for operations within a transactional context. - * - * @author mustafa - */ -@FunctionalInterface -public interface TransactionalFunction { - - R apply(Connection tx) throws SQLException; -} diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V1__initial_schema.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V1__initial_schema.sql deleted file mode 100644 index a76611b27..000000000 --- a/postgres-persistence/src/main/resources/db/migration_postgres/V1__initial_schema.sql +++ /dev/null @@ -1,173 +0,0 @@ - --- -------------------------------------------------------------------------------------------------------------- --- SCHEMA FOR METADATA DAO --- -------------------------------------------------------------------------------------------------------------- - -CREATE TABLE meta_event_handler ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - name varchar(255) NOT NULL, - event varchar(255) NOT NULL, - active boolean NOT NULL, - json_data TEXT NOT NULL, - PRIMARY KEY (id) -); -CREATE INDEX event_handler_name_index ON meta_event_handler (name); -CREATE INDEX event_handler_event_index ON meta_event_handler (event); - -CREATE TABLE meta_task_def ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - name varchar(255) NOT NULL, - json_data TEXT NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_task_def_name ON meta_task_def (name); - -CREATE TABLE meta_workflow_def ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - name varchar(255) NOT NULL, - version int NOT NULL, - latest_version int NOT NULL DEFAULT 0, - json_data TEXT NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_name_version ON meta_workflow_def (name,version); -CREATE INDEX workflow_def_name_index ON meta_workflow_def (name); - --- -------------------------------------------------------------------------------------------------------------- --- SCHEMA FOR EXECUTION DAO --- -------------------------------------------------------------------------------------------------------------- - -CREATE TABLE event_execution ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - event_handler_name varchar(255) NOT NULL, - event_name varchar(255) NOT NULL, - message_id varchar(255) NOT NULL, - execution_id varchar(255) NOT NULL, - json_data TEXT NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_event_execution ON event_execution (event_handler_name,event_name,message_id); - -CREATE TABLE poll_data ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - queue_name varchar(255) NOT NULL, - domain varchar(255) NOT NULL, - json_data TEXT NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_poll_data ON poll_data (queue_name,domain); -CREATE INDEX ON poll_data (queue_name); - -CREATE TABLE task_scheduled ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_id varchar(255) NOT NULL, - task_key varchar(255) NOT NULL, - task_id varchar(255) NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_workflow_id_task_key ON task_scheduled (workflow_id,task_key); - -CREATE TABLE task_in_progress ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - task_def_name varchar(255) NOT NULL, - task_id varchar(255) NOT NULL, - workflow_id varchar(255) NOT NULL, - in_progress_status boolean NOT NULL DEFAULT false, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_task_def_task_id1 ON task_in_progress (task_def_name,task_id); - -CREATE TABLE task ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - task_id varchar(255) NOT NULL, - json_data TEXT NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_task_id ON task (task_id); - -CREATE TABLE workflow ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_id varchar(255) NOT NULL, - correlation_id varchar(255), - json_data TEXT NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_workflow_id ON workflow (workflow_id); - -CREATE TABLE workflow_def_to_workflow ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_def varchar(255) NOT NULL, - date_str varchar(60), - workflow_id varchar(255) NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_workflow_def_date_str ON workflow_def_to_workflow (workflow_def,date_str,workflow_id); - -CREATE TABLE workflow_pending ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_type varchar(255) NOT NULL, - workflow_id varchar(255) NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_workflow_type_workflow_id ON workflow_pending (workflow_type,workflow_id); -CREATE INDEX workflow_type_index ON workflow_pending (workflow_type); - -CREATE TABLE workflow_to_task ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - modified_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - workflow_id varchar(255) NOT NULL, - task_id varchar(255) NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_workflow_to_task_id ON workflow_to_task (workflow_id,task_id); -CREATE INDEX workflow_id_index ON workflow_to_task (workflow_id); - --- -------------------------------------------------------------------------------------------------------------- --- SCHEMA FOR QUEUE DAO --- -------------------------------------------------------------------------------------------------------------- - -CREATE TABLE queue ( - id SERIAL, - created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - queue_name varchar(255) NOT NULL, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_queue_name ON queue (queue_name); - -CREATE TABLE queue_message ( - id SERIAL, - created_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - deliver_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - queue_name varchar(255) NOT NULL, - message_id varchar(255) NOT NULL, - priority integer DEFAULT 0, - popped boolean DEFAULT false, - offset_time_seconds BIGINT, - payload TEXT, - PRIMARY KEY (id) -); -CREATE UNIQUE INDEX unique_queue_name_message_id ON queue_message (queue_name,message_id); -CREATE INDEX combo_queue_message ON queue_message (queue_name,popped,deliver_on,created_on); diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V2__1009_Fix_PostgresExecutionDAO_Index.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V2__1009_Fix_PostgresExecutionDAO_Index.sql deleted file mode 100644 index 03b132ab0..000000000 --- a/postgres-persistence/src/main/resources/db/migration_postgres/V2__1009_Fix_PostgresExecutionDAO_Index.sql +++ /dev/null @@ -1,3 +0,0 @@ -DROP INDEX IF EXISTS unique_event_execution; - -CREATE UNIQUE INDEX unique_event_execution ON event_execution (event_handler_name,event_name,execution_id); \ No newline at end of file diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V3__correlation_id_index.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V3__correlation_id_index.sql deleted file mode 100644 index 9ced890da..000000000 --- a/postgres-persistence/src/main/resources/db/migration_postgres/V3__correlation_id_index.sql +++ /dev/null @@ -1,3 +0,0 @@ -DROP INDEX IF EXISTS workflow_corr_id_index; - -CREATE INDEX workflow_corr_id_index ON workflow (correlation_id); \ No newline at end of file diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V4__new_qm_index_with_priority.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V4__new_qm_index_with_priority.sql deleted file mode 100644 index 23d12a37c..000000000 --- a/postgres-persistence/src/main/resources/db/migration_postgres/V4__new_qm_index_with_priority.sql +++ /dev/null @@ -1,3 +0,0 @@ -DROP INDEX IF EXISTS combo_queue_message; - -CREATE INDEX combo_queue_message ON queue_message (queue_name,priority,popped,deliver_on,created_on); \ No newline at end of file diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V5__new_queue_message_pk.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V5__new_queue_message_pk.sql deleted file mode 100644 index 6fefa6019..000000000 --- a/postgres-persistence/src/main/resources/db/migration_postgres/V5__new_queue_message_pk.sql +++ /dev/null @@ -1,11 +0,0 @@ --- no longer need separate index if pk is queue_name, message_id -DROP INDEX IF EXISTS unique_queue_name_message_id; - --- remove id primary key -ALTER TABLE queue_message DROP CONSTRAINT IF EXISTS queue_message_pkey; - --- remove id column -ALTER TABLE queue_message DROP COLUMN IF EXISTS id; - --- set primary key to queue_name, message_id -ALTER TABLE queue_message ADD PRIMARY KEY (queue_name, message_id); diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V6__update_pk.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V6__update_pk.sql deleted file mode 100644 index 24613543b..000000000 --- a/postgres-persistence/src/main/resources/db/migration_postgres/V6__update_pk.sql +++ /dev/null @@ -1,77 +0,0 @@ --- 1) queue_message -DROP INDEX IF EXISTS unique_queue_name_message_id; -ALTER TABLE queue_message DROP CONSTRAINT IF EXISTS queue_message_pkey; -ALTER TABLE queue_message DROP COLUMN IF EXISTS id; -ALTER TABLE queue_message ADD PRIMARY KEY (queue_name, message_id); - --- 2) queue -DROP INDEX IF EXISTS unique_queue_name; -ALTER TABLE queue DROP CONSTRAINT IF EXISTS queue_pkey; -ALTER TABLE queue DROP COLUMN IF EXISTS id; -ALTER TABLE queue ADD PRIMARY KEY (queue_name); - --- 3) workflow_to_task -DROP INDEX IF EXISTS unique_workflow_to_task_id; -ALTER TABLE workflow_to_task DROP CONSTRAINT IF EXISTS workflow_to_task_pkey; -ALTER TABLE workflow_to_task DROP COLUMN IF EXISTS id; -ALTER TABLE workflow_to_task ADD PRIMARY KEY (workflow_id, task_id); - --- 4) workflow_pending -DROP INDEX IF EXISTS unique_workflow_type_workflow_id; -ALTER TABLE workflow_pending DROP CONSTRAINT IF EXISTS workflow_pending_pkey; -ALTER TABLE workflow_pending DROP COLUMN IF EXISTS id; -ALTER TABLE workflow_pending ADD PRIMARY KEY (workflow_type, workflow_id); - --- 5) workflow_def_to_workflow -DROP INDEX IF EXISTS unique_workflow_def_date_str; -ALTER TABLE workflow_def_to_workflow DROP CONSTRAINT IF EXISTS workflow_def_to_workflow_pkey; -ALTER TABLE workflow_def_to_workflow DROP COLUMN IF EXISTS id; -ALTER TABLE workflow_def_to_workflow ADD PRIMARY KEY (workflow_def, date_str, workflow_id); - --- 6) workflow -DROP INDEX IF EXISTS unique_workflow_id; -ALTER TABLE workflow DROP CONSTRAINT IF EXISTS workflow_pkey; -ALTER TABLE workflow DROP COLUMN IF EXISTS id; -ALTER TABLE workflow ADD PRIMARY KEY (workflow_id); - --- 7) task -DROP INDEX IF EXISTS unique_task_id; -ALTER TABLE task DROP CONSTRAINT IF EXISTS task_pkey; -ALTER TABLE task DROP COLUMN IF EXISTS id; -ALTER TABLE task ADD PRIMARY KEY (task_id); - --- 8) task_in_progress -DROP INDEX IF EXISTS unique_task_def_task_id1; -ALTER TABLE task_in_progress DROP CONSTRAINT IF EXISTS task_in_progress_pkey; -ALTER TABLE task_in_progress DROP COLUMN IF EXISTS id; -ALTER TABLE task_in_progress ADD PRIMARY KEY (task_def_name, task_id); - --- 9) task_scheduled -DROP INDEX IF EXISTS unique_workflow_id_task_key; -ALTER TABLE task_scheduled DROP CONSTRAINT IF EXISTS task_scheduled_pkey; -ALTER TABLE task_scheduled DROP COLUMN IF EXISTS id; -ALTER TABLE task_scheduled ADD PRIMARY KEY (workflow_id, task_key); - --- 10) poll_data -DROP INDEX IF EXISTS unique_poll_data; -ALTER TABLE poll_data DROP CONSTRAINT IF EXISTS poll_data_pkey; -ALTER TABLE poll_data DROP COLUMN IF EXISTS id; -ALTER TABLE poll_data ADD PRIMARY KEY (queue_name, domain); - --- 11) event_execution -DROP INDEX IF EXISTS unique_event_execution; -ALTER TABLE event_execution DROP CONSTRAINT IF EXISTS event_execution_pkey; -ALTER TABLE event_execution DROP COLUMN IF EXISTS id; -ALTER TABLE event_execution ADD PRIMARY KEY (event_handler_name, event_name, execution_id); - --- 12) meta_workflow_def -DROP INDEX IF EXISTS unique_name_version; -ALTER TABLE meta_workflow_def DROP CONSTRAINT IF EXISTS meta_workflow_def_pkey; -ALTER TABLE meta_workflow_def DROP COLUMN IF EXISTS id; -ALTER TABLE meta_workflow_def ADD PRIMARY KEY (name, version); - --- 13) meta_task_def -DROP INDEX IF EXISTS unique_task_def_name; -ALTER TABLE meta_task_def DROP CONSTRAINT IF EXISTS meta_task_def_pkey; -ALTER TABLE meta_task_def DROP COLUMN IF EXISTS id; -ALTER TABLE meta_task_def ADD PRIMARY KEY (name); diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V7__new_qm_index_desc_priority.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V7__new_qm_index_desc_priority.sql deleted file mode 100644 index 149dcc4c5..000000000 --- a/postgres-persistence/src/main/resources/db/migration_postgres/V7__new_qm_index_desc_priority.sql +++ /dev/null @@ -1,3 +0,0 @@ -DROP INDEX IF EXISTS combo_queue_message; - -CREATE INDEX combo_queue_message ON queue_message USING btree (queue_name , priority desc, popped, deliver_on, created_on) \ No newline at end of file diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresExecutionDAOTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresExecutionDAOTest.java deleted file mode 100644 index 3fb12ab8c..000000000 --- a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresExecutionDAOTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.dao; - -import java.util.List; - -import org.flywaydb.core.Flyway; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.dao.ExecutionDAO; -import com.netflix.conductor.dao.ExecutionDAOTest; -import com.netflix.conductor.model.WorkflowModel; -import com.netflix.conductor.postgres.config.PostgresConfiguration; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -@ContextConfiguration( - classes = { - TestObjectMapperConfiguration.class, - PostgresConfiguration.class, - FlywayAutoConfiguration.class - }) -@RunWith(SpringRunner.class) -@SpringBootTest -public class PostgresExecutionDAOTest extends ExecutionDAOTest { - - @Autowired private PostgresExecutionDAO executionDAO; - - @Autowired Flyway flyway; - - // clean the database between tests. - @Before - public void before() { - flyway.clean(); - flyway.migrate(); - } - - @Test - public void testPendingByCorrelationId() { - - WorkflowDef def = new WorkflowDef(); - def.setName("pending_count_correlation_jtest"); - - WorkflowModel workflow = createTestWorkflow(); - workflow.setWorkflowDefinition(def); - - generateWorkflows(workflow, 10); - - List bycorrelationId = - getExecutionDAO() - .getWorkflowsByCorrelationId( - "pending_count_correlation_jtest", "corr001", true); - assertNotNull(bycorrelationId); - assertEquals(10, bycorrelationId.size()); - } - - @Test - public void testRemoveWorkflow() { - WorkflowDef def = new WorkflowDef(); - def.setName("workflow"); - - WorkflowModel workflow = createTestWorkflow(); - workflow.setWorkflowDefinition(def); - - List ids = generateWorkflows(workflow, 1); - - assertEquals(1, getExecutionDAO().getPendingWorkflowCount("workflow")); - ids.forEach(wfId -> getExecutionDAO().removeWorkflow(wfId)); - assertEquals(0, getExecutionDAO().getPendingWorkflowCount("workflow")); - } - - @Override - public ExecutionDAO getExecutionDAO() { - return executionDAO; - } -} diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresMetadataDAOTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresMetadataDAOTest.java deleted file mode 100644 index b9a03ebd1..000000000 --- a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresMetadataDAOTest.java +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.dao; - -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.flywaydb.core.Flyway; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TestName; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.common.metadata.events.EventHandler; -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.core.exception.ApplicationException; -import com.netflix.conductor.postgres.config.PostgresConfiguration; - -import static com.netflix.conductor.core.exception.ApplicationException.Code.CONFLICT; -import static com.netflix.conductor.core.exception.ApplicationException.Code.NOT_FOUND; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThrows; -import static org.junit.Assert.assertTrue; - -@ContextConfiguration( - classes = { - TestObjectMapperConfiguration.class, - PostgresConfiguration.class, - FlywayAutoConfiguration.class - }) -@RunWith(SpringRunner.class) -@SpringBootTest -public class PostgresMetadataDAOTest { - - @Autowired private PostgresMetadataDAO metadataDAO; - - @Rule public TestName name = new TestName(); - - @Autowired Flyway flyway; - - // clean the database between tests. - @Before - public void before() { - flyway.clean(); - flyway.migrate(); - } - - @Test - public void testDuplicateWorkflowDef() { - WorkflowDef def = new WorkflowDef(); - def.setName("testDuplicate"); - def.setVersion(1); - - metadataDAO.createWorkflowDef(def); - - ApplicationException applicationException = - assertThrows(ApplicationException.class, () -> metadataDAO.createWorkflowDef(def)); - assertEquals( - "Workflow with testDuplicate.1 already exists!", applicationException.getMessage()); - assertEquals(CONFLICT, applicationException.getCode()); - } - - @Test - public void testRemoveNotExistingWorkflowDef() { - ApplicationException applicationException = - assertThrows( - ApplicationException.class, () -> metadataDAO.removeWorkflowDef("test", 1)); - assertEquals( - "No such workflow definition: test version: 1", applicationException.getMessage()); - assertEquals(NOT_FOUND, applicationException.getCode()); - } - - @Test - public void testWorkflowDefOperations() { - WorkflowDef def = new WorkflowDef(); - def.setName("test"); - def.setVersion(1); - def.setDescription("description"); - def.setCreatedBy("unit_test"); - def.setCreateTime(1L); - def.setOwnerApp("ownerApp"); - def.setUpdatedBy("unit_test2"); - def.setUpdateTime(2L); - - metadataDAO.createWorkflowDef(def); - - List all = metadataDAO.getAllWorkflowDefs(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals(1, all.get(0).getVersion()); - - WorkflowDef found = metadataDAO.getWorkflowDef("test", 1).get(); - assertTrue(EqualsBuilder.reflectionEquals(def, found)); - - def.setVersion(3); - metadataDAO.createWorkflowDef(def); - - all = metadataDAO.getAllWorkflowDefs(); - assertNotNull(all); - assertEquals(2, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals(1, all.get(0).getVersion()); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(def.getVersion(), found.getVersion()); - assertEquals(3, found.getVersion()); - - all = metadataDAO.getAllLatest(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals(3, all.get(0).getVersion()); - - all = metadataDAO.getAllVersions(def.getName()); - assertNotNull(all); - assertEquals(2, all.size()); - assertEquals("test", all.get(0).getName()); - assertEquals("test", all.get(1).getName()); - assertEquals(1, all.get(0).getVersion()); - assertEquals(3, all.get(1).getVersion()); - - def.setDescription("updated"); - metadataDAO.updateWorkflowDef(def); - found = metadataDAO.getWorkflowDef(def.getName(), def.getVersion()).get(); - assertEquals(def.getDescription(), found.getDescription()); - - List allnames = metadataDAO.findAll(); - assertNotNull(allnames); - assertEquals(1, allnames.size()); - assertEquals(def.getName(), allnames.get(0)); - - def.setVersion(2); - metadataDAO.createWorkflowDef(def); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(3, found.getVersion()); - - metadataDAO.removeWorkflowDef("test", 3); - Optional deleted = metadataDAO.getWorkflowDef("test", 3); - assertFalse(deleted.isPresent()); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(2, found.getVersion()); - - metadataDAO.removeWorkflowDef("test", 1); - deleted = metadataDAO.getWorkflowDef("test", 1); - assertFalse(deleted.isPresent()); - - found = metadataDAO.getLatestWorkflowDef(def.getName()).get(); - assertEquals(def.getName(), found.getName()); - assertEquals(2, found.getVersion()); - } - - @Test - public void testTaskDefOperations() { - TaskDef def = new TaskDef("taskA"); - def.setDescription("description"); - def.setCreatedBy("unit_test"); - def.setCreateTime(1L); - def.setInputKeys(Arrays.asList("a", "b", "c")); - def.setOutputKeys(Arrays.asList("01", "o2")); - def.setOwnerApp("ownerApp"); - def.setRetryCount(3); - def.setRetryDelaySeconds(100); - def.setRetryLogic(TaskDef.RetryLogic.FIXED); - def.setTimeoutPolicy(TaskDef.TimeoutPolicy.ALERT_ONLY); - def.setUpdatedBy("unit_test2"); - def.setUpdateTime(2L); - - metadataDAO.createTaskDef(def); - - TaskDef found = metadataDAO.getTaskDef(def.getName()); - assertTrue(EqualsBuilder.reflectionEquals(def, found)); - - def.setDescription("updated description"); - metadataDAO.updateTaskDef(def); - found = metadataDAO.getTaskDef(def.getName()); - assertTrue(EqualsBuilder.reflectionEquals(def, found)); - assertEquals("updated description", found.getDescription()); - - for (int i = 0; i < 9; i++) { - TaskDef tdf = new TaskDef("taskA" + i); - metadataDAO.createTaskDef(tdf); - } - - List all = metadataDAO.getAllTaskDefs(); - assertNotNull(all); - assertEquals(10, all.size()); - Set allnames = all.stream().map(TaskDef::getName).collect(Collectors.toSet()); - assertEquals(10, allnames.size()); - List sorted = allnames.stream().sorted().collect(Collectors.toList()); - assertEquals(def.getName(), sorted.get(0)); - - for (int i = 0; i < 9; i++) { - assertEquals(def.getName() + i, sorted.get(i + 1)); - } - - for (int i = 0; i < 9; i++) { - metadataDAO.removeTaskDef(def.getName() + i); - } - all = metadataDAO.getAllTaskDefs(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals(def.getName(), all.get(0).getName()); - } - - @Test - public void testRemoveNotExistingTaskDef() { - ApplicationException applicationException = - assertThrows( - ApplicationException.class, - () -> metadataDAO.removeTaskDef("test" + UUID.randomUUID().toString())); - assertEquals("No such task definition", applicationException.getMessage()); - assertEquals(NOT_FOUND, applicationException.getCode()); - } - - @Test - public void testEventHandlers() { - String event1 = "SQS::arn:account090:sqstest1"; - String event2 = "SQS::arn:account090:sqstest2"; - - EventHandler eventHandler = new EventHandler(); - eventHandler.setName(UUID.randomUUID().toString()); - eventHandler.setActive(false); - EventHandler.Action action = new EventHandler.Action(); - action.setAction(EventHandler.Action.Type.start_workflow); - action.setStart_workflow(new EventHandler.StartWorkflow()); - action.getStart_workflow().setName("workflow_x"); - eventHandler.getActions().add(action); - eventHandler.setEvent(event1); - - metadataDAO.addEventHandler(eventHandler); - List all = metadataDAO.getAllEventHandlers(); - assertNotNull(all); - assertEquals(1, all.size()); - assertEquals(eventHandler.getName(), all.get(0).getName()); - assertEquals(eventHandler.getEvent(), all.get(0).getEvent()); - - List byEvents = metadataDAO.getEventHandlersForEvent(event1, true); - assertNotNull(byEvents); - assertEquals(0, byEvents.size()); // event is marked as in-active - - eventHandler.setActive(true); - eventHandler.setEvent(event2); - metadataDAO.updateEventHandler(eventHandler); - - all = metadataDAO.getAllEventHandlers(); - assertNotNull(all); - assertEquals(1, all.size()); - - byEvents = metadataDAO.getEventHandlersForEvent(event1, true); - assertNotNull(byEvents); - assertEquals(0, byEvents.size()); - - byEvents = metadataDAO.getEventHandlersForEvent(event2, true); - assertNotNull(byEvents); - assertEquals(1, byEvents.size()); - } -} diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresQueueDAOTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresQueueDAOTest.java deleted file mode 100644 index d435d2bfb..000000000 --- a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresQueueDAOTest.java +++ /dev/null @@ -1,409 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.dao; - -import java.sql.Connection; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.sql.DataSource; - -import org.flywaydb.core.Flyway; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TestName; -import org.junit.runner.RunWith; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.config.TestObjectMapperConfiguration; -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.postgres.config.PostgresConfiguration; -import com.netflix.conductor.postgres.util.Query; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.ImmutableList; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -@ContextConfiguration( - classes = { - TestObjectMapperConfiguration.class, - PostgresConfiguration.class, - FlywayAutoConfiguration.class - }) -@RunWith(SpringRunner.class) -@SpringBootTest -public class PostgresQueueDAOTest { - - private static final Logger LOGGER = LoggerFactory.getLogger(PostgresQueueDAOTest.class); - - @Autowired private PostgresQueueDAO queueDAO; - - @Qualifier("dataSource") - @Autowired - private DataSource dataSource; - - @Autowired private ObjectMapper objectMapper; - - @Rule public TestName name = new TestName(); - - @Autowired Flyway flyway; - - // clean the database between tests. - @Before - public void before() { - flyway.clean(); - flyway.migrate(); - } - - @Test - public void complexQueueTest() { - String queueName = "TestQueue"; - long offsetTimeInSecond = 0; - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.push(queueName, messageId, offsetTimeInSecond); - } - int size = queueDAO.getSize(queueName); - assertEquals(10, size); - Map details = queueDAO.queuesDetail(); - assertEquals(1, details.size()); - assertEquals(10L, details.get(queueName).longValue()); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.pushIfNotExists(queueName, messageId, offsetTimeInSecond); - } - - List popped = queueDAO.pop(queueName, 10, 100); - assertNotNull(popped); - assertEquals(10, popped.size()); - - Map>> verbose = queueDAO.queuesDetailVerbose(); - assertEquals(1, verbose.size()); - long shardSize = verbose.get(queueName).get("a").get("size"); - long unackedSize = verbose.get(queueName).get("a").get("uacked"); - assertEquals(0, shardSize); - assertEquals(10, unackedSize); - - popped.forEach(messageId -> queueDAO.ack(queueName, messageId)); - - verbose = queueDAO.queuesDetailVerbose(); - assertEquals(1, verbose.size()); - shardSize = verbose.get(queueName).get("a").get("size"); - unackedSize = verbose.get(queueName).get("a").get("uacked"); - assertEquals(0, shardSize); - assertEquals(0, unackedSize); - - popped = queueDAO.pop(queueName, 10, 100); - assertNotNull(popped); - assertEquals(0, popped.size()); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.pushIfNotExists(queueName, messageId, offsetTimeInSecond); - } - size = queueDAO.getSize(queueName); - assertEquals(10, size); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - assertTrue(queueDAO.containsMessage(queueName, messageId)); - queueDAO.remove(queueName, messageId); - } - - size = queueDAO.getSize(queueName); - assertEquals(0, size); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.pushIfNotExists(queueName, messageId, offsetTimeInSecond); - } - queueDAO.flush(queueName); - size = queueDAO.getSize(queueName); - assertEquals(0, size); - } - - /** - * Test fix for https://github.com/Netflix/conductor/issues/399 - * - * @since 1.8.2-rc5 - */ - @Test - public void pollMessagesTest() { - final List messages = new ArrayList<>(); - final String queueName = "issue399_testQueue"; - final int totalSize = 10; - - for (int i = 0; i < totalSize; i++) { - String payload = "{\"id\": " + i + ", \"msg\":\"test " + i + "\"}"; - Message m = new Message("testmsg-" + i, payload, ""); - if (i % 2 == 0) { - // Set priority on message with pair id - m.setPriority(99 - i); - } - messages.add(m); - } - - // Populate the queue with our test message batch - queueDAO.push(queueName, ImmutableList.copyOf(messages)); - - // Assert that all messages were persisted and no extras are in there - assertEquals("Queue size mismatch", totalSize, queueDAO.getSize(queueName)); - - List zeroPoll = queueDAO.pollMessages(queueName, 0, 10_000); - assertTrue("Zero poll should be empty", zeroPoll.isEmpty()); - - final int firstPollSize = 3; - List firstPoll = queueDAO.pollMessages(queueName, firstPollSize, 10_000); - assertNotNull("First poll was null", firstPoll); - assertFalse("First poll was empty", firstPoll.isEmpty()); - assertEquals("First poll size mismatch", firstPollSize, firstPoll.size()); - - final int secondPollSize = 4; - List secondPoll = queueDAO.pollMessages(queueName, secondPollSize, 10_000); - assertNotNull("Second poll was null", secondPoll); - assertFalse("Second poll was empty", secondPoll.isEmpty()); - assertEquals("Second poll size mismatch", secondPollSize, secondPoll.size()); - - // Assert that the total queue size hasn't changed - assertEquals( - "Total queue size should have remained the same", - totalSize, - queueDAO.getSize(queueName)); - - // Assert that our un-popped messages match our expected size - final long expectedSize = totalSize - firstPollSize - secondPollSize; - try (Connection c = dataSource.getConnection()) { - String UNPOPPED = - "SELECT COUNT(*) FROM queue_message WHERE queue_name = ? AND popped = false"; - try (Query q = new Query(objectMapper, c, UNPOPPED)) { - long count = q.addParameter(queueName).executeCount(); - assertEquals("Remaining queue size mismatch", expectedSize, count); - } - } catch (Exception ex) { - fail(ex.getMessage()); - } - } - - /** Test fix for https://github.com/Netflix/conductor/issues/1892 */ - @Test - public void containsMessageTest() { - String queueName = "TestQueue"; - long offsetTimeInSecond = 0; - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - queueDAO.push(queueName, messageId, offsetTimeInSecond); - } - int size = queueDAO.getSize(queueName); - assertEquals(10, size); - - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - assertTrue(queueDAO.containsMessage(queueName, messageId)); - queueDAO.remove(queueName, messageId); - } - for (int i = 0; i < 10; i++) { - String messageId = "msg" + i; - assertFalse(queueDAO.containsMessage(queueName, messageId)); - } - } - - /** - * Test fix for https://github.com/Netflix/conductor/issues/448 - * - * @since 1.8.2-rc5 - */ - @Test - public void pollDeferredMessagesTest() throws InterruptedException { - final List messages = new ArrayList<>(); - final String queueName = "issue448_testQueue"; - final int totalSize = 10; - - for (int i = 0; i < totalSize; i++) { - int offset = 0; - if (i < 5) { - offset = 0; - } else if (i == 6 || i == 7) { - // Purposefully skipping id:5 to test out of order deliveries - // Set id:6 and id:7 for a 2s delay to be picked up in the second polling batch - offset = 5; - } else { - // Set all other queue messages to have enough of a delay that they won't - // accidentally - // be picked up. - offset = 10_000 + i; - } - - String payload = "{\"id\": " + i + ",\"offset_time_seconds\":" + offset + "}"; - Message m = new Message("testmsg-" + i, payload, ""); - messages.add(m); - queueDAO.push(queueName, "testmsg-" + i, offset); - } - - // Assert that all messages were persisted and no extras are in there - assertEquals("Queue size mismatch", totalSize, queueDAO.getSize(queueName)); - - final int firstPollSize = 4; - List firstPoll = queueDAO.pollMessages(queueName, firstPollSize, 100); - assertNotNull("First poll was null", firstPoll); - assertFalse("First poll was empty", firstPoll.isEmpty()); - assertEquals("First poll size mismatch", firstPollSize, firstPoll.size()); - - List firstPollMessageIds = - messages.stream() - .map(Message::getId) - .collect(Collectors.toList()) - .subList(0, firstPollSize + 1); - - for (int i = 0; i < firstPollSize; i++) { - String actual = firstPoll.get(i).getId(); - assertTrue("Unexpected Id: " + actual, firstPollMessageIds.contains(actual)); - } - - final int secondPollSize = 3; - - // Sleep a bit to get the next batch of messages - LOGGER.debug("Sleeping for second poll..."); - Thread.sleep(5_000); - - // Poll for many more messages than expected - List secondPoll = queueDAO.pollMessages(queueName, secondPollSize + 10, 100); - assertNotNull("Second poll was null", secondPoll); - assertFalse("Second poll was empty", secondPoll.isEmpty()); - assertEquals("Second poll size mismatch", secondPollSize, secondPoll.size()); - - List expectedIds = Arrays.asList("testmsg-4", "testmsg-6", "testmsg-7"); - for (int i = 0; i < secondPollSize; i++) { - String actual = secondPoll.get(i).getId(); - assertTrue("Unexpected Id: " + actual, expectedIds.contains(actual)); - } - - // Assert that the total queue size hasn't changed - assertEquals( - "Total queue size should have remained the same", - totalSize, - queueDAO.getSize(queueName)); - - // Assert that our un-popped messages match our expected size - final long expectedSize = totalSize - firstPollSize - secondPollSize; - try (Connection c = dataSource.getConnection()) { - String UNPOPPED = - "SELECT COUNT(*) FROM queue_message WHERE queue_name = ? AND popped = false"; - try (Query q = new Query(objectMapper, c, UNPOPPED)) { - long count = q.addParameter(queueName).executeCount(); - assertEquals("Remaining queue size mismatch", expectedSize, count); - } - } catch (Exception ex) { - fail(ex.getMessage()); - } - } - - @Test - public void processUnacksTest() { - processUnacks( - () -> { - // Process unacks - queueDAO.processUnacks("process_unacks_test"); - }, - "process_unacks_test"); - } - - @Test - public void processAllUnacksTest() { - processUnacks( - () -> { - // Process all unacks - queueDAO.processAllUnacks(); - }, - "process_unacks_test"); - } - - private void processUnacks(Runnable unack, String queueName) { - // Count of messages in the queue(s) - final int count = 10; - // Number of messages to process acks for - final int unackedCount = 4; - // A secondary queue to make sure we don't accidentally process other queues - final String otherQueueName = "process_unacks_test_other_queue"; - - // Create testing queue with some messages (but not all) that will be popped/acked. - for (int i = 0; i < count; i++) { - int offset = 0; - if (i >= unackedCount) { - offset = 1_000_000; - } - - queueDAO.push(queueName, "unack-" + i, offset); - } - - // Create a second queue to make sure that unacks don't occur for it - for (int i = 0; i < count; i++) { - queueDAO.push(otherQueueName, "other-" + i, 0); - } - - // Poll for first batch of messages (should be equal to unackedCount) - List polled = queueDAO.pollMessages(queueName, 100, 10_000); - assertNotNull(polled); - assertFalse(polled.isEmpty()); - assertEquals(unackedCount, polled.size()); - - // Poll messages from the other queue so we know they don't get unacked later - queueDAO.pollMessages(otherQueueName, 100, 10_000); - - // Ack one of the polled messages - assertTrue(queueDAO.ack(queueName, "unack-1")); - - // Should have one less un-acked popped message in the queue - Long uacked = queueDAO.queuesDetailVerbose().get(queueName).get("a").get("uacked"); - assertNotNull(uacked); - assertEquals(uacked.longValue(), unackedCount - 1); - - unack.run(); - - // Check uacks for both queues after processing - Map>> details = queueDAO.queuesDetailVerbose(); - uacked = details.get(queueName).get("a").get("uacked"); - assertNotNull(uacked); - assertEquals( - "The messages that were polled should be unacked still", - uacked.longValue(), - unackedCount - 1); - - Long otherUacked = details.get(otherQueueName).get("a").get("uacked"); - assertNotNull(otherUacked); - assertEquals( - "Other queue should have all unacked messages", otherUacked.longValue(), count); - - Long size = queueDAO.queuesDetail().get(queueName); - assertNotNull(size); - assertEquals(size.longValue(), count - unackedCount); - } -} diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/performance/PerformanceTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/performance/PerformanceTest.java deleted file mode 100644 index 13e450762..000000000 --- a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/performance/PerformanceTest.java +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.postgres.performance; - -// SBMTODO: this test needs to be migrated -// reference - https://github.com/Netflix/conductor/pull/1940 -// @Ignore("This test cannot be automated") -// public class PerformanceTest { -// -// public static final int MSGS = 1000; -// public static final int PRODUCER_BATCH = 10; // make sure MSGS % PRODUCER_BATCH == 0 -// public static final int PRODUCERS = 4; -// public static final int WORKERS = 8; -// public static final int OBSERVERS = 4; -// public static final int OBSERVER_DELAY = 5000; -// public static final int UNACK_RUNNERS = 10; -// public static final int UNACK_DELAY = 500; -// public static final int WORKER_BATCH = 10; -// public static final int WORKER_BATCH_TIMEOUT = 500; -// public static final int COMPLETION_MONITOR_DELAY = 1000; -// -// private DataSource dataSource; -// private QueueDAO Q; -// private ExecutionDAO E; -// -// private final ExecutorService threadPool = Executors.newFixedThreadPool(PRODUCERS + WORKERS + -// OBSERVERS + UNACK_RUNNERS); -// private static final Logger LOGGER = LoggerFactory.getLogger(PerformanceTest.class); -// -// @Before -// public void setUp() { -// TestConfiguration testConfiguration = new TestConfiguration(); -// configuration = new TestPostgresConfiguration(testConfiguration, -// -// "jdbc:postgresql://localhost:54320/conductor?charset=utf8&parseTime=true&interpolateParams=true", -// 10, 2); -// PostgresDataSourceProvider dataSource = new PostgresDataSourceProvider(configuration); -// this.dataSource = dataSource.get(); -// resetAllData(this.dataSource); -// flywayMigrate(this.dataSource); -// -// final ObjectMapper objectMapper = new JsonMapperProvider().get(); -// Q = new PostgresQueueDAO(objectMapper, this.dataSource); -// E = new PostgresExecutionDAO(objectMapper, this.dataSource); -// } -// -// @After -// public void tearDown() throws Exception { -// resetAllData(dataSource); -// } -// -// public static final String QUEUE = "task_queue"; -// -// @Test -// public void testQueueDaoPerformance() throws InterruptedException { -// AtomicBoolean stop = new AtomicBoolean(false); -// Stopwatch start = Stopwatch.createStarted(); -// AtomicInteger poppedCoutner = new AtomicInteger(0); -// HashMultiset allPopped = HashMultiset.create(); -// -// // Consumers - workers -// for (int i = 0; i < WORKERS; i++) { -// threadPool.submit(() -> { -// while (!stop.get()) { -// List pop = Q.pollMessages(QUEUE, WORKER_BATCH, WORKER_BATCH_TIMEOUT); -// LOGGER.info("Popped {} messages", pop.size()); -// poppedCoutner.accumulateAndGet(pop.size(), Integer::sum); -// -// if (pop.size() == 0) { -// try { -// Thread.sleep(200); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } else { -// LOGGER.info("Popped {}", -// pop.stream().map(Message::getId).collect(Collectors.toList())); -// } -// -// pop.forEach(popped -> { -// synchronized (allPopped) { -// allPopped.add(popped.getId()); -// } -// boolean exists = Q.containsMessage(QUEUE, popped.getId()); -// boolean ack = Q.ack(QUEUE, popped.getId()); -// -// if (ack && exists) { -// // OK -// } else { -// LOGGER.error("Exists & Ack did not succeed for msg: {}", popped); -// } -// }); -// } -// }); -// } -// -// // Producers -// List> producers = Lists.newArrayList(); -// for (int i = 0; i < PRODUCERS; i++) { -// Future producer = threadPool.submit(() -> { -// try { -// // N messages -// for (int j = 0; j < MSGS / PRODUCER_BATCH; j++) { -// List randomMessages = getRandomMessages(PRODUCER_BATCH); -// Q.push(QUEUE, randomMessages); -// LOGGER.info("Pushed {} messages", PRODUCER_BATCH); -// LOGGER.info("Pushed {}", -// randomMessages.stream().map(Message::getId).collect(Collectors.toList())); -// } -// LOGGER.info("Pushed ALL"); -// } catch (Exception e) { -// LOGGER.error("Something went wrong with producer", e); -// throw new RuntimeException(e); -// } -// }); -// -// producers.add(producer); -// } -// -// // Observers -// for (int i = 0; i < OBSERVERS; i++) { -// threadPool.submit(() -> { -// while (!stop.get()) { -// try { -// int size = Q.getSize(QUEUE); -// Q.queuesDetail(); -// LOGGER.info("Size {} messages", size); -// } catch (Exception e) { -// LOGGER.info("Queue size failed, nevermind"); -// } -// -// try { -// Thread.sleep(OBSERVER_DELAY); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } -// }); -// } -// -// // Consumers - unack processor -// for (int i = 0; i < UNACK_RUNNERS; i++) { -// threadPool.submit(() -> { -// while (!stop.get()) { -// try { -// Q.processUnacks(QUEUE); -// } catch (Exception e) { -// LOGGER.info("Unack failed, nevermind", e); -// continue; -// } -// LOGGER.info("Unacked"); -// try { -// Thread.sleep(UNACK_DELAY); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } -// }); -// } -// -// long elapsed; -// while (true) { -// try { -// Thread.sleep(COMPLETION_MONITOR_DELAY); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// -// int size = Q.getSize(QUEUE); -// LOGGER.info("MONITOR SIZE : {}", size); -// -// if (size == 0 && producers.stream().map(Future::isDone).reduce(true, (b1, b2) -> b1 && -// b2)) { -// elapsed = start.elapsed(TimeUnit.MILLISECONDS); -// stop.set(true); -// break; -// } -// } -// -// threadPool.awaitTermination(10, TimeUnit.SECONDS); -// threadPool.shutdown(); -// LOGGER.info("Finished in {} ms", elapsed); -// LOGGER.info("Throughput {} msgs/second", ((MSGS * PRODUCERS) / (elapsed * 1.0)) * 1000); -// LOGGER.info("Threads finished"); -// if (poppedCoutner.get() != MSGS * PRODUCERS) { -// synchronized (allPopped) { -// List duplicates = allPopped.entrySet().stream() -// .filter(stringEntry -> stringEntry.getCount() > 1) -// .map(stringEntry -> stringEntry.getElement() + ": " + stringEntry.getCount()) -// .collect(Collectors.toList()); -// -// LOGGER.error("Found duplicate pops: " + duplicates); -// } -// throw new RuntimeException("Popped " + poppedCoutner.get() + " != produced: " + MSGS * -// PRODUCERS); -// } -// } -// -// @Test -// public void testExecDaoPerformance() throws InterruptedException { -// AtomicBoolean stop = new AtomicBoolean(false); -// Stopwatch start = Stopwatch.createStarted(); -// BlockingDeque msgQueue = new LinkedBlockingDeque<>(1000); -// HashMultiset allPopped = HashMultiset.create(); -// -// // Consumers - workers -// for (int i = 0; i < WORKERS; i++) { -// threadPool.submit(() -> { -// while (!stop.get()) { -// List popped = new ArrayList<>(); -// while (true) { -// try { -// Task poll; -// poll = msgQueue.poll(10, TimeUnit.MILLISECONDS); -// -// if (poll == null) { -// // poll timed out -// continue; -// } -// synchronized (allPopped) { -// allPopped.add(poll.getTaskId()); -// } -// popped.add(poll); -// if (stop.get() || popped.size() == WORKER_BATCH) { -// break; -// } -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } -// -// LOGGER.info("Popped {} messages", popped.size()); -// LOGGER.info("Popped {}", -// popped.stream().map(Task::getTaskId).collect(Collectors.toList())); -// -// // Polling -// popped.stream() -// .peek(task -> { -// task.setWorkerId("someWorker"); -// task.setPollCount(task.getPollCount() + 1); -// task.setStartTime(System.currentTimeMillis()); -// }) -// .forEach(task -> { -// try { -// // should always be false -// boolean concurrentLimit = E.exceedsInProgressLimit(task); -// task.setStartTime(System.currentTimeMillis()); -// E.updateTask(task); -// LOGGER.info("Polled {}", task.getTaskId()); -// } catch (Exception e) { -// LOGGER.error("Something went wrong with worker during poll", e); -// throw new RuntimeException(e); -// } -// }); -// -// popped.forEach(task -> { -// try { -// -// String wfId = task.getWorkflowInstanceId(); -// Workflow workflow = E.getWorkflow(wfId, true); -// E.getTask(task.getTaskId()); -// -// task.setStatus(Task.Status.COMPLETED); -// task.setWorkerId("someWorker"); -// task.setOutputData(Collections.singletonMap("a", "b")); -// E.updateTask(task); -// E.updateWorkflow(workflow); -// LOGGER.info("Updated {}", task.getTaskId()); -// } catch (Exception e) { -// LOGGER.error("Something went wrong with worker during update", e); -// throw new RuntimeException(e); -// } -// }); -// -// } -// }); -// } -// -// Multiset pushedTasks = HashMultiset.create(); -// -// // Producers -// List> producers = Lists.newArrayList(); -// for (int i = 0; i < PRODUCERS; i++) { -// Future producer = threadPool.submit(() -> { -// // N messages -// for (int j = 0; j < MSGS / PRODUCER_BATCH; j++) { -// List randomTasks = getRandomTasks(PRODUCER_BATCH); -// -// Workflow wf = getWorkflow(randomTasks); -// E.createWorkflow(wf); -// -// E.createTasks(randomTasks); -// randomTasks.forEach(t -> { -// try { -// boolean offer = false; -// while (!offer) { -// offer = msgQueue.offer(t, 10, TimeUnit.MILLISECONDS); -// } -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// }); -// LOGGER.info("Pushed {} messages", PRODUCER_BATCH); -// List collect = -// randomTasks.stream().map(Task::getTaskId).collect(Collectors.toList()); -// synchronized (pushedTasks) { -// pushedTasks.addAll(collect); -// } -// LOGGER.info("Pushed {}", collect); -// } -// LOGGER.info("Pushed ALL"); -// }); -// -// producers.add(producer); -// } -// -// // Observers -// for (int i = 0; i < OBSERVERS; i++) { -// threadPool.submit(() -> { -// while (!stop.get()) { -// try { -// List size = E.getPendingTasksForTaskType("taskType"); -// LOGGER.info("Size {} messages", size.size()); -// LOGGER.info("Size q {} messages", msgQueue.size()); -// synchronized (allPopped) { -// LOGGER.info("All pp {} messages", allPopped.size()); -// } -// LOGGER.info("Workflows by correlation id size: {}", -// E.getWorkflowsByCorrelationId("abcd", "1", true).size()); -// LOGGER.info("Workflows by correlation id size: {}", -// E.getWorkflowsByCorrelationId("abcd", "2", true).size()); -// LOGGER.info("Workflows running ids: {}", E.getRunningWorkflowIds("abcd", -// 1)); -// LOGGER.info("Workflows pending count: {}", -// E.getPendingWorkflowCount("abcd")); -// } catch (Exception e) { -// LOGGER.warn("Observer failed ", e); -// } -// try { -// Thread.sleep(OBSERVER_DELAY); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } -// }); -// } -// -// long elapsed; -// while (true) { -// try { -// Thread.sleep(COMPLETION_MONITOR_DELAY); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// -// int size; -// try { -// size = E.getPendingTasksForTaskType("taskType").size(); -// } catch (Exception e) { -// LOGGER.warn("Monitor failed", e); -// continue; -// } -// LOGGER.info("MONITOR SIZE : {}", size); -// -// if (size == 0 && producers.stream().map(Future::isDone).reduce(true, (b1, b2) -> b1 && -// b2)) { -// elapsed = start.elapsed(TimeUnit.MILLISECONDS); -// stop.set(true); -// break; -// } -// } -// -// threadPool.awaitTermination(10, TimeUnit.SECONDS); -// threadPool.shutdown(); -// LOGGER.info("Finished in {} ms", elapsed); -// LOGGER.info("Throughput {} msgs/second", ((MSGS * PRODUCERS) / (elapsed * 1.0)) * 1000); -// LOGGER.info("Threads finished"); -// -// List duplicates = pushedTasks.entrySet().stream() -// .filter(stringEntry -> stringEntry.getCount() > 1) -// .map(stringEntry -> stringEntry.getElement() + ": " + stringEntry.getCount()) -// .collect(Collectors.toList()); -// -// LOGGER.error("Found duplicate pushes: " + duplicates); -// } -// -// private Workflow getWorkflow(List randomTasks) { -// Workflow wf = new Workflow(); -// wf.setWorkflowId(randomTasks.get(0).getWorkflowInstanceId()); -// wf.setCorrelationId(wf.getWorkflowId()); -// wf.setTasks(randomTasks); -// WorkflowDef workflowDefinition = new WorkflowDef(); -// workflowDefinition.setName("abcd"); -// wf.setWorkflowDefinition(workflowDefinition); -// wf.setStartTime(System.currentTimeMillis()); -// return wf; -// } -// -// private List getRandomTasks(int i) { -// String timestamp = Long.toString(System.nanoTime()); -// return IntStream.range(0, i).mapToObj(j -> { -// String id = Thread.currentThread().getId() + "_" + timestamp + "_" + j; -// Task task = new Task(); -// task.setTaskId(id); -// task.setCorrelationId(Integer.toString(j)); -// task.setTaskType("taskType"); -// task.setReferenceTaskName("refName" + j); -// task.setWorkflowType("task_wf"); -// task.setWorkflowInstanceId(Thread.currentThread().getId() + "_" + timestamp); -// return task; -// }).collect(Collectors.toList()); -// } -// -// private List getRandomMessages(int i) { -// String timestamp = Long.toString(System.nanoTime()); -// return IntStream.range(0, i).mapToObj(j -> { -// String id = Thread.currentThread().getId() + "_" + timestamp + "_" + j; -// return new Message(id, "{ \"a\": \"b\", \"timestamp\": \" " + timestamp + " \"}", -// "receipt"); -// }).collect(Collectors.toList()); -// } -// -// private void flywayMigrate(DataSource dataSource) { -// FluentConfiguration flywayConfiguration = Flyway.configure() -// .table(configuration.getFlywayTable()) -// .locations(Paths.get("db","migration_postgres").toString()) -// .dataSource(dataSource) -// .placeholderReplacement(false); -// -// Flyway flyway = flywayConfiguration.load(); -// try { -// flyway.migrate(); -// } catch (FlywayException e) { -// if (e.getMessage().contains("non-empty")) { -// return; -// } -// throw e; -// } -// } -// -// public void resetAllData(DataSource dataSource) { -// // TODO -// } -// } diff --git a/postgres-persistence/src/test/resources/application.properties b/postgres-persistence/src/test/resources/application.properties deleted file mode 100644 index c7a573204..000000000 --- a/postgres-persistence/src/test/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -conductor.db.type=postgres -spring.datasource.url=jdbc:tc:postgresql:///conductor -spring.datasource.username=postgres -spring.datasource.password=postgres -spring.datasource.hikari.maximum-pool-size=8 -spring.datasource.hikari.auto-commit=false -spring.flyway.locations=classpath:db/migration_postgres diff --git a/redis-concurrency-limit/dependencies.lock b/redis-concurrency-limit/dependencies.lock index 706285cc9..8ad8d878e 100644 --- a/redis-concurrency-limit/dependencies.lock +++ b/redis-concurrency-limit/dependencies.lock @@ -1,7 +1,7 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { @@ -11,14 +11,35 @@ "com.netflix.conductor:conductor-core": { "project": true }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -29,11 +50,137 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.springframework.data:spring-data-commons", + "org.springframework.data:spring-data-keyvalue", + "org.springframework.data:spring-data-redis", + "redis.clients:jedis" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.data:spring-data-commons": { + "locked": "2.3.9.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-keyvalue" + ] + }, + "org.springframework.data:spring-data-keyvalue": { + "locked": "2.3.9.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] }, "org.springframework.data:spring-data-redis": { - "locked": "2.6.3" + "locked": "2.3.9.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-commons", + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-context-support", + "org.springframework:spring-oxm", + "org.springframework:spring-tx" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.data:spring-data-keyvalue", + "org.springframework:spring-context-support" + ] + }, + "org.springframework:spring-context-support": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.data:spring-data-commons", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-context-support", + "org.springframework:spring-expression", + "org.springframework:spring-oxm", + "org.springframework:spring-tx" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-oxm": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] + }, + "org.springframework:spring-tx": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-keyvalue", + "org.springframework.data:spring-data-redis" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { "locked": "3.3.0" @@ -41,395 +188,1760 @@ }, "runtimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ + "locked": "2.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "redis.clients:jedis" + ] }, "redis.clients:jedis": { "locked": "3.3.0" } }, "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.github.docker-java:docker-java-api" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.springframework.data:spring-data-commons", + "org.springframework.data:spring-data-keyvalue", + "org.springframework.data:spring-data-redis", + "org.testcontainers:testcontainers", + "redis.clients:jedis" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring", + "org.testcontainers:spock" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.data:spring-data-commons": { + "locked": "2.3.9.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-keyvalue" + ] + }, + "org.springframework.data:spring-data-keyvalue": { + "locked": "2.3.9.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] }, "org.springframework.data:spring-data-redis": { - "locked": "2.6.3" + "locked": "2.3.9.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-commons", + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-context-support", + "org.springframework:spring-oxm", + "org.springframework:spring-tx" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.data:spring-data-keyvalue", + "org.springframework:spring-context-support" + ] + }, + "org.springframework:spring-context-support": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.data:spring-data-commons", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-context-support", + "org.springframework:spring-expression", + "org.springframework:spring-oxm", + "org.springframework:spring-test", + "org.springframework:spring-tx" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-oxm": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-tx": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-keyvalue", + "org.springframework.data:spring-data-redis" + ] }, "org.testcontainers:spock": { "locked": "1.15.3" }, "org.testcontainers:testcontainers": { - "locked": "1.15.3" + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:spock" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { "locked": "3.3.0" } }, "testRuntimeClasspath": { + "com.beust:jcommander": { + "locked": "1.72", + "transitive": [ + "org.testng:testng" + ] + }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.github.docker-java:docker-java-api", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "org.codehaus.groovy:groovy-cli-commons" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant-junit", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-antlr": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-junit": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant", + "org.codehaus.groovy:groovy-ant" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovydoc" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.springframework.data:spring-data-commons", + "org.springframework.data:spring-data-keyvalue", + "org.springframework.data:spring-data-redis", + "org.testcontainers:testcontainers", + "redis.clients:jedis" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring", + "org.testcontainers:spock" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.data:spring-data-commons": { + "locked": "2.3.9.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-keyvalue" + ] + }, + "org.springframework.data:spring-data-keyvalue": { + "locked": "2.3.9.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] }, "org.springframework.data:spring-data-redis": { - "locked": "2.6.3" + "locked": "2.3.9.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-commons", + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-context-support", + "org.springframework:spring-oxm", + "org.springframework:spring-tx" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.data:spring-data-keyvalue", + "org.springframework:spring-context-support" + ] + }, + "org.springframework:spring-context-support": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.data:spring-data-commons", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-context-support", + "org.springframework:spring-expression", + "org.springframework:spring-oxm", + "org.springframework:spring-test", + "org.springframework:spring-tx" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-oxm": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-redis" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-tx": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.data:spring-data-keyvalue", + "org.springframework.data:spring-data-redis" + ] }, "org.testcontainers:spock": { "locked": "1.15.3" }, "org.testcontainers:testcontainers": { - "locked": "1.15.3" + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:spock" + ] + }, + "org.testng:testng": { + "locked": "6.13.1", + "transitive": [ + "org.codehaus.groovy:groovy-testng" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { "locked": "3.3.0" diff --git a/redis-lock/dependencies.lock b/redis-lock/dependencies.lock index 36f631a8f..1c831ee95 100644 --- a/redis-lock/dependencies.lock +++ b/redis-lock/dependencies.lock @@ -1,21 +1,157 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.redisson:redisson" + ] + }, "com.netflix.conductor:conductor-core": { "project": true }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.redisson:redisson" + ] + }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -26,371 +162,1569 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] + }, "org.redisson:redisson": { "locked": "3.13.3" }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-starter" + ] } }, "runtimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "org.redisson:redisson" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.redisson:redisson" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ + "locked": "2.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.redisson:redisson" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] }, "org.redisson:redisson": { "locked": "3.13.3" + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson" + ] } }, "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.redisson:redisson" + ] + }, "com.github.kstyrc:embedded-redis": { "locked": "0.6" }, + "com.google.guava:guava": { + "locked": "18.0", + "transitive": [ + "com.github.kstyrc:embedded-redis" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-io:commons-io": { + "locked": "2.4", + "transitive": [ + "com.github.kstyrc:embedded-redis" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.redisson:redisson" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10" }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] + }, "org.redisson:redisson": { "locked": "3.13.3" }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "org.redisson:redisson" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.redisson:redisson" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" + ] }, "com.github.kstyrc:embedded-redis": { "locked": "0.6" }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "locked": "18.0", + "transitive": [ + "com.github.kstyrc:embedded-redis" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ + "com.github.kstyrc:embedded-redis", "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "org.redisson:redisson" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.redisson:redisson" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] }, "org.redisson:redisson": { "locked": "3.13.3" }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson", + "org.slf4j:jul-to-slf4j" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/redis-lock/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/redis-lock/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 3edd5aeeb..fe41f5bea 100644 --- a/redis-lock/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/redis-lock/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -6,6 +6,15 @@ } ], "hints": [ + { + "name": "conductor.workflow-execution-lock.type", + "values": [ + { + "value": "redis", + "description": "Use the redis-lock implementation as the lock provider." + } + ] + }, { "name": "conductor.redis-lock.server-type", "providers": [ diff --git a/redis-persistence/dependencies.lock b/redis-persistence/dependencies.lock index 5e8408ae0..f828edefc 100644 --- a/redis-persistence/dependencies.lock +++ b/redis-persistence/dependencies.lock @@ -1,27 +1,276 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.google.guava:guava": { + "locked": "19.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { "locked": "2.0.20" }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, "com.thoughtworks.xstream:xstream": { "locked": "1.4.19" }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-io:commons-io": { + "locked": "2.4", + "transitive": [ + "com.netflix.dyno:dyno-core" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.3", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -32,395 +281,2136 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] + }, "org.rarefiedredis.redis:redis-java": { "locked": "0.0.17" }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "redis.clients:jedis" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "locked": "3.3.0" + "locked": "3.3.0", + "transitive": [ + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } }, "runtimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] + }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.eureka:eureka-client" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.1", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { "locked": "2.0.20" }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey:jersey-client": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] }, "com.thoughtworks.xstream:xstream": { - "locked": "1.4.19" + "locked": "1.4.19", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.8", + "transitive": [ + "com.netflix.archaius:archaius-core" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core", + "com.netflix.dyno:dyno-core" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ + "locked": "2.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.3", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + "com.netflix.conductor:conductor-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.3.7", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] }, "org.rarefiedredis.redis:redis-java": { "locked": "0.0.17" }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "redis.clients:jedis" + ] + }, "redis.clients:jedis": { - "locked": "3.3.0" + "locked": "3.3.0", + "transitive": [ + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "stax:stax-api": { + "locked": "1.0.1", + "transitive": [ + "org.codehaus.jettison:jettison" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } }, "testCompileClasspath": { + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.google.guava:guava": { + "locked": "19.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { "locked": "2.0.20" }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, "com.thoughtworks.xstream:xstream": { "locked": "1.4.19" }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-io:commons-io": { + "locked": "2.4", + "transitive": [ + "com.netflix.dyno:dyno-core" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.3", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] + }, "org.rarefiedredis.redis:redis-java": { "locked": "0.0.17" }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "redis.clients:jedis" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "locked": "3.3.0" + "locked": "3.3.0", + "transitive": [ + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } }, "testRuntimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] + }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.eureka:eureka-client" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.1", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "locked": "19.0", + "transitive": [ + "com.google.inject:guice", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { "locked": "2.0.20" }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey:jersey-client": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] }, "com.thoughtworks.xstream:xstream": { - "locked": "1.4.19" + "locked": "1.4.19", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.8", + "transitive": [ + "com.netflix.archaius:archaius-core" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + "locked": "2.7", + "transitive": [ + "com.netflix.conductor:conductor-core", + "com.netflix.dyno:dyno-core" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.3", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + "com.netflix.conductor:conductor-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.3.7", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] }, "org.rarefiedredis.redis:redis-java": { "locked": "0.0.17" }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "redis.clients:jedis" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "locked": "3.3.0" + "locked": "3.3.0", + "transitive": [ + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "stax:stax-api": { + "locked": "1.0.1", + "transitive": [ + "org.codehaus.jettison:jettison" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } } } \ No newline at end of file diff --git a/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisClusterConfiguration.java b/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisClusterConfiguration.java index 0b4e4389e..b98e038f7 100644 --- a/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisClusterConfiguration.java +++ b/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisClusterConfiguration.java @@ -12,25 +12,35 @@ */ package com.netflix.conductor.redis.config; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Configuration; import com.netflix.conductor.core.config.ConductorProperties; import com.netflix.conductor.redis.jedis.JedisCluster; +import com.netflix.dyno.connectionpool.Host; import com.netflix.dyno.connectionpool.HostSupplier; import com.netflix.dyno.connectionpool.TokenMapSupplier; import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.Protocol; import redis.clients.jedis.commands.JedisCommands; @Configuration(proxyBeanMethods = false) @ConditionalOnProperty(name = "conductor.db.type", havingValue = "redis_cluster") public class RedisClusterConfiguration extends JedisCommandsConfigurer { + private static final Logger log = LoggerFactory.getLogger(JedisCommandsConfigurer.class); + + // Same as redis.clients.jedis.BinaryJedisCluster + protected static final int DEFAULT_MAX_ATTEMPTS = 5; + @Override protected JedisCommands createJedisCommands( RedisProperties properties, @@ -43,7 +53,25 @@ protected JedisCommands createJedisCommands( hostSupplier.getHosts().stream() .map(h -> new HostAndPort(h.getHostName(), h.getPort())) .collect(Collectors.toSet()); - return new JedisCluster( - new redis.clients.jedis.JedisCluster(hosts, genericObjectPoolConfig)); + String password = getPassword(hostSupplier.getHosts()); + + if (password != null) { + log.info("Connecting to Redis Cluster with AUTH"); + return new JedisCluster( + new redis.clients.jedis.JedisCluster( + hosts, + Protocol.DEFAULT_TIMEOUT, + Protocol.DEFAULT_TIMEOUT, + DEFAULT_MAX_ATTEMPTS, + password, + genericObjectPoolConfig)); + } else { + return new JedisCluster( + new redis.clients.jedis.JedisCluster(hosts, genericObjectPoolConfig)); + } + } + + private String getPassword(List hosts) { + return hosts.isEmpty() ? null : hosts.get(0).getPassword(); } } diff --git a/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisSentinelConfiguration.java b/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisSentinelConfiguration.java index 90a3fd6cd..89fa5b8cc 100644 --- a/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisSentinelConfiguration.java +++ b/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisSentinelConfiguration.java @@ -13,6 +13,7 @@ package com.netflix.conductor.redis.config; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; @@ -28,6 +29,7 @@ import com.netflix.dyno.connectionpool.TokenMapSupplier; import redis.clients.jedis.JedisSentinelPool; +import redis.clients.jedis.Protocol; import redis.clients.jedis.commands.JedisCommands; @Configuration(proxyBeanMethods = false) @@ -59,8 +61,31 @@ protected JedisCommands createJedisCommands( for (Host host : hostSupplier.getHosts()) { sentinels.add(host.getHostName() + ":" + host.getPort()); } - return new JedisSentinel( - new JedisSentinelPool( - properties.getClusterName(), sentinels, genericObjectPoolConfig)); + // We use the password of the first sentinel host as password and sentinelPassword + String password = getPassword(hostSupplier.getHosts()); + if (password != null) { + return new JedisSentinel( + new JedisSentinelPool( + properties.getClusterName(), + sentinels, + genericObjectPoolConfig, + Protocol.DEFAULT_TIMEOUT, + Protocol.DEFAULT_TIMEOUT, + password, + Protocol.DEFAULT_DATABASE, + null, + Protocol.DEFAULT_TIMEOUT, + Protocol.DEFAULT_TIMEOUT, + password, + null)); + } else { + return new JedisSentinel( + new JedisSentinelPool( + properties.getClusterName(), sentinels, genericObjectPoolConfig)); + } + } + + private String getPassword(List hosts) { + return hosts.isEmpty() ? null : hosts.get(0).getPassword(); } } diff --git a/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisStandaloneConfiguration.java b/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisStandaloneConfiguration.java index e6f8c8769..8882e5403 100644 --- a/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisStandaloneConfiguration.java +++ b/redis-persistence/src/main/java/com/netflix/conductor/redis/config/RedisStandaloneConfiguration.java @@ -25,6 +25,7 @@ import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; +import redis.clients.jedis.Protocol; import redis.clients.jedis.commands.JedisCommands; @Configuration(proxyBeanMethods = false) @@ -44,6 +45,20 @@ protected JedisCommands createJedisCommands( config.setMaxTotal(properties.getMaxConnectionsPerHost()); log.info("Starting conductor server using redis_standalone."); Host host = hostSupplier.getHosts().get(0); - return new JedisStandalone(new JedisPool(config, host.getHostName(), host.getPort())); + return new JedisStandalone(getJedisPool(config, host)); + } + + private JedisPool getJedisPool(JedisPoolConfig config, Host host) { + if (host.getPassword() != null) { + log.info("Connecting to Redis Standalone with AUTH"); + return new JedisPool( + config, + host.getHostName(), + host.getPort(), + Protocol.DEFAULT_TIMEOUT, + host.getPassword()); + } else { + return new JedisPool(config, host.getHostName(), host.getPort()); + } } } diff --git a/rest/dependencies.lock b/rest/dependencies.lock index a4d5ff69d..dc888aced 100644 --- a/rest/dependencies.lock +++ b/rest/dependencies.lock @@ -1,10 +1,66 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "org.webjars:webjars-locator-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, @@ -14,11 +70,75 @@ "com.netflix.runtime:health-api": { "locked": "1.1.4" }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -29,70 +149,280 @@ "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] + }, "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" + "locked": "1.6.8" + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] } }, "runtimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "org.webjars:webjars-locator-core" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true @@ -101,103 +431,406 @@ "locked": "1.1.4" }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] }, "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" + "locked": "1.6.8" + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] } }, "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "org.webjars:webjars-locator-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "com.netflix.conductor:conductor-common": { "project": true }, @@ -207,94 +840,552 @@ "com.netflix.runtime:health-api": { "locked": "1.1.4" }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] + }, "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" + "locked": "1.6.8" + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "com.netflix.conductor:conductor-core", + "org.webjars:webjars-locator-core" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", "com.netflix.conductor:conductor-common", + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" + "com.google.errorprone:error_prone_annotations": { + "locked": "2.4.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { "project": true @@ -303,109 +1394,521 @@ "locked": "1.1.4" }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ + "locked": "1.3.8", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "com.netflix.spectator:spectator-api", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] }, "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" + "locked": "1.6.8" + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] } } } \ No newline at end of file diff --git a/rest/src/main/java/com/netflix/conductor/rest/controllers/TaskResource.java b/rest/src/main/java/com/netflix/conductor/rest/controllers/TaskResource.java index 251eb5937..1b1fe6b7a 100644 --- a/rest/src/main/java/com/netflix/conductor/rest/controllers/TaskResource.java +++ b/rest/src/main/java/com/netflix/conductor/rest/controllers/TaskResource.java @@ -105,12 +105,24 @@ public ResponseEntity getTask(@PathVariable("taskId") String taskId) { } @GetMapping("/queue/sizes") - @Operation(summary = "Get Task type queue sizes") + @Operation(summary = "Deprecated. Please use /tasks/queue/size endpoint") + @Deprecated public Map size( @RequestParam(value = "taskType", required = false) List taskTypes) { return taskService.getTaskQueueSizes(taskTypes); } + @GetMapping("/queue/size") + @Operation(summary = "Get queue size for a task type.") + public Integer taskDepth( + @RequestParam("taskType") String taskType, + @RequestParam(value = "domain", required = false) String domain, + @RequestParam(value = "isolationGroupId", required = false) String isolationGroupId, + @RequestParam(value = "executionNamespace", required = false) + String executionNamespace) { + return taskService.getTaskQueueSize(taskType, domain, executionNamespace, isolationGroupId); + } + @GetMapping("/queue/all/verbose") @Operation(summary = "Get the details about each queue") public Map>> allVerbose() { diff --git a/server/build.gradle b/server/build.gradle index ea574de58..5a9183081 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -19,20 +19,21 @@ dependencies { implementation project(':conductor-rest') implementation project(':conductor-core') - implementation project(':conductor-contribs') implementation project(':conductor-redis-persistence') implementation project(':conductor-cassandra-persistence') - implementation project(':conductor-postgres-persistence') - implementation project(':conductor-mysql-persistence') implementation project(':conductor-es6-persistence') - implementation(project(path: ':conductor-es7-persistence', configuration: 'shadow')) implementation project(':conductor-grpc-server') implementation project(':conductor-redis-lock') - implementation project(':conductor-postgres-external-storage') + implementation project(':conductor-redis-concurrency-limit') + implementation project(':conductor-http-task') + implementation project(':conductor-json-jq-task') + implementation project(':conductor-awss3-storage') + implementation project(':conductor-awssqs-event-queue') implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.retry:spring-retry' implementation 'org.springframework.boot:spring-boot-starter-log4j2' implementation 'org.apache.logging.log4j:log4j-web' @@ -41,11 +42,6 @@ dependencies { implementation "org.springdoc:springdoc-openapi-ui:${revOpenapi}" - implementation(group: 'com.rabbitmq', name: 'amqp-client'){ version{require "${revAmqpClient}"}} - runtimeOnly 'io.micrometer:micrometer-registry-datadog' - - runtimeOnly 'com.netflix.spectator:spectator-reg-micrometer' - runtimeOnly "org.glassfish.jaxb:jaxb-runtime:${revJAXB}" testImplementation project(':conductor-rest') diff --git a/server/dependencies.lock b/server/dependencies.lock index 8783fb4c8..5d6957278 100644 --- a/server/dependencies.lock +++ b/server/dependencies.lock @@ -1,35 +1,97 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { - "com.netflix.conductor:conductor-cassandra-persistence": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "org.webjars:webjars-locator-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.netflix.conductor:conductor-awss3-storage": { "project": true }, - "com.netflix.conductor:conductor-contribs": { + "com.netflix.conductor:conductor-awssqs-event-queue": { "project": true }, - "com.netflix.conductor:conductor-core": { + "com.netflix.conductor:conductor-cassandra-persistence": { "project": true }, - "com.netflix.conductor:conductor-es6-persistence": { + "com.netflix.conductor:conductor-core": { "project": true }, - "com.netflix.conductor:conductor-es7-persistence": { + "com.netflix.conductor:conductor-es6-persistence": { "project": true }, "com.netflix.conductor:conductor-grpc-server": { "project": true }, - "com.netflix.conductor:conductor-mysql-persistence": { + "com.netflix.conductor:conductor-http-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-external-storage": { + "com.netflix.conductor:conductor-json-jq-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-persistence": { + "com.netflix.conductor:conductor-redis-concurrency-limit": { "project": true }, "com.netflix.conductor:conductor-redis-lock": { @@ -41,184 +103,752 @@ "com.netflix.conductor:conductor-rest": { "project": true }, - "com.rabbitmq:amqp-client": { - "locked": "5.14.0" + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.micrometer:micrometer-core": { + "locked": "1.5.14", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.hibernate.validator:hibernate-validator" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.12", + "transitive": [ + "io.micrometer:micrometer-core" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] + }, "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" + "locked": "1.6.8" + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-actuator": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-validation", + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] } }, "productionRuntimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] + }, "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage" + ] }, "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue" + ] + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ + "locked": "3.10.2", + "transitive": [ "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2" + "com.netflix.eureka:eureka-client", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.webjars:webjars-locator-core" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.datastax.cassandra:cassandra-driver-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "net.thisptr:jackson-jq", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core", + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.google.protobuf:protobuf-java-util", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", - "com.netflix.conductor:conductor-core", + "locked": "31.0.1-android", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.google.inject:guice", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "31.0.1-android" + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.19.2", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.protobuf:protobuf-java-util", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.19.2" + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.protobuf:protobuf-java-util": { + "locked": "3.19.2", + "transitive": [ + "io.grpc:grpc-services" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], + ] + }, + "com.netflix.conductor:conductor-awss3-storage": { + "project": true + }, + "com.netflix.conductor:conductor-awssqs-event-queue": { "project": true }, "com.netflix.conductor:conductor-cassandra-persistence": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "project": true - }, - "com.netflix.conductor:conductor-contribs": { - "project": true + ] }, "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "project": true + ] }, "com.netflix.conductor:conductor-es6-persistence": { "project": true }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-grpc-server": { "project": true }, - "com.netflix.conductor:conductor-mysql-persistence": { + "com.netflix.conductor:conductor-http-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-external-storage": { + "com.netflix.conductor:conductor-json-jq-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-persistence": { + "com.netflix.conductor:conductor-redis-concurrency-limit": { "project": true }, "com.netflix.conductor:conductor-redis-lock": { @@ -230,500 +860,1797 @@ "com.netflix.conductor:conductor-rest": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ + "locked": "2.0.20", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" + ] + }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ + "locked": "1.1.4", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "5.14.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.sun.activation:jakarta.activation": { + "locked": "1.2.2", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.istack:istack-commons-runtime": { + "locked": "3.0.11", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey:jersey-client": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.19" + "locked": "1.4.19", + "transitive": [ + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.eureka:eureka-client" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.8", + "transitive": [ + "com.netflix.archaius:archaius-core" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" + "com.netflix.conductor:conductor-es6-persistence", + "com.netflix.dyno:dyno-core" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services" + ] }, "io.grpc:grpc-netty": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" - }, - "io.micrometer:micrometer-registry-datadog": { - "locked": "1.8.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.8.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.12.0" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.micrometer:micrometer-core": { + "locked": "1.5.14", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.hibernate.validator:hibernate-validator" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "org.glassfish.jaxb:jaxb-runtime" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.1.1" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.28" + "locked": "1.1.1", + "transitive": [ + "com.netflix.conductor:conductor-http-task", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "org.elasticsearch:elasticsearch" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.redisson:redisson" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] }, "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.0.13" + "locked": "0.0.13", + "transitive": [ + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "3.0.1" + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-lock", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "io.swagger.core.v3:swagger-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + ] + }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.3.7", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] }, "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "com.netflix.conductor:conductor-es6-persistence", + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + ] }, "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "8.0.5" + ] + }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "org.glassfish.jaxb:jaxb-runtime": { "locked": "2.3.3" }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.3.3" + "org.glassfish.jaxb:txw2": { + "locked": "2.3.4", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.12", + "transitive": [ + "io.micrometer:micrometer-core", + "org.elasticsearch:elasticsearch" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.latencyutils:LatencyUtils": { + "locked": "2.0.3", + "transitive": [ + "io.micrometer:micrometer-core" + ] + }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "com.github.jnr:jnr-ffi", + "net.minidev:accessors-smart", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] }, "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ + "locked": "0.0.17", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] }, "org.redisson:redisson": { - "firstLevelTransitive": [ + "locked": "3.13.3", + "transitive": [ "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "io.dropwizard.metrics:metrics-core", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core", + "redis.clients:jedis" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] }, "org.springdoc:springdoc-openapi-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", + "locked": "1.6.8", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "1.6.7" + ] + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-actuator": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-validation", + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.6.6" + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ + "locked": "2.3.12.RELEASE", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "2.6.6" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "3.7.1" + "locked": "3.3.0", + "transitive": [ + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "stax:stax-api": { + "locked": "1.0.1", + "transitive": [ + "org.codehaus.jettison:jettison" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } }, "runtimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] + }, "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage" + ] }, "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue" + ] + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ + "locked": "3.10.2", + "transitive": [ "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2" + "com.netflix.eureka:eureka-client", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.webjars:webjars-locator-core" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.datastax.cassandra:cassandra-driver-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "net.thisptr:jackson-jq", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core", + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.google.protobuf:protobuf-java-util", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", - "com.netflix.conductor:conductor-core", + "locked": "31.0.1-android", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.google.inject:guice", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "31.0.1-android" + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.19.2", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.protobuf:protobuf-java-util", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.19.2" + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.protobuf:protobuf-java-util": { + "locked": "3.19.2", + "transitive": [ + "io.grpc:grpc-services" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ + "locked": "2.4.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], + ] + }, + "com.netflix.conductor:conductor-awss3-storage": { + "project": true + }, + "com.netflix.conductor:conductor-awssqs-event-queue": { "project": true }, "com.netflix.conductor:conductor-cassandra-persistence": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "project": true - }, - "com.netflix.conductor:conductor-contribs": { - "project": true + ] }, "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "project": true + ] }, "com.netflix.conductor:conductor-es6-persistence": { "project": true }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-grpc-server": { "project": true }, - "com.netflix.conductor:conductor-mysql-persistence": { + "com.netflix.conductor:conductor-http-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-external-storage": { + "com.netflix.conductor:conductor-json-jq-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-persistence": { + "com.netflix.conductor:conductor-redis-concurrency-limit": { "project": true }, "com.netflix.conductor:conductor-redis-lock": { @@ -735,394 +2662,1519 @@ "com.netflix.conductor:conductor-rest": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ + "locked": "2.0.20", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" + ] + }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ + "locked": "1.1.4", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "5.14.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.sun.activation:jakarta.activation": { + "locked": "1.2.2", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.istack:istack-commons-runtime": { + "locked": "3.0.11", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey:jersey-client": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.19" + "locked": "1.4.19", + "transitive": [ + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.eureka:eureka-client" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.8", + "transitive": [ + "com.netflix.archaius:archaius-core" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" + "com.netflix.conductor:conductor-es6-persistence", + "com.netflix.dyno:dyno-core" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services" + ] }, "io.grpc:grpc-netty": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" - }, - "io.micrometer:micrometer-registry-datadog": { - "locked": "1.8.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.8.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.12.0" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.micrometer:micrometer-core": { + "locked": "1.5.14", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.hibernate.validator:hibernate-validator" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "org.glassfish.jaxb:jaxb-runtime" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.1.1" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.28" + "locked": "1.1.1", + "transitive": [ + "com.netflix.conductor:conductor-http-task", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "org.elasticsearch:elasticsearch" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.redisson:redisson" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] }, "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.0.13" + "locked": "0.0.13", + "transitive": [ + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "3.0.1" + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-lock", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "io.swagger.core.v3:swagger-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + ] + }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.3.7", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] }, "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "com.netflix.conductor:conductor-es6-persistence", + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + ] }, "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "8.0.5" + ] + }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "org.glassfish.jaxb:jaxb-runtime": { "locked": "2.3.3" }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.3.3" + "org.glassfish.jaxb:txw2": { + "locked": "2.3.4", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.12", + "transitive": [ + "io.micrometer:micrometer-core", + "org.elasticsearch:elasticsearch" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.latencyutils:LatencyUtils": { + "locked": "2.0.3", + "transitive": [ + "io.micrometer:micrometer-core" + ] + }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "com.github.jnr:jnr-ffi", + "net.minidev:accessors-smart", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] }, "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ + "locked": "0.0.17", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] }, "org.redisson:redisson": { - "firstLevelTransitive": [ + "locked": "3.13.3", + "transitive": [ "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "io.dropwizard.metrics:metrics-core", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core", + "redis.clients:jedis" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] }, "org.springdoc:springdoc-openapi-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", + "locked": "1.6.8", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "1.6.7" + ] + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-actuator": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-validation", + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.6.6" + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ + "locked": "2.3.12.RELEASE", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "2.6.6" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "3.7.1" + "locked": "3.3.0", + "transitive": [ + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "stax:stax-api": { + "locked": "1.0.1", + "transitive": [ + "org.codehaus.jettison:jettison" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } }, "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "org.webjars:webjars-locator-core" + ] + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.google.guava:guava", + "io.grpc:grpc-api" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:guava": { + "locked": "31.0.1-android", + "transitive": [ + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] + }, "com.google.protobuf:protobuf-java": { - "locked": "3.13.0" + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "io.grpc:grpc-protobuf" + ] }, - "com.netflix.conductor:conductor-cassandra-persistence": { + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.conductor:conductor-awss3-storage": { "project": true }, - "com.netflix.conductor:conductor-common": { + "com.netflix.conductor:conductor-awssqs-event-queue": { "project": true }, - "com.netflix.conductor:conductor-contribs": { + "com.netflix.conductor:conductor-cassandra-persistence": { "project": true }, - "com.netflix.conductor:conductor-core": { + "com.netflix.conductor:conductor-common": { "project": true }, - "com.netflix.conductor:conductor-es6-persistence": { + "com.netflix.conductor:conductor-core": { "project": true }, - "com.netflix.conductor:conductor-es7-persistence": { + "com.netflix.conductor:conductor-es6-persistence": { "project": true }, "com.netflix.conductor:conductor-grpc-server": { "project": true }, - "com.netflix.conductor:conductor-mysql-persistence": { + "com.netflix.conductor:conductor-http-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-external-storage": { + "com.netflix.conductor:conductor-json-jq-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-persistence": { + "com.netflix.conductor:conductor-redis-concurrency-limit": { "project": true }, "com.netflix.conductor:conductor-redis-lock": { @@ -1134,199 +4186,993 @@ "com.netflix.conductor:conductor-rest": { "project": true }, - "com.rabbitmq:amqp-client": { - "locked": "5.14.0" + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-testing" + ] }, "io.grpc:grpc-protobuf": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-stub": { - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-testing" + ] }, "io.grpc:grpc-testing": { - "locked": "1.45.1" + "locked": "1.46.0" + }, + "io.micrometer:micrometer-core": { + "locked": "1.5.14", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.hibernate.validator:hibernate-validator" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-starter-test" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "io.grpc:grpc-testing", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "org.apache.commons:commons-lang3": { + "locked": "3.10", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.12", + "transitive": [ + "io.micrometer:micrometer-core" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.jayway.jsonpath:json-path", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] + }, "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.7" + "locked": "1.6.8" + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] }, "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-validation", + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.springframework.boot:spring-boot-starter" + ] } }, "testRuntimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.amazonaws:aws-java-sdk-core": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] + }, "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage" + ] }, "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue" + ] + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ + "locked": "3.10.2", + "transitive": [ "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2" + "com.netflix.eureka:eureka-client", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.webjars:webjars-locator-core" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.datastax.cassandra:cassandra-driver-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "net.thisptr:jackson-jq", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core", + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.google.protobuf:protobuf-java-util", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", - "com.netflix.conductor:conductor-core", + "locked": "31.0.1-android", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.google.inject:guice", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "31.0.1-android" + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.protobuf:protobuf-java-util", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.13.0" + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.protobuf:protobuf-java-util": { + "locked": "3.19.2", + "transitive": [ + "io.grpc:grpc-services" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], + ] + }, + "com.netflix.conductor:conductor-awss3-storage": { + "project": true + }, + "com.netflix.conductor:conductor-awssqs-event-queue": { "project": true }, "com.netflix.conductor:conductor-cassandra-persistence": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "project": true - }, - "com.netflix.conductor:conductor-contribs": { - "project": true + ] }, "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "project": true + ] }, "com.netflix.conductor:conductor-es6-persistence": { "project": true }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-grpc-server": { "project": true }, - "com.netflix.conductor:conductor-mysql-persistence": { + "com.netflix.conductor:conductor-http-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-external-storage": { + "com.netflix.conductor:conductor-json-jq-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-persistence": { + "com.netflix.conductor:conductor-redis-concurrency-limit": { "project": true }, "com.netflix.conductor:conductor-redis-lock": { @@ -1338,369 +5184,1550 @@ "com.netflix.conductor:conductor-rest": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ + "locked": "2.0.20", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" + ] + }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ + "locked": "1.1.4", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "5.14.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.sun.activation:jakarta.activation": { + "locked": "1.2.2", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.istack:istack-commons-runtime": { + "locked": "3.0.11", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.sun.jersey:jersey-client": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.19" + "locked": "1.4.19", + "transitive": [ + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.8", + "transitive": [ + "com.netflix.archaius:archaius-core" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" + "com.netflix.conductor:conductor-es6-persistence", + "com.netflix.dyno:dyno-core" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient" + ] + }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api", + "io.grpc:grpc-testing" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-testing" + ] }, "io.grpc:grpc-netty": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.45.1" + "locked": "1.46.0", + "transitive": [ + "com.netflix.conductor:conductor-grpc", + "io.grpc:grpc-services", + "io.grpc:grpc-testing" + ] }, "io.grpc:grpc-testing": { - "locked": "1.45.1" - }, - "io.micrometer:micrometer-registry-datadog": { - "locked": "1.8.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.8.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.12.0" + "locked": "1.46.0" + }, + "io.micrometer:micrometer-core": { + "locked": "1.5.14", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.hibernate.validator:hibernate-validator" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "org.glassfish.jaxb:jaxb-runtime", + "org.springframework.boot:spring-boot-starter-test" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.1.1" + "locked": "1.1.1", + "transitive": [ + "com.netflix.conductor:conductor-http-task", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "org.elasticsearch:elasticsearch" + ] }, "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.28" + "locked": "4.13.2", + "transitive": [ + "io.grpc:grpc-testing", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.redisson:redisson" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] }, "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.0.13" + "locked": "0.0.13", + "transitive": [ + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "3.0.1" + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-lock", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "io.swagger.core.v3:swagger-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-rest", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "locked": "2.17.1" + ] + }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-compat-qual": { + "locked": "2.5.5", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.12.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.3.7", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] }, "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "com.netflix.conductor:conductor-es6-persistence", + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + ] }, "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "8.0.5" + ] + }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "org.glassfish.jaxb:jaxb-runtime": { "locked": "2.3.3" }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.3.3" + "org.glassfish.jaxb:txw2": { + "locked": "2.3.4", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.12", + "transitive": [ + "io.micrometer:micrometer-core", + "org.elasticsearch:elasticsearch" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.latencyutils:LatencyUtils": { + "locked": "2.0.3", + "transitive": [ + "io.micrometer:micrometer-core" + ] + }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "com.github.jnr:jnr-ffi", + "net.minidev:accessors-smart", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] }, "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ + "locked": "0.0.17", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] }, "org.redisson:redisson": { - "firstLevelTransitive": [ + "locked": "3.13.3", + "transitive": [ "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "io.dropwizard.metrics:metrics-core", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson", + "org.slf4j:jul-to-slf4j", + "org.webjars:webjars-locator-core", + "redis.clients:jedis" + ] + }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] }, "org.springdoc:springdoc-openapi-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", + "locked": "1.6.8", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "1.6.7" + ] + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] }, "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-validation", + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.6.6" + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" }, "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ + "locked": "2.3.12.RELEASE", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "2.6.6" + ] + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework:spring-web": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "3.7.1" + "locked": "3.3.0", + "transitive": [ + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "stax:stax-api": { + "locked": "1.0.1", + "transitive": [ + "org.codehaus.jettison:jettison" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } } } \ No newline at end of file diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 69b0ebf98..4ffb2cd26 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -18,8 +18,9 @@ conductor.db.type=memory conductor.indexing.enabled=false -#Dynomite Cluster details. +#Redis configuration details. #format is host:port:rack separated by semicolon +#Auth is supported. Password is taken from host[0]. format: host:port:rack:password conductor.redis.hosts=host1:port:rack;host2:port:rack:host3:port:rack #namespace for the keys stored in Dynomite/Redis diff --git a/settings.gradle b/settings.gradle index 4eab3cb90..a3a92ae41 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,7 +12,7 @@ */ plugins { - id "com.gradle.enterprise" version "3.9" + id "com.gradle.enterprise" version "3.10" } gradleEnterprise { @@ -35,26 +35,24 @@ include 'annotations-processor' include 'server' include 'common' include 'core' -include 'contribs' include 'client' include 'client-spring' include 'cassandra-persistence' include 'redis-persistence' -include 'mysql-persistence' -include 'postgres-persistence' include 'es6-persistence' -include 'es7-persistence' include 'redis-lock' -include 'zookeeper-lock' -include 'azureblob-storage' -include 'postgres-external-storage' +include 'awss3-storage' +include 'awssqs-event-queue' include 'redis-concurrency-limit' +include 'json-jq-task' +include 'http-task' + include 'rest' include 'grpc' include 'grpc-server' diff --git a/test-harness/build.gradle b/test-harness/build.gradle index 28911ab80..2a249ac0b 100644 --- a/test-harness/build.gradle +++ b/test-harness/build.gradle @@ -5,15 +5,16 @@ dependencies { testImplementation project(':conductor-common') testImplementation project(':conductor-rest') testImplementation project(':conductor-core') - testImplementation project(':conductor-contribs') testImplementation project(':conductor-redis-persistence') - testImplementation project(':conductor-mysql-persistence') - testImplementation project(':conductor-postgres-persistence') testImplementation project(':conductor-cassandra-persistence') testImplementation project(':conductor-es6-persistence') testImplementation project(':conductor-grpc-server') testImplementation project(':conductor-client') testImplementation project(':conductor-grpc-client') + testImplementation project(':conductor-json-jq-task') + testImplementation project(':conductor-http-task') + + testImplementation "org.springframework.retry:spring-retry" testImplementation "com.fasterxml.jackson.core:jackson-databind" testImplementation "com.fasterxml.jackson.core:jackson-core" @@ -35,13 +36,4 @@ dependencies { testImplementation "org.elasticsearch.client:elasticsearch-rest-high-level-client" testImplementation "org.testcontainers:elasticsearch:${revTestContainer}" - testImplementation "org.testcontainers:mysql:${revTestContainer}" - testImplementation "org.testcontainers:postgresql:${revTestContainer}" - testImplementation(group: 'com.rabbitmq', name: 'amqp-client'){ version{require "${revAmqpClient}"}} -} - -test { - testLogging { - exceptionFormat = 'full' - } } diff --git a/test-harness/dependencies.lock b/test-harness/dependencies.lock index c9a1a1fdd..98b959ac8 100644 --- a/test-harness/dependencies.lock +++ b/test-harness/dependencies.lock @@ -1,15 +1,24 @@ { "annotationProcessor": { "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" } }, "compileClasspath": { "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -19,14 +28,30 @@ }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "runtimeClasspath": { "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web" + ] }, "org.apache.logging.log4j:log4j-jul": { "locked": "2.17.1" @@ -36,21 +61,175 @@ }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "org.apache.logging.log4j:log4j-slf4j-impl" + ] } }, "testCompileClasspath": { + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.github.docker-java:docker-java-api" + ] + }, "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "org.elasticsearch:elasticsearch-x-content" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.2.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.3.4", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "locked": "30.0-jre" + "locked": "30.0-jre", + "transitive": [ + "com.google.inject:guice" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.protobuf:protobuf-java": { "locked": "3.13.0" }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.jayway.jsonpath:json-path": { + "locked": "2.4.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, "com.netflix.conductor:conductor-cassandra-persistence": { "project": true }, @@ -60,9 +239,6 @@ "com.netflix.conductor:conductor-common": { "project": true }, - "com.netflix.conductor:conductor-contribs": { - "project": true - }, "com.netflix.conductor:conductor-core": { "project": true }, @@ -75,10 +251,10 @@ "com.netflix.conductor:conductor-grpc-server": { "project": true }, - "com.netflix.conductor:conductor-mysql-persistence": { + "com.netflix.conductor:conductor-http-task": { "project": true }, - "com.netflix.conductor:conductor-postgres-persistence": { + "com.netflix.conductor:conductor-json-jq-task": { "project": true }, "com.netflix.conductor:conductor-redis-persistence": { @@ -90,728 +266,3408 @@ "com.netflix.conductor:conductor-server": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { "locked": "2.0.20" }, - "com.rabbitmq:amqp-client": { - "locked": "5.14.0" + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.eureka:eureka-client": { + "locked": "1.8.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.17", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "org.codehaus.groovy:groovy-cli-commons" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "commons-io:commons-io": { + "locked": "2.4", + "transitive": [ + "com.netflix.dyno:dyno-core" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, + "jakarta.activation:jakarta.activation-api": { + "locked": "1.2.2", + "transitive": [ + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] + }, + "jakarta.xml.bind:jakarta.xml.bind-api": { + "locked": "2.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.ws.rs:jsr311-api": { + "locked": "1.1.1", + "transitive": [ + "com.sun.jersey:jersey-core" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "org.elasticsearch:elasticsearch" + ] }, "junit:junit": { - "locked": "4.13.2" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "locked": "3.12.0" + "locked": "3.10", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" + "locked": "2.17.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { "locked": "2.17.1" }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.5.0", + "transitive": [ + "com.google.guava:guava" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { "locked": "6.8.12" }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.9", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-params" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "net.minidev:accessors-smart" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] + }, + "org.slf4j:slf4j-api": { + "locked": "1.7.30", + "transitive": [ + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers", + "redis.clients:jedis" + ] + }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-starter": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE" + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework:spring-web": { - "locked": "5.3.18" + "locked": "5.2.15.RELEASE" }, "org.testcontainers:elasticsearch": { "locked": "1.15.3" }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:elasticsearch" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content", + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "locked": "3.3.0" + "locked": "3.3.0", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] } }, "testRuntimeClasspath": { + "antlr:antlr": { + "locked": "2.7.7", + "transitive": [ + "org.antlr:antlr-runtime", + "org.antlr:stringtemplate" + ] + }, + "aopalliance:aopalliance": { + "locked": "1.0", + "transitive": [ + "com.google.inject:guice" + ] + }, "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs", "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" + ] + }, + "com.amazonaws:aws-java-sdk-kms": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-s3" + ] }, "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage" + ] }, "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.11.86" + "locked": "1.11.86", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue" + ] + }, + "com.amazonaws:jmespath-java": { + "locked": "1.11.86", + "transitive": [ + "com.amazonaws:aws-java-sdk-kms", + "com.amazonaws:aws-java-sdk-s3", + "com.amazonaws:aws-java-sdk-sqs" + ] + }, + "com.beust:jcommander": { + "locked": "1.72", + "transitive": [ + "org.testng:testng" + ] + }, + "com.carrotsearch:hppc": { + "locked": "0.7.1", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ + "locked": "3.10.2", + "transitive": [ "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" + ] + }, + "com.ecwid.consul:consul-api": { + "locked": "1.2.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib" + ] }, "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.github.docker-java:docker-java-api", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-core", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "io.swagger.core.v3:swagger-models" + ] }, "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.core:jackson-databind", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2" + "com.netflix.eureka:eureka-client", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.webjars:webjars-locator-core" + ] }, "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.amazonaws:jmespath-java", + "com.datastax.cassandra:cassandra-driver-core", + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor", + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile", + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base", + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.fasterxml.jackson.module:jackson-module-parameter-names", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.13.2.2" + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.eureka:eureka-client", + "io.swagger.core.v3:swagger-core", + "net.thisptr:jackson-jq", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.11.4", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.11.4", + "transitive": [ + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.11.4", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson" + ] + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] }, "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" + "locked": "2.11.4", + "transitive": [ + "com.netflix.conductor:conductor-client", + "io.swagger.core.v3:swagger-core", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] }, "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ + "locked": "2.11.4", + "transitive": [ "com.netflix.conductor:conductor-client" - ], - "locked": "2.13.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" + ] + }, + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": { + "locked": "2.11.4", + "transitive": [ + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider" + ] + }, + "com.fasterxml.jackson.module:jackson-module-parameter-names": { + "locked": "2.11.4", + "transitive": [ + "org.springframework.boot:spring-boot-starter-json" + ] + }, + "com.fasterxml:classmate": { + "locked": "1.5.1", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "com.github.andrewoma.dexx:dexx-collections": { + "locked": "0.2", + "transitive": [ + "com.github.vlsi.compactmap:compactmap" + ] + }, + "com.github.ben-manes.caffeine:caffeine": { + "locked": "2.8.8", + "transitive": [ + "com.netflix.conductor:conductor-core", + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "com.github.docker-java:docker-java-api": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.docker-java:docker-java-transport": { + "locked": "3.2.8", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep" + ] + }, + "com.github.docker-java:docker-java-transport-zerodep": { + "locked": "3.2.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "com.github.jnr:jffi": { + "locked": "1.2.16", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.jnr:jnr-constants": { + "locked": "0.9.9", + "transitive": [ + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-ffi": { + "locked": "2.1.7", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.jnr:jnr-posix" + ] + }, + "com.github.jnr:jnr-posix": { + "locked": "3.0.44", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "com.github.jnr:jnr-x86asm": { + "locked": "1.0.2", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "com.github.spullara.mustache.java:compiler": { + "locked": "0.9.3", + "transitive": [ + "org.elasticsearch.plugin:lang-mustache-client" + ] + }, + "com.github.vlsi.compactmap:compactmap": { + "locked": "2.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.android:annotations": { + "locked": "4.1.1.4", + "transitive": [ + "io.grpc:grpc-core" + ] + }, + "com.google.api.grpc:proto-google-common-protos": { + "locked": "2.0.1", + "transitive": [ + "io.grpc:grpc-protobuf" + ] + }, + "com.google.code.findbugs:jsr305": { + "locked": "3.0.2", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-api", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite" + ] + }, + "com.google.code.gson:gson": { + "locked": "2.8.7", + "transitive": [ + "com.ecwid.consul:consul-api", + "com.google.protobuf:protobuf-java-util", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "io.grpc:grpc-core" + ] + }, + "com.google.errorprone:error_prone_annotations": { + "locked": "2.10.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:failureaccess": { + "locked": "1.0.1", + "transitive": [ + "com.google.guava:guava" + ] }, "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-contribs", - "com.netflix.conductor:conductor-core", + "locked": "30.0-jre", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.google.inject:guice", + "com.google.protobuf:protobuf-java-util", + "com.netflix.archaius:archaius-core", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "30.0-jre" + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "io.grpc:grpc-api", + "io.grpc:grpc-core", + "io.grpc:grpc-netty", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-services", + "io.grpc:grpc-stub" + ] + }, + "com.google.guava:listenablefuture": { + "locked": "9999.0-empty-to-avoid-conflict-with-guava", + "transitive": [ + "com.google.guava:guava" + ] + }, + "com.google.inject:guice": { + "locked": "4.1.0", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client" + ] + }, + "com.google.j2objc:j2objc-annotations": { + "locked": "1.3", + "transitive": [ + "com.google.guava:guava", + "com.google.protobuf:protobuf-java-util" + ] }, "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ + "locked": "3.13.0", + "transitive": [ + "com.google.api.grpc:proto-google-common-protos", + "com.google.protobuf:protobuf-java-util", "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "3.13.0" + "com.netflix.conductor:conductor-grpc-client", + "io.grpc:grpc-protobuf" + ] + }, + "com.google.protobuf:protobuf-java-util": { + "locked": "3.19.2", + "transitive": [ + "io.grpc:grpc-services" + ] + }, + "com.googlecode.json-simple:json-simple": { + "locked": "1.1", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] }, "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" + "locked": "2.4.0", + "transitive": [ + "com.netflix.conductor:conductor-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "com.netflix.archaius:archaius-core": { + "locked": "0.7.6", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-common" - ], - "project": true + ] + }, + "com.netflix.conductor:conductor-awss3-storage": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-server" + ] + }, + "com.netflix.conductor:conductor-awssqs-event-queue": { + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-server" + ] }, "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-client": { "project": true }, "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest" - ], - "project": true - }, - "com.netflix.conductor:conductor-contribs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest", "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-es6-persistence": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-grpc-client": { "project": true }, "com.netflix.conductor:conductor-grpc-server": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, - "com.netflix.conductor:conductor-mysql-persistence": { - "firstLevelTransitive": [ + "com.netflix.conductor:conductor-http-task": { + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "firstLevelTransitive": [ + "com.netflix.conductor:conductor-json-jq-task": { + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, - "com.netflix.conductor:conductor-postgres-persistence": { - "firstLevelTransitive": [ + "com.netflix.conductor:conductor-redis-concurrency-limit": { + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ + "project": true, + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "project": true + ] }, "com.netflix.conductor:conductor-server": { "project": true }, + "com.netflix.dyno-queues:dyno-queues-core": { + "locked": "2.0.20", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ + "locked": "2.0.20", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" + ] + }, + "com.netflix.dyno:dyno-contrib": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache" + ] + }, + "com.netflix.dyno:dyno-core": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-core", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-demo": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis" + ] + }, + "com.netflix.dyno:dyno-jedis": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-recipes" + ] + }, + "com.netflix.dyno:dyno-memcache": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] + }, + "com.netflix.dyno:dyno-recipes": { + "locked": "1.7.2-rc2", + "transitive": [ + "com.netflix.dyno:dyno-demo" + ] }, "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" + "locked": "1.10.10", + "transitive": [ + "com.netflix.conductor:conductor-client", + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib" + ] + }, + "com.netflix.netflix-commons:netflix-eventbus": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "com.netflix.netflix-commons:netflix-infix": { + "locked": "0.3.0", + "transitive": [ + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ + "locked": "1.1.4", + "transitive": [ "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" + ] + }, + "com.netflix.servo:servo-core": { + "locked": "0.12.21", + "transitive": [ + "com.netflix.dyno-queues:dyno-queues-redis", + "com.netflix.dyno:dyno-contrib", + "com.netflix.eureka:eureka-client", + "com.netflix.netflix-commons:netflix-eventbus" + ] }, "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ + "locked": "0.122.0", + "transitive": [ "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", - "com.netflix.conductor:conductor-server" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", - "com.netflix.conductor:conductor-server" - ], - "locked": "5.14.0" + ] }, "com.spotify:completable-futures": { - "firstLevelTransitive": [ + "locked": "0.3.3", + "transitive": [ "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" + ] + }, + "com.sun.activation:jakarta.activation": { + "locked": "1.2.2", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.istack:istack-commons-runtime": { + "locked": "3.0.12", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "com.sun.jersey.contribs:jersey-apache-client4": { + "locked": "1.19.1", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] }, "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" + "locked": "1.19.4", + "transitive": [ + "com.netflix.conductor:conductor-client", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4" + ] + }, + "com.sun.jersey:jersey-core": { + "locked": "1.19.4", + "transitive": [ + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-client" + ] + }, + "com.tdunning:t-digest": { + "locked": "3.2", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "com.thoughtworks.qdox:qdox": { + "locked": "1.12.1", + "transitive": [ + "org.codehaus.groovy:groovy-docgenerator" + ] }, "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.19" + "locked": "1.4.19", + "transitive": [ + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.eureka:eureka-client" + ] + }, + "com.vaadin.external.google:android-json": { + "locked": "0.0.20131108.vaadin1", + "transitive": [ + "org.skyscreamer:jsonassert" + ] + }, + "commons-cli:commons-cli": { + "locked": "1.4", + "transitive": [ + "com.netflix.dyno:dyno-demo", + "org.codehaus.groovy:groovy-cli-commons" + ] + }, + "commons-codec:commons-codec": { + "locked": "1.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "commons-configuration:commons-configuration": { + "locked": "1.10", + "transitive": [ + "com.netflix.archaius:archaius-core", + "com.netflix.eureka:eureka-client" + ] }, "commons-io:commons-io": { - "firstLevelTransitive": [ + "locked": "2.7", + "transitive": [ "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" + "com.netflix.conductor:conductor-es6-persistence", + "com.netflix.dyno:dyno-core" + ] + }, + "commons-jxpath:commons-jxpath": { + "locked": "1.3", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "commons-lang:commons-lang": { + "locked": "2.6", + "transitive": [ + "commons-configuration:commons-configuration" + ] + }, + "commons-logging:commons-logging": { + "locked": "1.2", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "commons-configuration:commons-configuration", + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "info.picocli:picocli": { + "locked": "4.3.2", + "transitive": [ + "org.codehaus.groovy:groovy-cli-picocli" + ] + }, + "io.dropwizard.metrics:metrics-core": { + "locked": "4.1.22", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core" + ] + }, + "io.github.classgraph:classgraph": { + "locked": "4.8.143", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "io.github.x-stream:mxparser": { + "locked": "1.2.2", + "transitive": [ + "com.thoughtworks.xstream:xstream" + ] + }, + "io.grpc:grpc-api": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-protobuf", + "io.grpc:grpc-protobuf-lite", + "io.grpc:grpc-stub" + ] + }, + "io.grpc:grpc-context": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-api" + ] + }, + "io.grpc:grpc-core": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-netty", + "io.grpc:grpc-services" + ] }, "io.grpc:grpc-netty": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.45.1" + "com.netflix.conductor:conductor-grpc-client", + "io.grpc:grpc-services" + ] + }, + "io.grpc:grpc-protobuf-lite": { + "locked": "1.46.0", + "transitive": [ + "io.grpc:grpc-protobuf" + ] }, "io.grpc:grpc-services": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.45.1" + ] }, "io.grpc:grpc-stub": { - "firstLevelTransitive": [ + "locked": "1.46.0", + "transitive": [ "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.45.1" - }, - "io.micrometer:micrometer-registry-datadog": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.8.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.8.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.5.0" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.12.0" + "com.netflix.conductor:conductor-grpc-client", + "io.grpc:grpc-services" + ] + }, + "io.micrometer:micrometer-core": { + "locked": "1.5.14", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "io.netty:netty-buffer": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-codec-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-resolver-dns" + ] + }, + "io.netty:netty-codec-http": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec-http2", + "io.netty:netty-handler-proxy", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-codec-http2": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-codec-socks": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler-proxy" + ] + }, + "io.netty:netty-common": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-buffer", + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler": { + "locked": "4.1.65.Final", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.netty:netty-handler-proxy": { + "locked": "4.1.65.Final", + "transitive": [ + "io.grpc:grpc-netty" + ] + }, + "io.netty:netty-resolver": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-handler", + "io.netty:netty-resolver-dns", + "io.netty:netty-transport", + "org.elasticsearch.plugin:transport-netty4-client" + ] + }, + "io.netty:netty-resolver-dns": { + "locked": "4.1.65.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.netty:netty-transport": { + "locked": "4.1.65.Final", + "transitive": [ + "io.netty:netty-codec", + "io.netty:netty-codec-dns", + "io.netty:netty-codec-http", + "io.netty:netty-codec-http2", + "io.netty:netty-codec-socks", + "io.netty:netty-handler", + "io.netty:netty-handler-proxy", + "io.netty:netty-resolver-dns", + "org.elasticsearch.plugin:transport-netty4-client", + "org.redisson:redisson" + ] + }, + "io.perfmark:perfmark-api": { + "locked": "0.25.0", + "transitive": [ + "io.grpc:grpc-core", + "io.grpc:grpc-netty" + ] + }, + "io.projectreactor:reactor-core": { + "locked": "3.3.17.RELEASE", + "transitive": [ + "org.redisson:redisson" + ] + }, + "io.reactivex.rxjava2:rxjava": { + "locked": "2.2.21", + "transitive": [ + "org.redisson:redisson" + ] }, "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs", + "locked": "1.3.8", + "transitive": [ + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" + ] + }, + "io.swagger.core.v3:swagger-annotations": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] + }, + "io.swagger.core.v3:swagger-core": { + "locked": "2.2.0", + "transitive": [ + "org.springdoc:springdoc-openapi-common" + ] + }, + "io.swagger.core.v3:swagger-models": { + "locked": "2.2.0", + "transitive": [ + "io.swagger.core.v3:swagger-core" + ] }, "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" + "locked": "1.2.2", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.conductor:conductor-core", + "jakarta.xml.bind:jakarta.xml.bind-api" + ] + }, + "jakarta.annotation:jakarta.annotation-api": { + "locked": "1.3.5", + "transitive": [ + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "jakarta.validation:jakarta.validation-api": { + "locked": "2.0.2", + "transitive": [ + "io.swagger.core.v3:swagger-core", + "org.hibernate.validator:hibernate-validator" + ] }, "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" + "locked": "2.3.3", + "transitive": [ + "com.fasterxml.jackson.module:jackson-module-jaxb-annotations", + "com.netflix.conductor:conductor-core", + "io.swagger.core.v3:swagger-core", + "org.glassfish.jaxb:jaxb-runtime", + "org.springframework.boot:spring-boot-starter-test" + ] }, "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ + "locked": "1.3.2", + "transitive": [ "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" + ] + }, + "javax.cache:cache-api": { + "locked": "1.1.1", + "transitive": [ + "org.redisson:redisson" + ] + }, + "javax.inject:javax.inject": { + "locked": "1", + "transitive": [ + "com.google.inject:guice" + ] + }, + "javax.servlet:servlet-api": { + "locked": "2.5", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] }, "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "1.1.1" + "locked": "1.1.1", + "transitive": [ + "com.netflix.conductor:conductor-http-task", + "com.netflix.eureka:eureka-client", + "com.sun.jersey:jersey-core" + ] + }, + "jline:jline": { + "locked": "2.14.6", + "transitive": [ + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "joda-time:joda-time": { + "locked": "2.10.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-infix", + "org.elasticsearch:elasticsearch" + ] }, "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.28" + "locked": "4.13.2", + "transitive": [ + "org.codehaus.groovy:groovy-test", + "org.junit.vintage:junit-vintage-engine", + "org.spockframework:spock-core", + "org.testcontainers:testcontainers" + ] + }, + "net.bytebuddy:byte-buddy": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core", + "org.redisson:redisson" + ] + }, + "net.bytebuddy:byte-buddy-agent": { + "locked": "1.10.22", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "net.java.dev.jna:jna": { + "locked": "5.8.0", + "transitive": [ + "com.github.docker-java:docker-java-transport-zerodep", + "org.rnorth.visible-assertions:visible-assertions" + ] + }, + "net.minidev:accessors-smart": { + "locked": "2.3.1", + "transitive": [ + "net.minidev:json-smart" + ] + }, + "net.minidev:json-smart": { + "locked": "2.3.1", + "transitive": [ + "com.jayway.jsonpath:json-path" + ] + }, + "net.sf.jopt-simple:jopt-simple": { + "locked": "5.0.2", + "transitive": [ + "org.elasticsearch:elasticsearch-cli" + ] }, "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "0.0.13" + "locked": "0.0.13", + "transitive": [ + "com.netflix.conductor:conductor-json-jq-task" + ] + }, + "org.antlr:antlr-runtime": { + "locked": "3.4", + "transitive": [ + "com.netflix.netflix-commons:netflix-infix" + ] + }, + "org.antlr:stringtemplate": { + "locked": "3.2.1", + "transitive": [ + "org.antlr:antlr-runtime" + ] + }, + "org.apache.ant:ant": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant-junit", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-antlr": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-junit": { + "locked": "1.9.15", + "transitive": [ + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.apache.ant:ant-launcher": { + "locked": "1.9.15", + "transitive": [ + "org.apache.ant:ant", + "org.codehaus.groovy:groovy-ant" + ] }, "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ + "locked": "2.0.5", + "transitive": [ "com.netflix.conductor:conductor-common", "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" + ] + }, + "org.apache.commons:commons-compress": { + "locked": "1.20", + "transitive": [ + "org.testcontainers:testcontainers" + ] }, "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ + "locked": "3.10", + "transitive": [ + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-contribs" - ], - "locked": "3.0.1" + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-lock", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "io.swagger.core.v3:swagger-core" + ] + }, + "org.apache.commons:commons-math": { + "locked": "2.2", + "transitive": [ + "com.netflix.dyno:dyno-core", + "com.netflix.netflix-commons:netflix-eventbus" + ] + }, + "org.apache.commons:commons-pool2": { + "locked": "2.8.1", + "transitive": [ + "redis.clients:jedis" + ] + }, + "org.apache.httpcomponents:httpasyncclient": { + "locked": "4.1.4", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpclient": { + "locked": "4.5.13", + "transitive": [ + "com.amazonaws:aws-java-sdk-core", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.eureka:eureka-client", + "com.sun.jersey.contribs:jersey-apache-client4", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore": { + "locked": "4.4.14", + "transitive": [ + "org.apache.httpcomponents:httpclient", + "org.elasticsearch.client:elasticsearch-rest-client" + ] + }, + "org.apache.httpcomponents:httpcore-nio": { + "locked": "4.4.14", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-client" + ] }, "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-server", + "org.apache.logging.log4j:log4j-core", + "org.apache.logging.log4j:log4j-jul", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.elasticsearch:elasticsearch" + ] }, "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-server", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.apache.logging.log4j:log4j-web", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-server", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.17.1" + "com.netflix.conductor:conductor-server", + "org.springframework.boot:spring-boot-starter-log4j2" + ] }, "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ + "locked": "2.17.1", + "transitive": [ "com.netflix.conductor:conductor-annotations", + "com.netflix.conductor:conductor-awss3-storage", + "com.netflix.conductor:conductor-awssqs-event-queue", "com.netflix.conductor:conductor-cassandra-persistence", "com.netflix.conductor:conductor-client", "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-contribs", "com.netflix.conductor:conductor-core", "com.netflix.conductor:conductor-es6-persistence", "com.netflix.conductor:conductor-grpc", "com.netflix.conductor:conductor-grpc-client", "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", + "com.netflix.conductor:conductor-http-task", + "com.netflix.conductor:conductor-json-jq-task", + "com.netflix.conductor:conductor-redis-concurrency-limit", "com.netflix.conductor:conductor-redis-lock", "com.netflix.conductor:conductor-redis-persistence", "com.netflix.conductor:conductor-rest", "com.netflix.conductor:conductor-server" - ], - "locked": "2.17.1" + ] + }, + "org.apache.lucene:lucene-analyzers-common": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-backward-codecs": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-core": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-grouping": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-highlighter": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-join": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-memory": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-misc": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queries": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-queryparser": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-sandbox": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial-extras": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-spatial3d": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.lucene:lucene-suggest": { + "locked": "7.7.3", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-core": { + "locked": "9.0.46", + "transitive": [ + "org.apache.tomcat.embed:tomcat-embed-websocket", + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apache.tomcat.embed:tomcat-embed-websocket": { + "locked": "9.0.46", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat" + ] + }, + "org.apiguardian:apiguardian-api": { + "locked": "1.1.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.assertj:assertj-core": { + "locked": "3.16.1", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.checkerframework:checker-qual": { + "locked": "3.8.0", + "transitive": [ + "com.github.ben-manes.caffeine:caffeine", + "com.google.guava:guava" + ] + }, + "org.codehaus.groovy:groovy": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant", + "org.codehaus.groovy:groovy-cli-commons", + "org.codehaus.groovy:groovy-cli-picocli", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-datetime", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh", + "org.codehaus.groovy:groovy-jmx", + "org.codehaus.groovy:groovy-json", + "org.codehaus.groovy:groovy-jsr223", + "org.codehaus.groovy:groovy-macro", + "org.codehaus.groovy:groovy-nio", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-sql", + "org.codehaus.groovy:groovy-swing", + "org.codehaus.groovy:groovy-templates", + "org.codehaus.groovy:groovy-test", + "org.codehaus.groovy:groovy-test-junit5", + "org.codehaus.groovy:groovy-testng", + "org.codehaus.groovy:groovy-xml", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] }, "org.codehaus.groovy:groovy-all": { "locked": "2.5.13" }, + "org.codehaus.groovy:groovy-ant": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-commons": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-cli-picocli": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-console": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovysh" + ] + }, + "org.codehaus.groovy:groovy-datetime": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-docgenerator": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-groovydoc" + ] + }, + "org.codehaus.groovy:groovy-groovydoc": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-ant" + ] + }, + "org.codehaus.groovy:groovy-groovysh": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-jmx": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-json": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-jsr223": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-macro": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-nio": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-servlet": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-sql": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-swing": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console" + ] + }, + "org.codehaus.groovy:groovy-templates": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-console", + "org.codehaus.groovy:groovy-docgenerator", + "org.codehaus.groovy:groovy-groovydoc", + "org.codehaus.groovy:groovy-servlet", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.groovy:groovy-test-junit5": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-testng": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all" + ] + }, + "org.codehaus.groovy:groovy-xml": { + "locked": "2.5.14", + "transitive": [ + "org.codehaus.groovy:groovy-all", + "org.codehaus.groovy:groovy-servlet", + "org.codehaus.groovy:groovy-templates", + "org.spockframework:spock-core", + "org.spockframework:spock-spring" + ] + }, + "org.codehaus.jettison:jettison": { + "locked": "1.4.0", + "transitive": [ + "com.netflix.eureka:eureka-client" + ] + }, + "org.codehaus.mojo:animal-sniffer-annotations": { + "locked": "1.19", + "transitive": [ + "io.grpc:grpc-core" + ] + }, "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + "locked": "6.8.12", + "transitive": [ + "com.netflix.conductor:conductor-es6-persistence", + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.plugin:reindex-client" + ] }, "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" + ] }, "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ + "locked": "6.8.12", + "transitive": [ "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "8.0.5" + ] + }, + "org.elasticsearch.plugin:aggs-matrix-stats-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client" + ] + }, + "org.elasticsearch.plugin:lang-mustache-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:parent-join-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:percolator-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:rank-eval-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:reindex-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch.plugin:transport-netty4-client": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.client:elasticsearch-rest-high-level-client", + "org.elasticsearch.client:transport" + ] + }, + "org.elasticsearch:elasticsearch-cli": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-core": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch", + "org.elasticsearch:elasticsearch-cli", + "org.elasticsearch:elasticsearch-ssl-config", + "org.elasticsearch:elasticsearch-x-content" + ] + }, + "org.elasticsearch:elasticsearch-secure-sm": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:elasticsearch-ssl-config": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch.plugin:reindex-client" + ] + }, + "org.elasticsearch:elasticsearch-x-content": { + "locked": "6.8.12", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] + }, + "org.elasticsearch:jna": { + "locked": "5.5.0", + "transitive": [ + "org.elasticsearch:elasticsearch" + ] }, "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ + "locked": "2.3.4", + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "locked": "2.3.6" - }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.3.3" + ] + }, + "org.glassfish.jaxb:txw2": { + "locked": "2.3.4", + "transitive": [ + "org.glassfish.jaxb:jaxb-runtime" + ] + }, + "org.glassfish:jakarta.el": { + "locked": "3.0.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-tomcat", + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.hamcrest:hamcrest": { + "locked": "2.2", + "transitive": [ + "org.hamcrest:hamcrest-core", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.hamcrest:hamcrest-core": { + "locked": "2.2", + "transitive": [ + "junit:junit" + ] + }, + "org.hdrhistogram:HdrHistogram": { + "locked": "2.1.12", + "transitive": [ + "io.micrometer:micrometer-core", + "org.elasticsearch:elasticsearch" + ] + }, + "org.hibernate.validator:hibernate-validator": { + "locked": "6.1.7.Final", + "transitive": [ + "org.springframework.boot:spring-boot-starter-validation" + ] + }, + "org.jboss.logging:jboss-logging": { + "locked": "3.4.2.Final", + "transitive": [ + "org.hibernate.validator:hibernate-validator" + ] + }, + "org.jboss.marshalling:jboss-marshalling": { + "locked": "2.0.9.Final", + "transitive": [ + "org.jboss.marshalling:jboss-marshalling-river" + ] + }, + "org.jboss.marshalling:jboss-marshalling-river": { + "locked": "2.0.9.Final", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-bean": { + "locked": "5.0.13", + "transitive": [ + "org.redisson:redisson" + ] + }, + "org.jodd:jodd-core": { + "locked": "5.0.13", + "transitive": [ + "org.jodd:jodd-bean" + ] + }, + "org.jruby.jcodings:jcodings": { + "locked": "1.0.43", + "transitive": [ + "org.jruby.joni:joni" + ] + }, + "org.jruby.joni:joni": { + "locked": "2.1.27", + "transitive": [ + "net.thisptr:jackson-jq" + ] + }, + "org.junit.jupiter:junit-jupiter": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit.jupiter:junit-jupiter-api": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.mockito:mockito-junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-engine": { + "locked": "5.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5", + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.jupiter:junit-jupiter-params": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter" + ] + }, + "org.junit.platform:junit-platform-commons": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.junit.platform:junit-platform-engine": { + "locked": "1.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.junit.platform:junit-platform-launcher": { + "locked": "1.6.3", + "transitive": [ + "org.codehaus.groovy:groovy-test-junit5" + ] + }, + "org.junit.vintage:junit-vintage-engine": { + "locked": "5.6.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.junit:junit-bom": { + "locked": "5.6.3", + "transitive": [ + "org.junit.jupiter:junit-jupiter", + "org.junit.jupiter:junit-jupiter-api", + "org.junit.jupiter:junit-jupiter-engine", + "org.junit.jupiter:junit-jupiter-params", + "org.junit.platform:junit-platform-commons", + "org.junit.platform:junit-platform-engine", + "org.junit.platform:junit-platform-launcher", + "org.junit.vintage:junit-vintage-engine" + ] + }, + "org.latencyutils:LatencyUtils": { + "locked": "2.0.3", + "transitive": [ + "io.micrometer:micrometer-core" + ] + }, + "org.luaj:luaj-jse": { + "locked": "3.0", + "transitive": [ + "org.rarefiedredis.redis:redis-java" + ] + }, + "org.mockito:mockito-core": { + "locked": "3.3.3", + "transitive": [ + "org.mockito:mockito-junit-jupiter", + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.mockito:mockito-junit-jupiter": { + "locked": "3.3.3", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.objenesis:objenesis": { + "locked": "2.6", + "transitive": [ + "org.mockito:mockito-core" + ] + }, + "org.opentest4j:opentest4j": { + "locked": "1.2.0", + "transitive": [ + "org.junit.jupiter:junit-jupiter-api", + "org.junit.platform:junit-platform-engine" + ] + }, + "org.ow2.asm:asm": { + "locked": "5.0.4", + "transitive": [ + "com.github.jnr:jnr-ffi", + "net.minidev:accessors-smart", + "org.ow2.asm:asm-tree" + ] + }, + "org.ow2.asm:asm-analysis": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-commons": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.ow2.asm:asm-tree": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi", + "org.ow2.asm:asm-analysis", + "org.ow2.asm:asm-commons", + "org.ow2.asm:asm-util" + ] + }, + "org.ow2.asm:asm-util": { + "locked": "5.0.3", + "transitive": [ + "com.github.jnr:jnr-ffi" + ] + }, + "org.projectlombok:lombok": { + "locked": "1.18.20", + "transitive": [ + "com.netflix.dyno:dyno-jedis" + ] }, "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ + "locked": "0.0.17", + "transitive": [ "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" + ] + }, + "org.reactivestreams:reactive-streams": { + "locked": "1.0.3", + "transitive": [ + "io.projectreactor:reactor-core", + "io.reactivex.rxjava2:rxjava" + ] }, "org.redisson:redisson": { - "firstLevelTransitive": [ + "locked": "3.13.3", + "transitive": [ "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" + ] + }, + "org.rnorth.duct-tape:duct-tape": { + "locked": "1.0.8", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.rnorth.visible-assertions:visible-assertions": { + "locked": "2.1.2", + "transitive": [ + "org.testcontainers:testcontainers" + ] + }, + "org.skyscreamer:jsonassert": { + "locked": "1.5.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.slf4j:jul-to-slf4j": { + "locked": "1.7.30", + "transitive": [ + "org.springframework.boot:spring-boot-starter-log4j2", + "org.springframework.boot:spring-boot-starter-logging" + ] }, "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ + "locked": "1.7.30", + "transitive": [ + "com.datastax.cassandra:cassandra-driver-core", + "com.github.docker-java:docker-java-api", + "com.github.docker-java:docker-java-transport-zerodep", + "com.jayway.jsonpath:json-path", + "com.netflix.archaius:archaius-core", "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.7.36" + "com.netflix.conductor:conductor-grpc-client", + "com.netflix.dyno:dyno-contrib", + "com.netflix.dyno:dyno-core", + "com.netflix.dyno:dyno-demo", + "com.netflix.dyno:dyno-jedis", + "com.netflix.dyno:dyno-memcache", + "com.netflix.dyno:dyno-recipes", + "com.netflix.netflix-commons:netflix-eventbus", + "com.netflix.netflix-commons:netflix-infix", + "com.netflix.servo:servo-core", + "com.netflix.spectator:spectator-api", + "io.dropwizard.metrics:metrics-core", + "io.swagger.core.v3:swagger-core", + "org.apache.logging.log4j:log4j-slf4j-impl", + "org.redisson:redisson", + "org.slf4j:jul-to-slf4j", + "org.testcontainers:testcontainers", + "org.webjars:webjars-locator-core", + "redis.clients:jedis" + ] }, "org.spockframework:spock-core": { - "locked": "1.3-groovy-2.5" + "locked": "1.3-groovy-2.5", + "transitive": [ + "org.spockframework:spock-spring" + ] }, "org.spockframework:spock-spring": { "locked": "1.3-groovy-2.5" }, + "org.springdoc:springdoc-openapi-common": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core" + ] + }, "org.springdoc:springdoc-openapi-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", + "locked": "1.6.8", + "transitive": [ "com.netflix.conductor:conductor-rest", "com.netflix.conductor:conductor-server" - ], - "locked": "1.6.7" + ] + }, + "org.springdoc:springdoc-openapi-webmvc-core": { + "locked": "1.6.8", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.springframework.boot:spring-boot": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-actuator-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-actuator-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-actuator" + ] + }, + "org.springframework.boot:spring-boot-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-actuator-autoconfigure", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] }, "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.6.6" + "locked": "2.3.12.RELEASE", + "transitive": [ + "com.netflix.conductor:conductor-server", + "org.springframework.boot:spring-boot-starter-actuator", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-starter-validation", + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ + "locked": "2.3.12.RELEASE", + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "locked": "2.6.6" + ] }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.6.6" + "org.springframework.boot:spring-boot-starter-json": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ + "locked": "2.3.12.RELEASE", + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "locked": "2.6.6" + ] + }, + "org.springframework.boot:spring-boot-starter-logging": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter" + ] }, "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" + "locked": "2.3.12.RELEASE" + }, + "org.springframework.boot:spring-boot-starter-tomcat": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ + "locked": "2.3.12.RELEASE", + "transitive": [ "com.netflix.conductor:conductor-server" - ], - "locked": "2.6.6" + ] }, "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ + "locked": "2.3.12.RELEASE", + "transitive": [ "com.netflix.conductor:conductor-rest", "com.netflix.conductor:conductor-server" - ], - "locked": "2.6.6" + ] + }, + "org.springframework.boot:spring-boot-test": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.boot:spring-boot-test-autoconfigure" + ] + }, + "org.springframework.boot:spring-boot-test-autoconfigure": { + "locked": "2.3.12.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.springframework.retry:spring-retry": { + "locked": "1.2.5.RELEASE", + "transitive": [ + "com.netflix.conductor:conductor-server" + ] + }, + "org.springframework:spring-aop": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-beans": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-aop", + "org.springframework:spring-context", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-context": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-core": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot", + "org.springframework.boot:spring-boot-starter", + "org.springframework.boot:spring-boot-starter-test", + "org.springframework.retry:spring-retry", + "org.springframework:spring-aop", + "org.springframework:spring-beans", + "org.springframework:spring-context", + "org.springframework:spring-expression", + "org.springframework:spring-test", + "org.springframework:spring-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-expression": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-context", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-jcl": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework:spring-core" + ] + }, + "org.springframework:spring-test": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] }, "org.springframework:spring-web": { - "locked": "5.3.18" + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-common", + "org.springframework.boot:spring-boot-starter-json", + "org.springframework.boot:spring-boot-starter-web", + "org.springframework:spring-webmvc" + ] + }, + "org.springframework:spring-webmvc": { + "locked": "5.2.15.RELEASE", + "transitive": [ + "org.springdoc:springdoc-openapi-webmvc-core", + "org.springframework.boot:spring-boot-starter-web" + ] }, "org.testcontainers:elasticsearch": { "locked": "1.15.3" }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" + "org.testcontainers:testcontainers": { + "locked": "1.15.3", + "transitive": [ + "org.testcontainers:elasticsearch" + ] + }, + "org.testng:testng": { + "locked": "6.13.1", + "transitive": [ + "org.codehaus.groovy:groovy-testng" + ] + }, + "org.webjars:swagger-ui": { + "locked": "4.10.3", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.webjars:webjars-locator-core": { + "locked": "0.45", + "transitive": [ + "org.springdoc:springdoc-openapi-ui" + ] + }, + "org.xmlunit:xmlunit-core": { + "locked": "2.7.0", + "transitive": [ + "org.springframework.boot:spring-boot-starter-test" + ] + }, + "org.yaml:snakeyaml": { + "locked": "1.26", + "transitive": [ + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", + "org.elasticsearch:elasticsearch-x-content", + "org.redisson:redisson", + "org.springframework.boot:spring-boot-starter" + ] }, "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "3.3.0" + "locked": "3.3.0", + "transitive": [ + "com.netflix.conductor:conductor-redis-concurrency-limit", + "com.netflix.conductor:conductor-redis-persistence", + "com.netflix.dyno:dyno-jedis", + "org.rarefiedredis.redis:redis-java" + ] + }, + "software.amazon.ion:ion-java": { + "locked": "1.0.1", + "transitive": [ + "com.amazonaws:aws-java-sdk-core" + ] + }, + "xmlpull:xmlpull": { + "locked": "1.1.3.1", + "transitive": [ + "io.github.x-stream:mxparser" + ] } } } \ No newline at end of file diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/DoWhileSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/DoWhileSpec.groovy index 381d9d117..6b2f556dd 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/DoWhileSpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/DoWhileSpec.groovy @@ -33,6 +33,7 @@ class DoWhileSpec extends AbstractSpecification { "do_while_multiple_integration_test.json", "do_while_as_subtask_integration_test.json", 'simple_one_task_sub_workflow_integration_test.json', + 'do_while_iteration_fix_test.json', "do_while_sub_workflow_integration_test.json") } @@ -792,9 +793,9 @@ class DoWhileSpec extends AbstractSpecification { tasks[0].status == Task.Status.COMPLETED tasks[1].taskType == 'DO_WHILE' tasks[1].status == Task.Status.IN_PROGRESS - tasks[2].taskType == 'integration_task_0' + tasks[2].taskType == 'integration_task_2' tasks[2].status == Task.Status.SCHEDULED - tasks[3].taskType == 'integration_task_2' + tasks[3].taskType == 'integration_task_0' tasks[3].status == Task.Status.SCHEDULED tasks[4].taskType == 'JOIN' tasks[4].status == Task.Status.IN_PROGRESS @@ -813,10 +814,10 @@ class DoWhileSpec extends AbstractSpecification { tasks[0].status == Task.Status.COMPLETED tasks[1].taskType == 'DO_WHILE' tasks[1].status == Task.Status.IN_PROGRESS - tasks[2].taskType == 'integration_task_0' - tasks[2].status == Task.Status.COMPLETED - tasks[3].taskType == 'integration_task_2' - tasks[3].status == Task.Status.SCHEDULED + tasks[2].taskType == 'integration_task_2' + tasks[2].status == Task.Status.SCHEDULED + tasks[3].taskType == 'integration_task_0' + tasks[3].status == Task.Status.COMPLETED tasks[4].taskType == 'JOIN' tasks[4].status == Task.Status.IN_PROGRESS tasks[5].taskType == 'integration_task_1' @@ -836,10 +837,10 @@ class DoWhileSpec extends AbstractSpecification { tasks[0].status == Task.Status.COMPLETED tasks[1].taskType == 'DO_WHILE' tasks[1].status == Task.Status.COMPLETED - tasks[2].taskType == 'integration_task_0' - tasks[2].status == Task.Status.COMPLETED - tasks[3].taskType == 'integration_task_2' - tasks[3].status == Task.Status.SCHEDULED + tasks[2].taskType == 'integration_task_2' + tasks[2].status == Task.Status.SCHEDULED + tasks[3].taskType == 'integration_task_0' + tasks[3].status == Task.Status.COMPLETED tasks[4].taskType == 'JOIN' tasks[4].status == Task.Status.IN_PROGRESS tasks[5].taskType == 'integration_task_1' @@ -858,9 +859,9 @@ class DoWhileSpec extends AbstractSpecification { tasks[0].status == Task.Status.COMPLETED tasks[1].taskType == 'DO_WHILE' tasks[1].status == Task.Status.COMPLETED - tasks[2].taskType == 'integration_task_0' + tasks[2].taskType == 'integration_task_2' tasks[2].status == Task.Status.COMPLETED - tasks[3].taskType == 'integration_task_2' + tasks[3].taskType == 'integration_task_0' tasks[3].status == Task.Status.COMPLETED tasks[4].taskType == 'JOIN' tasks[4].status == Task.Status.COMPLETED @@ -869,6 +870,29 @@ class DoWhileSpec extends AbstractSpecification { } } + def "Test workflow with Do While task contains loop over task that use iteration in script expression"() { + given: "Number of iterations of the loop is set to 2" + def workflowInput = new HashMap() + workflowInput['loop'] = 2 + + when: "A do_while workflow is started" + def workflowInstanceId = workflowExecutor.startWorkflow("Do_While_Workflow_Iteration_Fix", 1, "looptest", workflowInput, null, null) + + then: "Verify that the workflow has competed" + with(workflowExecutionService.getExecutionStatus(workflowInstanceId, true)) { + status == Workflow.WorkflowStatus.COMPLETED + tasks.size() == 3 + tasks[0].taskType == 'DO_WHILE' + tasks[0].status == Task.Status.COMPLETED + tasks[1].taskType == 'LAMBDA' + tasks[1].status == Task.Status.COMPLETED + tasks[1].outputData.get("result") == 0 + tasks[2].taskType == 'LAMBDA' + tasks[2].status == Task.Status.COMPLETED + tasks[2].outputData.get("result") == 1 + } + } + void verifyTaskIteration(Task task, int iteration) { assert task.getReferenceTaskName().endsWith(TaskUtils.getLoopOverTaskRefNameSuffix(task.getIteration())) assert task.iteration == iteration diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ExternalPayloadStorageSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ExternalPayloadStorageSpec.groovy index b0dceb9a5..44907f3df 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ExternalPayloadStorageSpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ExternalPayloadStorageSpec.groovy @@ -20,17 +20,13 @@ import com.netflix.conductor.common.metadata.tasks.TaskType import com.netflix.conductor.common.run.Workflow import com.netflix.conductor.core.execution.tasks.SubWorkflow import com.netflix.conductor.test.base.AbstractSpecification +import com.netflix.conductor.test.utils.MockExternalPayloadStorage import com.netflix.conductor.test.utils.UserTask import spock.lang.Shared import static com.netflix.conductor.test.util.WorkflowTestUtil.verifyPolledAndAcknowledgedLargePayloadTask import static com.netflix.conductor.test.util.WorkflowTestUtil.verifyPolledAndAcknowledgedTask -import static com.netflix.conductor.test.utils.MockExternalPayloadStorage.DYNAMIC_FORK_LARGE_PAYLOAD_PATH -import static com.netflix.conductor.test.utils.MockExternalPayloadStorage.INITIAL_WORKFLOW_INPUT_PATH -import static com.netflix.conductor.test.utils.MockExternalPayloadStorage.INPUT_PAYLOAD_PATH -import static com.netflix.conductor.test.utils.MockExternalPayloadStorage.TASK_OUTPUT_PATH -import static com.netflix.conductor.test.utils.MockExternalPayloadStorage.WORKFLOW_OUTPUT_PATH class ExternalPayloadStorageSpec extends AbstractSpecification { @@ -61,6 +57,9 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { @Autowired SubWorkflow subWorkflowTask + @Autowired + MockExternalPayloadStorage mockExternalPayloadStorage + def setup() { workflowTestUtil.registerWorkflows('simple_workflow_1_integration_test.json', 'conditional_system_task_workflow_integration_test.json', @@ -79,7 +78,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { and: "input required to start large payload workflow" def correlationId = 'wf_external_storage' - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() when: "the workflow is started" def workflowInstanceId = workflowExecutor.startWorkflow(LINEAR_WORKFLOW_T1_T2, 1, correlationId, null, workflowInputPath, null, null) @@ -93,7 +92,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { } when: "poll and complete the 'integration_task_1' with external payload storage" - def taskOutputPath = TASK_OUTPUT_PATH + String taskOutputPath = uploadLargeTaskOutput() def pollAndCompleteLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_1', 'task1.integration.worker', taskOutputPath) then: "verify that the 'integration_task_1' was polled and acknowledged" @@ -106,10 +105,8 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath tasks[1].taskType == 'integration_task_2' tasks[1].status == Task.Status.SCHEDULED - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH } when: "poll and complete the 'integration_task_2' with external payload storage" @@ -123,14 +120,14 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { status == Workflow.WorkflowStatus.COMPLETED tasks.size() == 2 output.isEmpty() - externalOutputPayloadStoragePath == WORKFLOW_OUTPUT_PATH + tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == 'integration_task_2' tasks[1].status == Task.Status.COMPLETED - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } } @@ -140,7 +137,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { and: "input required to start large payload workflow" def correlationId = 'wf_external_storage' - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() when: "the workflow is started" def workflowInstanceId = workflowExecutor.startWorkflow(WORKFLOW_WITH_SYNCHRONOUS_SYSTEM_TASK, 1, correlationId, null, workflowInputPath, null, null) @@ -154,7 +151,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { } when: "poll and complete the 'integration_task_1' with external payload storage" - def taskOutputPath = TASK_OUTPUT_PATH + String taskOutputPath = uploadLargeTaskOutput() def pollAndCompleteLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_1', 'task1.integration.worker', taskOutputPath) then: "verify that the 'integration_task_1' was polled and acknowledged" @@ -167,10 +164,10 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == 'JSON_JQ_TRANSFORM' tasks[1].status == Task.Status.COMPLETED - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[1].outputData['result'] == 104 // output of .tp2.TEST_SAMPLE | length expression from output.json. On assertion failure, check workflow definition and output.json } } @@ -181,7 +178,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { metadataService.getWorkflowDef(CONDITIONAL_SYSTEM_TASK_WORKFLOW, 1) and: "input required to start large payload workflow" - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() def correlationId = "conditional_system_external_storage" when: "the workflow is started" @@ -196,7 +193,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { } when: "poll and complete the 'integration_task_1' with external payload storage" - def taskOutputPath = TASK_OUTPUT_PATH + String taskOutputPath = uploadLargeTaskOutput() def pollAndCompleteLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_1', 'task1.integration.worker', taskOutputPath) then: "verify that the 'integration_task_1' was polled and acknowledged" @@ -209,13 +206,13 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == "DECISION" tasks[1].status == Task.Status.COMPLETED tasks[2].taskType == "USER_TASK" tasks[2].status == Task.Status.SCHEDULED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } when: "the system task 'USER_TASK' is started by issuing a system task call" @@ -230,13 +227,13 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == "DECISION" tasks[1].status == Task.Status.COMPLETED tasks[2].taskType == "USER_TASK" tasks[2].status == Task.Status.COMPLETED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[2].outputData.get("size") == 104 tasks[3].taskType == 'integration_task_3' tasks[3].status == Task.Status.SCHEDULED @@ -254,17 +251,17 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { status == Workflow.WorkflowStatus.COMPLETED tasks.size() == 4 output.isEmpty() - externalOutputPayloadStoragePath == WORKFLOW_OUTPUT_PATH + tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == "DECISION" tasks[1].status == Task.Status.COMPLETED tasks[2].taskType == "USER_TASK" tasks[2].status == Task.Status.COMPLETED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[2].outputData.get("size") == 104 tasks[3].taskType == 'integration_task_3' tasks[3].status == Task.Status.COMPLETED @@ -278,7 +275,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { and: "input required to start large payload workflow" def correlationId = 'fork_join_external_storage' - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() when: "the workflow is started" def workflowInstanceId = workflowExecutor.startWorkflow(FORK_JOIN_WF, 1, correlationId, null, workflowInputPath, null, null) @@ -320,7 +317,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { } when: "the first task of the right fork is polled and completed with external payload storage" - def taskOutputPath = TASK_OUTPUT_PATH + String taskOutputPath = uploadLargeTaskOutput() def polledAndAckLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_2', 'task2.integration.worker', taskOutputPath) then: "verify that the 'integration_task_2' was polled and acknowledged" @@ -359,15 +356,15 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[2].status == Task.Status.COMPLETED tasks[2].taskType == 'integration_task_2' tasks[2].outputData.isEmpty() - tasks[2].externalOutputPayloadStoragePath == taskOutputPath + tasks[3].status == Task.Status.COMPLETED tasks[3].taskType == 'JOIN' tasks[3].outputData.isEmpty() - tasks[3].externalOutputPayloadStoragePath == taskOutputPath + tasks[4].status == Task.Status.COMPLETED tasks[4].taskType == 'integration_task_3' tasks[4].outputData.isEmpty() - tasks[4].externalOutputPayloadStoragePath == taskOutputPath + tasks[5].status == Task.Status.SCHEDULED tasks[5].taskType == 'integration_task_4' } @@ -389,15 +386,15 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[2].status == Task.Status.COMPLETED tasks[2].taskType == 'integration_task_2' tasks[2].outputData.isEmpty() - tasks[2].externalOutputPayloadStoragePath == taskOutputPath + tasks[3].status == Task.Status.COMPLETED tasks[3].taskType == 'JOIN' tasks[3].outputData.isEmpty() - tasks[3].externalOutputPayloadStoragePath == taskOutputPath + tasks[4].status == Task.Status.COMPLETED tasks[4].taskType == 'integration_task_3' tasks[4].outputData.isEmpty() - tasks[4].externalOutputPayloadStoragePath == taskOutputPath + tasks[5].status == Task.Status.COMPLETED tasks[5].taskType == 'integration_task_4' } @@ -409,7 +406,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { metadataService.getWorkflowDef(WORKFLOW_WITH_INLINE_SUB_WF, 1) and: "input required to start large payload workflow" - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() def correlationId = "workflow_with_inline_sub_wf_external_storage" when: "the workflow is started" @@ -424,7 +421,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { } when: "poll and complete the 'integration_task_1' with external payload storage" - def taskOutputPath = TASK_OUTPUT_PATH + String taskOutputPath = uploadLargeTaskOutput() def pollAndCompleteLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_1', 'task1.integration.worker', taskOutputPath) then: "verify that the 'integration_task_1' was polled and acknowledged" @@ -437,11 +434,11 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == TaskType.SUB_WORKFLOW.name() tasks[1].status == Task.Status.SCHEDULED tasks[1].inputData.isEmpty() - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } when: "the subworkflow is started by issuing a system task call" @@ -456,11 +453,11 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == TaskType.SUB_WORKFLOW.name() tasks[1].status == Task.Status.IN_PROGRESS tasks[1].inputData.isEmpty() - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } when: "sub workflow is retrieved" @@ -472,7 +469,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { status == Workflow.WorkflowStatus.RUNNING tasks.size() == 1 input.isEmpty() - externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[0].status == Task.Status.SCHEDULED tasks[0].taskType == 'integration_task_3' } @@ -488,13 +485,13 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { status == Workflow.WorkflowStatus.COMPLETED tasks.size() == 1 input.isEmpty() - externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[0].status == Task.Status.COMPLETED tasks[0].taskType == 'integration_task_3' tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + output.isEmpty() - externalOutputPayloadStoragePath == WORKFLOW_OUTPUT_PATH + } and: "the subworkflow task is completed and the workflow is in running state" @@ -505,17 +502,17 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == TaskType.SUB_WORKFLOW.name() tasks[1].status == Task.Status.COMPLETED tasks[1].inputData.isEmpty() - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[1].outputData.isEmpty() - tasks[1].externalOutputPayloadStoragePath + tasks[2].taskType == 'integration_task_2' tasks[2].status == Task.Status.SCHEDULED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } when: "poll and complete the 'integration_task_2' with external payload storage" @@ -529,23 +526,23 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { status == Workflow.WorkflowStatus.COMPLETED tasks.size() == 3 output.isEmpty() - externalOutputPayloadStoragePath == WORKFLOW_OUTPUT_PATH + tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == TaskType.SUB_WORKFLOW.name() tasks[1].status == Task.Status.COMPLETED tasks[1].inputData.isEmpty() - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[1].outputData.isEmpty() - tasks[1].externalOutputPayloadStoragePath + tasks[2].taskType == 'integration_task_2' tasks[2].status == Task.Status.COMPLETED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[2].outputData.isEmpty() - tasks[2].externalOutputPayloadStoragePath == taskOutputPath + } } @@ -564,7 +561,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { and: "input required to start large payload workflow" def correlationId = 'retry_wf_external_storage' - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() when: "the workflow is started" def workflowInstanceId = workflowExecutor.startWorkflow(LINEAR_WORKFLOW_T1_T2, 1, correlationId, null, workflowInputPath, null, null) @@ -578,7 +575,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { } when: "poll and complete the 'integration_task_1' with external payload storage" - def taskOutputPath = TASK_OUTPUT_PATH + String taskOutputPath = uploadLargeTaskOutput() def pollAndCompleteLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_1', 'task1.integration.worker', taskOutputPath) then: "verify that the 'integration_task_1' was polled and acknowledged" @@ -591,10 +588,10 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == 'integration_task_2' tasks[1].status == Task.Status.SCHEDULED - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } when: "poll and fail the 'integration_task_2'" @@ -610,15 +607,15 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == 'integration_task_2' tasks[1].status == Task.Status.FAILED tasks[1].inputData.isEmpty() - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[2].taskType == 'integration_task_2' tasks[2].status == Task.Status.SCHEDULED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } when: "poll and complete the retried 'integration_task_2'" @@ -632,19 +629,19 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { status == Workflow.WorkflowStatus.COMPLETED tasks.size() == 3 output.isEmpty() - externalOutputPayloadStoragePath == WORKFLOW_OUTPUT_PATH + tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[1].taskType == 'integration_task_2' tasks[1].status == Task.Status.FAILED tasks[1].inputData.isEmpty() - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[2].taskType == 'integration_task_2' tasks[2].status == Task.Status.COMPLETED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + } cleanup: @@ -657,7 +654,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { metadataService.getWorkflowDef(WORKFLOW_WITH_DECISION_AND_TERMINATE, 1) and: "input required to start large payload workflow" - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() def correlationId = "decision_terminate_external_storage" when: "the workflow is started" @@ -673,7 +670,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { } when: "poll and complete the 'integration_task_1' with external payload storage" - def taskOutputPath = TASK_OUTPUT_PATH + String taskOutputPath = uploadLargeTaskOutput() def pollAndCompleteLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_1', 'task1.integration.worker', taskOutputPath) then: "verify that the 'integration_task_1' was polled and acknowledged" @@ -684,12 +681,12 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { status == Workflow.WorkflowStatus.FAILED tasks.size() == 3 output.isEmpty() - externalOutputPayloadStoragePath == WORKFLOW_OUTPUT_PATH + reasonForIncompletion.contains('Workflow is FAILED by TERMINATE task') tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED tasks[0].outputData.isEmpty() - tasks[0].externalOutputPayloadStoragePath == taskOutputPath + tasks[0].seq == 1 tasks[1].taskType == 'DECISION' tasks[1].status == Task.Status.COMPLETED @@ -697,10 +694,9 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[2].taskType == 'TERMINATE' tasks[2].status == Task.Status.COMPLETED tasks[2].inputData.isEmpty() - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[2].seq == 3 tasks[2].outputData.isEmpty() - tasks[2].externalOutputPayloadStoragePath == TASK_OUTPUT_PATH } } @@ -710,7 +706,7 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { and: "input required to start large payload workflow" def correlationId = "dynamic_fork_join_subworkflow_external_storage" - def workflowInputPath = INITIAL_WORKFLOW_INPUT_PATH + String workflowInputPath = uploadInitialWorkflowInput() when: "the workflow is started" def workflowInstanceId = workflowExecutor.startWorkflow(DYNAMIC_FORK_JOIN_WF, 1, correlationId, null, workflowInputPath, null, null) @@ -719,14 +715,15 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { with(workflowExecutionService.getExecutionStatus(workflowInstanceId, true)) { status == Workflow.WorkflowStatus.RUNNING input.isEmpty() - externalInputPayloadStoragePath == workflowInputPath + tasks.size() == 1 tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.SCHEDULED } when: "poll and complete the 'integration_task_1' with external payload storage" - def taskOutputPath = DYNAMIC_FORK_LARGE_PAYLOAD_PATH + String taskOutputPath = "${UUID.randomUUID()}.json" + mockExternalPayloadStorage.upload(taskOutputPath, mockExternalPayloadStorage.curateDynamicForkLargePayload()) def pollAndCompleteLargePayloadTask = workflowTestUtil.pollAndCompleteLargePayloadTask('integration_task_1', 'task1.integration.worker', taskOutputPath) then: "verify that the 'integration_task_1' was polled and acknowledged" @@ -740,18 +737,29 @@ class ExternalPayloadStorageSpec extends AbstractSpecification { tasks[0].taskType == 'integration_task_1' tasks[0].status == Task.Status.COMPLETED !tasks[0].outputData - tasks[0].externalOutputPayloadStoragePath == TASK_OUTPUT_PATH tasks[1].taskType == 'FORK' !tasks[1].inputData - tasks[1].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[1].status == Task.Status.COMPLETED tasks[2].taskType == 'SUB_WORKFLOW' !tasks[2].inputData - tasks[2].externalInputPayloadStoragePath == INPUT_PAYLOAD_PATH + tasks[2].status == Task.Status.SCHEDULED tasks[3].taskType == 'JOIN' tasks[3].status == Task.Status.IN_PROGRESS tasks[3].referenceTaskName == 'dynamicfanouttask_join' } } + + private String uploadLargeTaskOutput() { + String taskOutputPath = "${UUID.randomUUID()}.json" + mockExternalPayloadStorage.upload(taskOutputPath, mockExternalPayloadStorage.readOutputDotJson(), 0) + return taskOutputPath + } + + private String uploadInitialWorkflowInput() { + String workflowInputPath = "${UUID.randomUUID()}.json" + mockExternalPayloadStorage.upload(workflowInputPath, ['param1': 'p1 value', 'param2': 'p2 value', 'case': 'two']) + return workflowInputPath + } } diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/KafkaPublishTaskSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/KafkaPublishTaskSpec.groovy deleted file mode 100644 index fcb860a28..000000000 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/KafkaPublishTaskSpec.groovy +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.test.integration - -import org.springframework.beans.factory.annotation.Autowired - -import com.netflix.conductor.common.metadata.tasks.TaskDef -import com.netflix.conductor.common.metadata.tasks.TaskResult -import com.netflix.conductor.common.metadata.tasks.TaskType -import com.netflix.conductor.common.metadata.workflow.WorkflowDef -import com.netflix.conductor.common.metadata.workflow.WorkflowTask -import com.netflix.conductor.common.run.Workflow -import com.netflix.conductor.test.base.AbstractSpecification - -import com.fasterxml.jackson.databind.ObjectMapper -import spock.lang.Shared - -class KafkaPublishTaskSpec extends AbstractSpecification { - - @Autowired - ObjectMapper objectMapper - - @Shared - def isWorkflowRegistered = false - - def kafkaInput = ['requestDetails': ['key1': 'value1', 'key2': 42], - 'path1' : 'file://path1', - 'path2' : 'file://path2', - 'outputPath' : 's3://bucket/outputPath' - ] - - def expectedTaskInput = "{\"kafka_request\":{\"topic\":\"test_kafka_topic\",\"bootStrapServers\":\"localhost:9092\",\"value\":{\"requestDetails\":{\"key1\":\"value1\",\"key2\":42},\"outputPath\":\"s3://bucket/outputPath\",\"inputPaths\":[\"file://path1\",\"file://path2\"]}}}" - - def setup() { - if (!isWorkflowRegistered) { - registerKafkaWorkflow() - isWorkflowRegistered = true - } - } - - def "Test the kafka template usage failure case"() { - - given: "Start a workflow based on the registered workflow" - def workflowInstanceId = workflowExecutor.startWorkflow("template_kafka_workflow", 1, - "testTaskDefTemplate", kafkaInput, - null, null, null) - - and: "Get the workflow based on the Id that is being executed" - def workflow = workflowExecutionService.getExecutionStatus(workflowInstanceId, true) - def task = workflow.tasks.get(0) - def taskInput = task.inputData - - when: "Ensure that the task is pollable and fail the task" - def polledTask = workflowExecutionService.poll('KAFKA_PUBLISH', 'test') - workflowExecutionService.ackTaskReceived(polledTask.taskId) - def taskResult = new TaskResult(polledTask) - taskResult.status = TaskResult.Status.FAILED - taskResult.reasonForIncompletion = 'NON TRANSIENT ERROR OCCURRED: An integration point required to complete the task is down' - taskResult.addOutputData("TERMINAL_ERROR", "Integration endpoint down: FOOBAR") - taskResult.addOutputData("ErrorMessage", "There was a terminal error") - workflowExecutionService.updateTask(taskResult) - - and: "Then run a decide to move the workflow forward" - workflowExecutor.decide(workflowInstanceId) - - and: "Get the updated workflow after the task result has been updated" - def updatedWorkflow = workflowExecutionService.getExecutionStatus(workflowInstanceId, true) - - then: "Check that the workflow is created and is not terminal" - workflowInstanceId - workflow - !workflow.getStatus().isTerminal() - !workflow.getReasonForIncompletion() - - and: "Check if the input of the next task to be polled is as expected for a kafka task" - taskInput - taskInput.containsKey('kafka_request') - taskInput['kafka_request'] instanceof Map - objectMapper.writeValueAsString(taskInput) == expectedTaskInput - - and: "Polled task is not null and the workflowInstanceId of the task is same as the workflow created initially" - polledTask - polledTask.workflowInstanceId == workflowInstanceId - - and: "The updated workflow is in a failed state" - updatedWorkflow - updatedWorkflow.status == Workflow.WorkflowStatus.FAILED - } - - def "Test the kafka template usage success case"() { - - given: "Start a workflow based on the registered kafka workflow" - def workflowInstanceId = workflowExecutor.startWorkflow("template_kafka_workflow", 1, - "testTaskDefTemplate", kafkaInput, - null, null, null) - - and: "Get the workflow based on the Id that is being executed" - def workflow = workflowExecutionService.getExecutionStatus(workflowInstanceId, true) - def task = workflow.tasks.get(0) - def taskInput = task.inputData - - when: "Ensure that the task is pollable and complete the task" - def polledTask = workflowExecutionService.poll('KAFKA_PUBLISH', 'test') - workflowExecutionService.ackTaskReceived(polledTask.taskId) - def taskResult = new TaskResult(polledTask) - taskResult.setStatus(TaskResult.Status.COMPLETED) - workflowExecutionService.updateTask(taskResult) - - and: "Then run a decide to move the workflow forward" - workflowExecutor.decide(workflowInstanceId) - - and: "Get the updated workflow after the task result has been updated" - def updatedWorkflow = workflowExecutionService.getExecutionStatus(workflowInstanceId, true) - - then: "Check that the workflow is created and is not terminal" - workflowInstanceId - workflow - !workflow.getStatus().isTerminal() - !workflow.getReasonForIncompletion() - - and: "Check if the input of the next task to be polled is as expected for a kafka task" - taskInput - taskInput.containsKey('kafka_request') - taskInput['kafka_request'] instanceof Map - objectMapper.writeValueAsString(taskInput) == expectedTaskInput - - and: "Polled task is not null and the workflowInstanceId of the task is same as the workflow created initially" - polledTask - polledTask.workflowInstanceId == workflowInstanceId - - and: "The updated workflow is complete" - updatedWorkflow - updatedWorkflow.status == Workflow.WorkflowStatus.COMPLETED - - } - - def registerKafkaWorkflow() { - System.setProperty("STACK_KAFKA", "test_kafka_topic") - TaskDef templatedTask = new TaskDef() - templatedTask.name = "templated_kafka_task" - templatedTask.retryCount = 0 - templatedTask.ownerEmail = "test@harness.com" - - def kafkaRequest = new HashMap<>() - kafkaRequest["topic"] = '${STACK_KAFKA}' - kafkaRequest["bootStrapServers"] = "localhost:9092" - - def value = new HashMap<>() - value["inputPaths"] = ['${workflow.input.path1}', '${workflow.input.path2}'] - value["requestDetails"] = '${workflow.input.requestDetails}' - value["outputPath"] = '${workflow.input.outputPath}' - kafkaRequest["value"] = value - - templatedTask.inputTemplate["kafka_request"] = kafkaRequest - metadataService.registerTaskDef([templatedTask]) - - WorkflowDef templateWf = new WorkflowDef() - templateWf.name = "template_kafka_workflow" - WorkflowTask wft = new WorkflowTask() - wft.name = templatedTask.name - wft.workflowTaskType = TaskType.KAFKA_PUBLISH - wft.taskReferenceName = "t0" - templateWf.tasks.add(wft) - templateWf.schemaVersion = 2 - templateWf.ownerEmail = "test@harness.com" - metadataService.registerWorkflowDef(templateWf) - } -} diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/SimpleWorkflowSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/SimpleWorkflowSpec.groovy index 943cd3f4e..7dfe4d5b7 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/SimpleWorkflowSpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/SimpleWorkflowSpec.groovy @@ -247,13 +247,11 @@ class SimpleWorkflowSpec extends AbstractSpecification { when: "Poll for a 'task_rt' task and then ack the task" def polledTaskRtTry1 = workflowExecutionService.poll('task_rt', 'task1.integration.worker.testTimeout') - def received = workflowExecutionService.ackTaskReceived(polledTaskRtTry1.taskId) then: "Verify that the 'task_rt' was polled" polledTaskRtTry1 polledTaskRtTry1.taskType == 'task_rt' polledTaskRtTry1.workflowInstanceId == workflowInstanceId - received polledTaskRtTry1.status == Task.Status.IN_PROGRESS when: "An additional poll is done wto retrieved another 'task_rt'" @@ -556,14 +554,12 @@ class SimpleWorkflowSpec extends AbstractSpecification { when: "Poll for the first task and complete the task" def polledIntegrationTask1 = workflowExecutionService.poll('integration_task_1', 'task1.integration.worker') - def ackPolledIntegrationTask1 = workflowExecutionService.ackTaskReceived(polledIntegrationTask1.taskId) polledIntegrationTask1.status = Task.Status.COMPLETED def polledIntegrationTask1Output = "task1.output -> " + polledIntegrationTask1.inputData['p1'] + "." + polledIntegrationTask1.inputData['p2'] polledIntegrationTask1.outputData['op'] = polledIntegrationTask1Output workflowExecutionService.updateTask(new TaskResult(polledIntegrationTask1)) then: "verify that the 'integration_task_1' is polled and completed" - ackPolledIntegrationTask1 with(polledIntegrationTask1) { inputData.containsKey('p1') inputData.containsKey('p2') @@ -731,7 +727,6 @@ class SimpleWorkflowSpec extends AbstractSpecification { when: "the first task 'integration_task_1' is polled and then sent back with a callBack seconds" def pollTaskTry1 = workflowExecutionService.poll('integration_task_1', 'task1.integration.worker') - def ackReceivedTaskTry1 = workflowExecutionService.ackTaskReceived(pollTaskTry1) pollTaskTry1.outputData['op'] = 'task1.in.progress' pollTaskTry1.callbackAfterSeconds = 5 pollTaskTry1.status = Task.Status.IN_PROGRESS @@ -739,7 +734,6 @@ class SimpleWorkflowSpec extends AbstractSpecification { then: "verify that the task is polled and acknowledged" pollTaskTry1 - ackReceivedTaskTry1 and: "the input data of the data is as expected" pollTaskTry1.inputData.containsKey('p1') @@ -813,7 +807,6 @@ class SimpleWorkflowSpec extends AbstractSpecification { when: "the first task 'integration_task_1' is polled and then sent back with a callBack seconds" def pollTaskTry1 = workflowExecutionService.poll('integration_task_1', 'task1.integration.worker') - def ackReceivedTaskTry1 = workflowExecutionService.ackTaskReceived(pollTaskTry1) pollTaskTry1.outputData['op'] = 'task1.in.progress' pollTaskTry1.callbackAfterSeconds = 3600 pollTaskTry1.status = Task.Status.IN_PROGRESS @@ -821,7 +814,6 @@ class SimpleWorkflowSpec extends AbstractSpecification { then: "verify that the task is polled and acknowledged" pollTaskTry1 - ackReceivedTaskTry1 and: "the input data of the data is as expected" pollTaskTry1.inputData.containsKey('p1') diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/StartWorkflowSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/StartWorkflowSpec.groovy index 6686804db..e216d07bb 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/StartWorkflowSpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/StartWorkflowSpec.groovy @@ -13,12 +13,15 @@ package com.netflix.conductor.test.integration import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Value +import org.springframework.core.io.ClassPathResource import com.netflix.conductor.common.metadata.tasks.Task import com.netflix.conductor.common.run.Workflow import com.netflix.conductor.core.execution.tasks.StartWorkflow import com.netflix.conductor.dao.QueueDAO import com.netflix.conductor.test.base.AbstractSpecification +import com.netflix.conductor.test.utils.MockExternalPayloadStorage import spock.lang.Shared import spock.lang.Unroll @@ -31,12 +34,18 @@ class StartWorkflowSpec extends AbstractSpecification { @Autowired StartWorkflow startWorkflowTask + @Autowired + MockExternalPayloadStorage mockExternalPayloadStorage + @Shared def WORKFLOW_THAT_STARTS_ANOTHER_WORKFLOW = 'workflow_that_starts_another_workflow' + static String workflowInputPath = "${UUID.randomUUID()}.json" + def setup() { workflowTestUtil.registerWorkflows('workflow_that_starts_another_workflow.json', 'simple_workflow_1_integration_test.json') + mockExternalPayloadStorage.upload(workflowInputPath, StartWorkflowSpec.class.getResourceAsStream("/start_workflow_input.json"), 0) } @Unroll @@ -151,7 +160,7 @@ class StartWorkflowSpec extends AbstractSpecification { * Builds a TestCase for a StartWorkflowRequest with a workflow name and input in external payload storage. */ static workflowRequestWithExternalPayloadStorage() { - new TestCase(name: 'name and version with external input', workflowInputPath: '/start_workflow_input.json') + new TestCase(name: 'name and version with external input', workflowInputPath: workflowInputPath) } static class TestCase { diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/TaskLimitsWorkflowSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/TaskLimitsWorkflowSpec.groovy index 57e7ebc28..3b78c392f 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/TaskLimitsWorkflowSpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/TaskLimitsWorkflowSpec.groovy @@ -176,12 +176,10 @@ class TaskLimitsWorkflowSpec extends AbstractSpecification { when: "The task is polled and acknowledged" def polledTask1 = workflowExecutionService.poll('test_task_with_concurrency_limit', 'test_task_worker') - def ackPolledTask1 = workflowExecutionService.ackTaskReceived(polledTask1.taskId) then: "Verify that the task was polled and acknowledged" polledTask1.taskType == 'test_task_with_concurrency_limit' polledTask1.workflowInstanceId == workflowInstanceId - ackPolledTask1 when: "A additional workflow that has a concurrency execution limited task in it" def workflowTwoInstanceId = workflowExecutor.startWorkflow(CONCURRENCY_EXECUTION_LIMITED_WORKFLOW, 1, @@ -219,11 +217,9 @@ class TaskLimitsWorkflowSpec extends AbstractSpecification { and: "The task is polled again and acknowledged" def polledTaskTry2 = workflowExecutionService.poll('test_task_with_concurrency_limit', 'test_task_worker') - def ackPolledTaskTry2 = workflowExecutionService.ackTaskReceived(polledTaskTry2.taskId) then: "Verify that the task is returned since there are no tasks in progress" polledTaskTry2.taskType == 'test_task_with_concurrency_limit' polledTaskTry2.workflowInstanceId == workflowTwoInstanceId - ackPolledTaskTry2 } } diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/WorkflowAndTaskConfigurationSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/WorkflowAndTaskConfigurationSpec.groovy index d0dd8be3e..f7d0df3f9 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/WorkflowAndTaskConfigurationSpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/WorkflowAndTaskConfigurationSpec.groovy @@ -194,12 +194,10 @@ class WorkflowAndTaskConfigurationSpec extends AbstractSpecification { when: "The the first task 'integration_task_1' is polled and acknowledged" def task1Try1 = workflowExecutionService.poll('integration_task_1', 'task1.worker') - def task1Try1Acknowledgment = workflowExecutionService.ackTaskReceived(task1Try1) then: "Ensure that a task was polled" task1Try1 task1Try1.workflowInstanceId == workflowInstanceId - task1Try1Acknowledgment and: "Ensure that the decider size queue is 1 to to enable the evaluation" queueDAO.getSize(Utils.DECIDER_QUEUE) == 1 @@ -220,12 +218,10 @@ class WorkflowAndTaskConfigurationSpec extends AbstractSpecification { when: "Poll for the task again and acknowledge" def task1Try2 = workflowExecutionService.poll('integration_task_1', 'task1.worker') - def task1Try2Acknowledgment = workflowExecutionService.ackTaskReceived(task1Try2) then: "Ensure that a task was polled" task1Try2 task1Try2.workflowInstanceId == workflowInstanceId - task1Try2Acknowledgment when: "There is a delay of 3 seconds introduced and the workflow is swept to run the evaluation" Thread.sleep(3000) @@ -274,12 +270,10 @@ class WorkflowAndTaskConfigurationSpec extends AbstractSpecification { when: "The the first task 'integration_task_1' is polled and acknowledged" def task1Try1 = workflowExecutionService.poll('integration_task_1', 'task1.worker') - def task1Try1Acknowledgment = workflowExecutionService.ackTaskReceived(task1Try1) then: "Ensure that a task was polled" task1Try1 task1Try1.workflowInstanceId == workflowInstanceId - task1Try1Acknowledgment when: "There is a delay of 6 seconds introduced and the workflow is swept to run the evaluation" Thread.sleep(6000) @@ -326,12 +320,10 @@ class WorkflowAndTaskConfigurationSpec extends AbstractSpecification { when: "The the first task 'integration_task_1' is polled and acknowledged" def task1Try1 = workflowExecutionService.poll('integration_task_1', 'task1.worker') - def task1Try1Acknowledgment = workflowExecutionService.ackTaskReceived(task1Try1) then: "Ensure that a task was polled" task1Try1 task1Try1.workflowInstanceId == workflowInstanceId - task1Try1Acknowledgment when: "There is a delay of 6 seconds introduced and the workflow is swept to run the evaluation" Thread.sleep(6000) @@ -393,12 +385,10 @@ class WorkflowAndTaskConfigurationSpec extends AbstractSpecification { when: "The the first task 'integration_task_1' is polled and acknowledged" def task1 = workflowExecutionService.poll('integration_task_1', 'task1.worker') - def task1Ack = workflowExecutionService.ackTaskReceived(task1) then: "Ensure that a task was polled" task1 task1.workflowInstanceId == workflowInstanceId - task1Ack when: "There is a delay of 6 seconds introduced and the task is completed" Thread.sleep(6000) diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/resiliency/QueueResiliencySpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/resiliency/QueueResiliencySpec.groovy index 719db6c07..1a04b59b6 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/resiliency/QueueResiliencySpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/resiliency/QueueResiliencySpec.groovy @@ -479,7 +479,7 @@ class QueueResiliencySpec extends AbstractResiliencySpecification { def result = taskResource.updateTask(taskResult) then: "updateTask fails with an exception" - 2 * queueDAO.postpone(*_) >> { throw new IllegalStateException("Queue postpone failed from Spy") } + 1 * queueDAO.postpone(*_) >> { throw new IllegalStateException("Queue postpone failed from Spy") } thrown(Exception) } diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/util/WorkflowTestUtil.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/util/WorkflowTestUtil.groovy index 586f3b99e..4ba25b476 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/util/WorkflowTestUtil.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/util/WorkflowTestUtil.groovy @@ -240,7 +240,6 @@ class WorkflowTestUtil { */ Tuple pollAndFailTask(String taskName, String workerId, String failureReason, Map outputParams = null, int waitAtEndSeconds = 0) { def polledIntegrationTask = workflowExecutionService.poll(taskName, workerId) - def ackPolledIntegrationTask = workflowExecutionService.ackTaskReceived(polledIntegrationTask.taskId) def taskResult = new TaskResult(polledIntegrationTask) taskResult.status = TaskResult.Status.FAILED taskResult.reasonForIncompletion = failureReason @@ -250,7 +249,7 @@ class WorkflowTestUtil { } } workflowExecutionService.updateTask(taskResult) - return waitAtEndSecondsAndReturn(waitAtEndSeconds, polledIntegrationTask, ackPolledIntegrationTask) + return waitAtEndSecondsAndReturn(waitAtEndSeconds, polledIntegrationTask) } /** @@ -258,14 +257,13 @@ class WorkflowTestUtil { * into a tuple. This method is intended to be used by pollAndFailTask and pollAndCompleteTask * @param waitAtEndSeconds The total seconds of delay before the method returns * @param ackedTaskResult the task result created after ack - * @param ackPolledIntegrationTask a acknowledgement of a poll * @return A Tuple of polledTask and acknowledgement of the poll */ - static Tuple waitAtEndSecondsAndReturn(int waitAtEndSeconds, Task polledIntegrationTask, boolean ackPolledIntegrationTask) { + static Tuple waitAtEndSecondsAndReturn(int waitAtEndSeconds, Task polledIntegrationTask) { if (waitAtEndSeconds > 0) { Thread.sleep(waitAtEndSeconds * 1000) } - return new Tuple(polledIntegrationTask, ackPolledIntegrationTask) + return new Tuple(polledIntegrationTask) } /** @@ -283,7 +281,6 @@ class WorkflowTestUtil { if (polledIntegrationTask == null) { return new Tuple(null, null) } - def ackPolledIntegrationTask = workflowExecutionService.ackTaskReceived(polledIntegrationTask.taskId) def taskResult = new TaskResult(polledIntegrationTask) taskResult.status = TaskResult.Status.COMPLETED if (outputParams) { @@ -292,18 +289,17 @@ class WorkflowTestUtil { } } workflowExecutionService.updateTask(taskResult) - return waitAtEndSecondsAndReturn(waitAtEndSeconds, polledIntegrationTask, ackPolledIntegrationTask) + return waitAtEndSecondsAndReturn(waitAtEndSeconds, polledIntegrationTask) } Tuple pollAndCompleteLargePayloadTask(String taskName, String workerId, String outputPayloadPath) { def polledIntegrationTask = workflowExecutionService.poll(taskName, workerId) - def ackPolledIntegrationTask = workflowExecutionService.ackTaskReceived(polledIntegrationTask.taskId) def taskResult = new TaskResult(polledIntegrationTask) taskResult.status = TaskResult.Status.COMPLETED taskResult.outputData = null taskResult.externalOutputPayloadStoragePath = outputPayloadPath workflowExecutionService.updateTask(taskResult) - return new Tuple(polledIntegrationTask, ackPolledIntegrationTask) + return new Tuple(polledIntegrationTask) } /** @@ -315,9 +311,7 @@ class WorkflowTestUtil { static void verifyPolledAndAcknowledgedTask(Tuple completedTaskAndAck, Map expectedTaskInputParams = null) { assert completedTaskAndAck[0]: "The task polled cannot be null" def polledIntegrationTask = completedTaskAndAck[0] as Task - def ackPolledIntegrationTask = completedTaskAndAck[1] as boolean assert polledIntegrationTask - assert ackPolledIntegrationTask if (expectedTaskInputParams) { expectedTaskInputParams.forEach { k, v -> @@ -330,8 +324,6 @@ class WorkflowTestUtil { static void verifyPolledAndAcknowledgedLargePayloadTask(Tuple completedTaskAndAck) { assert completedTaskAndAck[0]: "The task polled cannot be null" def polledIntegrationTask = completedTaskAndAck[0] as Task - def ackPolledIntegrationTask = completedTaskAndAck[1] as boolean assert polledIntegrationTask - assert ackPolledIntegrationTask } } diff --git a/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/GrpcEndToEndTest.java b/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/GrpcEndToEndTest.java index 5041524ea..0353cd048 100644 --- a/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/GrpcEndToEndTest.java +++ b/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/GrpcEndToEndTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at diff --git a/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/mysql/MySQLGrpcEndToEndTest.java b/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/mysql/MySQLGrpcEndToEndTest.java deleted file mode 100644 index 23d385406..000000000 --- a/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/mysql/MySQLGrpcEndToEndTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.test.integration.grpc.mysql; - -import org.junit.Before; -import org.junit.runner.RunWith; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.client.grpc.EventClient; -import com.netflix.conductor.client.grpc.MetadataClient; -import com.netflix.conductor.client.grpc.TaskClient; -import com.netflix.conductor.client.grpc.WorkflowClient; -import com.netflix.conductor.test.integration.grpc.AbstractGrpcEndToEndTest; - -@RunWith(SpringRunner.class) -@TestPropertySource( - properties = { - "conductor.db.type=mysql", - "conductor.grpc-server.port=8094", - "spring.datasource.url=jdbc:tc:mysql:///conductor", // "tc" prefix starts the MySql - // container - "spring.datasource.username=root", - "spring.datasource.password=root", - "spring.datasource.hikari.maximum-pool-size=8", - "spring.datasource.hikari.minimum-idle=300000" - }) -public class MySQLGrpcEndToEndTest extends AbstractGrpcEndToEndTest { - - @Before - public void init() { - taskClient = new TaskClient("localhost", 8094); - workflowClient = new WorkflowClient("localhost", 8094); - metadataClient = new MetadataClient("localhost", 8094); - eventClient = new EventClient("localhost", 8094); - } -} diff --git a/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/postgres/PostgresGrpcEndToEndTest.java b/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/postgres/PostgresGrpcEndToEndTest.java deleted file mode 100644 index 108cf09a8..000000000 --- a/test-harness/src/test/java/com/netflix/conductor/test/integration/grpc/postgres/PostgresGrpcEndToEndTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.test.integration.grpc.postgres; - -import org.junit.Before; -import org.junit.runner.RunWith; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.client.grpc.EventClient; -import com.netflix.conductor.client.grpc.MetadataClient; -import com.netflix.conductor.client.grpc.TaskClient; -import com.netflix.conductor.client.grpc.WorkflowClient; -import com.netflix.conductor.test.integration.grpc.AbstractGrpcEndToEndTest; - -@RunWith(SpringRunner.class) -@TestPropertySource( - properties = { - "conductor.db.type=postgres", - "conductor.grpc-server.port=8098", - "spring.datasource.url=jdbc:tc:postgresql:///conductor", // "tc" prefix starts the - // Postgres container - "spring.datasource.username=postgres", - "spring.datasource.password=postgres", - "spring.datasource.hikari.maximum-pool-size=8", - "spring.datasource.hikari.minimum-idle=300000" - }) -public class PostgresGrpcEndToEndTest extends AbstractGrpcEndToEndTest { - - @Before - public void init() { - taskClient = new TaskClient("localhost", 8098); - workflowClient = new WorkflowClient("localhost", 8098); - metadataClient = new MetadataClient("localhost", 8098); - eventClient = new EventClient("localhost", 8098); - } -} diff --git a/test-harness/src/test/java/com/netflix/conductor/test/integration/http/HttpEndToEndTest.java b/test-harness/src/test/java/com/netflix/conductor/test/integration/http/HttpEndToEndTest.java index 96745a14f..0dded2cdd 100644 --- a/test-harness/src/test/java/com/netflix/conductor/test/integration/http/HttpEndToEndTest.java +++ b/test-harness/src/test/java/com/netflix/conductor/test/integration/http/HttpEndToEndTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 Netflix, Inc. + * Copyright 2022 Netflix, Inc. *

* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at diff --git a/test-harness/src/test/java/com/netflix/conductor/test/listener/WorkflowStatusPublisherIntegrationTest.java b/test-harness/src/test/java/com/netflix/conductor/test/listener/WorkflowStatusPublisherIntegrationTest.java deleted file mode 100644 index 30e8516e3..000000000 --- a/test-harness/src/test/java/com/netflix/conductor/test/listener/WorkflowStatusPublisherIntegrationTest.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright 2022 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.test.listener; - -import java.io.IOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringRunner; - -import com.netflix.conductor.common.metadata.tasks.Task; -import com.netflix.conductor.common.metadata.tasks.TaskDef; -import com.netflix.conductor.common.metadata.tasks.TaskResult; -import com.netflix.conductor.common.metadata.workflow.WorkflowDef; -import com.netflix.conductor.common.metadata.workflow.WorkflowTask; -import com.netflix.conductor.common.run.Workflow; -import com.netflix.conductor.common.run.WorkflowSummary; -import com.netflix.conductor.core.events.queue.Message; -import com.netflix.conductor.core.execution.WorkflowExecutor; -import com.netflix.conductor.dao.QueueDAO; -import com.netflix.conductor.model.WorkflowModel; -import com.netflix.conductor.service.ExecutionService; -import com.netflix.conductor.service.MetadataService; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import static com.netflix.conductor.common.metadata.tasks.Task.Status.COMPLETED; - -import static org.junit.Assert.assertEquals; - -@RunWith(SpringRunner.class) -@SpringBootTest( - properties = { - "conductor.workflow-status-listener.type=queue_publisher", - "conductor.workflow-status-listener.queue-publisher.successQueue=dummy", - "conductor.workflow-status-listener.queue-publisher.failureQueue=dummy", - "conductor.workflow-status-listener.queue-publisher.finalizeQueue=final" - }) -@TestPropertySource(locations = "classpath:application-integrationtest.properties") -public class WorkflowStatusPublisherIntegrationTest { - - private final String CALLBACK_QUEUE = "dummy"; - private final String FINALIZED_QUEUE = "final"; - private static final String LINEAR_WORKFLOW_T1_T2 = "junit_test_wf"; - private static final int WORKFLOW_VERSION = 1; - private static final String INCOMPLETION_REASON = "test reason"; - private static final String DEFAULT_OWNER_EMAIL = "test@harness.com"; - - @Autowired private ObjectMapper objectMapper; - - @Autowired QueueDAO queueDAO; - - @Autowired protected MetadataService metadataService; - - @Autowired protected ExecutionService workflowExecutionService; - - @Autowired protected WorkflowExecutor workflowExecutor; - - @Before - public void setUp() { - TaskDef taskDef = new TaskDef(); - taskDef.setName("junit_task_1"); - taskDef.setTimeoutSeconds(120); - taskDef.setResponseTimeoutSeconds(120); - taskDef.setRetryCount(1); - taskDef.setOwnerEmail(DEFAULT_OWNER_EMAIL); - metadataService.registerTaskDef(Collections.singletonList(taskDef)); - } - - @After - public void cleanUp() { - List workflows = - metadataService.getWorkflowDefs().stream() - .map(WorkflowDef::getName) - .collect(Collectors.toList()); - for (String wfName : workflows) { - List running = - workflowExecutionService.getRunningWorkflows(wfName, WORKFLOW_VERSION); - for (String wfid : running) { - workflowExecutor.terminateWorkflow(wfid, "cleanup"); - } - } - queueDAO.queuesDetail().keySet().forEach(queueDAO::flush); - } - - @Test - public void testListenerOnTerminatedWorkflow() throws IOException { - String id = - startOrLoadWorkflowExecution( - LINEAR_WORKFLOW_T1_T2, - 1, - "testWorkflowTerminatedListener", - new HashMap<>()); - workflowExecutor.terminateWorkflow(id, INCOMPLETION_REASON); - - List callbackMessages = queueDAO.pollMessages(CALLBACK_QUEUE, 1, 200); - queueDAO.ack(CALLBACK_QUEUE, callbackMessages.get(0).getId()); - - WorkflowSummary payload = - objectMapper.readValue(callbackMessages.get(0).getPayload(), WorkflowSummary.class); - assertEquals(id, callbackMessages.get(0).getId()); - assertEquals(LINEAR_WORKFLOW_T1_T2, payload.getWorkflowType()); - assertEquals("testWorkflowTerminatedListener", payload.getCorrelationId()); - assertEquals(Workflow.WorkflowStatus.TERMINATED, payload.getStatus()); - assertEquals(INCOMPLETION_REASON, payload.getReasonForIncompletion()); - - // check finalized queue - callbackMessages = queueDAO.pollMessages(FINALIZED_QUEUE, 1, 200); - queueDAO.ack(CALLBACK_QUEUE, callbackMessages.get(0).getId()); - - payload = - objectMapper.readValue(callbackMessages.get(0).getPayload(), WorkflowSummary.class); - assertEquals(id, callbackMessages.get(0).getId()); - assertEquals(LINEAR_WORKFLOW_T1_T2, payload.getWorkflowType()); - assertEquals("testWorkflowTerminatedListener", payload.getCorrelationId()); - assertEquals(Workflow.WorkflowStatus.TERMINATED, payload.getStatus()); - assertEquals(INCOMPLETION_REASON, payload.getReasonForIncompletion()); - } - - @Test - public void testListenerOnCompletedWorkflow() throws IOException, InterruptedException { - WorkflowDef workflowDef = new WorkflowDef(); - workflowDef.setName(LINEAR_WORKFLOW_T1_T2); - workflowDef.setDescription(workflowDef.getName()); - workflowDef.setVersion(WORKFLOW_VERSION); - workflowDef.setSchemaVersion(2); - workflowDef.setOwnerEmail(DEFAULT_OWNER_EMAIL); - workflowDef.setWorkflowStatusListenerEnabled(true); - LinkedList wftasks = new LinkedList<>(); - - WorkflowTask wft1 = new WorkflowTask(); - wft1.setName("junit_task_1"); - wft1.setTaskReferenceName("t1"); - - wftasks.add(wft1); - workflowDef.setTasks(wftasks); - - metadataService.updateWorkflowDef(Collections.singletonList(workflowDef)); - - String id = - startOrLoadWorkflowExecution( - workflowDef.getName(), 1, "testWorkflowCompletedListener", new HashMap<>()); - - List tasks = workflowExecutionService.getTasks("junit_task_1", null, 1); - tasks.get(0).setStatus(COMPLETED); - workflowExecutionService.updateTask(new TaskResult(tasks.get(0))); - - checkIfWorkflowIsCompleted(id); - - List callbackMessages = queueDAO.pollMessages(CALLBACK_QUEUE, 1, 200); - queueDAO.ack(CALLBACK_QUEUE, callbackMessages.get(0).getId()); - - WorkflowSummary payload = - objectMapper.readValue(callbackMessages.get(0).getPayload(), WorkflowSummary.class); - assertEquals(id, callbackMessages.get(0).getId()); - assertEquals(LINEAR_WORKFLOW_T1_T2, payload.getWorkflowType()); - assertEquals("testWorkflowCompletedListener", payload.getCorrelationId()); - assertEquals(Workflow.WorkflowStatus.COMPLETED, payload.getStatus()); - - // check finalized queue - callbackMessages = queueDAO.pollMessages(FINALIZED_QUEUE, 1, 200); - queueDAO.ack(CALLBACK_QUEUE, callbackMessages.get(0).getId()); - - payload = - objectMapper.readValue(callbackMessages.get(0).getPayload(), WorkflowSummary.class); - assertEquals(id, callbackMessages.get(0).getId()); - assertEquals(LINEAR_WORKFLOW_T1_T2, payload.getWorkflowType()); - assertEquals("testWorkflowCompletedListener", payload.getCorrelationId()); - assertEquals(Workflow.WorkflowStatus.COMPLETED, payload.getStatus()); - } - - @SuppressWarnings("BusyWait") - private void checkIfWorkflowIsCompleted(String id) throws InterruptedException { - int statusRetrieveAttempts = 0; - while (workflowExecutor.getWorkflow(id, false).getStatus() - != WorkflowModel.Status.COMPLETED) { - if (statusRetrieveAttempts > 5) { - break; - } - Thread.sleep(100); - statusRetrieveAttempts++; - } - } - - private String startOrLoadWorkflowExecution( - String workflowName, int version, String correlationId, Map input) { - return workflowExecutor.startWorkflow(workflowName, version, correlationId, input, null); - } -} diff --git a/test-harness/src/test/java/com/netflix/conductor/test/utils/MockExternalPayloadStorage.java b/test-harness/src/test/java/com/netflix/conductor/test/utils/MockExternalPayloadStorage.java index 3abd58917..2351f2e51 100644 --- a/test-harness/src/test/java/com/netflix/conductor/test/utils/MockExternalPayloadStorage.java +++ b/test-harness/src/test/java/com/netflix/conductor/test/utils/MockExternalPayloadStorage.java @@ -13,18 +13,20 @@ package com.netflix.conductor.test.utils; import java.io.*; -import java.net.URL; +import java.nio.file.Files; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.UUID; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; -import com.netflix.conductor.common.metadata.tasks.TaskType; import com.netflix.conductor.common.metadata.workflow.SubWorkflowParams; import com.netflix.conductor.common.metadata.workflow.WorkflowDef; import com.netflix.conductor.common.metadata.workflow.WorkflowTask; @@ -33,72 +35,58 @@ import com.fasterxml.jackson.databind.ObjectMapper; +import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_SIMPLE; +import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_SUB_WORKFLOW; + +/** A {@link ExternalPayloadStorage} implementation that stores payload in file. */ @ConditionalOnProperty(name = "conductor.external-payload-storage.type", havingValue = "mock") @Component public class MockExternalPayloadStorage implements ExternalPayloadStorage { private static final Logger LOGGER = LoggerFactory.getLogger(MockExternalPayloadStorage.class); - public static final String INPUT_PAYLOAD_PATH = "payload/input"; - - public static final String INITIAL_WORKFLOW_INPUT_PATH = "workflow/input"; - public static final String WORKFLOW_OUTPUT_PATH = "workflow/output"; - public static final String TASK_OUTPUT_PATH = "task/output"; - public static final String DYNAMIC_FORK_LARGE_PAYLOAD_PATH = "dynamic_fork_large_payload"; - - public static final String TEMP_FILE_PATH = "/input.json"; - private final ObjectMapper objectMapper; + private final File payloadDir; @Autowired - public MockExternalPayloadStorage(ObjectMapper objectMapper) { + public MockExternalPayloadStorage(ObjectMapper objectMapper) throws IOException { this.objectMapper = objectMapper; - LOGGER.info("Initialized {}", this.getClass().getCanonicalName()); + this.payloadDir = Files.createTempDirectory("payloads").toFile(); + LOGGER.info( + "{} initialized in directory: {}", + this.getClass().getSimpleName(), + payloadDir.getAbsolutePath()); } @Override public ExternalStorageLocation getLocation( Operation operation, PayloadType payloadType, String path) { ExternalStorageLocation location = new ExternalStorageLocation(); - location.setUri("http://some/uri"); - switch (payloadType) { - case TASK_INPUT: - case WORKFLOW_INPUT: - location.setPath(INPUT_PAYLOAD_PATH); - break; - case WORKFLOW_OUTPUT: - location.setPath(WORKFLOW_OUTPUT_PATH); - break; - case TASK_OUTPUT: - location.setPath(TASK_OUTPUT_PATH); - break; - } + location.setPath(UUID.randomUUID() + ".json"); return location; } @Override public void upload(String path, InputStream payload, long payloadSize) { + File file = new File(payloadDir, path); + String filePath = file.getAbsolutePath(); try { - URL filePathURL = MockExternalPayloadStorage.class.getResource(TEMP_FILE_PATH); - File file = new File(filePathURL.toURI()); - try (FileOutputStream outputStream = new FileOutputStream(file)) { - int read; - byte[] bytes = new byte[1024]; - while ((read = payload.read(bytes)) != -1) { - outputStream.write(bytes, 0, read); - } - outputStream.flush(); + if (!file.exists() && file.createNewFile()) { + LOGGER.debug("Created file: {}", filePath); } - } catch (Exception e) { + IOUtils.copy(payload, new FileOutputStream(file)); + LOGGER.debug("Written to {}", filePath); + } catch (IOException e) { // just handle this exception here and return empty map so that test will fail in case // this exception is thrown + LOGGER.error("Error writing to {}", filePath); } finally { try { if (payload != null) { payload.close(); } } catch (IOException e) { - LOGGER.warn("Unable to close inputstream when writing to file"); + LOGGER.warn("Unable to close input stream when writing to file"); } } } @@ -106,58 +94,38 @@ public void upload(String path, InputStream payload, long payloadSize) { @Override public InputStream download(String path) { try { - Map payload = getPayload(path); - String jsonString = objectMapper.writeValueAsString(payload); - return new ByteArrayInputStream(jsonString.getBytes()); + LOGGER.debug("Reading from {}", path); + return new FileInputStream(new File(payloadDir, path)); } catch (IOException e) { + LOGGER.error("Error reading {}", path, e); return null; } } - @SuppressWarnings("unchecked") - private Map getPayload(String path) { - Map stringObjectMap = new HashMap<>(); + public void upload(String path, Map payload) { try { - switch (path) { - case INITIAL_WORKFLOW_INPUT_PATH: - stringObjectMap.put("param1", "p1 value"); - stringObjectMap.put("param2", "p2 value"); - stringObjectMap.put("case", "two"); - return stringObjectMap; - case TASK_OUTPUT_PATH: - InputStream opStream = - MockExternalPayloadStorage.class.getResourceAsStream("/output.json"); - return objectMapper.readValue(opStream, Map.class); - case INPUT_PAYLOAD_PATH: - case WORKFLOW_OUTPUT_PATH: - InputStream ipStream = - MockExternalPayloadStorage.class.getResourceAsStream(TEMP_FILE_PATH); - return objectMapper.readValue(ipStream, Map.class); - case DYNAMIC_FORK_LARGE_PAYLOAD_PATH: - return curateDynamicForkLargePayload(); - default: - return objectMapper.readValue( - MockExternalPayloadStorage.class.getResourceAsStream(path), Map.class); - } + InputStream bais = new ByteArrayInputStream(objectMapper.writeValueAsBytes(payload)); + upload(path, bais, 0); } catch (IOException e) { - // just handle this exception here and return empty map so that test will fail in case - // this exception is thrown + LOGGER.error("Error serializing map to json", e); } - return stringObjectMap; + } + + public InputStream readOutputDotJson() { + return MockExternalPayloadStorage.class.getResourceAsStream("/output.json"); } @SuppressWarnings("unchecked") - private Map curateDynamicForkLargePayload() { + public Map curateDynamicForkLargePayload() { Map dynamicForkLargePayload = new HashMap<>(); try { - InputStream inputStream = - MockExternalPayloadStorage.class.getResourceAsStream("/output.json"); + InputStream inputStream = readOutputDotJson(); Map largePayload = objectMapper.readValue(inputStream, Map.class); WorkflowTask simpleWorkflowTask = new WorkflowTask(); simpleWorkflowTask.setName("integration_task_10"); simpleWorkflowTask.setTaskReferenceName("t10"); - simpleWorkflowTask.setType(TaskType.SIMPLE.name()); + simpleWorkflowTask.setType(TASK_TYPE_SIMPLE); simpleWorkflowTask.setInputParameters( Collections.singletonMap("p1", "${workflow.input.imageType}")); @@ -173,15 +141,14 @@ private Map curateDynamicForkLargePayload() { WorkflowTask subWorkflowTask = new WorkflowTask(); subWorkflowTask.setName("large_payload_subworkflow"); - subWorkflowTask.setType(TaskType.SUB_WORKFLOW.name()); + subWorkflowTask.setType(TASK_TYPE_SUB_WORKFLOW); subWorkflowTask.setTaskReferenceName("large_payload_subworkflow"); subWorkflowTask.setInputParameters(largePayload); subWorkflowTask.setSubWorkflowParam(subWorkflowParams); - dynamicForkLargePayload.put("dynamicTasks", Collections.singletonList(subWorkflowTask)); + dynamicForkLargePayload.put("dynamicTasks", List.of(subWorkflowTask)); dynamicForkLargePayload.put( - "dynamicTasksInput", - Collections.singletonMap("large_payload_subworkflow", largePayload)); + "dynamicTasksInput", Map.of("large_payload_subworkflow", largePayload)); } catch (IOException e) { // just handle this exception here and return empty map so that test will fail in case // this exception is thrown diff --git a/test-harness/src/test/resources/do_while_iteration_fix_test.json b/test-harness/src/test/resources/do_while_iteration_fix_test.json new file mode 100644 index 000000000..b9dd19a29 --- /dev/null +++ b/test-harness/src/test/resources/do_while_iteration_fix_test.json @@ -0,0 +1,43 @@ +{ + "name": "Do_While_Workflow_Iteration_Fix", + "description": "Do_While_Workflow_Iteration_Fix", + "version": 1, + "tasks": [ + { + "name": "loopTask", + "taskReferenceName": "loopTask", + "inputParameters": { + "value": "${workflow.input.loop}" + }, + "type": "DO_WHILE", + "decisionCases": {}, + "defaultCase": [], + "forkTasks": [], + "startDelay": 0, + "joinOn": [], + "optional": false, + "defaultExclusiveJoinTask": [], + "asyncComplete": false, + "loopCondition": "if ($.loopTask['iteration'] < $.value) { true; } else { false;} ", + "loopOver": [ + { + "name": "form_uri", + "taskReferenceName": "form_uri", + "inputParameters": { + "index" : "${loopTask['iteration']}", + "scriptExpression": "return $.index - 1;" + }, + "type": "LAMBDA" + } + ] + } + ], + "inputParameters": [], + "outputParameters": {}, + "schemaVersion": 2, + "restartable": true, + "workflowStatusListenerEnabled": false, + "timeoutPolicy": "ALERT_ONLY", + "timeoutSeconds": 0, + "ownerEmail": "test@harness.com" +} diff --git a/ui/package.json b/ui/package.json index d7d3c0bc8..bd6902b00 100644 --- a/ui/package.json +++ b/ui/package.json @@ -32,7 +32,7 @@ "react-router": "^5.2.0", "react-router-dom": "^5.2.0", "react-router-use-location-state": "^2.5.0", - "react-scripts": "4.0.3", + "react-scripts": "^5.0.1", "react-vis-timeline-2": "^2.1.6", "rison": "^0.1.1", "styled-components": "^5.3.0", @@ -61,33 +61,29 @@ ] }, "resolutions": { - "immer": "^9.0.6", - "ansi-html": "^0.0.8", - "glob-parent": "^5.1.2", - "node-forge": "^1.3.0", "validator": "^13.7.0", "nth-check": "^2.0.1", - "browserslist": "^4.16.5", - "async": "^3.2.2" + "async": "^3.2.2", + "ejs": "^3.1.7" }, "devDependencies": { "@testing-library/dom": "^8.2.0", - "@testing-library/jest-dom": "^4.2.4", - "@testing-library/react": "^9.3.2", - "@testing-library/user-event": "^7.1.2", - "@wdio/cli": "5.18.5", - "@wdio/junit-reporter": "5.18.3", - "@wdio/local-runner": "5.18.5", - "@wdio/mocha-framework": "5.16.15", - "@wdio/selenium-standalone-service": "5.16.10", - "@wdio/spec-reporter": "5.16.11", - "@wdio/sync": "5.18.5", - "js-yaml": "3.13.1", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/react": "^13.2.0", + "@testing-library/user-event": "^14.2.0", + "@wdio/cli": "7.19.7", + "@wdio/junit-reporter": "7.19.7", + "@wdio/local-runner": "7.19.7", + "@wdio/mocha-framework": "7.19.7", + "@wdio/selenium-standalone-service": "7.19.5", + "@wdio/spec-reporter": "7.19.7", + "@wdio/sync": "7.19.7", + "js-yaml": "4.1.0", "prettier": "^2.2.1", "sass": "^1.49.9", "typescript": "^4.6.3", - "webdriver": "^5.0.0", - "webdriverio": "^5.0.0" + "webdriver": "^7.19.7", + "webdriverio": "^7.19.7" }, "engines": { "node": ">=14.17.0" diff --git a/ui/src/components/diagram/WorkflowDAG.js b/ui/src/components/diagram/WorkflowDAG.js index d4b709bdf..31a5d802a 100644 --- a/ui/src/components/diagram/WorkflowDAG.js +++ b/ui/src/components/diagram/WorkflowDAG.js @@ -9,6 +9,7 @@ export default class WorkflowDAG { this.graph = new graphlib.Graph({ directed: true, compound: false }); this.taskResults = new Map(); + this.loopTaskRefs = []; this.constructGraph(); } @@ -38,9 +39,20 @@ export default class WorkflowDAG { else if (execution) { let isTerminated = false; for (let task of execution.tasks) { - if (task.taskType === "TERMINATE") isTerminated = true; - - this.addTaskResult(task.referenceTaskName, task); + if (task["taskType"] === "TERMINATE") isTerminated = true; + if (task["loopOverTask"]) { + let refTaskName = task["referenceTaskName"]; + let refTaskNameSansIter = refTaskName.substring( + 0, + refTaskName.lastIndexOf("__") + ); + let taskModel = { + ...task, + referenceTaskName: refTaskNameSansIter, + }; + this.addTaskResult(refTaskNameSansIter, taskModel); + } + this.addTaskResult(task["referenceTaskName"], task); } if (execution.status) { @@ -143,7 +155,11 @@ export default class WorkflowDAG { // Special case - When the antecedent of an executed node is a SWITCH, the edge may not necessarily be highlighted. // E.g. the default edge not taken. // SWITCH is the newer version of DECISION and DECISION is deprecated - if (antecedent.type === "SWITCH" || antecedent.type === "DECISION") { + if ( + antecedent.type === "SWITCH" || + antecedent.type === "DECISION" || + antecedents.type === "DO_WHILE" + ) { edgeParams.caseValue = getCaseValue( taskConfig.taskReferenceName, antecedent @@ -196,7 +212,7 @@ export default class WorkflowDAG { retval.push(decisionTask); // Empty default path } else { retval.push( - ...this.processTaskList(decisionTask.defaultCase, [decisionTask], null) + ...this.processTaskList(decisionTask.defaultCase, [decisionTask]) ); } @@ -246,6 +262,54 @@ export default class WorkflowDAG { } } + processDoWhileTask(doWhileTask, antecedents) { + console.assert(Array.isArray(antecedents)); + + let doWhileTaskResult = _.last( + this.taskResults.get(doWhileTask.taskReferenceName) + ); + let startDoWhileTask = { + ...doWhileTask, + taskReferenceName: doWhileTask.taskReferenceName + "-START", + }; + this.addTaskResult(startDoWhileTask.taskReferenceName, { + ...doWhileTaskResult, + }); + this.graph.setEdge( + doWhileTask.taskReferenceName + "-START", + doWhileTask.taskReferenceName, + { + caseValue: "LOOP", + executed: true, + } + ); + this.addVertex(startDoWhileTask, antecedents); + + antecedents = [startDoWhileTask]; + + const retval = []; + + if (_.isEmpty(doWhileTask.loopOver)) { + retval.push(doWhileTask); // Empty default path + } else { + this.loopTaskRefs.push(doWhileTask.taskReferenceName); + retval.push(...this.processTaskList(doWhileTask.loopOver, antecedents)); + this.loopTaskRefs.pop(); + } + // Set an edge from the do_while task to the first task + this.graph.setEdge( + doWhileTask.taskReferenceName, + doWhileTask.taskReferenceName + "-START", + { + caseValue: "LOOP", + executed: true, + } + ); + // Add do_while final state at the end + this.addVertex(doWhileTask, retval); + return [doWhileTask]; + } + processForkJoin(forkJoinTask, antecedents) { let outerForkTasks = forkJoinTask.forkTasks || []; @@ -281,6 +345,10 @@ export default class WorkflowDAG { return []; } + case "DO_WHILE": { + return this.processDoWhileTask(task, antecedents); + } + /* case "TERMINAL": case "JOIN": diff --git a/ui/src/components/diagram/WorkflowGraph.jsx b/ui/src/components/diagram/WorkflowGraph.jsx index 4da3ec0eb..14721b56c 100644 --- a/ui/src/components/diagram/WorkflowGraph.jsx +++ b/ui/src/components/diagram/WorkflowGraph.jsx @@ -414,6 +414,11 @@ class WorkflowGraph extends React.Component { retval.firstDfRef = v.firstDfRef; retval.shape = "stack"; break; + case "DO_WHILE": + retval = composeBarNode(v, "bidir"); + retval.label = `${retval.label} [DO_WHILE]`; + this.barNodes.push(v.ref); + break; default: retval.label = `${v.ref}\n(${v.name})`; retval.shape = "rect"; @@ -446,6 +451,13 @@ class WorkflowGraph extends React.Component { ); return _.first(points); }); + } else if (barNode.fanDir === "bidir") { + fanOut = this.graph.inEdges(barRef).map((e) => { + const points = parseSvgPath( + this.graph.edge(e).elem.querySelector("path").getAttribute("d") + ); + return _.last(points); + }); } else { fanOut = this.graph.inEdges(barRef).map((e) => { const points = parseSvgPath( diff --git a/ui/src/components/diagram/diagram.scss b/ui/src/components/diagram/diagram.scss index dfed89837..52b3ec23e 100644 --- a/ui/src/components/diagram/diagram.scss +++ b/ui/src/components/diagram/diagram.scss @@ -149,7 +149,7 @@ $node-text-size: 12px; &.dimmed { rect { stroke: $light-color; - fill: #fff; + fill: #fff; } text { fill: $light-color; diff --git a/ui/src/components/formik/FromikDropdown.jsx b/ui/src/components/formik/FromikDropdown.jsx deleted file mode 100644 index 71a9a2f12..000000000 --- a/ui/src/components/formik/FromikDropdown.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; -import { useField } from "formik"; -import { Dropdown } from ".."; - -export default function (props) { - const [field, meta, helper] = useField(props); - const touchedError = meta.touched && meta.error; - return ( - <> - helper.setValue(value)} - {...props} - error={touchedError} - helperText={touchedError} - /> - - ); -} diff --git a/ui/src/data/common.js b/ui/src/data/common.js index bf345a133..20a880c87 100644 --- a/ui/src/data/common.js +++ b/ui/src/data/common.js @@ -1,14 +1,12 @@ import _ from "lodash"; import { useQuery, useQueries, useMutation } from "react-query"; import { useFetchContext, fetchWithContext } from "../plugins/fetch"; -import assert from "assert"; export function useFetchParallel(paths, reactQueryOptions) { const fetchContext = useFetchContext(); return useQueries( paths.map((path) => { - assert(_.isArray(path)); return { queryKey: [fetchContext.stack, ...path], queryFn: () => fetchWithContext(`/${path.join("/")}`, fetchContext), @@ -21,17 +19,14 @@ export function useFetchParallel(paths, reactQueryOptions) { ); } -export function useFetch(path, reactQueryOptions, defaultResponse) { +export function useFetch(key, path, reactQueryOptions, defaultResponse) { const fetchContext = useFetchContext(); - const key = _.isArray(path) - ? [fetchContext.stack, ...path] - : [fetchContext.stack, path]; - const pathStr = _.isArray(path) ? `/${path.join("/")}` : path; + return useQuery( - key, + [fetchContext.stack, ...key], () => { - if (pathStr) { - return fetchWithContext(pathStr, fetchContext); + if (path) { + return fetchWithContext(path, fetchContext); } else { return Promise.resolve(defaultResponse); } diff --git a/ui/src/data/misc.js b/ui/src/data/misc.js index 8e0975bfa..8da060f61 100644 --- a/ui/src/data/misc.js +++ b/ui/src/data/misc.js @@ -1,9 +1,9 @@ import { useFetch } from "./common"; export const useEventHandlers = () => { - return useFetch("/event"); + return useFetch(["event"], "/event"); }; export const useLogs = ({ taskId }) => { - return useFetch(`/tasks/${taskId}/log`); + return useFetch(["taskLog", taskId], `/tasks/${taskId}/log`); }; diff --git a/ui/src/data/task.js b/ui/src/data/task.js index 8a6c9f491..a86382474 100644 --- a/ui/src/data/task.js +++ b/ui/src/data/task.js @@ -9,14 +9,13 @@ import { import qs from "qs"; import { useFetchContext, fetchWithContext } from "../plugins/fetch"; import { useFetch } from "./common"; -const STALE_TIME_DROPDOWN = 600000; // 10 mins export function useTask(taskName, defaultTask) { let path; if (taskName) { path = `/metadata/taskdefs/${taskName}`; } - return useFetch(path, {}, defaultTask); + return useFetch(["taskDef", taskName], path, {}, defaultTask); } export function useTaskSearch({ searchReady, ...searchObj }) { @@ -91,9 +90,7 @@ export function useTaskQueueInfo(taskName) { } export function useTaskNames() { - const { data } = useFetch(`/metadata/taskdefs`, { - staleTime: STALE_TIME_DROPDOWN, - }); + const { data } = useTaskDefs(); return useMemo( () => (data ? Array.from(new Set(data.map((def) => def.name))).sort() : []), [data] @@ -101,7 +98,7 @@ export function useTaskNames() { } export function useTaskDefs() { - return useFetch("/metadata/taskdefs"); + return useFetch(["taskDefs"], "/metadata/taskdefs"); } export function useSaveTask(callbacks) { diff --git a/ui/src/data/workflow.js b/ui/src/data/workflow.js index c8c0d229f..8a64aa58e 100644 --- a/ui/src/data/workflow.js +++ b/ui/src/data/workflow.js @@ -37,7 +37,9 @@ export function useWorkflowSearch(searchObj) { } export function useWorkflow(workflowId) { - return useFetch(`/workflow/${workflowId}`, { enabled: !!workflowId }); + return useFetch(["workflow", workflowId], `/workflow/${workflowId}`, { + enabled: !!workflowId, + }); } export function useWorkflows(workflowIds, reactQueryOptions) { @@ -69,15 +71,19 @@ export function useWorkflowDef( reactQueryOptions = {} ) { let path; + const key = ["workflowDef", workflowName]; if (workflowName) { path = `/metadata/workflow/${workflowName}`; - if (version) path += `?version=${version}`; + if (version) { + path += `?version=${version}`; + key.push(version); + } } - return useFetch(path, reactQueryOptions, defaultWorkflow); + return useFetch(key, path, reactQueryOptions, defaultWorkflow); } export function useWorkflowDefs() { - const { data, ...rest } = useFetch("/metadata/workflow", { + const { data, ...rest } = useFetch(["workflowDefs"], "/metadata/workflow", { staleTime: STALE_TIME_WORKFLOW_DEFS, }); @@ -97,7 +103,6 @@ export function useWorkflowDefs() { } }, [data]); - console.log(workflows); return { data: workflows, ...rest, @@ -129,7 +134,7 @@ export function useWorkflowNames() { // Version numbers do not necessarily start, or run contiguously from 1. Could be arbitrary integers e.g. 52335678. // By convention they should be monotonic (ever increasing) wrt time. export function useWorkflowNamesAndVersions() { - const { data, ...rest } = useFetch("/metadata/workflow", { + const { data, ...rest } = useFetch(["workflowDefs"], "/metadata/workflow", { staleTime: STALE_TIME_WORKFLOW_DEFS, }); diff --git a/ui/src/pages/execution/Timeline.jsx b/ui/src/pages/execution/Timeline.jsx index ee94ceb6c..1b2348e27 100644 --- a/ui/src/pages/execution/Timeline.jsx +++ b/ui/src/pages/execution/Timeline.jsx @@ -40,9 +40,10 @@ export default function TimelineComponent({ const items = tasks .filter((t) => t.startTime > 0 || t.endTime > 0) .map((task) => { - const dfParent = dag.graph - .predecessors(task.referenceTaskName) - .map((t) => dag.graph.node(t)) + const predecessors = dag.graph.predecessors(task.referenceTaskName); + + const dfParent = predecessors + ?.map((t) => dag.graph.node(t)) .find((t) => t.type === "FORK_JOIN_DYNAMIC"); const startTime = task.startTime > 0 diff --git a/ui/src/utils/localstorage.js b/ui/src/utils/localstorage.js deleted file mode 100644 index eddab6538..000000000 --- a/ui/src/utils/localstorage.js +++ /dev/null @@ -1,34 +0,0 @@ -import { useState } from "react"; - -// If key is null/undefined, hook behaves exactly like useState -export function useLocalStorage(key, initialValue) { - const initialString = JSON.stringify(initialValue); - - const [storedValue, setStoredValue] = useState(() => { - if (key) { - const item = window.localStorage.getItem(key); - return item ? JSON.parse(item) : initialValue; - } else { - return initialValue; - } - }); - - const setValue = (value) => { - // Allow value to be a function so we have same API as useState - const valueToStore = value instanceof Function ? value(storedValue) : value; - - // Save state - setStoredValue(valueToStore); - - if (key) { - const stringToStore = JSON.stringify(valueToStore); - if (stringToStore === initialString) { - window.localStorage.removeItem(key); - } else { - window.localStorage.setItem(key, stringToStore); - } - } - }; - - return [storedValue, setValue]; -} diff --git a/ui/yarn.lock b/ui/yarn.lock index 551a58e8e..3db96014c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -9,21 +9,16 @@ dependencies: "@jridgewell/trace-mapping" "^0.3.0" -"@babel/code-frame@7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" - integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz#ab0b1e981e1749bf59736cf7ebe25cfc9f949c15" + integrity sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg== dependencies: - "@babel/highlight" "^7.10.4" + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.5.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.8.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== @@ -35,29 +30,12 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== -"@babel/core@7.12.3": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.3.tgz#1b436884e1e3bff6fb1328dc02b208759de92ad8" - integrity sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.1" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.1" - "@babel/parser" "^7.12.3" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" +"@babel/compat-data@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.10.tgz#711dc726a492dfc8be8220028b1b92482362baab" + integrity sha512-GZt/TCsG70Ms19gfZO1tM4CVnXsPgEPBCpJu+Qz3L0LUDsY5nZqFZglIoPC1kIYOtNBZlrnFT+klg12vFGZXrw== -"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.7.5", "@babel/core@^7.8.4": +"@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.16.0": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.9.tgz#6bae81a06d95f4d0dec5bb9d74bbc1f58babdcfe" integrity sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw== @@ -78,7 +56,46 @@ json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.12.1", "@babel/generator@^7.17.9": +"@babel/core@^7.11.1", "@babel/core@^7.7.2", "@babel/core@^7.8.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.10.tgz#74ef0fbf56b7dfc3f198fc2d927f4f03e12f4b05" + integrity sha512-liKoppandF3ZcBnIYFjfSDHZLKdLHGJRkoWtG8zQyGJBQfIYobpnVGI5+pLBNtS6psFLDzyq8+h5HiVljW9PNA== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-module-transforms" "^7.17.7" + "@babel/helpers" "^7.17.9" + "@babel/parser" "^7.17.10" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.17.10" + "@babel/types" "^7.17.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/eslint-parser@^7.16.3": + version "7.17.0" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz#eabb24ad9f0afa80e5849f8240d0e5facc2d90d6" + integrity sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA== + dependencies: + eslint-scope "^5.1.1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.0" + +"@babel/generator@^7.17.10", "@babel/generator@^7.7.2": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.10.tgz#c281fa35b0c349bbe9d02916f4ae08fc85ed7189" + integrity sha512-46MJZZo9y3o4kmhBVc7zW7i8dtR1oIK/sdO5NcfcZRhTGYi+KKJRtHNgsU6c4VUcJmUNV/LQdebD/9Dlv4K+Tg== + dependencies: + "@babel/types" "^7.17.10" + "@jridgewell/gen-mapping" "^0.1.0" + jsesc "^2.5.1" + +"@babel/generator@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== @@ -112,6 +129,16 @@ browserslist "^4.17.5" semver "^6.3.0" +"@babel/helper-compilation-targets@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.10.tgz#09c63106d47af93cf31803db6bc49fef354e2ebe" + integrity sha512-gh3RxjWbauw/dFiU/7whjd0qN9K6nPJMqe6+Er7rOavFh0CQUSwhAE3IcTho2rywPJFxej6TUUHDkWcYI6gGqQ== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6", "@babel/helper-create-class-features-plugin@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz#71835d7fb9f38bd9f1378e40a4c0902fdc2ea49d" @@ -125,7 +152,7 @@ "@babel/helper-replace-supers" "^7.16.7" "@babel/helper-split-export-declaration" "^7.16.7" -"@babel/helper-create-regexp-features-plugin@^7.16.7": +"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1" integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA== @@ -183,14 +210,14 @@ dependencies: "@babel/types" "^7.17.0" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== dependencies: "@babel/types" "^7.16.7" -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": +"@babel/helper-module-transforms@^7.16.7", "@babel/helper-module-transforms@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz#3943c7f777139e7954a5355c815263741a9c1cbd" integrity sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw== @@ -277,7 +304,7 @@ "@babel/traverse" "^7.16.8" "@babel/types" "^7.16.8" -"@babel/helpers@^7.12.1", "@babel/helpers@^7.17.9": +"@babel/helpers@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.9.tgz#b2af120821bfbe44f9907b1826e168e819375a1a" integrity sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q== @@ -286,7 +313,7 @@ "@babel/traverse" "^7.17.9" "@babel/types" "^7.17.0" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": +"@babel/highlight@^7.16.7": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.9.tgz#61b2ee7f32ea0454612def4fccdae0de232b73e3" integrity sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg== @@ -295,11 +322,16 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.3", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9", "@babel/parser@^7.7.0": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== +"@babel/parser@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.10.tgz#873b16db82a8909e0fbd7f115772f4b739f6ce78" + integrity sha512-n2Q6i+fnJqzOaq2VkdXxy2TCPCWQZHiCo0XqmrCvDWcZQKRyZzYi4Z0yxlBuN0w+r2ZHmre+Q087DSrw3pbJDQ== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" @@ -333,7 +365,7 @@ "@babel/helper-create-class-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-proposal-class-static-block@^7.16.7": +"@babel/plugin-proposal-class-static-block@^7.16.7", "@babel/plugin-proposal-class-static-block@^7.17.6": version "7.17.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c" integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA== @@ -402,7 +434,7 @@ "@babel/helper-plugin-utils" "^7.16.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.16.7": +"@babel/plugin-proposal-object-rest-spread@^7.16.7", "@babel/plugin-proposal-object-rest-spread@^7.17.3": version "7.17.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390" integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw== @@ -596,6 +628,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.10.tgz#80031e6042cad6a95ed753f672ebd23c30933195" + integrity sha512-xJefea1DWXW09pW4Tm9bjwVlPDyYA2it3fWlmEjpYz6alPvTUjL0EOzNzI/FEOyI3r4/J7uVH5UqKgl1TQ5hqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/plugin-transform-arrow-functions@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154" @@ -647,7 +686,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-destructuring@^7.16.7": +"@babel/plugin-transform-destructuring@^7.16.7", "@babel/plugin-transform-destructuring@^7.17.7": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz#49dc2675a7afa9a5e4c6bdee636061136c3408d1" integrity sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ== @@ -724,7 +763,7 @@ "@babel/helper-plugin-utils" "^7.16.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.16.8": +"@babel/plugin-transform-modules-commonjs@^7.16.8", "@babel/plugin-transform-modules-commonjs@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz#274be1a2087beec0254d4abd4d86e52442e1e5b6" integrity sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw== @@ -734,7 +773,7 @@ "@babel/helper-simple-access" "^7.17.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.16.7": +"@babel/plugin-transform-modules-systemjs@^7.16.7", "@babel/plugin-transform-modules-systemjs@^7.17.8": version "7.17.8" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz#81fd834024fae14ea78fbe34168b042f38703859" integrity sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw== @@ -760,6 +799,13 @@ dependencies: "@babel/helper-create-regexp-features-plugin" "^7.16.7" +"@babel/plugin-transform-named-capturing-groups-regex@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.10.tgz#715dbcfafdb54ce8bccd3d12e8917296a4ba66a4" + integrity sha512-v54O6yLaJySCs6mGzaVOUw9T967GnH38T6CQSAtnzdNPwu84l2qAjssKzo/WSO8Yi7NF+7ekm5cVbF/5qiIgNA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.17.0" + "@babel/plugin-transform-new-target@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244" @@ -829,7 +875,7 @@ "@babel/helper-annotate-as-pure" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/plugin-transform-regenerator@^7.16.7": +"@babel/plugin-transform-regenerator@^7.16.7", "@babel/plugin-transform-regenerator@^7.17.9": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz#0a33c3a61cf47f45ed3232903683a0afd2d3460c" integrity sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ== @@ -915,7 +961,87 @@ "@babel/helper-create-regexp-features-plugin" "^7.16.7" "@babel/helper-plugin-utils" "^7.16.7" -"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4", "@babel/preset-env@^7.8.4": +"@babel/preset-env@^7.11.0": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.17.10.tgz#a81b093669e3eb6541bb81a23173c5963c5de69c" + integrity sha512-YNgyBHZQpeoBSRBg0xixsZzfT58Ze1iZrajvv0lJc70qDDGuGfonEnMGfWeSY0mQ3JTuCWFbMkzFRVafOyJx4g== + dependencies: + "@babel/compat-data" "^7.17.10" + "@babel/helper-compilation-targets" "^7.17.10" + "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-validator-option" "^7.16.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-async-generator-functions" "^7.16.8" + "@babel/plugin-proposal-class-properties" "^7.16.7" + "@babel/plugin-proposal-class-static-block" "^7.17.6" + "@babel/plugin-proposal-dynamic-import" "^7.16.7" + "@babel/plugin-proposal-export-namespace-from" "^7.16.7" + "@babel/plugin-proposal-json-strings" "^7.16.7" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7" + "@babel/plugin-proposal-numeric-separator" "^7.16.7" + "@babel/plugin-proposal-object-rest-spread" "^7.17.3" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.7" + "@babel/plugin-proposal-optional-chaining" "^7.16.7" + "@babel/plugin-proposal-private-methods" "^7.16.11" + "@babel/plugin-proposal-private-property-in-object" "^7.16.7" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.7" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.16.7" + "@babel/plugin-transform-async-to-generator" "^7.16.8" + "@babel/plugin-transform-block-scoped-functions" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.7" + "@babel/plugin-transform-classes" "^7.16.7" + "@babel/plugin-transform-computed-properties" "^7.16.7" + "@babel/plugin-transform-destructuring" "^7.17.7" + "@babel/plugin-transform-dotall-regex" "^7.16.7" + "@babel/plugin-transform-duplicate-keys" "^7.16.7" + "@babel/plugin-transform-exponentiation-operator" "^7.16.7" + "@babel/plugin-transform-for-of" "^7.16.7" + "@babel/plugin-transform-function-name" "^7.16.7" + "@babel/plugin-transform-literals" "^7.16.7" + "@babel/plugin-transform-member-expression-literals" "^7.16.7" + "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/plugin-transform-modules-commonjs" "^7.17.9" + "@babel/plugin-transform-modules-systemjs" "^7.17.8" + "@babel/plugin-transform-modules-umd" "^7.16.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.10" + "@babel/plugin-transform-new-target" "^7.16.7" + "@babel/plugin-transform-object-super" "^7.16.7" + "@babel/plugin-transform-parameters" "^7.16.7" + "@babel/plugin-transform-property-literals" "^7.16.7" + "@babel/plugin-transform-regenerator" "^7.17.9" + "@babel/plugin-transform-reserved-words" "^7.16.7" + "@babel/plugin-transform-shorthand-properties" "^7.16.7" + "@babel/plugin-transform-spread" "^7.16.7" + "@babel/plugin-transform-sticky-regex" "^7.16.7" + "@babel/plugin-transform-template-literals" "^7.16.7" + "@babel/plugin-transform-typeof-symbol" "^7.16.7" + "@babel/plugin-transform-unicode-escapes" "^7.16.7" + "@babel/plugin-transform-unicode-regex" "^7.16.7" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.17.10" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.5.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.22.1" + semver "^6.3.0" + +"@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": version "7.16.11" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982" integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g== @@ -1035,14 +1161,14 @@ core-js-pure "^3.20.2" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.10.4", "@babel/template@^7.16.7", "@babel/template@^7.3.3": +"@babel/template@^7.16.7", "@babel/template@^7.3.3": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== @@ -1051,7 +1177,7 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.12.1", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.3", "@babel/traverse@^7.17.9", "@babel/traverse@^7.4.5": version "7.17.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== @@ -1067,7 +1193,23 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/traverse@^7.17.10", "@babel/traverse@^7.7.2": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.10.tgz#1ee1a5ac39f4eac844e6cf855b35520e5eb6f8b5" + integrity sha512-VmbrTHQteIdUUQNTb+zE12SHS/xQVIShmBPhlNP12hD5poF2pbITW1Z4172d03HegaQWhLffdkRJYtAzp0AGcw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.10" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.10" + "@babel/types" "^7.17.10" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== @@ -1075,28 +1217,100 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@babel/types@^7.17.10": + version "7.17.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.10.tgz#d35d7b4467e439fcf06d195f8100e0fea7fc82c4" + integrity sha512-9O26jG0mBYfGkUYCYZRnBwbVLd1UZOICEr2Em6InB6jVfsAv1GKgwXHmrSg+WFWDmeKTA6vyTZiN8tCSM5Oo3A== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cnakazawa/watch@^1.0.3": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" - integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ== +"@csstools/normalize.css@*": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@csstools/postcss-color-function@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz#229966327747f58fbe586de35daa139db3ce1e5d" + integrity sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA== dependencies: - exec-sh "^0.3.2" - minimist "^1.2.0" + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" -"@csstools/convert-colors@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" - integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw== +"@csstools/postcss-font-format-keywords@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.0.tgz#7e7df948a83a0dfb7eb150a96e2390ac642356a1" + integrity sha512-oO0cZt8do8FdVBX8INftvIA4lUrKUSCcWUf9IwH9IPWOgKT22oAZFXeHLoDK7nhB2SmkNycp5brxfNMRLIhd6Q== + dependencies: + postcss-value-parser "^4.2.0" -"@csstools/normalize.css@^10.1.0": - version "10.1.0" - resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" - integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== +"@csstools/postcss-hwb-function@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz#d6785c1c5ba8152d1d392c66f3a6a446c6034f6d" + integrity sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.0.tgz#f484db59fc94f35a21b6d680d23b0ec69b286b7f" + integrity sha512-i4yps1mBp2ijrx7E96RXrQXQQHm6F4ym1TOD0D69/sjDjZvQ22tqiEvaNw7pFZTUO5b9vWRHzbHzP9+UKuw+bA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.3.tgz#98c827ca88598e598dcd726a9d9e21e0475eb487" + integrity sha512-wMQ3GMWrJyRQfvBJsD38ndF/nwHT32xevSn8w2X+iCoWqmhhoj0K7HgdGW8XQhah6sdENBa8yS9gRosdezaQZw== + dependencies: + "@csstools/selector-specificity" "^1.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-normalize-display-values@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.0.tgz#ce698f688c28517447aedf15a9037987e3d2dc97" + integrity sha512-bX+nx5V8XTJEmGtpWTO6kywdS725t71YSLlxWt78XoHUbELWgoCXeOFymRJmL3SU1TLlKSIi7v52EWqe60vJTQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz#e9a269487a292e0930760948e923e1d46b638ee6" + integrity sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.0.tgz#f8ffc05e163ba7bcbefc5fdcaf264ce9fd408c16" + integrity sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz#2cc020785db5ec82cc9444afe4cdae2a65445f89" + integrity sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg== + +"@csstools/selector-specificity@1.0.0", "@csstools/selector-specificity@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-1.0.0.tgz#91c560df2ed8d9700e4c7ed4ac21a3a322c9d975" + integrity sha512-RkYG5KiGNX0fJ5YoI0f4Wfq2Yo74D25Hru4fxTOioYdQvHBxcrrtTTyT5Ozzh2ejcNrhFy7IEts2WyEY7yi5yw== "@egjs/hammerjs@^2.0.17": version "2.0.17" @@ -1132,68 +1346,31 @@ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== +"@eslint/eslintrc@^1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.3.tgz#fcaa2bcef39e13d6e9e7f6271f4cc7cae1174886" + integrity sha512-uGo44hIwoLGNyduRpjdEpovcbMdd+Nv7amtmJxnKmI8xj6yd5LncmSwDa5NgX/41lIFJtkjD6YdVfgEzPfJ5UA== dependencies: ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" + debug "^4.3.2" + espree "^9.3.2" globals "^13.9.0" - ignore "^4.0.6" + ignore "^5.2.0" import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" + js-yaml "^4.1.0" + minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@gar/promisify@^1.0.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@hapi/address@2.x.x": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5" - integrity sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ== - -"@hapi/bourne@1.x.x": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz#0a7095adea067243ce3283e1b56b8a8f453b242a" - integrity sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA== - -"@hapi/hoek@8.x.x", "@hapi/hoek@^8.3.0": - version "8.5.1" - resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz#fde96064ca446dec8c55a8c2f130957b070c6e06" - integrity sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow== - -"@hapi/joi@^15.1.0": - version "15.1.1" - resolved "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz#c675b8a71296f02833f8d6d243b34c57b8ce19d7" - integrity sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ== - dependencies: - "@hapi/address" "2.x.x" - "@hapi/bourne" "1.x.x" - "@hapi/hoek" "8.x.x" - "@hapi/topo" "3.x.x" - -"@hapi/topo@3.x.x": - version "3.1.6" - resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz#68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29" - integrity sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ== - dependencies: - "@hapi/hoek" "^8.3.0" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== +"@humanwhocodes/config-array@^0.9.2": + version "0.9.5" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7" + integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw== dependencies: - "@humanwhocodes/object-schema" "^1.2.0" + "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -1214,201 +1391,234 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2" - integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g== +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.5.1" + jest-util "^27.5.1" slash "^3.0.0" -"@jest/core@^26.6.0", "@jest/core@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad" - integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw== +"@jest/console@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.0.tgz#db78222c3d3b0c1db82f1b9de51094c2aaff2176" + integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA== dependencies: - "@jest/console" "^26.6.2" - "@jest/reporters" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/types" "^28.1.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.0" + jest-util "^28.1.0" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" + emittery "^0.8.1" exit "^0.1.2" - graceful-fs "^4.2.4" - jest-changed-files "^26.6.2" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-resolve-dependencies "^26.6.3" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - jest-watcher "^26.6.2" - micromatch "^4.0.2" - p-each-series "^2.1.0" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^26.6.0", "@jest/environment@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c" - integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA== +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== dependencies: - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^26.6.2" + jest-mock "^27.5.1" -"@jest/fake-timers@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad" - integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA== +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== dependencies: - "@jest/types" "^26.6.2" - "@sinonjs/fake-timers" "^6.0.1" + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" "@types/node" "*" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" -"@jest/globals@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a" - integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA== +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== dependencies: - "@jest/environment" "^26.6.2" - "@jest/types" "^26.6.2" - expect "^26.6.2" + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" -"@jest/reporters@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6" - integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw== +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^4.0.3" + istanbul-lib-instrument "^5.1.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - jest-haste-map "^26.6.2" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" slash "^3.0.0" source-map "^0.6.0" string-length "^4.0.1" terminal-link "^2.0.0" - v8-to-istanbul "^7.0.0" - optionalDependencies: - node-notifier "^8.0.0" + v8-to-istanbul "^8.1.0" -"@jest/source-map@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535" - integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA== +"@jest/schemas@^28.0.2": + version "28.0.2" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.0.2.tgz#08c30df6a8d07eafea0aef9fb222c5e26d72e613" + integrity sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA== + dependencies: + "@sinclair/typebox" "^0.23.3" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== dependencies: callsites "^3.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" source-map "^0.6.0" -"@jest/test-result@^26.6.0", "@jest/test-result@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18" - integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ== +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== dependencies: - "@jest/console" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^26.6.3": - version "26.6.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17" - integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw== +"@jest/test-result@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.0.tgz#fd149dee123510dd2fcadbbf5f0020f98ad7f12c" + integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ== dependencies: - "@jest/test-result" "^26.6.2" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-runner "^26.6.3" - jest-runtime "^26.6.3" + "@jest/console" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" -"@jest/transform@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b" - integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA== +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== dependencies: "@babel/core" "^7.1.0" - "@jest/types" "^26.6.2" - babel-plugin-istanbul "^6.0.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.4" - jest-haste-map "^26.6.2" - jest-regex-util "^26.0.0" - jest-util "^26.6.2" - micromatch "^4.0.2" - pirates "^4.0.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" slash "^3.0.0" source-map "^0.6.1" write-file-atomic "^3.0.0" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jest/types@^25.5.0": - version "25.5.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" - integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^15.0.0" - chalk "^3.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" -"@jest/types@^26.6.0", "@jest/types@^26.6.2": - version "26.6.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" - integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== +"@jest/types@^28.1.0": + version "28.1.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.0.tgz#508327a89976cbf9bd3e1cc74641a29fd7dfd519" + integrity sha512-xmEggMPr317MIOjjDoZ4ejCSr9Lpbt/u34+dvc99t7DS8YirW5rwZEhzKPC2BMUFkUhI48qs6qLUSGw5FuL0GA== dependencies: + "@jest/schemas" "^28.0.2" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^15.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri@^3.0.3": version "3.0.5" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.11" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" @@ -1422,6 +1632,11 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + "@material-ui/core@^4.12.3": version "4.12.4" resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73" @@ -1504,19 +1719,19 @@ prop-types "^15.7.2" react-is "^16.8.0 || ^17.0.0" -"@monaco-editor/loader@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.0.tgz#659fbaf1d612ea67b2a0519a18612d1c4813e444" - integrity sha512-N3mGq1ktC3zh7WUx3NGO+PSDdNq9Vspk/41rEmRdrCqV9vNbBTRzAOplmUpNQsi+hmTs++ERMBobMERb8Kb+3g== +"@monaco-editor/loader@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@monaco-editor/loader/-/loader-1.3.2.tgz#04effbb87052d19cd7d3c9d81c0635490f9bb6d8" + integrity sha512-BTDbpHl3e47r3AAtpfVFTlAi7WXv4UQ/xZmz8atKl4q7epQV5e7+JbigFDViWF71VBi4IIBdcWP57Hj+OWuc9g== dependencies: state-local "^1.0.6" "@monaco-editor/react@^4.3.1": - version "4.4.2" - resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.4.2.tgz#e2848643e4b713138ae1a92a8d2671a13aa69661" - integrity sha512-QwQKkP5zXK8oA6uMpZcyQqYKQbMFUIE1Z9gPhYajk4qXdt/kGCu3RvO9SGKGlS9MSciCyd3WjEksVMDoyxQk4w== + version "4.4.5" + resolved "https://registry.yarnpkg.com/@monaco-editor/react/-/react-4.4.5.tgz#beabe491efeb2457441a00d1c7651c653697f65b" + integrity sha512-IImtzU7sRc66OOaQVCG+5PFHkSWnnhrUWGBuH6zNmH2h0YgmAhcjHZQc/6MY9JWEbUtVF1WPBMJ9u1XuFbRrVA== dependencies: - "@monaco-editor/loader" "^1.3.0" + "@monaco-editor/loader" "^1.3.2" prop-types "^15.7.2" "@nodelib/fs.scandir@2.1.5": @@ -1540,46 +1755,42 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@npmcli/fs@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.1.1.tgz#72f719fe935e687c56a4faecf3c03d06ba593257" - integrity sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@pmmmwh/react-refresh-webpack-plugin@0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz#1eec460596d200c0236bf195b078a5d1df89b766" - integrity sha512-br5Qwvh8D2OQqSXpd1g/xqXKnK0r+Jz6qVKBbWmpUcrbGOxUrf39V5oZ1876084CGn18uMdR5uvPqBv9UqtBjQ== +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.6.tgz#9ced74cb23dae31ab385f775e237ce4c50422a1d" + integrity sha512-IIWxofIYt/AbMwoeBgj+O2aAXLrlCQVg+A4a2zfpXFNHgP8o8rvi3v+oe5t787Lj+KXlKOh8BAiUp9bhuELXhg== dependencies: - ansi-html "^0.0.7" + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.8.1" error-stack-parser "^2.0.6" - html-entities "^1.2.1" - native-url "^0.2.6" - schema-utils "^2.6.5" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.0" + schema-utils "^3.0.0" source-map "^0.7.3" -"@rollup/plugin-node-resolve@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" - integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== dependencies: - "@rollup/pluginutils" "^3.0.8" - "@types/resolve" "0.0.8" + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" builtin-modules "^3.1.0" + deepmerge "^4.2.2" is-module "^1.0.0" - resolve "^1.14.2" + resolve "^1.19.0" -"@rollup/plugin-replace@^2.3.1": +"@rollup/plugin-replace@^2.4.1": version "2.4.2" resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a" integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== @@ -1587,7 +1798,7 @@ "@rollup/pluginutils" "^3.1.0" magic-string "^0.25.7" -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": +"@rollup/pluginutils@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== @@ -1596,10 +1807,15 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@sheerun/mutationobserver-shim@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz#5405ee8e444ed212db44e79351f0c70a582aae25" - integrity sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw== +"@rushstack/eslint-patch@^1.1.0": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz#6801033be7ff87a6b7cadaf5b337c9f366a3c4b0" + integrity sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw== + +"@sinclair/typebox@^0.23.3": + version "0.23.5" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.23.5.tgz#93f7b9f4e3285a7a9ade7557d9a8d36809cbc47d" + integrity sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg== "@sindresorhus/is@^4.0.0": version "4.6.0" @@ -1613,20 +1829,22 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40" - integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA== +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== dependencies: "@sinonjs/commons" "^1.7.0" -"@surma/rollup-plugin-off-main-thread@^1.1.1": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-1.4.2.tgz#e6786b6af5799f82f7ab3a82e53f6182d2b91a58" - integrity sha512-yBMPqmd1yEJo/280PAMkychuaALyQ9Lkb5q1ck3mjJrFuEobIfhnQ4J3mbvBoISmR3SWMWV+cGB/I0lCQee79A== +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== dependencies: - ejs "^2.6.1" + ejs "^3.1.6" + json5 "^2.2.0" magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" "@svgr/babel-plugin-add-jsx-attribute@^5.4.0": version "5.4.0" @@ -1717,7 +1935,7 @@ deepmerge "^4.2.2" svgo "^1.2.2" -"@svgr/webpack@5.5.0": +"@svgr/webpack@^5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz#aae858ee579f5fa8ce6c3166ef56c6a1b381b640" integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== @@ -1738,7 +1956,7 @@ dependencies: defer-to-connect "^2.0.0" -"@testing-library/dom@*", "@testing-library/dom@^8.2.0": +"@testing-library/dom@^8.2.0", "@testing-library/dom@^8.5.0": version "8.13.0" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5" integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ== @@ -1752,59 +1970,56 @@ lz-string "^1.4.4" pretty-format "^27.0.2" -"@testing-library/dom@^6.15.0": - version "6.16.0" - resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-6.16.0.tgz#04ada27ed74ad4c0f0d984a1245bb29b1fd90ba9" - integrity sha512-lBD88ssxqEfz0wFL6MeUyyWZfV/2cjEZZV3YRpb2IoJRej/4f1jB0TzqIOznTpfR1r34CNesrubxwIlAQ8zgPA== +"@testing-library/jest-dom@^5.16.4": + version "5.16.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd" + integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA== dependencies: - "@babel/runtime" "^7.8.4" - "@sheerun/mutationobserver-shim" "^0.3.2" - "@types/testing-library__dom" "^6.12.1" - aria-query "^4.0.2" - dom-accessibility-api "^0.3.0" - pretty-format "^25.1.0" - wait-for-expect "^3.0.2" - -"@testing-library/jest-dom@^4.2.4": - version "4.2.4" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-4.2.4.tgz#00dfa0cbdd837d9a3c2a7f3f0a248ea6e7b89742" - integrity sha512-j31Bn0rQo12fhCWOUWy9fl7wtqkp7In/YP2p5ZFyRuiiB9Qs3g+hS4gAmDWONbAHcRmVooNJ5eOHQDCOmUFXHg== - dependencies: - "@babel/runtime" "^7.5.1" - chalk "^2.4.1" - css "^2.2.3" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css "^3.0.0" css.escape "^1.5.1" - jest-diff "^24.0.0" - jest-matcher-utils "^24.0.0" - lodash "^4.17.11" - pretty-format "^24.0.0" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" redent "^3.0.0" -"@testing-library/react@^9.3.2": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-9.5.0.tgz#71531655a7890b61e77a1b39452fbedf0472ca5e" - integrity sha512-di1b+D0p+rfeboHO5W7gTVeZDIK5+maEgstrZbWZSSvxDyfDRkkyBE1AJR5Psd6doNldluXlCWqXriUfqu/9Qg== +"@testing-library/react@^13.2.0": + version "13.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-13.2.0.tgz#2db00bc94d71c4e90e5c25582e90a650ae2925bf" + integrity sha512-Bprbz/SZVONCJy5f7hcihNCv313IJXdYiv0nSJklIs1SQCIHHNlnGNkosSXnGZTmesyGIcBGNppYhXcc11pb7g== dependencies: - "@babel/runtime" "^7.8.4" - "@testing-library/dom" "^6.15.0" - "@types/testing-library__react" "^9.1.2" + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" -"@testing-library/user-event@^7.1.2": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-7.2.1.tgz#2ad4e844175a3738cb9e7064be5ea070b8863a1c" - integrity sha512-oZ0Ib5I4Z2pUEcoo95cT1cr6slco9WY7yiPpG+RGNkj8YcYgJnM7pXmYmorNOReh8MIGcKSqXyeGjxnr8YiZbA== +"@testing-library/user-event@^14.2.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.2.0.tgz#8293560f8f80a00383d6c755ec3e0b918acb1683" + integrity sha512-+hIlG4nJS6ivZrKnOP7OGsDu9Fxmryj9vCl8x0ZINtTJcCHs2zLsYif5GzuRiBF2ck5GZG2aQr7Msg+EHlnYVQ== "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig== -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": +"@types/aria-query@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.0.tgz#df2d64b5cc73cca0d75e2a7793d6b5c199c2f7b2" + integrity sha512-P+dkdFu0n08PDIvw+9nT9ByQnd+Udc8DaWPb9HKfaPwCvWvQpC5XaMRx2xLWECm9x1VKNps6vEAlirjA6+uNrQ== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": version "7.1.19" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460" integrity sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw== @@ -1837,6 +2052,21 @@ dependencies: "@babel/types" "^7.3.0" +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + "@types/cacheable-request@^6.0.1": version "6.0.2" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" @@ -1847,10 +2077,51 @@ "@types/node" "*" "@types/responselike" "*" -"@types/caseless@*": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" - integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/diff@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-5.0.2.tgz#dd565e0086ccf8bc6522c6ebafd8a3125c91c12b" + integrity sha512-uw8eYMIReOwstQ0QKF0sICefSy8cNO/v7gOTiIy9SbwuHyEecJUm7qlgueOO5S1udZ5I/irVydHVwMchgzbKTg== + +"@types/easy-table@^0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/easy-table/-/easy-table-0.0.33.tgz#b1f7ec29014ec24906b4f28d8368e2e99b399313" + integrity sha512-/vvqcJPmZUfQwCgemL0/34G7bIQnCuvgls379ygRlcC1FqNqk3n+VZ15dAO51yl6JNDoWd8vsk+kT8zfZ1VZSw== + +"@types/ejs@^3.0.5": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/ejs/-/ejs-3.1.1.tgz#29c539826376a65e7f7d672d51301f37ed718f6d" + integrity sha512-RQul5wEfY7BjWm0sYY86cmUN/pcXWGyVxWX93DFFJvcrxax5zKlieLwA3T77xJGwNcZW0YW6CYG70p1m8xPFmA== + +"@types/eslint-scope@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" + integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.4.2" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.2.tgz#48f2ac58ab9c631cb68845c3d956b28f79fad575" + integrity sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" "@types/eslint@^7.28.2": version "7.29.0" @@ -1860,7 +2131,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*": +"@types/estree@*", "@types/estree@^0.0.51": version "0.0.51" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== @@ -1870,12 +2141,35 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/fibers@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/fibers/-/fibers-3.1.1.tgz#b714d357eebf6aec0bc5d70512e573b89bc84f20" + integrity sha512-yHoUi46uika0snoTpNcVqUSvgbRndaIps4TUCotrXjtc0DHDoPQckmyXEZ2bX3e4mpJmyEW3hRhCwQa/ISCPaA== + +"@types/fs-extra@^9.0.1", "@types/fs-extra@^9.0.4": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== dependencies: - "@types/minimatch" "*" "@types/node" "*" "@types/graceful-fs@^4.1.2": @@ -1890,10 +2184,10 @@ resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.41.tgz#f6ecf57d1b12d2befcce00e928a6a097c22980aa" integrity sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA== -"@types/html-minifier-terser@^5.0.0": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz#693b316ad323ea97eed6b38ed1a3cc02b1672b57" - integrity sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w== +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-cache-semantics@*": version "4.0.1" @@ -1901,12 +2195,20 @@ integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== "@types/http-proxy@^1.17.8": - version "1.17.8" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" - integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== + version "1.17.9" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a" + integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw== dependencies: "@types/node" "*" +"@types/inquirer@^8.1.2": + version "8.2.1" + resolved "https://registry.yarnpkg.com/@types/inquirer/-/inquirer-8.2.1.tgz#28a139be3105a1175e205537e8ac10830e38dbf4" + integrity sha512-wKW3SKIUMmltbykg4I5JzCVzUhkuD9trD6efAmYgN2MrSntY0SMRQzEnD3mkyJ/rv9NLbTC7g3hKKE86YwEDLw== + dependencies: + "@types/through" "*" + rxjs "^7.2.0" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -1919,14 +2221,6 @@ dependencies: "@types/istanbul-lib-coverage" "*" -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - "@types/istanbul-reports@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" @@ -1934,16 +2228,29 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@*": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.5.1.tgz#2c8b6dc6ff85c33bcd07d0b62cb3d19ddfdb3ab9" + integrity sha512-fUy7YRpT+rHXto1YlL+J9rs0uLGyiqVt3ZOTQR+4ROc47yNl8WLdVLgUloBRhOxP1PZvguHl44T3H0wAWxahYQ== + dependencies: + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" + "@types/json-buffer@~3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64" integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ== -"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8": +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-stringify-safe@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/json-stringify-safe/-/json-stringify-safe-5.0.0.tgz#df34d054419d39323a3730966bacba02ac5e474e" + integrity sha512-UUA1sH0RSRROdInuDOA1yoRzbi5xVFD1RHCoOvNRPTNwR8zBkJ/84PZ6NhKVDtKp0FTeIccJCdQz1X2aJPr4uw== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -1956,50 +2263,98 @@ dependencies: "@types/node" "*" +"@types/lodash.flattendeep@^4.4.6": + version "4.4.7" + resolved "https://registry.yarnpkg.com/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.7.tgz#0ce3dccbe006826d58e9824b27df4b00ed3e90e6" + integrity sha512-1h6GW/AeZw/Wej6uxrqgmdTDZX1yFS39lRsXYkg+3kWvOWWrlGCI6H7lXxlUHOzxDT4QeYGmgPpQ3BX9XevzOg== + dependencies: + "@types/lodash" "*" + +"@types/lodash.pickby@^4.6.6": + version "4.6.7" + resolved "https://registry.yarnpkg.com/@types/lodash.pickby/-/lodash.pickby-4.6.7.tgz#fd089a5a7f8cbe7294ae5c90ea5ecd9f4cae4d2c" + integrity sha512-4ebXRusuLflfscbD0PUX4eVknDHD9Yf+uMtBIvA/hrnTqeAzbuHuDjvnYriLjUrI9YrhCPVKUf4wkRSXJQ6gig== + dependencies: + "@types/lodash" "*" + +"@types/lodash.union@^4.6.6": + version "4.6.7" + resolved "https://registry.yarnpkg.com/@types/lodash.union/-/lodash.union-4.6.7.tgz#ceace5ed9f3610652ba4a72e0e0afb2a0eec7a4d" + integrity sha512-6HXM6tsnHJzKgJE0gA/LhTGf/7AbjUk759WZ1MziVm+OBNAATHhdgj+a3KVE8g76GCLAnN4ZEQQG1EGgtBIABA== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.182" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" + integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== + "@types/lodash@^4.14.175": version "4.14.181" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.181.tgz#d1d3740c379fda17ab175165ba04e2d03389385d" integrity sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag== -"@types/minimatch@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== -"@types/node@*": - version "17.0.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== +"@types/mocha@^9.0.0": + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== +"@types/node@*", "@types/node@^17.0.4": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.33.tgz#3c1879b276dc63e73030bb91165e62a4509cd506" + integrity sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ== + +"@types/object-inspect@^1.8.0": + version "1.8.1" + resolved "https://registry.yarnpkg.com/@types/object-inspect/-/object-inspect-1.8.1.tgz#7c08197ad05cc0e513f529b1f3919cc99f720e1f" + integrity sha512-0JTdf3CGV0oWzE6Wa40Ayv2e2GhpP3pEJMcrlM74vBSJPuuNkVwfDnl0SZxyFCXETcB4oKA/MpTVfuYSMOelBg== "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/prettier@^2.0.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759" - integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw== +"@types/prettier@^2.1.5": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.1.tgz#76e72d8a775eef7ce649c63c8acae1a0824bbaed" + integrity sha512-XFjFHmaLVifrAKaZ+EKghFHtHSUonyw8P2Qmy2/+osBnrKbH9UYtlK10zg8/kCt47MFilll/DEDKy3DHfJ0URw== "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/puppeteer@^5.4.0": + version "5.4.6" + resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-5.4.6.tgz#afc438e41dcbc27ca1ba0235ea464a372db2b21c" + integrity sha512-98Kghehs7+/GD9b56qryhqdqVCXUTbetTv3PlvDnmFRTHQH0j9DIp1f7rkAW3BAj4U3yoeSEQnKgdW8bDq0Y0Q== + dependencies: + "@types/node" "*" + "@types/q@^1.5.1": version "1.5.5" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== -"@types/react-dom@*": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.0.tgz#b13f8d098e4b0c45df4f1ed123833143b0c71141" - integrity sha512-49897Y0UiCGmxZqpC8Blrf6meL8QUla6eb+BBhn69dTXlmuOlzkfr7HHY/O8J25e1lTUMs+YYxSlVDAaGHCOLg== +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.0.0": + version "18.0.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.4.tgz#dcbcadb277bcf6c411ceff70069424c57797d375" + integrity sha512-FgTtbqPOCI3dzZPZoC2T/sx3L34qxy99ITWn4eoSA95qPyXDMH0ALoAqUp49ITniiJFsXUVBtalh/KffMpg21Q== dependencies: "@types/react" "*" @@ -2019,20 +2374,17 @@ "@types/scheduler" "*" csstype "^3.0.2" -"@types/request@^2.48.4": - version "2.48.8" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.8.tgz#0b90fde3b655ab50976cb8c5ac00faca22f5a82c" - integrity sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ== +"@types/recursive-readdir@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/recursive-readdir/-/recursive-readdir-2.2.1.tgz#330f5ec0b73e8aeaf267a6e056884e393f3543a3" + integrity sha512-Xd+Ptc4/F2ueInqy5yK2FI5FxtwwbX2+VZpcg+9oYsFJVen8qQKGapCr+Bi5wQtHU1cTXT8s+07lo/nKPgu8Gg== dependencies: - "@types/caseless" "*" "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" -"@types/resolve@0.0.8": - version "0.0.8" - resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" - integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== dependencies: "@types/node" "*" @@ -2043,528 +2395,534 @@ dependencies: "@types/node" "*" +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== -"@types/selenium-standalone@^6.15.0": - version "6.15.2" - resolved "https://registry.yarnpkg.com/@types/selenium-standalone/-/selenium-standalone-6.15.2.tgz#b6562f8e016d7b656bba9ee6445086364959af01" - integrity sha512-Jnt4AHHcUOPGuZ5cJRYfP3IpPalNc/o1BmFvuFFmLtU2PtvEGvyyJPdpErqzZDxsP8E4yjTst0GL+QMJiEWuBA== +"@types/selenium-standalone@^7.0.0": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@types/selenium-standalone/-/selenium-standalone-7.0.1.tgz#7d94c2f663ceb495648c2c2a300f317d3a835257" + integrity sha512-zbKenL0fAXzPyiOaaFMrvFdMNhj5BgNJQq8bxiZfwQD9ID2J8bUG5xbcS3tQtlzIX/62z9nG5Vo45oaHWTbvbw== + dependencies: + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== dependencies: + "@types/mime" "^1" "@types/node" "*" -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" "@types/stack-utils@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== -"@types/tapable@^1", "@types/tapable@^1.0.5": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310" - integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== - -"@types/testing-library__dom@*": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.5.0.tgz#e0a00dd766983b1d6e9d10d33e708005ce6ad13e" - integrity sha512-mj1aH4cj3XUpMEgVpognma5kHVtbm6U6cHZmEFzCRiXPvKkuHrFr3+yXdGLXvfFRBaQIVshPGHI+hGTOJlhS/g== +"@types/stream-buffers@^3.0.3": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/stream-buffers/-/stream-buffers-3.0.4.tgz#bf128182da7bc62722ca0ddf5458a9c65f76e648" + integrity sha512-qU/K1tb2yUdhXkLIATzsIPwbtX6BpZk0l3dPW6xqWyhfzzM1ECaQ/8faEnu3CNraLiQ9LHyQQPBGp7N9Fbs25w== dependencies: - "@testing-library/dom" "*" + "@types/node" "*" + +"@types/supports-color@^8.1.0": + version "8.1.1" + resolved "https://registry.yarnpkg.com/@types/supports-color/-/supports-color-8.1.1.tgz#1b44b1b096479273adf7f93c75fc4ecc40a61ee4" + integrity sha512-dPWnWsf+kzIG140B8z2w3fr5D03TLWbOAFQl45xUpI3vcizeXriNR5VYkWZ+WTMsUHqZ9Xlt3hrxGNANFyNQfw== -"@types/testing-library__dom@^6.12.1": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-6.14.0.tgz#1aede831cb4ed4a398448df5a2c54b54a365644e" - integrity sha512-sMl7OSv0AvMOqn1UJ6j1unPMIHRXen0Ita1ujnMX912rrOcawe4f7wu0Zt9GIQhBhJvH2BaibqFgQ3lP+Pj2hA== +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.3" + resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz#ee6c7ffe9f8595882ee7bda8af33ae7b8789ef17" + integrity sha512-oKZe+Mf4ioWlMuzVBaXQ9WDnEm1+umLx0InILg+yvZVBBDmzV5KfZyLrCvadtWcx8+916jLmHafcmqqffl+iIw== dependencies: - pretty-format "^24.3.0" + "@types/jest" "*" -"@types/testing-library__react@^9.1.2": - version "9.1.3" - resolved "https://registry.yarnpkg.com/@types/testing-library__react/-/testing-library__react-9.1.3.tgz#35eca61cc6ea923543796f16034882a1603d7302" - integrity sha512-iCdNPKU3IsYwRK9JieSYAiX0+aYDXOGAmrC/3/M7AqqSDKnWWVv07X+Zk1uFSL7cMTUYzv4lQRfohucEocn5/w== +"@types/through@*": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" + integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== dependencies: - "@types/react-dom" "*" - "@types/testing-library__dom" "*" - pretty-format "^25.1.0" + "@types/node" "*" -"@types/tough-cookie@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.1.tgz#8f80dd965ad81f3e1bc26d6f5c727e132721ff40" - integrity sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg== +"@types/tmp@^0.2.0": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" + integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== -"@types/uglify-js@*": - version "3.13.2" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.2.tgz#1044c1713fb81cb1ceef29ad8a9ee1ce08d690ef" - integrity sha512-/xFrPIo+4zOeNGtVMbf9rUm0N+i4pDf1ynExomqtokIJmVzR3962lJ1UE+MmexMkA0cmN9oTzg5Xcbwge0Ij2Q== - dependencies: - source-map "^0.6.1" +"@types/trusted-types@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== -"@types/webpack-sources@*": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b" - integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.7.3" +"@types/ua-parser-js@^0.7.33": + version "0.7.36" + resolved "https://registry.yarnpkg.com/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz#9bd0b47f26b5a3151be21ba4ce9f5fa457c5f190" + integrity sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ== + +"@types/validator@^13.1.3": + version "13.7.2" + resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.7.2.tgz#a2114225d9be743fb154b06c29b8257aaca42922" + integrity sha512-KFcchQ3h0OPQgFirBRPZr5F/sVjxZsOrQHedj3zi8AH3Zv/hOLx2OLR4hxR5HcfoU+33n69ZuOfzthKVdMoTiw== + +"@types/which@^1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/which/-/which-1.3.2.tgz#9c246fc0c93ded311c8512df2891fb41f6227fdf" + integrity sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA== -"@types/webpack@^4.41.8": - version "4.41.32" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212" - integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg== +"@types/ws@^8.5.1": + version "8.5.3" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" + integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== dependencies: "@types/node" "*" - "@types/tapable" "^1" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - anymatch "^3.0.0" - source-map "^0.6.0" "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^13.0.0": - version "13.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" - integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== +"@types/yargs@^16.0.0": + version "16.0.4" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" + integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== dependencies: "@types/yargs-parser" "*" -"@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== +"@types/yargs@^17.0.8": + version "17.0.10" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" + integrity sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA== dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^4.5.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276" - integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== dependencies: - "@typescript-eslint/experimental-utils" "4.33.0" - "@typescript-eslint/scope-manager" "4.33.0" - debug "^4.3.1" + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.5.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.23.0.tgz#bc4cbcf91fbbcc2e47e534774781b82ae25cc3d8" + integrity sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA== + dependencies: + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/type-utils" "5.23.0" + "@typescript-eslint/utils" "5.23.0" + debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" - regexpp "^3.1.0" + regexpp "^3.2.0" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/experimental-utils@4.33.0", "@typescript-eslint/experimental-utils@^4.0.1": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd" - integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-5.23.0.tgz#ea03860fa612dadf272789988f2ce41f0b7bb2f7" + integrity sha512-I+3YGQztH1DM9kgWzjslpZzJCBMRz0KhYG2WP62IwpooeZ1L6Qt0mNK8zs+uP+R2HOsr+TeDW35Pitc3PfVv8Q== dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/experimental-utils@^3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz#e179ffc81a80ebcae2ea04e0332f8b251345a686" - integrity sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/typescript-estree" "3.10.1" - eslint-scope "^5.0.0" - eslint-utils "^2.0.0" - -"@typescript-eslint/parser@^4.5.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.33.0.tgz#dfe797570d9694e560528d18eecad86c8c744899" - integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== - dependencies: - "@typescript-eslint/scope-manager" "4.33.0" - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/typescript-estree" "4.33.0" - debug "^4.3.1" + "@typescript-eslint/utils" "5.23.0" -"@typescript-eslint/scope-manager@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3" - integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== +"@typescript-eslint/parser@^5.5.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.23.0.tgz#443778e1afc9a8ff180f91b5e260ac3bec5e2de1" + integrity sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" + debug "^4.3.2" -"@typescript-eslint/types@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" - integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== - -"@typescript-eslint/types@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" - integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== +"@typescript-eslint/scope-manager@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.23.0.tgz#4305e61c2c8e3cfa3787d30f54e79430cc17ce1b" + integrity sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw== + dependencies: + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" -"@typescript-eslint/typescript-estree@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz#fd0061cc38add4fad45136d654408569f365b853" - integrity sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w== +"@typescript-eslint/type-utils@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz#f852252f2fc27620d5bb279d8fed2a13d2e3685e" + integrity sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw== dependencies: - "@typescript-eslint/types" "3.10.1" - "@typescript-eslint/visitor-keys" "3.10.1" - debug "^4.1.1" - glob "^7.1.6" - is-glob "^4.0.1" - lodash "^4.17.15" - semver "^7.3.2" - tsutils "^3.17.1" + "@typescript-eslint/utils" "5.23.0" + debug "^4.3.2" + tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" - integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== +"@typescript-eslint/types@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.23.0.tgz#8733de0f58ae0ed318dbdd8f09868cdbf9f9ad09" + integrity sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw== + +"@typescript-eslint/typescript-estree@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.23.0.tgz#dca5f10a0a85226db0796e8ad86addc9aee52065" + integrity sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg== dependencies: - "@typescript-eslint/types" "4.33.0" - "@typescript-eslint/visitor-keys" "4.33.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" + debug "^4.3.2" + globby "^11.0.4" + is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/visitor-keys@3.10.1": - version "3.10.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz#cd4274773e3eb63b2e870ac602274487ecd1e931" - integrity sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ== +"@typescript-eslint/utils@5.23.0", "@typescript-eslint/utils@^5.13.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.23.0.tgz#4691c3d1b414da2c53d8943310df36ab1c50648a" + integrity sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA== dependencies: - eslint-visitor-keys "^1.1.0" + "@types/json-schema" "^7.0.9" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@4.33.0": - version "4.33.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" - integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== +"@typescript-eslint/visitor-keys@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz#057c60a7ca64667a39f991473059377a8067c87b" + integrity sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg== dependencies: - "@typescript-eslint/types" "4.33.0" - eslint-visitor-keys "^2.0.0" + "@typescript-eslint/types" "5.23.0" + eslint-visitor-keys "^3.0.0" -"@wdio/cli@5.18.5": - version "5.18.5" - resolved "https://registry.yarnpkg.com/@wdio/cli/-/cli-5.18.5.tgz#549ffd1813338de80b25544f27937f4291166816" - integrity sha512-CLp9yO9jjjzb+zFJnkE+r2qt8ozmf4ed4na7nXmCl9xaNYlXNanUDVtBODW9aSjuJfQDohW9W47emk+RruwbdA== - dependencies: - "@wdio/config" "5.18.4" - "@wdio/logger" "5.16.10" - "@wdio/utils" "5.16.15" +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +"@wdio/cli@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/cli/-/cli-7.19.7.tgz#3a5c5de45839e218e4b5f326f7fe2e4c2634da42" + integrity sha512-BxAL2iHBZ/3J5hP48kRWfL6zI7T/WKtybsvQtuDSwYzpgJq6ZrCS8bbOldH6Nvb3YRaP7MmItRQFG7bQwFzJew== + dependencies: + "@types/ejs" "^3.0.5" + "@types/fs-extra" "^9.0.4" + "@types/inquirer" "^8.1.2" + "@types/lodash.flattendeep" "^4.4.6" + "@types/lodash.pickby" "^4.6.6" + "@types/lodash.union" "^4.6.6" + "@types/node" "^17.0.4" + "@types/recursive-readdir" "^2.2.0" + "@wdio/config" "7.19.5" + "@wdio/logger" "7.19.0" + "@wdio/types" "7.19.5" + "@wdio/utils" "7.19.7" async-exit-hook "^2.0.1" - chalk "^3.0.0" + chalk "^4.0.0" chokidar "^3.0.0" cli-spinners "^2.1.0" ejs "^3.0.1" - fs-extra "^8.0.1" - inquirer "^7.0.0" + fs-extra "^10.0.0" + inquirer "8.2.4" lodash.flattendeep "^4.4.0" lodash.pickby "^4.6.0" lodash.union "^4.6.0" - log-update "^3.2.0" - webdriverio "5.18.5" - yargs "^15.0.1" + mkdirp "^1.0.4" + recursive-readdir "^2.2.2" + webdriverio "7.19.7" + yargs "^17.0.0" yarn-install "^1.0.0" -"@wdio/config@5.18.4": - version "5.18.4" - resolved "https://registry.yarnpkg.com/@wdio/config/-/config-5.18.4.tgz#cabbac2f42bb1f8ac768f79d0e7671976d97d30e" - integrity sha512-HQugjG+BABDYG/1dPR6KA+IQilsg1MSQ/NVIg8R6I8ER9MA2JNIoaxvXZ+CnDfgY/QpyIHEeqJhfgw8GElaPdw== - dependencies: - "@wdio/logger" "5.16.10" - deepmerge "^4.0.0" - glob "^7.1.2" - -"@wdio/config@5.22.4": - version "5.22.4" - resolved "https://registry.yarnpkg.com/@wdio/config/-/config-5.22.4.tgz#053d4ba0a8b0dae6be740b1b7b9ab25abac2799e" - integrity sha512-i5dJQWb80darcRA//tfG0guMeQCeRUXroZNnHjGNb1qzvTRZmcIIhdxaD+DbK/5dWEx6aoMfoi6wjVp/CXwdAg== +"@wdio/config@7.19.5": + version "7.19.5" + resolved "https://registry.yarnpkg.com/@wdio/config/-/config-7.19.5.tgz#aa8158d648e1ffb28a7e53474d5ce171066e82f7" + integrity sha512-GyG0SSUjw9RyDgEwculgwiWyQ0eEeFAgaKTAa4RHC6ZgHHTgfyxzkWqBmNLzHfiB6GSR2DyZDcDsPT7ZAHkiEg== dependencies: - "@wdio/logger" "5.16.10" + "@wdio/logger" "7.19.0" + "@wdio/types" "7.19.5" deepmerge "^4.0.0" glob "^7.1.2" -"@wdio/junit-reporter@5.18.3": - version "5.18.3" - resolved "https://registry.yarnpkg.com/@wdio/junit-reporter/-/junit-reporter-5.18.3.tgz#893d5555ebcd51b2469189c2922d7fc5b95c506e" - integrity sha512-25SXzPVujFCrk7NhfkPFfJfkYGJugnRiWHp8CmMKW7SHhvTJXSYJaD0Ocgb+fekigNpcJ7ecJV5M3Fxw2ieSXQ== +"@wdio/junit-reporter@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/junit-reporter/-/junit-reporter-7.19.7.tgz#1d983928ad9f3aa07c7ebfa448315052dce440ed" + integrity sha512-x3sjHybj+WpRJt7HIvW9ae3F6kaeV+/KUTUMYVMkl/USI623unuFEqEtv5gpL77g+k763nE+XUZCq2mXMMWLyw== dependencies: - "@wdio/reporter" "5.15.2" + "@types/json-stringify-safe" "^5.0.0" + "@types/validator" "^13.1.3" + "@wdio/reporter" "7.19.7" + "@wdio/types" "7.19.5" json-stringify-safe "^5.0.1" - junit-report-builder "^1.3.0" - validator "^12.0.0" - -"@wdio/local-runner@5.18.5": - version "5.18.5" - resolved "https://registry.yarnpkg.com/@wdio/local-runner/-/local-runner-5.18.5.tgz#ffedeb68d6c76880996f5e875c6b2e0bc51657f6" - integrity sha512-S84vhSzB4a7DhVpu+aTHsFYy2MYk0FYcLgJfCNfPnJSw7MVm/QBp3J6UyzRl6SpQP6suV3TKAQ/JfIWwPKRKdA== - dependencies: - "@wdio/logger" "5.16.10" - "@wdio/repl" "5.16.15" - "@wdio/runner" "5.18.5" + junit-report-builder "^3.0.0" + validator "^13.0.0" + +"@wdio/local-runner@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/local-runner/-/local-runner-7.19.7.tgz#519d28d7f5f0204a996c6d441bfc1dd0aac02829" + integrity sha512-DZPaAzUwYZKO1OpBIeGppbY1vP9LJ1N/YT2/FkBy0mvSJ4NbJHj0jbKNUrGpEzOMIklbYPV/htxy3l29pjOkDg== + dependencies: + "@types/stream-buffers" "^3.0.3" + "@wdio/logger" "7.19.0" + "@wdio/repl" "7.19.7" + "@wdio/runner" "7.19.7" + "@wdio/types" "7.19.5" async-exit-hook "^2.0.1" + split2 "^4.0.0" stream-buffers "^3.0.2" -"@wdio/logger@5.16.10": - version "5.16.10" - resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-5.16.10.tgz#45d0ea485d52c8a7c526954ccc980d54c3e29e56" - integrity sha512-hRKhxgd9uB48Dtj2xe2ckxU4KwI/RO8IwguySuaI2SLFj6EDbdonwzpVkq111/fjBuq7R1NauAaNcm3AMEbIFA== +"@wdio/logger@7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@wdio/logger/-/logger-7.19.0.tgz#23697a4b4aaea56c3bd477a0393af2a5c175fc85" + integrity sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ== dependencies: - chalk "^3.0.0" + chalk "^4.0.0" loglevel "^1.6.0" loglevel-plugin-prefix "^0.8.4" strip-ansi "^6.0.0" -"@wdio/mocha-framework@5.16.15": - version "5.16.15" - resolved "https://registry.yarnpkg.com/@wdio/mocha-framework/-/mocha-framework-5.16.15.tgz#c464eef3561444d2fde658887e8b859c622f4230" - integrity sha512-nWwpghEAgQLh2NDP0dBcqPHONk56MLsAWPfHhOiT1coWsyvKQ60r9jD/8i/iQz+i9hldlAI5Or0pKQx9fTjkBA== - dependencies: - "@wdio/logger" "5.16.10" - "@wdio/utils" "5.16.15" - mocha "^6.1.0" - -"@wdio/protocols@5.16.7": - version "5.16.7" - resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-5.16.7.tgz#cf8af4fe9e362e879e9b39543ec8ad1770847764" - integrity sha512-fBlK/lfKeyxTQOfzgnpE0F7tBwb9maTgVkqv2LlvameB0Rsy18js1/cUhjJkpESXiK9md0si/CROdNaNliBKmg== - -"@wdio/protocols@5.22.1": - version "5.22.1" - resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-5.22.1.tgz#51fde0acb57d4ddf07d078fef0ad9c91d227229d" - integrity sha512-GdoWb/HTrb09Qb0S/7sLp1NU94LAhTsF1NnFj5sEFSUpecrl0S07pnhVg54pUImectN/woaqSl7uJGjlSGZcdQ== - -"@wdio/repl@5.16.15": - version "5.16.15" - resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-5.16.15.tgz#b419e4ee4079386bd1baebbbf2359f636ff901ac" - integrity sha512-AklEbnjL7uxr5+7IgD1RZEE1c7QKQpmNKx8DrOPVjNJIBjUmcatOFG+9R+sysyRI957DA5tlnU513dtF5rlGZg== - dependencies: - "@wdio/utils" "5.16.15" - -"@wdio/repl@5.23.0": - version "5.23.0" - resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-5.23.0.tgz#6a4fd9d5c0351d04235c09d1c80e39d71b2d8c00" - integrity sha512-cKG9m0XuqcQenQmoup0yJX1fkDQEdY06QXuwt636ZQf6XgDoeoAdNOgnRnNruQ0+JsC2eqHFoSNto1q8wcLH/g== - dependencies: - "@wdio/utils" "5.23.0" - -"@wdio/reporter@5.15.2": - version "5.15.2" - resolved "https://registry.yarnpkg.com/@wdio/reporter/-/reporter-5.15.2.tgz#578a2f99aaa02c5d419230a6b18d759960504478" - integrity sha512-M2eBZDvJIfa8ao81hcNbl9tN/pDtflSFFBa9iDcwPdztVplI50ob4xTlrsztv8V3Ox2En1TnfX1bQiV7E7gTiA== - dependencies: - fs-extra "^8.0.1" - -"@wdio/runner@5.18.5": - version "5.18.5" - resolved "https://registry.yarnpkg.com/@wdio/runner/-/runner-5.18.5.tgz#7b285e39b052905afb3dba64aab5fa6d3531ffea" - integrity sha512-jq9DMJw8s0cod6ioAPr9bpuDqRmr4MhixCLjFnNVntIK8x2pJSSMwraWMR1D8lmRWuqrPE9TWCUGydOWUjAr/g== - dependencies: - "@wdio/config" "5.18.4" - "@wdio/logger" "5.16.10" - "@wdio/utils" "5.16.15" +"@wdio/mocha-framework@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/mocha-framework/-/mocha-framework-7.19.7.tgz#58b0f397108ffc966242a45603c659b993f78c70" + integrity sha512-8QLIiveyfkHk4qulytNPNvSQ8YqANgrDjrKOryFF1EzdrjwdX0jLdfb23lKqDvFfBCWLWQ8DdY090gD6/tJOQg== + dependencies: + "@types/mocha" "^9.0.0" + "@wdio/logger" "7.19.0" + "@wdio/types" "7.19.5" + "@wdio/utils" "7.19.7" + expect-webdriverio "^3.0.0" + mocha "^10.0.0" + +"@wdio/protocols@7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@wdio/protocols/-/protocols-7.19.0.tgz#cd753752c64b9c1dd7ace05398c1d11c46af41ab" + integrity sha512-ji74rQag6v+INSNd0J8eAh2rpH5vOXgeiP5Qr32K6PWU6HzYWuAFH2x4srXsH0JawHCdTK2OQAOYrLmMb44hug== + +"@wdio/repl@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/repl/-/repl-7.19.7.tgz#bfcc1128785bc747e775c6baa280782f7e064eb7" + integrity sha512-6lgzZxSU2yV0YLb4byBASeC42y5rAZk7mOQ41fHTXyC9CfRJubwe47M9KJyAoOrHG2wpwUX92RLTpDrAVDV6Fg== + dependencies: + "@wdio/utils" "7.19.7" + +"@wdio/reporter@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/reporter/-/reporter-7.19.7.tgz#d595a631cedf387d015d55a51afe1549333c367b" + integrity sha512-Dum19gpfru66FnIq78/4HTuW87B7ceLDp6PJXwQM5kXyN7Gb7zhMgp6FZTM0FCYLyi6U/zXZSvpNUYl77caS6g== + dependencies: + "@types/diff" "^5.0.0" + "@types/node" "^17.0.4" + "@types/object-inspect" "^1.8.0" + "@types/supports-color" "^8.1.0" + "@types/tmp" "^0.2.0" + "@wdio/types" "7.19.5" + diff "^5.0.0" + fs-extra "^10.0.0" + object-inspect "^1.10.3" + supports-color "8.1.1" + +"@wdio/runner@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/runner/-/runner-7.19.7.tgz#d0115c52a02c2e4878e5450c3dbd9f214dff1ebc" + integrity sha512-PH4vOMwPnAU+cOTPrkJrU20CDDFGccBf4VV80GAQK9b71pfD+T7MIvUCnL0x/kMgIQV/0rFtM+6y5CDZI0R27g== + dependencies: + "@wdio/config" "7.19.5" + "@wdio/logger" "7.19.0" + "@wdio/types" "7.19.5" + "@wdio/utils" "7.19.7" deepmerge "^4.0.0" gaze "^1.1.2" - webdriverio "5.18.5" - -"@wdio/selenium-standalone-service@5.16.10": - version "5.16.10" - resolved "https://registry.yarnpkg.com/@wdio/selenium-standalone-service/-/selenium-standalone-service-5.16.10.tgz#1d76a9e2334a54abaae32ed5b414624a56112e9d" - integrity sha512-IudfrPgFoejkM+UT4sPv9g5pAGax7+CyHDZkbPDl2XXsct3gdAXDVe57KWuNYX+s0jFu8MSR/4nLnvJjdydNjw== - dependencies: - "@types/selenium-standalone" "^6.15.0" - "@wdio/logger" "5.16.10" - fs-extra "^8.0.1" - selenium-standalone "^6.15.1" - -"@wdio/spec-reporter@5.16.11": - version "5.16.11" - resolved "https://registry.yarnpkg.com/@wdio/spec-reporter/-/spec-reporter-5.16.11.tgz#5eaaef37a02f076bf1ebb4452d5e7dad0db558ca" - integrity sha512-UFqgq2VRgFxGBeIPufITKFZdrw6IuT/PN3uAoxWwoazicy0ghcOOwtVQpXsi0MIC6T3GsWIPdRgVhzk73l1U8w== - dependencies: - "@wdio/reporter" "5.15.2" - chalk "^3.0.0" + webdriver "7.19.7" + webdriverio "7.19.7" + +"@wdio/selenium-standalone-service@7.19.5": + version "7.19.5" + resolved "https://registry.yarnpkg.com/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.19.5.tgz#9bb383b5d9bbddc9df9de308d86459df7332c579" + integrity sha512-Llq4zeQiWSOrAdtmAMyr3jiGAxC4mTOJUmCsj6EmzIwOx9wjagfO+ehx3OPdpjYlubSiJFJO8eT2lR34GHNARg== + dependencies: + "@types/fs-extra" "^9.0.1" + "@types/node" "^17.0.4" + "@types/selenium-standalone" "^7.0.0" + "@wdio/config" "7.19.5" + "@wdio/logger" "7.19.0" + "@wdio/types" "7.19.5" + fs-extra "^10.0.0" + selenium-standalone "^8.0.3" + +"@wdio/spec-reporter@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/spec-reporter/-/spec-reporter-7.19.7.tgz#dd0f69f2e178e8c4a74121865a80abe2ccbd8f1e" + integrity sha512-BDBZU2EK/GuC9VxtfqPtoW43FmvKxYDsvcDVDi3F7o+9fkcuGSJiWbw1AX251ZzzVQ7YP9ImTitSpdpUKXkilQ== + dependencies: + "@types/easy-table" "^0.0.33" + "@wdio/reporter" "7.19.7" + "@wdio/types" "7.19.5" + chalk "^4.0.0" easy-table "^1.1.1" - pretty-ms "^5.0.0" - -"@wdio/sync@5.18.5": - version "5.18.5" - resolved "https://registry.yarnpkg.com/@wdio/sync/-/sync-5.18.5.tgz#eb4fc399879a523a187a20c1838653bad9a51f1b" - integrity sha512-r7ZqJYK0VTAEe3dw3CjOfU34BNdnVmdqsmiQ6O/x1MVeuhgJJdLZy9AXzL5pi594H9+Qu64R+pay9fNAXjryOg== - dependencies: - "@wdio/logger" "5.16.10" - optionalDependencies: - fibers "^4.0.1" - fibers_node_v8 "^3.1.2" + pretty-ms "^7.0.0" + +"@wdio/sync@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/sync/-/sync-7.19.7.tgz#19f685f1b052a154e7121fe6c19e2f227dde3457" + integrity sha512-iKQSeO3qWJKBB5Lt7Ir+AE1uZJgG0JVXnGfzTcvQAfn0i3ZdcMe4kQJrHIu8q8GxW8LeZh5MmSq2XP/VXjd1DQ== + dependencies: + "@types/fibers" "^3.1.0" + "@types/puppeteer" "^5.4.0" + "@wdio/logger" "7.19.0" + "@wdio/types" "7.19.5" + fibers "^5.0.0" + webdriverio "7.19.7" + +"@wdio/types@7.19.5": + version "7.19.5" + resolved "https://registry.yarnpkg.com/@wdio/types/-/types-7.19.5.tgz#e05790f61dfab54ee6683ac799cb5f96615d1d0f" + integrity sha512-S1lC0pmtEO7NVH/2nM1c7NHbkgxLZH3VVG/z6ym3Bbxdtcqi2LMsEvvawMAU/fmhyiIkMsGZCO8vxG9cRw4z4A== + dependencies: + "@types/node" "^17.0.4" + got "^11.8.1" + +"@wdio/utils@7.19.7": + version "7.19.7" + resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-7.19.7.tgz#b1dd86a12a08ba4f445a70c9859e30cff6eb522f" + integrity sha512-i/fBnEmEGDQ8Sr8H8p9UZ0kUPjSQhoJE2EullSyX+YgyZDtO3JO0M0jiRpbCFr0M+7fi17g+YOzQWmCSRGhPJA== + dependencies: + "@wdio/logger" "7.19.0" + "@wdio/types" "7.19.5" + p-iteration "^1.1.8" + +"@webassemblyjs/ast@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + +"@webassemblyjs/floating-point-hex-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== + +"@webassemblyjs/helper-api-error@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== + +"@webassemblyjs/helper-buffer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== + +"@webassemblyjs/helper-numbers@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@xtuc/long" "4.2.2" -"@wdio/utils@5.16.15": - version "5.16.15" - resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-5.16.15.tgz#c2228dcb196079a2e6c8758506de05d5ba3196e2" - integrity sha512-xeZSAeDtzm1+zVRjTuhsEKpcXokOZU1NrnXBacNNwyKIfRMwPUmyOX3WvKtHL+2OuLXjKP9dlRMHbPgX/nsz4w== - dependencies: - "@wdio/logger" "5.16.10" - deepmerge "^4.0.0" +"@webassemblyjs/helper-wasm-bytecode@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== -"@wdio/utils@5.23.0": - version "5.23.0" - resolved "https://registry.yarnpkg.com/@wdio/utils/-/utils-5.23.0.tgz#af22c6d4a346990c87f9e65cfb8e7ba75e552eff" - integrity sha512-dWPEkDiaNUqJXPO6L2di2apI7Rle7Er4euh67Wlb5+3MrPNjCKhiF8gHcpQeL8oe6A1MH/f89kpSEEXe4BMkAw== +"@webassemblyjs/helper-wasm-section@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== dependencies: - "@wdio/logger" "5.16.10" - deepmerge "^4.0.0" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== +"@webassemblyjs/ieee754@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== +"@webassemblyjs/leb128@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" +"@webassemblyjs/utf8@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== + +"@webassemblyjs/wasm-edit@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-wasm-section" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-opt" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/wast-printer" "1.11.1" + +"@webassemblyjs/wasm-gen@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wasm-opt@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-buffer" "1.11.1" + "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + +"@webassemblyjs/wasm-parser@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== + dependencies: + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/ieee754" "1.11.1" + "@webassemblyjs/leb128" "1.11.1" + "@webassemblyjs/utf8" "1.11.1" + +"@webassemblyjs/wast-printer@1.11.1": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== + dependencies: + "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": @@ -2598,22 +2956,31 @@ acorn-globals@^6.0.0: acorn "^7.1.1" acorn-walk "^7.1.1" -acorn-jsx@^5.3.1: +acorn-import-assertions@^1.7.6: + version "1.8.0" + resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== + +acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^7.1.1: +acorn-node@^1.6.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" + integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== + dependencies: + acorn "^7.0.0" + acorn-walk "^7.0.0" + xtend "^4.0.2" + +acorn-walk@^7.0.0, acorn-walk@^7.1.1: version "7.2.0" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.0.0, acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -2623,15 +2990,25 @@ acorn@^8.2.4, acorn@^8.5.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== -address@1.1.2, address@^1.0.1: +acorn@^8.4.1, acorn@^8.7.1: + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + +address@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== -adjust-sourcemap-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz#5ae12fb5b7b1c585e80bbb5a63ec163a1a45e61e" - integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw== +address@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9" + integrity sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== dependencies: loader-utils "^2.0.0" regex-parser "^2.2.11" @@ -2643,25 +3020,26 @@ agent-base@6: dependencies: debug "4" -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv "^8.0.0" -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2671,7 +3049,7 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: +ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: version "8.11.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== @@ -2681,31 +3059,11 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - -ansi-colors@^4.1.1: +ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -2713,37 +3071,32 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: dependencies: type-fest "^0.21.3" -ansi-html@0.0.7, ansi-html@^0.0.7, ansi-html@^0.0.8: +ansi-html-community@^0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.8.tgz#e969db193b12bcdfa6727b29ffd8882dc13cc501" - integrity sha512-QROYz1I1Kj+8bTYgx0IlMBpRSCIU+7GjbE0oH+KF7QKc+qSF8YAlIutN59Db17tXN70Ono9upT9Ht0iG93W7ug== + resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.0.0, ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -2762,15 +3115,7 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: +anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -2778,11 +3123,6 @@ anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - archiver-utils@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2" @@ -2799,18 +3139,23 @@ archiver-utils@^2.1.0: normalize-path "^3.0.0" readable-stream "^2.0.0" -archiver@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-3.1.1.tgz#9db7819d4daf60aec10fe86b16cb9258ced66ea0" - integrity sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg== +archiver@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.1.tgz#21e92811d6f09ecfce649fbefefe8c79e57cbbb6" + integrity sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w== dependencies: archiver-utils "^2.1.0" - async "^2.6.3" + async "^3.2.3" buffer-crc32 "^0.2.1" - glob "^7.1.4" - readable-stream "^3.4.0" - tar-stream "^2.1.0" - zip-stream "^2.1.2" + readable-stream "^3.6.0" + readdir-glob "^1.0.0" + tar-stream "^2.2.0" + zip-stream "^4.1.0" + +arg@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.1.tgz#eb0c9a8f77786cad2af8ff2b862899842d7b6adb" + integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== argparse@^1.0.7: version "1.0.10" @@ -2819,7 +3164,12 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -aria-query@^4.0.2, aria-query@^4.2.2: +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-query@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== @@ -2832,32 +3182,12 @@ aria-query@^5.0.0: resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== -arity-n@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/arity-n/-/arity-n-1.0.4.tgz#d9e76b11733e08569c0847ae7b39b2860b30b745" - integrity sha1-2edrEXM+CFacCEeuezmyhgswt0U= - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= -array-flatten@^2.1.0: +array-flatten@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== @@ -2873,28 +3203,11 @@ array-includes@^3.1.4: get-intrinsic "^1.1.1" is-string "^1.0.7" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - array.prototype.flat@^1.2.5: version "1.3.0" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" @@ -2915,77 +3228,22 @@ array.prototype.flatmap@^1.2.5: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - ast-types-flow@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0= -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - async-exit-hook@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/async-exit-hook/-/async-exit-hook-2.0.1.tgz#8bd8b024b0ec9b1c01cccb9af9db29bd717dfaf3" integrity sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw== -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@0.9.x, async@^2.6.2, async@^2.6.3, async@^3.2.2: +async@^3.2.2, async@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/async/-/async-3.2.3.tgz#ac53dafd3f4720ee9e8a160628f18ea91df196c9" integrity sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g== @@ -3005,28 +3263,17 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^9.6.1: - version "9.8.8" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" - integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== +autoprefixer@^10.4.6: + version "10.4.7" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" + integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" + browserslist "^4.20.3" + caniuse-lite "^1.0.30001335" + fraction.js "^4.2.0" normalize-range "^0.1.2" - num2fraction "^1.2.2" - picocolors "^0.2.1" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" axe-core@^4.3.5: version "4.4.1" @@ -3038,48 +3285,28 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -babel-extract-comments@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz#0a2aedf81417ed391b85e18b4614e693a0351a21" - integrity sha512-qWWzi4TlddohA91bFwgt6zO/J0X+io7Qp184Fw0m2JYRSTZnJbFR8+07KmzudHCZgOiKRCrjhylwv9Xd8gfhVQ== - dependencies: - babylon "^6.18.0" - -babel-jest@^26.6.0, babel-jest@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056" - integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA== - dependencies: - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/babel__core" "^7.1.7" - babel-plugin-istanbul "^6.0.0" - babel-preset-jest "^26.6.2" +babel-jest@^27.4.2, babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3" - integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw== +babel-loader@^8.2.3: + version "8.2.5" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" + integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ== dependencies: - find-cache-dir "^2.1.0" - loader-utils "^1.4.0" - mkdirp "^0.5.3" - pify "^4.0.1" + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" schema-utils "^2.6.5" babel-plugin-dynamic-import-node@^2.3.3: @@ -3089,7 +3316,7 @@ babel-plugin-dynamic-import-node@^2.3.3: dependencies: object.assign "^4.1.0" -babel-plugin-istanbul@^6.0.0: +babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== @@ -3100,10 +3327,10 @@ babel-plugin-istanbul@^6.0.0: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d" - integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw== +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -3119,7 +3346,7 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-named-asset-import@^0.3.7: +babel-plugin-named-asset-import@^0.3.8: version "0.3.8" resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz#6b7fa43c59229685368683c28bc9734f24524cc2" integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== @@ -3164,19 +3391,6 @@ babel-plugin-syntax-jsx@^6.18.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY= - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - babel-plugin-transform-react-remove-prop-types@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" @@ -3200,15 +3414,15 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee" - integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ== +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== dependencies: - babel-plugin-jest-hoist "^26.6.2" + babel-plugin-jest-hoist "^27.5.1" babel-preset-current-node-syntax "^1.0.0" -babel-preset-react-app@^10.0.0: +babel-preset-react-app@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz#ed6005a20a24f2c88521809fa9aea99903751584" integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== @@ -3230,54 +3444,21 @@ babel-preset-react-app@^10.0.0: babel-plugin-macros "^3.1.0" babel-plugin-transform-react-remove-prop-types "^0.4.24" -babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== - balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64-js@^1.0.2, base64-js@^1.3.1: +base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - bfj@^7.0.2: version "7.0.2" resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.0.2.tgz#1988ce76f3add9ac2913fd8ba47aad9e651bfbb2" @@ -3298,24 +3479,12 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3: +bl@^4.0.3, bl@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== @@ -3329,43 +3498,33 @@ bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== - -body-parser@1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.2.tgz#4714ccd9c157d44797b8b5607d72c0b89952f26e" - integrity sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw== +body-parser@1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== dependencies: bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.7" - raw-body "2.4.3" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= +bonjour-service@^1.0.11: + version "1.0.12" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.12.tgz#28fbd4683f5f2e36feedb833e24ba661cac960c3" + integrity sha512-pMmguXYCu63Ug37DluMKEHdxc+aaIf/ay4YbF8Gxtba+9d3u+rmEWy61VK3Z3hp8Rskok3BunHYnG0dUHAsblw== dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" + array-flatten "^2.1.2" dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.4" boolbase@^1.0.0: version "1.0.0" @@ -3380,21 +3539,12 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" @@ -3417,11 +3567,6 @@ broadcast-channel@^3.4.1: rimraf "3.0.2" unload "2.2.0" -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" @@ -3432,68 +3577,7 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -browserslist@4.14.2, browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.5, browserslist@^4.17.5, browserslist@^4.19.1, browserslist@^4.6.2, browserslist@^4.6.4: +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.17.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.20.2: version "4.20.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.2.tgz#567b41508757ecd904dab4d1c646c612cd3d4f88" integrity sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA== @@ -3504,6 +3588,17 @@ browserslist@4.14.2, browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4. node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.20.3: + version "4.20.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3521,26 +3616,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffer@^5.1.0, buffer@^5.5.0: +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3553,11 +3629,6 @@ builtin-modules@^3.1.0: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -3581,66 +3652,6 @@ cac@^3.0.3: suffix "^0.1.0" text-table "^0.2.0" -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cacache@^15.0.5: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cacheable-lookup@^5.0.3: version "5.0.4" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" @@ -3667,31 +3678,12 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" -caller-callsite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" - integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= - dependencies: - callsites "^2.0.0" - -caller-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" - integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= - dependencies: - caller-callsite "^2.0.0" - -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= - callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camel-case@^4.1.1: +camel-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== @@ -3699,6 +3691,11 @@ camel-case@^4.1.1: pascal-case "^3.1.2" tslib "^2.0.3" +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase-keys@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-3.0.0.tgz#fc0c6c360363f7377e3793b9a16bccf1070c1ca4" @@ -3707,17 +3704,17 @@ camelcase-keys@^3.0.0: camelcase "^3.0.0" map-obj "^1.0.0" -camelcase@5.3.1, camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= -camelcase@^6.0.0, camelcase@^6.1.0, camelcase@^6.2.0: +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0, camelcase@^6.2.0, camelcase@^6.2.1: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -3737,36 +3734,20 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001317: +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001317: version "1.0.30001328" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001328.tgz#0ed7a2ca65ec45872c613630201644237ba1e329" integrity sha512-Ue55jHkR/s4r00FLNiX+hGMMuwml/QGqqzVeMQ5thUewznU2EdULFvI3JR7JJid6OrjJNfFvHY2G2dIjmRaDDQ== -capture-exit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" - integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g== - dependencies: - rsvp "^4.8.4" - -case-sensitive-paths-webpack-plugin@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz#23ac613cc9a856e4f88ff8bb73bbb5e989825cf7" - integrity sha512-/4YgnZS8y1UXXmC02xD5rRrBEu6T5ub+mQHLNRj0fzTRbgdBYhsNo2V5EqwgqrExjxsjtF/OpAKAMkKsxbD5XQ== - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: + version "1.0.30001340" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001340.tgz#029a2f8bfc025d4820fafbfaa6259fd7778340c7" + integrity sha512-jUNz+a9blQTQVu4uFcn17uAD8IDizPzQkIKh3LCJfg9BkyIqExYYdyc/ZSlWUSKb8iYiXxKsxbv4zYSvkqjrxw== -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz#db64066c6422eed2e08cc14b986ca43796dbc6d4" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== chalk@^1.1.3: version "1.1.3" @@ -3779,6 +3760,15 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" @@ -3787,7 +3777,7 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -3800,6 +3790,11 @@ char-regex@^1.0.2: resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-2.0.1.tgz#6dafdb25f9d3349914079f010ba8d0e6ff9cd01e" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + charcodes@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/charcodes/-/charcodes-0.2.0.tgz#5208d327e6cc05f99eb80ffc814707572d1f14e4" @@ -3815,7 +3810,7 @@ check-types@^11.1.1: resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.1.2.tgz#86a7c12bf5539f6324eb0e70ca8896c0e38f3e2f" integrity sha512-tzWzvgePgLORb9/3a0YenggReLKAIb2owL03H2Xdoe5pKcUyWRSEQ8xfCar8t2SIAuEDwtmx2da1YB52YuHQMQ== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.4.1: +chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.0.0, chokidar@^3.4.2, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3830,87 +3825,43 @@ check-types@^11.1.1: optionalDependencies: fsevents "~2.3.2" -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - chownr@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== +chrome-launcher@^0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.15.0.tgz#5144a57aba0cf2f4cbe61dccefdde024fb3ca7fc" + integrity sha512-ZQqX5kb9H0+jy1OqLnWampfocrtSZaGl7Ny3F9GRha85o4odbL8x55paUzh51UC7cEmZ5obp3H2Mm70uC2PpRA== + dependencies: + "@types/node" "*" + escape-string-regexp "^4.0.0" + is-wsl "^2.2.0" + lighthouse-logger "^1.0.0" chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -cjs-module-lexer@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f" - integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw== +ci-info@^3.2.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.1.tgz#58331f6f472a25fe3a50a351ae3052936c2c7f32" + integrity sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" +cjs-module-lexer@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" + integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -clean-css@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178" - integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A== +clean-css@^5.2.2: + version "5.3.0" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.0.tgz#ad3d8238d5f3549e83d5f87205189494bc7cbb59" + integrity sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ== dependencies: source-map "~0.6.0" -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" @@ -3918,7 +3869,7 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.1.0: +cli-spinners@^2.1.0, cli-spinners@^2.5.0: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== @@ -3928,23 +3879,14 @@ cli-width@^3.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" + wrap-ansi "^7.0.0" clone-response@^1.0.2: version "1.0.2" @@ -3982,15 +3924,7 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.3: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -4009,28 +3943,22 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@^1.1.4, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" - integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" +colord@^2.9.1: + version "2.9.2" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" + integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== -color@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" +colorette@^2.0.10: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== -combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: +combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -4042,10 +3970,25 @@ commander@2, commander@^2.20.0, commander@^2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +commander@^9.0.0: + version "9.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== common-tags@^1.8.0: version "1.8.2" @@ -4057,18 +4000,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.1, component-emitter@^1.3.0: +component-emitter@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== -compose-function@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/compose-function/-/compose-function-3.0.3.tgz#9ed675f13cc54501d30950a486ff6a7ba3ab185f" - integrity sha1-ntZ18TzFRQHTCVCkhv9qe6OrGF8= - dependencies: - arity-n "^1.0.4" - compress-brotli@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.6.tgz#64bd6f21f4f3e9841dbac392f4c29218caf5e9d9" @@ -4077,15 +4013,15 @@ compress-brotli@^1.3.6: "@types/json-buffer" "~3.0.0" json-buffer "~3.0.1" -compress-commons@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-2.1.1.tgz#9410d9a534cf8435e3fbbb7c6ce48de2dc2f0610" - integrity sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q== +compress-commons@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.1.tgz#df2a09a7ed17447642bad10a85cc9a19e5c42a7d" + integrity sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ== dependencies: buffer-crc32 "^0.2.13" - crc32-stream "^3.0.1" + crc32-stream "^4.0.2" normalize-path "^3.0.0" - readable-stream "^2.3.6" + readable-stream "^3.6.0" compressible@~2.0.16: version "2.0.18" @@ -4112,17 +4048,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -confusing-browser-globals@^1.0.10: +confusing-browser-globals@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81" integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== @@ -4132,16 +4058,6 @@ connect-history-api-fallback@^1.6.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -4154,18 +4070,6 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^0.3.3: - version "0.3.5" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" - integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= - convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" @@ -4178,27 +4082,10 @@ cookie-signature@1.0.6: resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= -cookie@0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== core-js-compat@^3.20.2, core-js-compat@^3.21.0: version "3.21.1" @@ -4208,40 +4095,44 @@ core-js-compat@^3.20.2, core-js-compat@^3.21.0: browserslist "^4.19.1" semver "7.0.0" +core-js-compat@^3.22.1: + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.5.tgz#7fffa1d20cb18405bd22756ca1353c6f1a0e8614" + integrity sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg== + dependencies: + browserslist "^4.20.3" + semver "7.0.0" + core-js-pure@^3.20.2: version "3.21.1" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-js@^3.6.5: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" - integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== +core-js-pure@^3.8.1: + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.5.tgz#bdee0ed2f9b78f2862cda4338a07b13a49b6c9a9" + integrity sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-js@^3.19.2: + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.5.tgz#a5f5a58e663d5c0ebb4e680cd7be37536fb2a9cf" + integrity sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^5.0.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" - integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== dependencies: - import-fresh "^2.0.0" - is-directory "^0.3.1" - js-yaml "^3.13.1" - parse-json "^4.0.0" + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" cosmiconfig@^7.0.0: version "7.0.1" @@ -4254,70 +4145,35 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -crc32-stream@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-3.0.1.tgz#cae6eeed003b0e44d739d279de5ae63b171b4e85" - integrity sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w== - dependencies: - crc "^3.4.4" - readable-stream "^3.4.0" +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== -crc@^3.4.4: - version "3.8.0" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" - integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== +crc32-stream@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.2.tgz#c922ad22b38395abe9d3870f02fa8134ed709007" + integrity sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w== dependencies: - buffer "^5.1.0" + crc-32 "^1.2.0" + readable-stream "^3.4.0" -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cronstrue@1.92.0: - version "1.92.0" - resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.92.0.tgz#3547fd0950cca488f3edd321d14376dcd1db59f0" - integrity sha512-AKptYmOJVXlxkzmHH6HTYJyuOr6t8FHHl4GJ+19yVLN7fMXRyNg3g67CzqdVYSWxaR2A4iOqvfxM/dsuyJpH9A== +cronstrue@1.92.0: + version "1.92.0" + resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.92.0.tgz#3547fd0950cca488f3edd321d14376dcd1db59f0" + integrity sha512-AKptYmOJVXlxkzmHH6HTYJyuOr6t8FHHl4GJ+19yVLN7fMXRyNg3g67CzqdVYSWxaR2A4iOqvfxM/dsuyJpH9A== cronstrue@^1.72.0: version "1.125.0" resolved "https://registry.yarnpkg.com/cronstrue/-/cronstrue-1.125.0.tgz#8030816d033d00caade9b2a9f9b71e69175bcf42" integrity sha512-qkC5mVbVGuuyBVXmam5anaRtbLcgfBUKajoyZqCdf/XBdgF43PsLSEm8eEi2dsI3YbqDPbLSH2mWNzM1dVqHgQ== -cross-spawn@7.0.3, cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" + node-fetch "2.6.7" cross-spawn@^4.0.2: version "4.0.2" @@ -4327,96 +4183,74 @@ cross-spawn@^4.0.2: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-blank-pseudo@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz#dfdefd3254bf8a82027993674ccf35483bfcb3c5" - integrity sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w== +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== dependencies: - postcss "^7.0.5" + postcss-selector-parser "^6.0.9" css-color-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" +css-declaration-sorter@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.2.2.tgz#bfd2f6f50002d6a3ae779a87d3a0c5d5b10e0f02" + integrity sha512-Ufadglr88ZLsrvS11gjeu/40Lw74D9Am/Jpr3LlYm5Q4ZP5KdlUhG+6u2EjyXeZcxmZ2h1ebCKngDjolpeLHpg== -css-has-pseudo@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz#3c642ab34ca242c59c41a125df9105841f6966ee" - integrity sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^5.0.0-rc.4" +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-6.7.1.tgz#e98106f154f6e1baf3fc3bc455cb9981c1d5fd2e" + integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.7" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.0" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.5" -css-loader@4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-4.3.0.tgz#c888af64b2a5b2e85462c72c0f4a85c7e2e0821e" - integrity sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg== - dependencies: - camelcase "^6.0.0" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^2.0.0" - postcss "^7.0.32" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.3" - postcss-modules-scope "^2.2.0" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.1.0" - schema-utils "^2.7.1" - semver "^7.3.2" +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz#ab78f781ced9181992fe7b6e4f3422e76429878f" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" -css-prefers-color-scheme@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz#6f830a2714199d4f0d0d0bb8a27916ed65cff1f4" - integrity sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg== - dependencies: - postcss "^7.0.5" +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== css-select-base-adapter@^0.1.1: version "0.1.1" @@ -4444,6 +4278,11 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" +css-shorthand-properties@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz#1c808e63553c283f289f2dd56fcee8f3337bd935" + integrity sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A== + css-to-react-native@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756" @@ -4461,7 +4300,7 @@ css-tree@1.0.0-alpha.37: mdn-data "2.0.4" source-map "^0.6.1" -css-tree@^1.1.2: +css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== @@ -4497,25 +4336,19 @@ css.escape@^1.5.1: resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb" integrity sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s= -css@^2.0.0, css@^2.2.3: - version "2.2.4" - resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw== +css@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d" + integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ== dependencies: - inherits "^2.0.3" + inherits "^2.0.4" source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -cssdb@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" - integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== + source-map-resolve "^0.6.0" -cssesc@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" - integrity sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== +cssdb@^6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.1.tgz#2637fdc57eab452849488de7e8d961ec06f2fe8f" + integrity sha512-0/nZEYfp8SFEzJkMud8NxZJsGfD7RHDJti6GRBLZptIwAzco6RTx1KgwFl4mGWsYS0ZNbCrsY9QryhQ4ldF3Mg== cssesc@^3.0.0: version "3.0.0" @@ -4527,75 +4360,56 @@ cssfilter@0.0.10: resolved "https://registry.yarnpkg.com/cssfilter/-/cssfilter-0.0.10.tgz#c6d2672632a2e5c83e013e6864a42ce8defd20ae" integrity sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4= -cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" - integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.3" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== +cssnano-preset-default@^5.2.7: + version "5.2.7" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.7.tgz#791e3603fb8f1b46717ac53b47e3c418e950f5f3" + integrity sha512-JiKP38ymZQK+zVKevphPzNSGHSlTI+AOwlasoSRtSVMUU285O7/6uZyd5NbW92ZHp41m0sSHe6JoZosakj63uA== + dependencies: + css-declaration-sorter "^6.2.2" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.0" + postcss-discard-comments "^5.1.1" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.4" + postcss-merge-rules "^5.1.1" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.2" + postcss-minify-selectors "^5.2.0" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.0" + postcss-normalize-repeat-style "^5.1.0" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.1" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== -cssnano@^4.1.10: - version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== +cssnano@^5.0.6: + version "5.1.7" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.7.tgz#99858bef6c76c9240f0cdc9239570bc7db8368be" + integrity sha512-pVsUV6LcTXif7lvKKW9ZrmX+rGRzxkEdJuVJcp5ftUjWITgwam5LMZOgaTvUrWPkcORBey6he7JKb4XAJvrpKg== dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" - is-resolvable "^1.0.0" - postcss "^7.0.0" + cssnano-preset-default "^5.2.7" + lilconfig "^2.0.3" + yaml "^1.10.2" -csso@^4.0.2: +csso@^4.0.2, csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== @@ -4629,11 +4443,6 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: version "1.2.4" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" @@ -5126,14 +4935,6 @@ d3@^6.2.0: d3-transition "2" d3-zoom "2" -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - dagre-d3@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29" @@ -5157,13 +4958,6 @@ damerau-levenshtein@^1.0.7: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - data-urls@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" @@ -5183,38 +4977,31 @@ date-format@0.0.2: resolved "https://registry.yarnpkg.com/date-format/-/date-format-0.0.2.tgz#fafd448f72115ef1e2b739155ae92f2be6c28dd1" integrity sha1-+v1Ej3IRXvHitzkVWukvK+bCjdE= -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^3.1.1, debug@^3.2.7: +debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== decimal.js@^10.2.1: version "10.3.1" @@ -5238,18 +5025,6 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= -deep-equal@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" - integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== - dependencies: - is-arguments "^1.0.4" - is-date-object "^1.0.1" - is-regex "^1.0.4" - object-is "^1.0.1" - object-keys "^1.1.1" - regexp.prototype.flags "^1.2.0" - deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -5265,13 +5040,12 @@ deepmerge@^4.0.0, deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" + execa "^5.0.0" defaults@^1.0.3: version "1.0.3" @@ -5285,47 +5059,22 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-properties@^1.1.2, define-properties@^1.1.3: +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: +defined@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== - dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= delaunator@4: version "4.0.1" @@ -5337,23 +5086,20 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-libc@^1.0.3: version "1.0.3" @@ -5370,7 +5116,7 @@ detect-node@^2.0.4, detect-node@^2.1.0: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port-alt@1.1.6: +detect-port-alt@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== @@ -5378,29 +5124,63 @@ detect-port-alt@1.1.6: address "^1.0.1" debug "^2.6.0" -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== +detective@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" + integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== + dependencies: + acorn-node "^1.6.1" + defined "^1.0.0" + minimist "^1.1.1" + +devtools-protocol@0.0.981744: + version "0.0.981744" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.981744.tgz#9960da0370284577d46c28979a0b32651022bacf" + integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg== + +devtools-protocol@^0.0.998712: + version "0.0.998712" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.998712.tgz#35788d4e9e91c55288330f3ae8cc4584b21e07bc" + integrity sha512-KCl+wJ9RsnDyGSsW7nbkgLFYxcKxZ7nzr6/r/hMOjkS02q2x1p8PbUenzKRMfL0jALhYxkCHrYnPnV3GHVD9EQ== + +devtools@7.19.7: + version "7.19.7" + resolved "https://registry.yarnpkg.com/devtools/-/devtools-7.19.7.tgz#b9091006f698303021dfb6593c35fe2792ca2601" + integrity sha512-XkIuojwTD0LeCzEeoTozKfAYWZUAw5Sj6CNPUuift3eDD9wnY2AcKLmFw8e9ihVUevJriyV8tMNbDsl97HSYWg== + dependencies: + "@types/node" "^17.0.4" + "@types/ua-parser-js" "^0.7.33" + "@wdio/config" "7.19.5" + "@wdio/logger" "7.19.0" + "@wdio/protocols" "7.19.0" + "@wdio/types" "7.19.5" + "@wdio/utils" "7.19.7" + chrome-launcher "^0.15.0" + edge-paths "^2.1.0" + puppeteer-core "^13.1.3" + query-selector-shadow-dom "^1.0.0" + ua-parser-js "^1.0.1" + uuid "^8.0.0" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -diff-sequences@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" - integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +diff-sequences@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41" + integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" +diff@5.0.0, diff@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== dir-glob@^3.0.1: version "3.0.1" @@ -5409,25 +5189,22 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= -dns-packet@^1.3.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" - integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= +dns-packet@^5.2.2: + version "5.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d" + integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw== dependencies: - buffer-indexof "^1.0.0" + "@leichtgewicht/ip-codec" "^2.0.1" doctrine@^2.1.0: version "2.1.0" @@ -5443,10 +5220,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.3.0.tgz#511e5993dd673b97c87ea47dba0e3892f7e0c983" - integrity sha512-PzwHEmsRP3IGY4gv/Ug+rMeaTIyTJvadCb+ujYXYeIylbHJezIyNToe8KfEgHTCEYyC+/bUghYOGg8yMGlZ6vA== +dom-accessibility-api@^0.5.6: + version "0.5.14" + resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56" + integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg== dom-accessibility-api@^0.5.9: version "0.5.13" @@ -5485,11 +5262,6 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" @@ -5539,38 +5311,21 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv-expand@5.1.0: +dotenv-expand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== -dotenv@8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -duplexer@^0.1.1: +duplexer@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - easy-table@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/easy-table/-/easy-table-1.2.0.tgz#ba9225d7138fee307bfd4f0b5bc3c04bdc7c54eb" @@ -5580,58 +5335,45 @@ easy-table@^1.1.1: optionalDependencies: wcwidth "^1.0.1" -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= +edge-paths@^2.1.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/edge-paths/-/edge-paths-2.2.1.tgz#d2d91513225c06514aeac9843bfce546abbf4391" + integrity sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw== dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" + "@types/which" "^1.3.2" + which "^2.0.2" ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== - -ejs@^3.0.1: - version "3.1.6" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" - integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== +ejs@^3.0.1, ejs@^3.1.6, ejs@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b" + integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ== dependencies: - jake "^10.6.1" + jake "^10.8.5" + +electron-to-chromium@^1.4.118: + version "1.4.137" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.137.tgz#186180a45617283f1c012284458510cd99d6787f" + integrity sha512-0Rcpald12O11BUogJagX3HsCN3FE83DSqWjgXoHo5a72KUKMSfI39XBgJpgNNxS9fuGzytaFjE06kZkiVFy2qA== electron-to-chromium@^1.4.84: version "1.4.107" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.107.tgz#564257014ab14033b4403a309c813123c58a3fb9" integrity sha512-Huen6taaVrUrSy8o7mGStByba8PfOWWluHNxSHGBrCgEdFVLtvdQDBr9LBCF9Uci8SYxh28QNNMO0oC17wbGAg== -elliptic@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== -emittery@^0.7.1: - version "0.7.2" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" - integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== emoji-regex@^8.0.0: version "8.0.0" @@ -5643,11 +5385,6 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - emojis-list@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" @@ -5658,41 +5395,26 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== +enhanced-resolve@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" + integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== dependencies: - ansi-colors "^4.1.1" + graceful-fs "^4.2.4" + tapable "^2.2.0" entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -5733,6 +5455,11 @@ es-abstract@^1.17.2, es-abstract@^1.19.1, es-abstract@^1.19.2: string.prototype.trimstart "^1.0.4" unbox-primitive "^1.0.1" +es-module-lexer@^0.9.0: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -5749,32 +5476,6 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.60" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.60.tgz#e8060a86472842b93019c31c34865012449883f4" - integrity sha512-jpKNXIt60htYG59/9FGf2PYT3pwMpnEbNKysU+k/4FGwyGtMotOvcZOuW+EmXXYASRqYSXQfGL5cVIthOTgbkg== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-iterator@2.0.3, es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -5785,21 +5486,21 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escape-string-regexp@2.0.0, escape-string-regexp@^2.0.0: +escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escodegen@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" @@ -5812,12 +5513,25 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-react-app@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e" - integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A== +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz#73ba3929978001c5c86274c017ea57eb5fa644b4" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== dependencies: - confusing-browser-globals "^1.0.10" + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" eslint-import-resolver-node@^0.3.6: version "0.3.6" @@ -5835,15 +5549,15 @@ eslint-module-utils@^2.7.3: debug "^3.2.7" find-up "^2.1.0" -eslint-plugin-flowtype@^5.2.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.10.0.tgz#7764cc63940f215bf3f0bd2d9a1293b2b9b2b4bb" - integrity sha512-vcz32f+7TP+kvTUyMXZmCnNujBQZDNmcqPImw8b9PZ+16w1Qdm6ryRuYZYVaG9xRqqmAPr2Cs9FAX5gN+x/bjw== +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz#e1557e37118f24734aa3122e7536a038d34a4912" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== dependencies: - lodash "^4.17.15" + lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.22.1: +eslint-plugin-import@^2.25.3: version "2.26.0" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== @@ -5862,14 +5576,14 @@ eslint-plugin-import@^2.22.1: resolve "^1.22.0" tsconfig-paths "^3.14.1" -eslint-plugin-jest@^24.1.0: - version "24.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889" - integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA== +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== dependencies: - "@typescript-eslint/experimental-utils" "^4.0.1" + "@typescript-eslint/experimental-utils" "^5.0.0" -eslint-plugin-jsx-a11y@^6.3.1: +eslint-plugin-jsx-a11y@^6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz#cdbf2df901040ca140b6ec14715c988889c2a6d8" integrity sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g== @@ -5887,12 +5601,12 @@ eslint-plugin-jsx-a11y@^6.3.1: language-tags "^1.0.5" minimatch "^3.0.4" -eslint-plugin-react-hooks@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" - integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== +eslint-plugin-react-hooks@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" + integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== -eslint-plugin-react@^7.21.5: +eslint-plugin-react@^7.27.1: version "7.29.4" resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz#4717de5227f55f3801a5fd51a16a4fa22b5914d2" integrity sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ== @@ -5912,22 +5626,14 @@ eslint-plugin-react@^7.21.5: semver "^6.3.0" string.prototype.matchall "^4.0.6" -eslint-plugin-testing-library@^3.9.2: - version "3.10.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-3.10.2.tgz#609ec2b0369da7cf2e6d9edff5da153cc31d87bd" - integrity sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA== - dependencies: - "@typescript-eslint/experimental-utils" "^3.10.1" - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== +eslint-plugin-testing-library@^5.0.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.0.tgz#ce43113dac5a5d93e8b0a8d9937983cdbf63f049" + integrity sha512-eWQ19l6uWL7LW8oeMyQVSGjVYFnBqk7DMHjadm0yOHBvX3Xi9OBrsNuxoAMdX4r7wlQ5WWpW46d+CB6FWFL/PQ== dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" + "@typescript-eslint/utils" "^5.13.0" -eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5935,12 +5641,13 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^2.0.0, eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== +eslint-scope@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" + integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" eslint-utils@^3.0.0: version "3.0.0" @@ -5949,82 +5656,76 @@ eslint-utils@^3.0.0: dependencies: eslint-visitor-keys "^2.0.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: +eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-webpack-plugin@^2.5.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.6.0.tgz#3bd4ada4e539cb1f6687d2f619073dbb509361cd" - integrity sha512-V+LPY/T3kur5QO3u+1s34VDTcRxjXWPUGM4hlmTb5DwVD0OQz631yGTxJZf4SpAqAjdbBVe978S8BJeHpAdOhQ== +eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" + integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + +eslint-webpack-plugin@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.1.1.tgz#83dad2395e5f572d6f4d919eedaa9cf902890fcb" + integrity sha512-xSucskTN9tOkfW7so4EaiFIkulWLXwCB/15H917lR6pTv0Zot6/fetFucmENRb7J5whVSFKIvwnrnsa78SG2yg== dependencies: "@types/eslint" "^7.28.2" - arrify "^2.0.1" jest-worker "^27.3.1" micromatch "^4.0.4" normalize-path "^3.0.0" schema-utils "^3.1.1" -eslint@^7.11.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== +eslint@^8.3.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.15.0.tgz#fea1d55a7062da48d82600d2e0974c55612a11e9" + integrity sha512-GG5USZ1jhCu8HJkzGgeK8/+RGnHaNYZGrGDzUtigK3BsGESW/rs2az23XqE0WVwDxy1VRvvjSSGu5nB0Bu+6SA== dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" + "@eslint/eslintrc" "^1.2.3" + "@humanwhocodes/config-array" "^0.9.2" ajv "^6.10.0" chalk "^4.0.0" cross-spawn "^7.0.2" - debug "^4.0.1" + debug "^4.3.2" doctrine "^3.0.0" - enquirer "^2.3.5" escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" + eslint-scope "^7.1.1" + eslint-utils "^3.0.0" + eslint-visitor-keys "^3.3.0" + espree "^9.3.2" esquery "^1.4.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" + glob-parent "^6.0.1" globals "^13.6.0" - ignore "^4.0.6" + ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - js-yaml "^3.13.1" + js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" - minimatch "^3.0.4" + minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" + regexpp "^3.2.0" + strip-ansi "^6.0.1" strip-json-comments "^3.1.0" - table "^6.0.9" text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== +espree@^9.3.2: + version "9.3.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596" + integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA== dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" + acorn "^8.7.1" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.3.0" esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" @@ -6038,7 +5739,7 @@ esquery@^1.4.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0, esrecurse@^4.3.0: +esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== @@ -6055,11 +5756,6 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== - estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" @@ -6080,57 +5776,24 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.0.0: +events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -eventsource@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf" - integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg== - dependencies: - original "^1.0.0" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -exec-sh@^0.3.2: - version "0.3.6" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" - integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" - integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" exit@^0.1.2: @@ -6138,94 +5801,61 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= +expect-webdriverio@^3.0.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/expect-webdriverio/-/expect-webdriverio-3.3.2.tgz#7ba7de33d6605fddcddd64d4b9752c0dccb2212e" + integrity sha512-hYJvcewauSJsHS3dpo3s/SvV+5Chm9f8MBM7kBzAcmOLGjQ8OI0XPeknvG1bt57OzlBB9GihYmp3NmESpwpXZg== dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" + expect "^27.0.2" + jest-matcher-utils "^28.0.2" -expect@^26.6.0, expect@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" - integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA== +expect@^27.0.2, expect@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== dependencies: - "@jest/types" "^26.6.2" - ansi-styles "^4.0.0" - jest-get-type "^26.3.0" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-regex-util "^26.0.0" + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" -express@^4.17.1: - version "4.17.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.3.tgz#f6c7302194a4fb54271b73a1fe7a06478c8f85a1" - integrity sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg== +express@^4.17.3: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.2" + body-parser "1.20.0" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.2" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.7" + qs "6.10.3" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" -ext@^1.1.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" - integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== - dependencies: - type "^2.5.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - external-editor@^3.0.3: version "3.1.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -6235,29 +5865,16 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" fast-deep-equal@^2.0.1: version "2.0.1" @@ -6269,7 +5886,7 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.1.1, fast-glob@^3.2.9: +fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== @@ -6297,7 +5914,7 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" -faye-websocket@^0.11.3, faye-websocket@^0.11.4: +faye-websocket@^0.11.3: version "0.11.4" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== @@ -6318,25 +5935,13 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -fibers@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fibers/-/fibers-4.0.3.tgz#dda5918280a48507f5d8a96dd9a525e8f4a532e2" - integrity sha512-MW5VrDtTOLpKK7lzw4qD7Z9tXaAhdOmOED5RHzg3+HjUk+ibkjVW0Py2ERtdqgTXaerLkVkBy2AEmJiT6RMyzg== - dependencies: - detect-libc "^1.0.3" - -fibers_node_v8@^3.1.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/fibers_node_v8/-/fibers_node_v8-3.1.5.tgz#354b481239e58a1c70eb4bde96c6e459a1e49554" - integrity sha512-jcut+gL68TclewWH/9si73yDhFOzu8LhmWg6SZRBw13rk4+7DCtqOMdsBhAyXaWRjI7c1XqcRp4AgebLJnvfCQ== +fibers@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/fibers/-/fibers-5.0.1.tgz#bb9b02aa022685185d21aed227363e456d87660d" + integrity sha512-VMC7Frt87Oo0AOJ6EcPFbi+tZmkQ4tD85aatwyWL6I9cYMJmm2e+pXUJsfGZ36U7MffXtjou2XIiWJMtHriErw== dependencies: detect-libc "^1.0.3" -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -6351,19 +5956,14 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-loader@6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa" - integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw== +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: loader-utils "^2.0.0" schema-utils "^3.0.0" -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - filelist@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.2.tgz#80202f21462d4d1c2e214119b1807c1bc0380e5b" @@ -6371,20 +5971,10 @@ filelist@^1.0.1: dependencies: minimatch "^3.0.4" -filesize@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" - integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== fill-range@^7.0.1: version "7.0.1" @@ -6393,28 +5983,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - find-cache-dir@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" @@ -6424,19 +6005,12 @@ find-cache-dir@^3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== +find-up@5.0.0, find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - locate-path "^5.0.0" + locate-path "^6.0.0" path-exists "^4.0.0" find-up@^1.0.0: @@ -6454,6 +6028,21 @@ find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -6462,67 +6051,39 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: version "3.2.5" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -flatten@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" - integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - follow-redirects@^1.0.0: - version "1.14.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" - integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + version "1.15.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== -fork-ts-checker-webpack-plugin@4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz#5055c703febcf37fa06405d400c122b905167fc5" - integrity sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw== +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.2" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340" + integrity sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA== dependencies: - "@babel/code-frame" "^7.5.5" - chalk "^2.4.1" - micromatch "^3.1.10" + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" minimatch "^3.0.4" - semver "^5.6.0" + schema-utils "2.7.0" + semver "^7.3.2" tapable "^1.0.0" - worker-rpc "^0.1.0" - -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" form-data@^3.0.0: version "3.0.1" @@ -6533,15 +6094,6 @@ form-data@^3.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - formik@^2.2.9: version "2.2.9" resolved "https://registry.yarnpkg.com/formik/-/formik-2.2.9.tgz#8594ba9c5e2e5cf1f42c5704128e119fc46232d0" @@ -6560,50 +6112,31 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.0.1, fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" + jsonfile "^6.0.1" + universalify "^2.0.0" -fs-extra@^9.0.1: +fs-extra@^9.0.0, fs-extra@^9.0.1: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -6613,37 +6146,17 @@ fs-extra@^9.0.1: jsonfile "^6.0.1" universalify "^2.0.0" -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@^2.1.2, fsevents@^2.1.3, fsevents@~2.3.2: +fsevents@^2.3.2, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -6665,12 +6178,12 @@ gaze@^1.1.2: dependencies: globule "^1.0.0" -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: +gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.1: +get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -6694,20 +6207,18 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.0.0, get-stream@^5.1.0: +get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -6716,38 +6227,26 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-parent@^3.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob-parent@^6.0.1, glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@7.2.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -6771,7 +6270,7 @@ glob@~7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@2.0.0: +global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== @@ -6799,19 +6298,7 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" -globby@11.0.1: - version "11.0.1" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357" - integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^11.0.3: +globby@^11.0.4: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -6823,17 +6310,6 @@ globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - globule@^1.0.0: version "1.3.3" resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.3.tgz#811919eeac1ab7344e905f2e3be80a13447973c2" @@ -6843,7 +6319,7 @@ globule@^1.0.0: lodash "~4.17.10" minimatch "~3.0.2" -got@^11.8.2: +got@^11.0.2, got@^11.8.1, got@^11.8.2: version "11.8.3" resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770" integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg== @@ -6860,7 +6336,7 @@ got@^11.8.2: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== @@ -6877,23 +6353,12 @@ graphlib@^2.1.8: dependencies: lodash "^4.17.15" -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= - -gzip-size@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" - integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== dependencies: - duplexer "^0.1.1" - pify "^4.0.1" + duplexer "^0.1.2" hammerjs@^2.0.8: version "2.0.8" @@ -6905,19 +6370,6 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - harmony-reflect@^1.4.6: version "1.6.2" resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" @@ -6945,7 +6397,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -6957,71 +6409,18 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.0, has@^1.0.3: +has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - he@1.2.0, he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - history@^4.9.0: version "4.10.1" resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" @@ -7034,15 +6433,6 @@ history@^4.9.0: tiny-warning "^1.0.0" value-equal "^1.0.1" -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -7070,16 +6460,6 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -7087,43 +6467,39 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -html-entities@^1.2.1, html-entities@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" + integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -html-minifier-terser@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" - integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== dependencies: - camel-case "^4.1.1" - clean-css "^4.2.3" - commander "^4.1.1" + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" he "^1.2.0" - param-case "^3.0.3" + param-case "^3.0.4" relateurl "^0.2.7" - terser "^4.6.3" + terser "^5.10.0" -html-webpack-plugin@4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c" - integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw== - dependencies: - "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" - html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" - lodash "^4.17.15" - pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" +html-webpack-plugin@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz#c3911936f57681c1f9f4d8b68c158cd9dfe52f50" + integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" htmlparser2@^6.1.0: version "6.1.0" @@ -7145,15 +6521,15 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-errors@~1.6.2: @@ -7180,20 +6556,10 @@ http-proxy-agent@^4.0.1: agent-base "6" debug "4" -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== - dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" - -http-proxy-middleware@^2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz#03af0f4676d172ae775cb5c33f592f40e1a4e07a" - integrity sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg== +http-proxy-middleware@^2.0.1, http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -7201,7 +6567,7 @@ http-proxy-middleware@^2.0.1: is-plain-obj "^3.0.0" micromatch "^4.0.2" -http-proxy@^1.17.0, http-proxy@^1.18.1: +http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -7210,15 +6576,6 @@ http-proxy@^1.17.0, http-proxy@^1.18.1: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" @@ -7227,10 +6584,13 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-proxy-agent@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" https-proxy-agent@^5.0.0: version "5.0.0" @@ -7240,10 +6600,10 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== hyphenate-style-name@^1.0.3: version "1.0.4" @@ -7257,41 +6617,41 @@ iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -icss-utils@^4.0.0, icss-utils@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" - integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA== +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - postcss "^7.0.14" + safer-buffer ">= 2.1.2 < 3.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^6.1.4: + version "6.1.5" + resolved "https://registry.yarnpkg.com/idb/-/idb-6.1.5.tgz#dbc53e7adf1ac7c59f9b2bf56e00b4ea4fce8c7b" + integrity sha512-IJtugpKkiVXQn5Y+LteyBCNk1N8xpGV3wWZk9EVtZWH8DYkjBn0bX1XnGP9RkyZF0sAcywa6unHqSWKe7q4LGw== -identity-obj-proxy@3.0.0: +identity-obj-proxy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14" integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ= dependencies: harmony-reflect "^1.4.6" -ieee754@^1.1.13, ieee754@^1.1.4: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.1.8, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -immer@8.0.1, immer@^9.0.6: +immer@^9.0.7: version "9.0.12" resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.12.tgz#2d33ddf3ee1d247deab9d707ca472c8c942a0f20" integrity sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA== @@ -7306,22 +6666,7 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== -import-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= - dependencies: - import-from "^2.1.0" - -import-fresh@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" - integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= - dependencies: - caller-path "^2.0.0" - resolve-from "^3.0.0" - -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -7329,21 +6674,6 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: parent-module "^1.0.0" resolve-from "^4.0.0" -import-from@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= - dependencies: - resolve-from "^3.0.0" - -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - import-local@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" @@ -7367,16 +6697,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - -infer-owner@^1.0.3, infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -7385,16 +6705,11 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -7405,32 +6720,26 @@ ini@^1.3.5: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== +inquirer@8.2.4: + version "8.2.4" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" + integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== dependencies: ansi-escapes "^4.2.1" - chalk "^4.1.0" + chalk "^4.1.1" cli-cursor "^3.1.0" cli-width "^3.0.0" external-editor "^3.0.3" figures "^3.0.0" - lodash "^4.17.19" + lodash "^4.17.21" mute-stream "0.0.8" + ora "^5.4.1" run-async "^2.4.0" - rxjs "^6.6.0" + rxjs "^7.5.5" string-width "^4.1.0" strip-ansi "^6.0.0" through "^2.3.6" - -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" + wrap-ansi "^7.0.0" internal-slot@^1.0.3: version "1.0.3" @@ -7446,63 +6755,21 @@ internmap@^1.0.0: resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== -ip-regex@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipaddr.js@1.9.1, ipaddr.js@^1.9.0: +ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -7510,13 +6777,6 @@ is-bigint@^1.0.1: dependencies: has-bigints "^1.0.1" -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -7532,61 +6792,18 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - -is-core-module@^2.0.0, is-core-module@^2.2.0, is-core-module@^2.8.1: +is-core-module@^2.2.0, is-core-module@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -7594,56 +6811,16 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-docker@^2.0.0: +is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -7666,6 +6843,11 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3: resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -7683,13 +6865,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -7700,53 +6875,27 @@ is-obj@^1.0.1: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: +is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" +is-port-reachable@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-3.1.0.tgz#f6668d3bca9c36b07f737c48a8f875ab0653cd2b" + integrity sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A== is-potential-custom-element-name@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.0.4, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -7759,12 +6908,7 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-root@2.1.0: +is-root@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== @@ -7776,11 +6920,6 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -7800,11 +6939,16 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -7817,17 +6961,7 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -is-wsl@^2.1.1, is-wsl@^2.2.0: +is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -7839,7 +6973,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -7849,38 +6983,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== -istanbul-lib-instrument@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - istanbul-lib-instrument@^5.0.4: version "5.1.0" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" @@ -7892,6 +6999,17 @@ istanbul-lib-instrument@^5.0.4: istanbul-lib-coverage "^3.2.0" semver "^6.3.0" +istanbul-lib-instrument@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz#31d18bdd127f825dd02ea7bfdfd906f8ab840e9f" + integrity sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + istanbul-lib-report@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" @@ -7910,7 +7028,7 @@ istanbul-lib-source-maps@^4.0.0: istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" -istanbul-reports@^3.0.2: +istanbul-reports@^3.1.3: version "3.1.4" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== @@ -7918,262 +7036,278 @@ istanbul-reports@^3.0.2: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jake@^10.6.1: - version "10.8.4" - resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.4.tgz#f6a8b7bf90c6306f768aa82bb7b98bf4ca15e84a" - integrity sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA== +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== dependencies: - async "0.9.x" + async "^3.2.3" chalk "^4.0.2" filelist "^1.0.1" minimatch "^3.0.4" -jest-changed-files@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" - integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ== - dependencies: - "@jest/types" "^26.6.2" - execa "^4.0.0" - throat "^5.0.0" - -jest-circus@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-26.6.0.tgz#7d9647b2e7f921181869faae1f90a2629fd70705" - integrity sha512-L2/Y9szN6FJPWFK8kzWXwfp+FOR7xq0cUL4lIsdbIdwz3Vh6P1nrpcqOleSzr28zOtSHQNV9Z7Tl+KkuK7t5Ng== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.0" - "@jest/test-result" "^26.6.0" - "@jest/types" "^26.6.0" - "@types/babel__traverse" "^7.0.4" +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" - expect "^26.6.0" + expect "^27.5.1" is-generator-fn "^2.0.0" - jest-each "^26.6.0" - jest-matcher-utils "^26.6.0" - jest-message-util "^26.6.0" - jest-runner "^26.6.0" - jest-runtime "^26.6.0" - jest-snapshot "^26.6.0" - jest-util "^26.6.0" - pretty-format "^26.6.0" - stack-utils "^2.0.2" - throat "^5.0.0" - -jest-cli@^26.6.0: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a" - integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg== - dependencies: - "@jest/core" "^26.6.3" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" chalk "^4.0.0" exit "^0.1.2" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" import-local "^3.0.2" - is-ci "^2.0.0" - jest-config "^26.6.3" - jest-util "^26.6.2" - jest-validate "^26.6.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" prompts "^2.0.1" - yargs "^15.4.1" + yargs "^16.2.0" -jest-config@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349" - integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg== +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== dependencies: - "@babel/core" "^7.1.0" - "@jest/test-sequencer" "^26.6.3" - "@jest/types" "^26.6.2" - babel-jest "^26.6.3" + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" chalk "^4.0.0" + ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.1" - graceful-fs "^4.2.4" - jest-environment-jsdom "^26.6.2" - jest-environment-node "^26.6.2" - jest-get-type "^26.3.0" - jest-jasmine2 "^26.6.3" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" - micromatch "^4.0.2" - pretty-format "^26.6.2" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" -jest-diff@^24.0.0, jest-diff@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" -jest-diff@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" - integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== +jest-diff@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.0.tgz#77686fef899ec1873dbfbf9330e37dd429703269" + integrity sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA== dependencies: chalk "^4.0.0" - diff-sequences "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + diff-sequences "^28.0.2" + jest-get-type "^28.0.2" + pretty-format "^28.1.0" -jest-docblock@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" - integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w== +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== dependencies: detect-newline "^3.0.0" -jest-each@^26.6.0, jest-each@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb" - integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A== +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" chalk "^4.0.0" - jest-get-type "^26.3.0" - jest-util "^26.6.2" - pretty-format "^26.6.2" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" -jest-environment-jsdom@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e" - integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q== +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" - jsdom "^16.4.0" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" -jest-environment-node@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c" - integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag== +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== dependencies: - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" - jest-mock "^26.6.2" - jest-util "^26.6.2" + jest-mock "^27.5.1" + jest-util "^27.5.1" -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== -jest-get-type@^26.3.0: - version "26.3.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" - integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== -jest-haste-map@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" - integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w== +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/graceful-fs" "^4.1.2" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" - graceful-fs "^4.2.4" - jest-regex-util "^26.0.0" - jest-serializer "^26.6.2" - jest-util "^26.6.2" - jest-worker "^26.6.2" - micromatch "^4.0.2" - sane "^4.0.3" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" walker "^1.0.7" optionalDependencies: - fsevents "^2.1.2" - -jest-jasmine2@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd" - integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg== - dependencies: - "@babel/traverse" "^7.1.0" - "@jest/environment" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" - expect "^26.6.2" + expect "^27.5.1" is-generator-fn "^2.0.0" - jest-each "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-runtime "^26.6.3" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - pretty-format "^26.6.2" - throat "^5.0.0" - -jest-leak-detector@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af" - integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg== + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== dependencies: - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" -jest-matcher-utils@^24.0.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073" - integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA== +jest-matcher-utils@^28.0.2: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz#2ae398806668eeabd293c61712227cb94b250ccf" + integrity sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ== dependencies: - chalk "^2.0.1" - jest-diff "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" + chalk "^4.0.0" + jest-diff "^28.1.0" + jest-get-type "^28.0.2" + pretty-format "^28.1.0" -jest-matcher-utils@^26.6.0, jest-matcher-utils@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a" - integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw== +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - pretty-format "^26.6.2" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" -jest-message-util@^26.6.0, jest-message-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" - integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA== +jest-message-util@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.0.tgz#7e8f0b9049e948e7b94c2a52731166774ba7d0af" + integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw== dependencies: - "@babel/code-frame" "^7.0.0" - "@jest/types" "^26.6.2" + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" - graceful-fs "^4.2.4" - micromatch "^4.0.2" - pretty-format "^26.6.2" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.0" slash "^3.0.0" - stack-utils "^2.0.2" + stack-utils "^2.0.3" -jest-mock@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302" - integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew== +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -8181,196 +7315,209 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^26.0.0: - version "26.0.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28" - integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A== +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== -jest-resolve-dependencies@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6" - integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg== - dependencies: - "@jest/types" "^26.6.2" - jest-regex-util "^26.0.0" - jest-snapshot "^26.6.2" +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-resolve@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.0.tgz#070fe7159af87b03e50f52ea5e17ee95bbee40e1" - integrity sha512-tRAz2bwraHufNp+CCmAD8ciyCpXCs1NQxB5EJAmtCFy6BN81loFEGWKzYu26Y62lAJJe4X4jg36Kf+NsQyiStQ== +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== dependencies: - "@jest/types" "^26.6.0" - chalk "^4.0.0" - graceful-fs "^4.2.4" - jest-pnp-resolver "^1.2.2" - jest-util "^26.6.0" - read-pkg-up "^7.0.1" - resolve "^1.17.0" - slash "^3.0.0" + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" -jest-resolve@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507" - integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ== +jest-resolve@^27.4.2, jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" chalk "^4.0.0" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" jest-pnp-resolver "^1.2.2" - jest-util "^26.6.2" - read-pkg-up "^7.0.1" - resolve "^1.18.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^26.6.0, jest-runner@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159" - integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" - emittery "^0.7.1" - exit "^0.1.2" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-docblock "^26.0.0" - jest-haste-map "^26.6.2" - jest-leak-detector "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" - jest-runtime "^26.6.3" - jest-util "^26.6.2" - jest-worker "^26.6.2" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" source-map-support "^0.5.6" - throat "^5.0.0" - -jest-runtime@^26.6.0, jest-runtime@^26.6.3: - version "26.6.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b" - integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw== - dependencies: - "@jest/console" "^26.6.2" - "@jest/environment" "^26.6.2" - "@jest/fake-timers" "^26.6.2" - "@jest/globals" "^26.6.2" - "@jest/source-map" "^26.6.2" - "@jest/test-result" "^26.6.2" - "@jest/transform" "^26.6.2" - "@jest/types" "^26.6.2" - "@types/yargs" "^15.0.0" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" chalk "^4.0.0" - cjs-module-lexer "^0.6.0" + cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" - exit "^0.1.2" + execa "^5.0.0" glob "^7.1.3" - graceful-fs "^4.2.4" - jest-config "^26.6.3" - jest-haste-map "^26.6.2" - jest-message-util "^26.6.2" - jest-mock "^26.6.2" - jest-regex-util "^26.0.0" - jest-resolve "^26.6.2" - jest-snapshot "^26.6.2" - jest-util "^26.6.2" - jest-validate "^26.6.2" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" slash "^3.0.0" strip-bom "^4.0.0" - yargs "^15.4.1" -jest-serializer@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1" - integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g== +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== dependencies: "@types/node" "*" - graceful-fs "^4.2.4" + graceful-fs "^4.2.9" -jest-snapshot@^26.6.0, jest-snapshot@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84" - integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og== +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" "@babel/types" "^7.0.0" - "@jest/types" "^26.6.2" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.0.0" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^26.6.2" - graceful-fs "^4.2.4" - jest-diff "^26.6.2" - jest-get-type "^26.3.0" - jest-haste-map "^26.6.2" - jest-matcher-utils "^26.6.2" - jest-message-util "^26.6.2" - jest-resolve "^26.6.2" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" natural-compare "^1.4.0" - pretty-format "^26.6.2" + pretty-format "^27.5.1" semver "^7.3.2" -jest-util@^26.6.0, jest-util@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1" - integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q== +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== dependencies: - "@jest/types" "^26.6.2" + "@jest/types" "^27.5.1" "@types/node" "*" chalk "^4.0.0" - graceful-fs "^4.2.4" - is-ci "^2.0.0" - micromatch "^4.0.2" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" -jest-validate@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec" - integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ== +jest-util@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5" + integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA== dependencies: - "@jest/types" "^26.6.2" - camelcase "^6.0.0" + "@jest/types" "^28.1.0" + "@types/node" "*" chalk "^4.0.0" - jest-get-type "^26.3.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" leven "^3.1.0" - pretty-format "^26.6.2" + pretty-format "^27.5.1" -jest-watch-typeahead@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-0.6.1.tgz#45221b86bb6710b7e97baaa1640ae24a07785e63" - integrity sha512-ITVnHhj3Jd/QkqQcTqZfRgjfyRhDFM/auzgVo2RKvSwi18YMvh0WvXDJFoFED6c7jd/5jxtu4kSOb9PTu2cPVg== +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz#b4a6826dfb9c9420da2f7bc900de59dad11266a9" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== dependencies: ansi-escapes "^4.3.1" chalk "^4.0.0" - jest-regex-util "^26.0.0" - jest-watcher "^26.3.0" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" -jest-watcher@^26.3.0, jest-watcher@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975" - integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ== +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== dependencies: - "@jest/test-result" "^26.6.2" - "@jest/types" "^26.6.2" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" - jest-util "^26.6.2" + jest-util "^27.5.1" string-length "^4.0.1" -jest-worker@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== +jest-watcher@^28.0.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.0.tgz#aaa7b4164a4e77eeb5f7d7b25ede5e7b4e9c9aaf" + integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA== dependencies: - merge-stream "^2.0.0" - supports-color "^6.1.0" + "@jest/test-result" "^28.1.0" + "@jest/types" "^28.1.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.0" + string-length "^4.0.1" -jest-worker@^26.5.0, jest-worker@^26.6.2: +jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -8379,7 +7526,7 @@ jest-worker@^26.5.0, jest-worker@^26.6.2: merge-stream "^2.0.0" supports-color "^7.0.0" -jest-worker@^27.3.1: +jest-worker@^27.0.2, jest-worker@^27.3.1, jest-worker@^27.4.5, jest-worker@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== @@ -8388,14 +7535,14 @@ jest-worker@^27.3.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@26.6.0: - version "26.6.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.0.tgz#546b25a1d8c888569dbbe93cae131748086a4a25" - integrity sha512-jxTmrvuecVISvKFFhOkjsWRZV7sFqdSUAd1ajOKY+/QE/aLBVstsJ/dX8GczLzwiT6ZEwwmZqtCUHLHHQVzcfA== +jest@^27.4.3: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== dependencies: - "@jest/core" "^26.6.0" + "@jest/core" "^27.5.1" import-local "^3.0.2" - jest-cli "^26.6.0" + jest-cli "^27.5.1" js-sha3@0.8.0: version "0.8.0" @@ -8407,13 +7554,12 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + argparse "^2.0.1" js-yaml@^3.13.1: version "3.14.1" @@ -8423,12 +7569,7 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^16.4.0: +jsdom@^16.6.0: version "16.7.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710" integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== @@ -8481,12 +7622,7 @@ json-buffer@3.0.1, json-buffer@~3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -8501,7 +7637,7 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: +json-schema@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== @@ -8511,7 +7647,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= @@ -8523,18 +7659,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.1: +json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -8544,15 +7673,10 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" +jsonpointer@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" + integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== jss-plugin-camel-case@^10.5.1: version "10.9.0" @@ -8632,15 +7756,15 @@ jss@10.9.0, jss@^10.5.1: array-includes "^3.1.4" object.assign "^4.1.2" -junit-report-builder@^1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/junit-report-builder/-/junit-report-builder-1.3.3.tgz#a848e9ef1b1664b855d1abf8766c39f0a9c5ff33" - integrity sha512-75bwaXjP/3ogyzOSkkcshXGG7z74edkJjgTZlJGAyzxlOHaguexM3VLG6JyD9ZBF8mlpgsUPB1sIWU4LISgeJw== +junit-report-builder@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/junit-report-builder/-/junit-report-builder-3.0.0.tgz#829680cfb20d99ce70e26cbb426162afe199fedc" + integrity sha512-aW7DnfLddUb51T+V08bJyecexaLomy5ID/0FXvhwsRXs9E0abvDaDT024U99J2agU3dt4q0ppzfKxSwrIIgXWg== dependencies: date-format "0.0.2" lodash "^4.17.15" - mkdirp "^0.5.0" - xmlbuilder "^10.0.0" + make-dir "^1.3.0" + xmlbuilder "^15.1.1" keycharm@^0.3.1: version "0.3.1" @@ -8655,31 +7779,7 @@ keyv@^4.0.0: compress-brotli "^1.3.6" json-buffer "3.0.1" -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -8689,11 +7789,16 @@ kleur@^3.0.3: resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -klona@^2.0.4: +klona@^2.0.4, klona@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== +ky@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/ky/-/ky-0.30.0.tgz#a3d293e4f6c4604a9a4694eceb6ce30e73d27d64" + integrity sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog== + language-subtag-registry@~0.3.2: version "0.3.21" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz#04ac218bea46f04cb039084602c6da9e788dd45a" @@ -8706,14 +7811,6 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" -last-call-webpack-plugin@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz#9742df0e10e3cf46e5c0381c2de90d3a7a2d7555" - integrity sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w== - dependencies: - lodash "^4.17.5" - webpack-sources "^1.1.0" - lazystream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638" @@ -8742,6 +7839,19 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lighthouse-logger@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz#ba6303e739307c4eee18f08249524e7dafd510db" + integrity sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA== + dependencies: + debug "^2.6.9" + marky "^1.2.2" + +lilconfig@^2.0.3, lilconfig@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.5.tgz#19e57fd06ccc3848fd1891655b5a447092225b25" + integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -8758,37 +7868,10 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -loader-utils@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" - integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" - integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== loader-utils@^2.0.0: version "2.0.2" @@ -8799,6 +7882,11 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" +loader-utils@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" + integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -8822,16 +7910,18 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash-es@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" @@ -8897,25 +7987,10 @@ lodash.pickby@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.pickby/-/lodash.pickby-4.6.0.tgz#7dea21d8c18d7703a27c704c15d3b84a67e33aff" integrity sha1-feoh2MGNdwOifHBMFdO4SmfjOv8= -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= lodash.union@^4.6.0: version "4.6.0" @@ -8932,33 +8007,25 @@ lodash.zip@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.zip/-/lodash.zip-4.2.0.tgz#ec6662e4896408ed4ab6c542a3990b72cc080020" integrity sha1-7GZi5IlkCO1KtsVCo5kLcswIACA= -"lodash@>=3.5 <5", lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.7.0, lodash@~4.17.10: +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.10: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" - -log-update@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-3.4.0.tgz#3b9a71e00ac5b1185cc193a36d654581c48f97b9" - integrity sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg== +log-symbols@4.1.0, log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: - ansi-escapes "^3.2.0" - cli-cursor "^2.1.0" - wrap-ansi "^5.0.0" + chalk "^4.1.0" + is-unicode-supported "^0.1.0" loglevel-plugin-prefix@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz#2fe0e05f1a820317d98d8c123e634c1bd84ff644" integrity sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g== -loglevel@^1.6.0, loglevel@^1.6.8: +loglevel@^1.6.0: version "1.8.0" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114" integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA== @@ -8990,13 +8057,6 @@ lru-cache@^4.0.1: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -9016,15 +8076,14 @@ magic-string@^0.25.0, magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== +make-dir@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: - pify "^4.0.1" - semver "^5.6.0" + pify "^3.0.0" -make-dir@^3.0.0, make-dir@^3.0.2: +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== @@ -9038,22 +8097,15 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" +marky@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.4.tgz#d02bb4c08be2366687c778ecd2a328971ce23d7f" + integrity sha512-zd2/GiSn6U3/jeFVZ0J9CA1LzQ8RfIVvXkb/U0swFHF/zT+dVohTAWjmo2DcIuofmIIIROlwTbd+shSeXmxr0w== match-sorter@^6.0.2: version "6.3.1" @@ -9063,15 +8115,6 @@ match-sorter@^6.0.2: "@babel/runtime" "^7.12.5" remove-accents "0.4.2" -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - mdn-data@2.0.14: version "2.0.14" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" @@ -9087,21 +8130,12 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== +memfs@^3.1.2, memfs@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" + integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" + fs-monkey "1.0.3" merge-descriptors@1.0.1: version "1.0.1" @@ -9123,30 +8157,6 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -microevent.ts@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz#70b09b83f43df5172d0205a63025bce0f7357fa0" - integrity sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g== - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.2, micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -9160,20 +8170,12 @@ microseconds@0.2.0: resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39" integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA== -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -9185,16 +8187,6 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -9223,26 +8215,18 @@ mini-create-react-context@^0.4.0: "@babel/runtime" "^7.12.1" tiny-warning "^1.0.3" -mini-css-extract-plugin@0.11.3: - version "0.11.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz#15b0910a7f32e62ffde4a7430cfefbd700724ea6" - integrity sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA== +mini-css-extract-plugin@^2.4.5: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.0.tgz#578aebc7fc14d32c0ad304c2c34f08af44673f5e" + integrity sha512-ndG8nxCEnAemsg4FSgS+yNyHKgkTB4nPKqCOgh65j3/30qqC5RaSQQXMm++Y6sb6E1zRSxPkztj9fqxhS1Eo6w== dependencies: - loader-utils "^1.1.0" - normalize-url "1.9.1" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" + schema-utils "^4.0.0" -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: +minimalistic-assert@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - minimatch@3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -9250,6 +8234,13 @@ minimatch@3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@5.0.1, minimatch@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -9269,141 +8260,61 @@ minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.6" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" - integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== - dependencies: - yallist "^4.0.0" - -minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.4.tgz#fd01504a6797ec5c9be81ff43d204961ed64a512" - integrity sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw== - dependencies: - minimist "^1.2.5" +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: +mkdirp@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mocha@^6.1.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.3.tgz#e648432181d8b99393410212664450a4c1e31912" - integrity sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg== +mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" + integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== dependencies: - ansi-colors "3.2.3" + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" browser-stdout "1.3.1" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" he "1.2.0" - js-yaml "3.13.1" - log-symbols "2.2.0" - minimatch "3.0.4" - mkdirp "0.5.4" - ms "2.1.1" - node-environment-flags "1.0.5" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" moment@^2.29.2: - version "2.29.2" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4" - integrity sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg== - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" + version "2.29.3" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.3.tgz#edd47411c322413999f7a5940d526de183c031f3" + integrity sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw== ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -9414,17 +8325,12 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== +multicast-dns@^7.2.4: + version "7.2.4" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.4.tgz#cf0b115c31e922aeb20b64e6556cbeb34cf0dd19" + integrity sha512-XkCYOU+rr2Ft3LI6w4ye51M3VK31qJXFIxu0XLw169PtKG0Zx47OrXeVW/GCYOfpC9s1yyyf1S+L8/4LY0J9Zw== dependencies: - dns-packet "^1.3.1" + dns-packet "^5.2.2" thunky "^1.0.2" mute-stream@0.0.8: @@ -9432,11 +8338,6 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== - nano-time@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef" @@ -9449,39 +8350,20 @@ nanoclone@^0.2.1: resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + nanoid@^2.1.0: version "2.1.11" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280" integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA== -nanoid@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" - integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -native-url@^0.2.6: - version "0.2.6" - resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.2.6.tgz#ca1258f5ace169c716ff44eccbddb674e10399ae" - integrity sha512-k4bDC87WtgrdD362gZz6zoiXQrl40kYlBmpfmSjwRO1VU0V5ccwJTlxuE72F6m3V0vc1xOf6n3UCP9QyerRqmA== - dependencies: - querystring "^0.2.0" +nanoid@^3.3.3: + version "3.3.4" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== natural-compare@^1.4.0: version "1.4.0" @@ -9493,21 +8375,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.5.0, neo-async@^2.6.1, neo-async@^2.6.2: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -9516,15 +8388,14 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-environment-flags@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" - integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" + whatwg-url "^5.0.0" -node-forge@^0.10.0, node-forge@^1.3.0: +node-forge@^1, node-forge@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== @@ -9534,53 +8405,17 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-notifier@^8.0.0: - version "8.0.2" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5" - integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg== - dependencies: - growly "^1.3.0" - is-wsl "^2.2.0" - semver "^7.3.2" - shellwords "^0.1.1" - uuid "^8.3.0" - which "^2.0.2" - node-releases@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +node-releases@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.4.tgz#f38252370c43854dc48aa431c766c6c398f40476" + integrity sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ== + +normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -9590,13 +8425,6 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -9607,34 +8435,12 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - normalize-url@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -9648,70 +8454,31 @@ nth-check@^1.0.2, nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== -object-inspect@^1.12.0, object-inspect@^1.9.0: +object-inspect@^1.10.3, object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== -object-is@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" @@ -9722,7 +8489,7 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.5: +object.entries@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== @@ -9740,7 +8507,7 @@ object.fromentries@^2.0.5: define-properties "^1.1.3" es-abstract "^1.19.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0: +object.getownpropertydescriptors@^2.1.0: version "2.1.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== @@ -9757,13 +8524,6 @@ object.hasown@^1.1.0: define-properties "^1.1.3" es-abstract "^1.19.1" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - object.values@^1.1.0, object.values@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" @@ -9783,10 +8543,10 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" @@ -9802,42 +8562,21 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -open@^7.0.2: - version "7.4.2" - resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== +open@^8.0.9, open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - -optimize-css-assets-webpack-plugin@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz#85883c6528aaa02e30bbad9908c92926bb52dc90" - integrity sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A== - dependencies: - cssnano "^4.1.10" - last-call-webpack-plugin "^3.0.0" + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" optionator@^0.8.1: version "0.8.3" @@ -9863,17 +8602,20 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== dependencies: - url-parse "^1.4.3" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" os-tmpdir@~1.0.2: version "1.0.2" @@ -9885,15 +8627,10 @@ p-cancelable@^2.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== -p-each-series@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" - integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +p-iteration@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/p-iteration/-/p-iteration-1.1.8.tgz#14df726d55af368beba81bcc92a26bb1b48e714a" + integrity sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ== p-limit@^1.1.0: version "1.3.0" @@ -9937,24 +8674,20 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - aggregate-error "^3.0.0" + p-limit "^3.0.2" -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - retry "^0.12.0" + "@types/retry" "0.12.0" + retry "^0.13.1" p-try@^1.0.0: version "1.0.0" @@ -9966,21 +8699,7 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pako@~1.0.5: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -param-case@^3.0.3: +param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== @@ -9995,17 +8714,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" @@ -10013,15 +8721,7 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -10059,16 +8759,6 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -10091,16 +8781,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -10137,17 +8817,6 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" @@ -10168,7 +8837,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.0, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -10178,10 +8847,10 @@ pify@^2.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" @@ -10195,654 +8864,520 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pirates@^4.0.1: +pirates@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: +pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" -pkg-up@3.1.0: +pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== dependencies: find-up "^3.0.0" -pnp-webpack-plugin@1.6.4: - version "1.6.4" - resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz#c9711ac4dc48a685dabafc86f8b6dd9f8df84149" - integrity sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg== - dependencies: - ts-pnp "^1.1.6" - popper.js@1.16.1-lts: version "1.16.1-lts" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== -portfinder@^1.0.26: - version "1.0.28" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" - integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== - dependencies: - async "^2.6.2" - debug "^3.1.1" - mkdirp "^0.5.5" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-attribute-case-insensitive@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz#d93e46b504589e94ac7277b0463226c68041a880" - integrity sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA== +postcss-attribute-case-insensitive@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz#39cbf6babf3ded1e4abf37d09d6eda21c644105c" + integrity sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ== dependencies: - postcss "^7.0.2" postcss-selector-parser "^6.0.2" -postcss-browser-comments@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-3.0.0.tgz#1248d2d935fb72053c8e1f61a84a57292d9f65e9" - integrity sha512-qfVjLfq7HFd2e0HW4s1dvU8X080OZdG46fFbIBFjW7US7YPDcWfRvdElvwMJr2LI6hMmD+7LnH2HcmXTs+uOig== - dependencies: - postcss "^7" +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz#bcfc86134df5807f5d3c0eefa191d42136b5e72a" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" - integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz#5efd37a88fbabeb00a2966d1e53d98ced93f74e0" - integrity sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g== +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-clamp/-/postcss-clamp-4.1.0.tgz#7263e95abadd8c2ba1bd911b0b5a5c9c93e02363" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-gray@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz#532a31eb909f8da898ceffe296fdc1f864be8547" - integrity sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw== +postcss-color-functional-notation@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz#f59ccaeb4ee78f1b32987d43df146109cc743073" + integrity sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.5" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-hex-alpha@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz#a8d9ca4c39d497c9661e374b9c51899ef0f87388" - integrity sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw== +postcss-color-hex-alpha@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz#61a0fd151d28b128aa6a8a21a2dad24eebb34d52" + integrity sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw== dependencies: - postcss "^7.0.14" - postcss-values-parser "^2.0.1" + postcss-value-parser "^4.2.0" -postcss-color-mod-function@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz#816ba145ac11cc3cb6baa905a75a49f903e4d31d" - integrity sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ== +postcss-color-rebeccapurple@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz#5d397039424a58a9ca628762eb0b88a61a66e079" + integrity sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-color-rebeccapurple@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz#c7a89be872bb74e45b1e3022bfe5748823e6de77" - integrity sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g== +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== +postcss-convert-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz#f8d3abe40b4ce4b1470702a0706343eac17e7c10" + integrity sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g== dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== - dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" +postcss-custom-media@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" + integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== -postcss-custom-media@^7.0.8: - version "7.0.8" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz#fffd13ffeffad73621be5f387076a28b00294e0c" - integrity sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg== +postcss-custom-properties@^12.1.7: + version "12.1.7" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz#ca470fd4bbac5a87fd868636dafc084bc2a78b41" + integrity sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg== dependencies: - postcss "^7.0.14" + postcss-value-parser "^4.2.0" -postcss-custom-properties@^8.0.11: - version "8.0.11" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz#2d61772d6e92f22f5e0d52602df8fae46fa30d97" - integrity sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA== +postcss-custom-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz#022839e41fbf71c47ae6e316cb0e6213012df5ef" + integrity sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q== dependencies: - postcss "^7.0.17" - postcss-values-parser "^2.0.1" + postcss-selector-parser "^6.0.4" -postcss-custom-selectors@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz#64858c6eb2ecff2fb41d0b28c9dd7b3db4de7fba" - integrity sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w== +postcss-dir-pseudo-class@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz#9afe49ea631f0cb36fa0076e7c2feb4e7e3f049c" + integrity sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + postcss-selector-parser "^6.0.9" -postcss-dir-pseudo-class@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz#6e3a4177d0edb3abcc85fdb6fbb1c26dabaeaba2" - integrity sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw== - dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" +postcss-discard-comments@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz#e90019e1a0e5b99de05f63516ce640bd0df3d369" + integrity sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ== -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== +postcss-double-position-gradients@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz#a12cfdb7d11fa1a99ccecc747f0c19718fb37152" + integrity sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ== dependencies: - postcss "^7.0.0" + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" -postcss-double-position-gradients@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz#fc927d52fddc896cb3a2812ebc5df147e110522e" - integrity sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA== +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== dependencies: - postcss "^7.0.5" - postcss-values-parser "^2.0.0" + postcss-value-parser "^4.2.0" -postcss-env-function@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz#0f3e3d3c57f094a92c2baf4b6241f0b0da5365d7" - integrity sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== -postcss-flexbugs-fixes@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" - integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== dependencies: - postcss "^7.0.26" + postcss-selector-parser "^6.0.9" -postcss-focus-visible@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" - integrity sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g== +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== dependencies: - postcss "^7.0.2" + postcss-selector-parser "^6.0.9" -postcss-focus-within@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz#763b8788596cee9b874c999201cdde80659ef680" - integrity sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w== - dependencies: - postcss "^7.0.2" +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== -postcss-font-variant@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz#42d4c0ab30894f60f98b17561eb5c0321f502641" - integrity sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA== - dependencies: - postcss "^7.0.2" +postcss-gap-properties@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz#6401bb2f67d9cf255d677042928a70a915e6ba60" + integrity sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ== -postcss-gap-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz#431c192ab3ed96a3c3d09f2ff615960f902c1715" - integrity sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg== +postcss-image-set-function@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz#bcff2794efae778c09441498f40e0c77374870a9" + integrity sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-image-set-function@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz#28920a2f29945bed4c3198d7df6496d410d3f288" - integrity sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-initial@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" - integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== +postcss-js@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.0.tgz#31db79889531b80dc7bc9b0ad283e418dce0ac00" + integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== dependencies: - postcss "^7.0.2" + camelcase-css "^2.0.1" -postcss-lab-function@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz#bb51a6856cd12289ab4ae20db1e3821ef13d7d2e" - integrity sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg== +postcss-lab-function@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz#e054e662c6480202f5760887ec1ae0d153357123" + integrity sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w== dependencies: - "@csstools/convert-colors" "^1.4.0" - postcss "^7.0.2" - postcss-values-parser "^2.0.0" + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" -postcss-load-config@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" - integrity sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw== +postcss-load-config@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== dependencies: - cosmiconfig "^5.0.0" - import-cwd "^2.0.0" + lilconfig "^2.0.5" + yaml "^1.10.2" -postcss-loader@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-6.2.1.tgz#0895f7346b1702103d30fdc66e4d494a93c008ef" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" -postcss-logical@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" - integrity sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA== - dependencies: - postcss "^7.0.2" +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== -postcss-media-minmax@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz#b75bb6cbc217c8ac49433e12f22048814a4f5ed5" - integrity sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw== - dependencies: - postcss "^7.0.2" +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz#7140bddec173e2d6d657edbd8554a55794e2a5b5" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== +postcss-merge-longhand@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.4.tgz#0f46f8753989a33260efc47de9a0cdc571f2ec5c" + integrity sha512-hbqRRqYfmXoGpzYKeW0/NCZhvNyQIlQeWVSao5iKWdyx7skLvCfQFGIUsP9NUs3dSbPac2IC4Go85/zG+7MlmA== dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== +postcss-merge-rules@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz#d327b221cd07540bcc8d9ff84446d8b404d00162" + integrity sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww== dependencies: - browserslist "^4.0.0" + browserslist "^4.16.6" caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== +postcss-minify-params@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz#77e250780c64198289c954884ebe3ee4481c3b1c" + integrity sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g== dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== +postcss-minify-selectors@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz#17c2be233e12b28ffa8a421a02fc8b839825536c" + integrity sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA== dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + postcss-selector-parser "^6.0.5" -postcss-modules-extract-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" - integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ== - dependencies: - postcss "^7.0.5" +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz#bb14e0cc78279d504dbdcbfd7e0ca28993ffbbb0" - integrity sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw== +postcss-modules-local-by-default@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" + integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== dependencies: - icss-utils "^4.1.1" - postcss "^7.0.32" + icss-utils "^5.0.0" postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" - integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== - dependencies: - postcss "^7.0.6" - postcss-selector-parser "^6.0.0" - -postcss-modules-values@^3.0.0: +postcss-modules-scope@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" - integrity sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg== + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== dependencies: - icss-utils "^4.0.0" - postcss "^7.0.6" + postcss-selector-parser "^6.0.4" -postcss-nesting@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" - integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== - dependencies: - postcss "^7.0.2" - -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - postcss "^7.0.0" + icss-utils "^5.0.0" -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== +postcss-nested@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-5.0.6.tgz#466343f7fc8d3d46af3e7dba3fcd47d052a945bc" + integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-selector-parser "^6.0.6" -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== +postcss-nesting@^10.1.4: + version "10.1.5" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.1.5.tgz#0711260e394cd0e117ff1f879eb1ee9a94550352" + integrity sha512-+NyBBE/wUcJ+NJgVd2FyKIZ414lul6ExqkOt1qXXw7oRzpQ0iT68cVpx+QfHh42QUMHXNoVLlN9InFY9XXK8ng== dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + "@csstools/selector-specificity" "1.0.0" + postcss-selector-parser "^6.0.10" -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== - dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== +postcss-normalize-positions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.0.tgz#902a7cb97cf0b9e8b1b654d4a43d451e48966458" + integrity sha512-8gmItgA4H5xiUxgN/3TVvXRoJxkAWLW6f/KKhdsH03atg0cB8ilXnrB5PpSshwVu/dD2ZsRFQcR1OEmSBDAgcQ== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== +postcss-normalize-repeat-style@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.0.tgz#f6d6fd5a54f51a741cc84a37f7459e60ef7a6398" + integrity sha512-IR3uBjc+7mcWGL6CtniKNQ4Rr5fTxwkaDHwMBDGGs1x9IVRkYIT/M4NelZWkAOBdV6v3Z9S46zqaKGlyzHSchw== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize@8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-8.0.1.tgz#90e80a7763d7fdf2da6f2f0f82be832ce4f66776" - integrity sha512-rt9JMS/m9FHIRroDDBGSMsyW1c0fkvOJPy62ggxSHUldJO7B195TqFMqIf+lY5ezpDcYOV4j86aUp3/XbxzCCQ== +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== dependencies: - "@csstools/normalize.css" "^10.1.0" - browserslist "^4.6.2" - postcss "^7.0.17" - postcss-browser-comments "^3.0.0" - sanitize.css "^10.0.0" + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz#31ecf350e9c6f6ddc250a78f0c3e111f32dd4c30" - integrity sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g== +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-page-break@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz#add52d0e0a528cabe6afee8b46e2abb277df46bf" - integrity sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ== +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/postcss-normalize/-/postcss-normalize-10.0.1.tgz#464692676b52792a06b06880a176279216540dd7" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== dependencies: - postcss "^7.0.2" + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" -postcss-place@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz#e9f39d33d2dc584e46ee1db45adb77ca9d1dcc62" - integrity sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg== - dependencies: - postcss "^7.0.2" - postcss-values-parser "^2.0.0" +postcss-opacity-percentage@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" + integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== -postcss-preset-env@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz#c34ddacf8f902383b35ad1e030f178f4cdf118a5" - integrity sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg== - dependencies: - autoprefixer "^9.6.1" - browserslist "^4.6.4" - caniuse-lite "^1.0.30000981" - css-blank-pseudo "^0.1.4" - css-has-pseudo "^0.10.0" - css-prefers-color-scheme "^3.1.1" - cssdb "^4.4.0" - postcss "^7.0.17" - postcss-attribute-case-insensitive "^4.0.1" - postcss-color-functional-notation "^2.0.1" - postcss-color-gray "^5.0.0" - postcss-color-hex-alpha "^5.0.3" - postcss-color-mod-function "^3.0.3" - postcss-color-rebeccapurple "^4.0.1" - postcss-custom-media "^7.0.8" - postcss-custom-properties "^8.0.11" - postcss-custom-selectors "^5.1.2" - postcss-dir-pseudo-class "^5.0.0" - postcss-double-position-gradients "^1.0.0" - postcss-env-function "^2.0.2" - postcss-focus-visible "^4.0.0" - postcss-focus-within "^3.0.0" - postcss-font-variant "^4.0.0" - postcss-gap-properties "^2.0.0" - postcss-image-set-function "^3.0.1" - postcss-initial "^3.0.0" - postcss-lab-function "^2.0.1" - postcss-logical "^3.0.0" - postcss-media-minmax "^4.0.0" - postcss-nesting "^7.0.0" - postcss-overflow-shorthand "^2.0.0" - postcss-page-break "^2.0.0" - postcss-place "^4.0.1" - postcss-pseudo-class-any-link "^6.0.0" - postcss-replace-overflow-wrap "^3.0.0" - postcss-selector-matches "^4.0.0" - postcss-selector-not "^4.0.0" - -postcss-pseudo-class-any-link@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz#2ed3eed393b3702879dec4a87032b210daeb04d1" - integrity sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew== +postcss-ordered-values@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz#0b41b610ba02906a3341e92cab01ff8ebc598adb" + integrity sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw== dependencies: - postcss "^7.0.2" - postcss-selector-parser "^5.0.0-rc.3" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== - dependencies: - browserslist "^4.0.0" - caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" +postcss-overflow-shorthand@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz#ebcfc0483a15bbf1b27fdd9b3c10125372f4cbc2" + integrity sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg== -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== - dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -postcss-replace-overflow-wrap@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz#61b360ffdaedca84c7c918d2b0f0d0ea559ab01c" - integrity sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw== +postcss-place@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.4.tgz#eb026650b7f769ae57ca4f938c1addd6be2f62c9" + integrity sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg== dependencies: - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-safe-parser@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-safe-parser/-/postcss-safe-parser-5.0.2.tgz#459dd27df6bc2ba64608824ba39e45dacf5e852d" - integrity sha512-jDUfCPJbKOABhwpUKcqCVbbXiloe/QXMcbJ6Iipf3sDIihEzTqRCeMBfRaOHxhBuTYqtASrI1KJWxzztZU4qUQ== +postcss-preset-env@^7.0.1: + version "7.5.0" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.5.0.tgz#0c1f23933597d55dab4a90f61eda30b76e710658" + integrity sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ== + dependencies: + "@csstools/postcss-color-function" "^1.1.0" + "@csstools/postcss-font-format-keywords" "^1.0.0" + "@csstools/postcss-hwb-function" "^1.0.0" + "@csstools/postcss-ic-unit" "^1.0.0" + "@csstools/postcss-is-pseudo-class" "^2.0.2" + "@csstools/postcss-normalize-display-values" "^1.0.0" + "@csstools/postcss-oklab-function" "^1.1.0" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.0" + "@csstools/postcss-unset-value" "^1.0.0" + autoprefixer "^10.4.6" + browserslist "^4.20.3" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^6.6.1" + postcss-attribute-case-insensitive "^5.0.0" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.2" + postcss-color-hex-alpha "^8.0.3" + postcss-color-rebeccapurple "^7.0.2" + postcss-custom-media "^8.0.0" + postcss-custom-properties "^12.1.7" + postcss-custom-selectors "^6.0.0" + postcss-dir-pseudo-class "^6.0.4" + postcss-double-position-gradients "^3.1.1" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.3" + postcss-image-set-function "^4.0.6" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.0" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.1.4" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.3" + postcss-page-break "^3.0.4" + postcss-place "^7.0.4" + postcss-pseudo-class-any-link "^7.1.2" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^5.0.0" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.3.tgz#0e4753518b9f6caa8b649c75b56e69e391d0c12f" + integrity sha512-I9Yp1VV2r8xFwg/JrnAlPCcKmutv6f6Ig6/CHFPqGJiDgYXM9C+0kgLfK4KOXbKNw+63QYl4agRUB0Wi9ftUIg== dependencies: - postcss "^8.1.0" + postcss-selector-parser "^6.0.10" -postcss-selector-matches@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" - integrity sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww== +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" + browserslist "^4.16.6" + caniuse-api "^3.0.0" -postcss-selector-not@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz#263016eef1cf219e0ade9a913780fc1f48204cbf" - integrity sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ== +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== dependencies: - balanced-match "^1.0.0" - postcss "^7.0.2" + postcss-value-parser "^4.2.0" -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz#d2df6bed10b477bf9c52fab28c568b4b29ca4319" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== -postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: +postcss-selector-not@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c" - integrity sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz#ac5fc506f7565dd872f82f5314c0f81a05630dc7" + integrity sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ== dependencies: - cssesc "^2.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" + balanced-match "^1.0.0" -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: version "6.0.10" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== @@ -10850,53 +9385,27 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" - integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" + postcss-value-parser "^4.2.0" + svgo "^2.7.0" -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" + postcss-selector-parser "^6.0.5" -postcss-value-parser@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0: +postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f" - integrity sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg== - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss@7.0.36: - version "7.0.36" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.35: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -10904,12 +9413,12 @@ postcss@^7, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, po picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.1.0: - version "8.4.12" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" - integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== +postcss@^8.3.5, postcss@^8.4.12, postcss@^8.4.4, postcss@^8.4.7: + version "8.4.13" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.13.tgz#7c87bc268e79f7f86524235821dfdf9f73e5d575" + integrity sha512-jtL6eTBrza5MPzy8oJLFuUscHDXTV5KcLlqAWHl5q5WYRfnNRGSmOZmOZ1T6Gy7A99mOZfqungmZMpMmCVJ8ZA== dependencies: - nanoid "^3.3.1" + nanoid "^3.3.3" picocolors "^1.0.0" source-map-js "^1.0.2" @@ -10923,60 +9432,25 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - prettier@^2.2.1: version "2.6.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== -pretty-bytes@^5.3.0: +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== -pretty-error@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6" - integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw== +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== dependencies: lodash "^4.17.20" - renderkid "^2.0.4" - -pretty-format@^24.0.0, pretty-format@^24.3.0, pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - -pretty-format@^25.1.0: - version "25.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" - integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== - dependencies: - "@jest/types" "^25.5.0" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^16.12.0" - -pretty-format@^26.6.0, pretty-format@^26.6.2: - version "26.6.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" - integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== - dependencies: - "@jest/types" "^26.6.2" - ansi-regex "^5.0.0" - ansi-styles "^4.0.0" - react-is "^17.0.1" + renderkid "^3.0.0" -pretty-format@^27.0.2: +pretty-format@^27.0.0, pretty-format@^27.0.2, pretty-format@^27.5.1: version "27.5.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== @@ -10985,10 +9459,20 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-ms@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-5.1.0.tgz#b906bdd1ec9e9799995c372e2b1c34f073f95384" - integrity sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw== +pretty-format@^28.1.0: + version "28.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.0.tgz#8f5836c6a0dfdb834730577ec18029052191af55" + integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q== + dependencies: + "@jest/schemas" "^28.0.2" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-ms@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-7.0.1.tgz#7d903eaab281f7d8e03c66f867e239dc32fb73e8" + integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== dependencies: parse-ms "^2.1.0" @@ -10997,21 +9481,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@2.0.3, progress@^2.0.0: +progress@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - promise@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -11019,15 +9493,7 @@ promise@^8.1.0: dependencies: asap "~2.0.6" -prompts@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prompts@^2.0.1: +prompts@^2.0.1, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -11064,41 +9530,21 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.28, psl@^1.1.33: +psl@^1.1.33: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -11107,73 +9553,51 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +puppeteer-core@^13.1.3: + version "13.7.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-13.7.0.tgz#3344bee3994163f49120a55ddcd144a40575ba5b" + integrity sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.981744" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + pkg-dir "4.2.0" + progress "2.0.3" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.5.0" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= -qs@6.9.7: - version "6.9.7" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.7.tgz#4610846871485e1e048f44ae3b94033f0e675afe" - integrity sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw== +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== +query-selector-shadow-dom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.0.tgz#8fa7459a4620f094457640e74e953a9dbe61a38e" + integrity sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg== query-state-core@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/query-state-core/-/query-state-core-2.5.0.tgz#7cac3fdc1f79c58c22f35efe8a5f5880f55728d3" integrity sha512-XVo7I/K+gKXqu+HlxtGXfjUtQ+LPjs5bTHB4RC4vDs6yCYLmchc4IxcZWt5EdZZLqIg/CuY+PUxN141t3J17fQ== -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -querystring@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" - integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== - querystringify@^2.1.1: version "2.2.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" @@ -11201,47 +9625,39 @@ raf@^3.4.1: dependencies: performance-now "^2.1.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.3.tgz#8f80305d11c2a0a545c2d9d89d7a0286fcead43c" - integrity sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: bytes "3.1.2" - http-errors "1.8.1" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" -react-app-polyfill@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-2.0.0.tgz#a0bea50f078b8a082970a9d853dc34b6dcc6a3cf" - integrity sha512-0sF4ny9v/B7s6aoehwze9vJNWcmCemAUYBVasscVr92+UYiEqDXOxfKjXN685mDaMRNF3WdhHQs76oTODMocFA== +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz#95221e0a9bd259e5ca6b177c7bb1cb6768f68fd7" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== dependencies: - core-js "^3.6.5" + core-js "^3.19.2" object-assign "^4.1.1" promise "^8.1.0" raf "^3.4.1" - regenerator-runtime "^0.13.7" - whatwg-fetch "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" react-cron-generator@^1.3.5: version "1.3.5" @@ -11259,35 +9675,35 @@ react-data-table-component@^6.11.8: lodash.orderby "^4.6.0" shortid "^2.2.16" -react-dev-utils@^11.0.3: - version "11.0.4" - resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" - integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== - dependencies: - "@babel/code-frame" "7.10.4" - address "1.1.2" - browserslist "4.14.2" - chalk "2.4.2" - cross-spawn "7.0.3" - detect-port-alt "1.1.6" - escape-string-regexp "2.0.0" - filesize "6.1.0" - find-up "4.1.0" - fork-ts-checker-webpack-plugin "4.1.6" - global-modules "2.0.0" - globby "11.0.1" - gzip-size "5.1.1" - immer "8.0.1" - is-root "2.1.0" - loader-utils "2.0.0" - open "^7.0.2" - pkg-up "3.1.0" - prompts "2.4.0" - react-error-overlay "^6.0.9" - recursive-readdir "2.2.2" - shell-quote "1.7.2" - strip-ansi "6.0.0" - text-table "0.2.0" +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" react-dom@^16.8.0: version "16.14.0" @@ -11299,7 +9715,7 @@ react-dom@^16.8.0: prop-types "^15.6.2" scheduler "^0.19.1" -react-error-overlay@^6.0.9: +react-error-overlay@^6.0.11: version "6.0.11" resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== @@ -11324,7 +9740,7 @@ react-helmet@^6.1.0: react-fast-compare "^3.1.1" react-side-effect "^2.1.0" -react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.4: +react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -11334,19 +9750,24 @@ react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react- resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-is@^18.0.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + react-query@^3.19.4: - version "3.34.19" - resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.34.19.tgz#0ff049b6e0d2ed148e9abfdd346625d0e88dc229" - integrity sha512-JO0Ymi58WKmvnhgg6bGIrYIeKb64KsKaPWo8JcGnmK2jJxAs2XmMBzlP75ZepSU7CHzcsWtIIyhMrLbX3pb/3w== + version "3.39.0" + resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.0.tgz#0caca7b0da98e65008bbcd4df0d25618c2100050" + integrity sha512-Od0IkSuS79WJOhzWBx/ys0x13+7wFqgnn64vBqqAAnZ9whocVhl/y1padD5uuZ6EIkXbFbInax0qvY7zGM0thA== dependencies: "@babel/runtime" "^7.5.5" broadcast-channel "^3.4.1" match-sorter "^6.0.2" -react-refresh@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" - integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== +react-refresh@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== react-resize-detector@^5.2.0: version "5.2.0" @@ -11359,15 +9780,15 @@ react-resize-detector@^5.2.0: resize-observer-polyfill "^1.5.1" react-router-dom@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" - integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.1.tgz#0151baf2365c5fcd8493f6ec9b9b31f34d0f8ae1" + integrity sha512-f0pj/gMAbv9e8gahTmCEY20oFhxhrmHwYeIwH5EO5xu0qme+wXtsdB8YfUOAZzUz4VaXmb58m3ceiLtjMhqYmQ== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.2.1" + react-router "5.3.1" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" @@ -11378,10 +9799,10 @@ react-router-use-location-state@^2.5.0: dependencies: use-location-state "^2.5.0" -react-router@5.2.1, react-router@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" - integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== +react-router@5.3.1, react-router@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.1.tgz#b13e84a016c79b9e80dde123ca4112c4f117e3cf" + integrity sha512-v+zwjqb7bakqgF+wMVKlAPTca/cEmPOvQ9zt7gpSNyPXau1+0qvuYZ5BWzzNDP1y6s15zDwgb9rPN63+SIniRQ== dependencies: "@babel/runtime" "^7.12.13" history "^4.9.0" @@ -11394,71 +9815,60 @@ react-router@5.2.1, react-router@^5.2.0: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-scripts@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-4.0.3.tgz#b1cafed7c3fa603e7628ba0f187787964cb5d345" - integrity sha512-S5eO4vjUzUisvkIPB7jVsKtuH2HhWcASREYWHAQ1FP5HyCv3xgn+wpILAEWkmy+A+tTNbSZClhxjT3qz6g4L1A== - dependencies: - "@babel/core" "7.12.3" - "@pmmmwh/react-refresh-webpack-plugin" "0.4.3" - "@svgr/webpack" "5.5.0" - "@typescript-eslint/eslint-plugin" "^4.5.0" - "@typescript-eslint/parser" "^4.5.0" - babel-eslint "^10.1.0" - babel-jest "^26.6.0" - babel-loader "8.1.0" - babel-plugin-named-asset-import "^0.3.7" - babel-preset-react-app "^10.0.0" +react-scripts@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-5.0.1.tgz#6285dbd65a8ba6e49ca8d651ce30645a6d980003" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" bfj "^7.0.2" - camelcase "^6.1.0" - case-sensitive-paths-webpack-plugin "2.3.0" - css-loader "4.3.0" - dotenv "8.2.0" - dotenv-expand "5.1.0" - eslint "^7.11.0" - eslint-config-react-app "^6.0.0" - eslint-plugin-flowtype "^5.2.0" - eslint-plugin-import "^2.22.1" - eslint-plugin-jest "^24.1.0" - eslint-plugin-jsx-a11y "^6.3.1" - eslint-plugin-react "^7.21.5" - eslint-plugin-react-hooks "^4.2.0" - eslint-plugin-testing-library "^3.9.2" - eslint-webpack-plugin "^2.5.2" - file-loader "6.1.1" - fs-extra "^9.0.1" - html-webpack-plugin "4.5.0" - identity-obj-proxy "3.0.0" - jest "26.6.0" - jest-circus "26.6.0" - jest-resolve "26.6.0" - jest-watch-typeahead "0.6.1" - mini-css-extract-plugin "0.11.3" - optimize-css-assets-webpack-plugin "5.0.4" - pnp-webpack-plugin "1.6.4" - postcss-flexbugs-fixes "4.2.1" - postcss-loader "3.0.0" - postcss-normalize "8.0.1" - postcss-preset-env "6.7.0" - postcss-safe-parser "5.0.2" - prompts "2.4.0" - react-app-polyfill "^2.0.0" - react-dev-utils "^11.0.3" - react-refresh "^0.8.3" - resolve "1.18.1" - resolve-url-loader "^3.1.2" - sass-loader "^10.0.5" - semver "7.3.2" - style-loader "1.3.0" - terser-webpack-plugin "4.2.3" - ts-pnp "1.2.0" - url-loader "4.1.1" - webpack "4.44.2" - webpack-dev-server "3.11.1" - webpack-manifest-plugin "2.2.0" - workbox-webpack-plugin "5.1.4" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" optionalDependencies: - fsevents "^2.1.3" + fsevents "^2.3.2" react-side-effect@^2.1.0: version "2.1.1" @@ -11475,7 +9885,7 @@ react-transition-group@^4.4.0: loose-envify "^1.4.0" prop-types "^15.6.2" -react-vis-timeline-2@^2.0.3: +react-vis-timeline-2@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/react-vis-timeline-2/-/react-vis-timeline-2-2.1.6.tgz#4b9a8d5dc1cde31ee7b084952531477f154d9c09" integrity sha512-/RggBBK3E89E1pl4DPe3lEZ+zR3cUZWKpO+/i9vtgv/XiPgSp/QiEY1s05F0AvLjHeYUVgks3XqL1pQxAFossQ== @@ -11506,15 +9916,6 @@ read-pkg-up@^1.0.1: find-up "^1.0.0" read-pkg "^1.0.0" -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" @@ -11524,17 +9925,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.5: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -11556,14 +9947,12 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== +readdir-glob@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.1.tgz#f0e10bb7bf7bfa7e0add8baffdc54c3f7dbee6c4" + integrity sha512-91/k1EzZwDx6HbERR+zucygRFfiPl2zkIYZtv3Jjr6Mn7SkKcVct8aVO+sSRiGMc6fLf72du3d92/uY63YPdEA== dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" + minimatch "^3.0.4" readdirp@~3.6.0: version "3.6.0" @@ -11572,7 +9961,7 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -recursive-readdir@2.2.2: +recursive-readdir@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg== @@ -11599,12 +9988,7 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.7: +regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== @@ -11616,20 +10000,12 @@ regenerator-transform@^0.15.0: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regex-parser@^2.2.11: version "2.2.11" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== -regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1: +regexp.prototype.flags@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz#b3f4c0059af9e47eca9f3f660e51d81307e72307" integrity sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ== @@ -11637,7 +10013,7 @@ regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.4.1: call-bind "^1.0.2" define-properties "^1.1.3" -regexpp@^3.1.0: +regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== @@ -11676,57 +10052,16 @@ remove-accents@0.4.2: resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5" integrity sha1-CkPTqq4egNuRngeuJUsoXZ4ce7U= -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -renderkid@^2.0.4: - version "2.0.7" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" - integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== dependencies: css-select "^4.1.3" dom-converter "^0.2.0" htmlparser2 "^6.1.0" lodash "^4.17.21" - strip-ansi "^3.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -request@^2.83.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + strip-ansi "^6.0.1" require-directory@^2.1.1: version "2.1.1" @@ -11738,11 +10073,6 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -11758,13 +10088,6 @@ resolve-alpn@^1.0.0: resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -11772,11 +10095,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -11792,36 +10110,23 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve-url-loader@^3.1.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320" - integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg== - dependencies: - adjust-sourcemap-loader "3.0.0" - camelcase "5.3.1" - compose-function "3.0.3" - convert-source-map "1.7.0" - es6-iterator "2.0.3" - loader-utils "1.2.3" - postcss "7.0.36" - rework "1.0.1" - rework-visit "1.0.0" +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" source-map "0.6.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.18.1: - version "1.18.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" - integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== - dependencies: - is-core-module "^2.0.0" - path-parse "^1.0.6" +resolve.exports@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" + integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.3.2: +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== @@ -11845,21 +10150,13 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" -resq@^1.6.0: +resq@^1.9.1: version "1.10.2" resolved "https://registry.yarnpkg.com/resq/-/resq-1.10.2.tgz#cedf4f20d53f6e574b1e12afbda446ad9576c193" integrity sha512-HmgVS3j+FLrEDBTDYysPdPVF9/hioDMJ/otOiQDKqk77YfZeeLOj0qi34yObumcud1gBpk+wpBTEg4kMicD++A== dependencies: fast-deep-equal "^2.0.1" -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -11868,48 +10165,20 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rework-visit@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rework-visit/-/rework-visit-1.0.0.tgz#9945b2803f219e2f7aca00adb8bc9f640f842c9a" - integrity sha1-mUWygD8hni96ygCtuLyfZA+ELJo= - -rework@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rework/-/rework-1.0.1.tgz#30806a841342b54510aa4110850cd48534144aa7" - integrity sha1-MIBqhBNCtUUQqkEQhQzUhTQUSqc= - dependencies: - convert-source-map "^0.3.3" - css "^2.0.0" - -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgb2hex@^0.1.0: - version "0.1.10" - resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.1.10.tgz#4fdd432665273e2d5900434940ceba0a04c8a8a8" - integrity sha512-vKz+kzolWbL3rke/xeTE2+6vHmZnNxGyDnaVW4OckntAIcc7DcZzWkQSfxMDwqHS8vhgySnIFyBUH7lIk6PxvQ== - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= +rgb2hex@0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.2.5.tgz#f82230cd3ab1364fa73c99be3a691ed688f8dbdc" + integrity sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw== rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" @@ -11918,65 +10187,27 @@ rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - rison@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/rison/-/rison-0.1.1.tgz#4dcc0557b241aff60e76178e7792135713f33120" integrity sha1-TcwFV7JBr/YOdheOd5ITVxPzMSA= -rollup-plugin-babel@^4.3.3: - version "4.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" - integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - rollup-pluginutils "^2.8.1" - -rollup-plugin-terser@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz#8c650062c22a8426c64268548957463bf981b413" - integrity sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w== +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== dependencies: - "@babel/code-frame" "^7.5.5" - jest-worker "^24.9.0" - rollup-pluginutils "^2.8.2" + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" serialize-javascript "^4.0.0" - terser "^4.6.2" - -rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" - integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== - dependencies: - estree-walker "^0.6.1" + terser "^5.0.0" -rollup@^1.31.1: - version "1.32.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" - integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== - dependencies: - "@types/estree" "*" - "@types/node" "*" - acorn "^7.1.0" - -rsvp@^4.8.4: - version "4.8.5" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" - integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== +rollup@^2.43.1: + version "2.72.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.72.1.tgz#861c94790537b10008f0ca0fbc60e631aabdd045" + integrity sha512-NTc5UGy/NWFGpSqF1lFY8z9Adri6uhyMLI6LvPAXdBKoPRFhIIiBUpt+Qg2awixqO3xvzSijjhnb4+QEZwJmxA== + optionalDependencies: + fsevents "~2.3.2" run-async@^2.4.0: version "2.4.1" @@ -11990,82 +10221,50 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - rw@1: version "1.3.3" resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== +rxjs@^7.2.0, rxjs@^7.5.5: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: - tslib "^1.9.0" + tslib "^2.1.0" safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded" - integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA== - dependencies: - "@cnakazawa/watch" "^1.0.3" - anymatch "^2.0.0" - capture-exit "^2.0.0" - exec-sh "^0.3.2" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - -sanitize.css@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-10.0.0.tgz#b5cb2547e96d8629a60947544665243b1dc3657a" - integrity sha512-vTxrZz4dX5W86M6oVWVdOVe72ZiPs41Oi7Z6Km4W5Turyz28mrXSJhhEBZoRtzJWIv3833WKVwLSDWWkEfupMg== +sanitize.css@*: + version "13.0.0" + resolved "https://registry.yarnpkg.com/sanitize.css/-/sanitize.css-13.0.0.tgz#2675553974b27964c75562ade3bd85d79879f173" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== -sass-loader@^10.0.5: - version "10.2.1" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-10.2.1.tgz#17e51df313f1a7a203889ce8ff91be362651276e" - integrity sha512-RRvWl+3K2LSMezIsd008ErK4rk6CulIMSwrcc2aZvjymUgKo/vjXGp1rSWmfTUX7bblEOz8tst4wBwWtCGBqKA== +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.6.0.tgz#5148362c8e2cdd4b950f3c63ac5d16dbfed37bcb" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== dependencies: klona "^2.0.4" - loader-utils "^2.0.0" neo-async "^2.6.2" - schema-utils "^3.0.0" - semver "^7.3.2" sass@^1.49.9: - version "1.50.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.0.tgz#3e407e2ebc53b12f1e35ce45efb226ea6063c7c8" - integrity sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ== + version "1.51.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.51.0.tgz#25ea36cf819581fe1fe8329e8c3a4eaaf70d2845" + integrity sha512-haGdpTgywJTvHC2b91GSq+clTKGbtkkZmVAb82jZQN/wTy6qs8DdFm2lhEQbEwrY0QDRgSQ3xDurqM977C3noA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -12091,16 +10290,16 @@ scheduler@^0.19.1: loose-envify "^1.1.0" object-assign "^4.1.1" -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" -schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: +schema-utils@^2.6.5: version "2.7.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== @@ -12109,7 +10308,7 @@ schema-utils@^2.6.5, schema-utils@^2.7.0, schema-utils@^2.7.1: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0, schema-utils@^3.1.1: +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -12118,20 +10317,32 @@ schema-utils@^3.0.0, schema-utils@^3.1.1: ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= -selenium-standalone@^6.15.1: - version "6.24.0" - resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-6.24.0.tgz#cca7c1c36bfa3429078a8e6a1a4fd373f641a7c8" - integrity sha512-Dun2XgNAgCfJNrrSzuv7Z7Wj7QTvBKpqx0VXFz7bW9T9FUe5ytzgzoCEEshwDVMh0Dv6sCgdZg7VDhM/q2yPPQ== +selenium-standalone@^8.0.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-8.1.3.tgz#24ad1ee575a88492e640f9d5abad73a7f10808d1" + integrity sha512-Xo6wU8nj9DNrhPKVgtZLCX4oa7Yp0L+XLB7PRozkx//LBaFogQBPZHzDB0MFkpQQIohcqYXn8wZGwVuewO99Xw== dependencies: - commander "^2.20.3" + commander "^9.0.0" cross-spawn "^7.0.3" debug "^4.3.1" + fs-extra "^10.0.0" got "^11.8.2" + is-port-reachable "^3.0.0" lodash.mapvalues "^4.6.0" lodash.merge "^4.6.2" minimist "^1.2.5" @@ -12141,14 +10352,14 @@ selenium-standalone@^6.15.1: which "^2.0.2" yauzl "^2.10.0" -selfsigned@^1.10.8: - version "1.10.14" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.14.tgz#ee51d84d9dcecc61e07e4aba34f229ab525c1574" - integrity sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA== +selfsigned@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" + integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== dependencies: - node-forge "^0.10.0" + node-forge "^1" -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -12158,48 +10369,50 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== - semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5: +semver@^7.3.2, semver@^7.3.5: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" -serialize-error@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac" - integrity sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA== +serialize-error@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== + dependencies: + type-fest "^0.20.2" + +serialize-javascript@6.0.0, serialize-javascript@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: - type-fest "^0.8.0" + randombytes "^2.1.0" serialize-javascript@^4.0.0: version "4.0.0" @@ -12208,13 +10421,6 @@ serialize-javascript@^4.0.0: dependencies: randombytes "^2.1.0" -serialize-javascript@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4" - integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== - dependencies: - randombytes "^2.1.0" - serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -12228,35 +10434,15 @@ serve-index@^1.9.1: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + send "0.18.0" setprototypeof@1.1.0: version "1.1.0" @@ -12268,26 +10454,11 @@ setprototypeof@1.2.0: resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -12295,25 +10466,15 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" - integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shell-quote@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== shortid@^2.2.16: version "2.2.16" @@ -12331,18 +10492,11 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -12353,55 +10507,10 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^4.0.0: +slash@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sockjs-client@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.6.0.tgz#e0277b8974558edcb557eafc7d3027ef6128d865" - integrity sha512-qVHJlyfdHFht3eBFZdKEXKTlb7I4IV41xnVNo8yUKA1UHcPJwgW2SvTq9LhnjjCywSkSK7c/e4nghU0GOoMCRQ== - dependencies: - debug "^3.2.7" - eventsource "^1.1.0" - faye-websocket "^0.11.4" - inherits "^2.0.4" - url-parse "^1.5.10" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== sockjs@^0.3.21: version "0.3.24" @@ -12412,35 +10521,34 @@ sockjs@^0.3.21: uuid "^8.3.2" websocket-driver "^0.7.4" -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: +source-list-map@^2.0.0, source-list-map@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== +source-map-loader@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-3.0.1.tgz#9ae5edc7c2d42570934be4c95d1ccc6352eba52d" + integrity sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-resolve@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2" + integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w== dependencies: atob "^2.1.2" decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.20: +source-map-support@^0.5.6, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -12448,26 +10556,28 @@ source-map-support@^0.5.6, source-map-support@~0.5.12, source-map-support@~0.5.2 buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.7.3, source-map@~0.7.2: +source-map@^0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== +source-map@^0.8.0-beta.0, source-map@~0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" @@ -12522,53 +10632,22 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" +split2@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/split2/-/split2-4.1.0.tgz#101907a24370f85bb782f08adaabe4e281ecf809" + integrity sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -ssri@^6.0.1: - version "6.0.2" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" - integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== - dependencies: - figgy-pudding "^3.5.1" - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - stable@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== -stack-utils@^2.0.2: +stack-utils@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== @@ -12585,61 +10664,21 @@ state-local@^1.0.6: resolved "https://registry.yarnpkg.com/state-local/-/state-local-1.0.7.tgz#da50211d07f05748d53009bee46307a37db386d5" integrity sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w== -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0: +"statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - stream-buffers@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-3.0.2.tgz#5249005a8d5c2d00b3a32e6e0a6ea209dc4f3521" integrity sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ== -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= - string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -12648,28 +10687,19 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-5.0.1.tgz#3d647f497b6e8e8d41e422f7e0b23bc536c8381e" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + string-natural-compare@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -12709,7 +10739,7 @@ string.prototype.trimstart@^1.0.4: call-bind "^1.0.2" define-properties "^1.1.3" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -12732,34 +10762,13 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -12767,6 +10776,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -12784,18 +10800,10 @@ strip-bom@^4.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-comments@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz#82b9c45e7f05873bee53f37168af930aa368679d" - integrity sha512-kL97alc47hoyIQSV165tTt9rG5dn4w1dNnBhOQ3bOU1Nc1hel09jnXANaHJ7vzHLd4Ju8kseDGzlev96pghLFw== - dependencies: - babel-extract-comments "^1.0.0" - babel-plugin-transform-object-rest-spread "^6.26.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== strip-final-newline@^2.0.0: version "2.0.0" @@ -12809,23 +10817,15 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.3.0.tgz#828b4a3b3b7e7aa5847ce7bae9e874512114249e" - integrity sha512-V7TCORko8rs9rIqkSrlMfkqA63DfoGBBJmK1kKGCcSi+BWb4cqz0SRsnp4l6rU5iwOEd0/2ePv68SV22VXon4Q== - dependencies: - loader-utils "^2.0.0" - schema-utils "^2.7.0" +style-loader@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.1.tgz#057dfa6b3d4d7c7064462830f9113ed417d38575" + integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== styled-components@^5.3.0: version "5.3.5" @@ -12843,26 +10843,25 @@ styled-components@^5.3.0: shallowequal "^1.1.0" supports-color "^5.5.0" -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" suffix@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/suffix/-/suffix-0.1.1.tgz#cc58231646a0ef1102f79478ef3a9248fd9c842f" integrity sha1-zFgjFkag7xEC95R47zqSSP2chC8= -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== +supports-color@8.1.1, supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" supports-color@^2.0.0: version "2.0.0" @@ -12876,13 +10875,6 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -12890,13 +10882,6 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - supports-hyperlinks@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -12915,7 +10900,7 @@ svg-parser@^2.0.2: resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== -svgo@^1.0.0, svgo@^1.2.2: +svgo@^1.2.2: version "1.3.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== @@ -12934,28 +10919,72 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" +tailwindcss@^3.0.2: + version "3.0.24" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.24.tgz#22e31e801a44a78a1d9a81ecc52e13b69d85704d" + integrity sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig== + dependencies: + arg "^5.0.1" + chokidar "^3.5.3" + color-name "^1.1.4" + detective "^5.2.0" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.2.11" + glob-parent "^6.0.2" + is-glob "^4.0.3" + lilconfig "^2.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.12" + postcss-js "^4.0.0" + postcss-load-config "^3.1.4" + postcss-nested "5.0.6" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" + quick-lru "^5.1.1" + resolve "^1.22.0" -tapable@^1.0.0, tapable@^1.1.3: +tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar-stream@2.2.0, tar-stream@^2.1.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@2.2.0, tar-stream@^2.1.4, tar-stream@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -12966,31 +10995,20 @@ tar-stream@2.2.0, tar-stream@^2.1.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== -tempy@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.3.0.tgz#6f6c5b295695a16130996ad5ab01a8bd726e8bf8" - integrity sha512-WrH/pui8YCwmeiAoxV+lpRH9HpRtgBhSR2ViBPgpGb/wnYDzp21R4MN45fsCGvLROvY67o3byhJRYRONJyImVQ== +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== dependencies: - temp-dir "^1.0.0" - type-fest "^0.3.1" - unique-string "^1.0.0" + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" terminal-link@^2.0.0: version "2.1.1" @@ -13000,53 +11018,25 @@ terminal-link@^2.0.0: ansi-escapes "^4.2.1" supports-hyperlinks "^2.0.0" -terser-webpack-plugin@4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz#28daef4a83bd17c1db0297070adc07fc8cfc6a9a" - integrity sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ== - dependencies: - cacache "^15.0.5" - find-cache-dir "^3.3.1" - jest-worker "^26.5.0" - p-limit "^3.0.2" - schema-utils "^3.0.0" - serialize-javascript "^5.0.1" - source-map "^0.6.1" - terser "^5.3.4" - webpack-sources "^1.4.3" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: + version "5.3.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54" + integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g== dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.0" source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2, terser@^4.6.2, terser@^4.6.3: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" + terser "^5.7.2" -terser@^5.3.4: - version "5.12.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.1.tgz#4cf2ebed1f5bceef5c83b9f60104ac4a78b49e9c" - integrity sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ== +terser@^5.0.0, terser@^5.10.0, terser@^5.7.2: + version "5.13.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.13.1.tgz#66332cdc5a01b04a224c9fad449fc1a18eaa1799" + integrity sha512-hn4WKOfwnwbYfe48NgrQjqNOH9jzLqRcIfbYytOXCOv46LBfWr9bDS17MQqOi+BWGD0sJK3Sj5NC/gJjiojaoA== dependencies: acorn "^8.5.0" commander "^2.20.0" - source-map "~0.7.2" + source-map "~0.8.0-beta.0" source-map-support "~0.5.20" test-exclude@^6.0.0: @@ -13058,25 +11048,17 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -text-table@0.2.0, text-table@^0.2.0: +text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throat@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" - integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" +throat@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" + integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== -through@^2.3.6: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -13086,18 +11068,6 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -timers-browserify@^2.0.4: - version "2.0.12" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" - integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== - dependencies: - setimmediate "^1.0.4" - -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - tiny-invariant@^1.0.2: version "1.2.0" resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9" @@ -13120,31 +11090,11 @@ tmpl@1.0.5: resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -13152,16 +11102,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -13181,13 +11121,12 @@ tough-cookie@^4.0.0: punycode "^2.1.1" universalify "^0.1.2" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= dependencies: - psl "^1.1.28" - punycode "^2.1.1" + punycode "^2.1.0" tr46@^2.1.0: version "2.1.0" @@ -13196,16 +11135,16 @@ tr46@^2.1.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-pnp@1.2.0, ts-pnp@^1.1.6: - version "1.2.0" - resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" - integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== - tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -13216,7 +11155,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.10.0, tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -13226,30 +11165,18 @@ tslib@^2.0.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tsutils@^3.17.1, tsutils@^3.21.0: +tslib@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -13269,6 +11196,11 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -13279,21 +11211,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" - integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.0, type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -13302,16 +11219,6 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/type/-/type-2.6.0.tgz#3ca6099af5981d36ca86b78442973694278a219f" - integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ== - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -13319,15 +11226,15 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - typescript@^4.6.3: - version "4.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + +ua-parser-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775" + integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg== unbox-primitive@^1.0.1: version "1.0.1" @@ -13339,6 +11246,14 @@ unbox-primitive@^1.0.1: has-symbols "^1.0.2" which-boxed-primitive "^1.0.2" +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -13362,48 +11277,14 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= - -uniqs@^2.0.0: +unique-string@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== dependencies: - crypto-random-string "^1.0.0" + crypto-random-string "^2.0.0" -universalify@^0.1.0, universalify@^0.1.2: +universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -13431,15 +11312,7 @@ unquote@~1.1.1: resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1, upath@^1.1.2, upath@^1.2.0: +upath@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== @@ -13451,21 +11324,7 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url-loader@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse@^1.4.3, url-parse@^1.5.1, url-parse@^1.5.10: +url-parse@^1.5.1: version "1.5.10" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== @@ -13473,14 +11332,6 @@ url-parse@^1.4.3, url-parse@^1.5.1, url-parse@^1.5.10: querystringify "^2.1.1" requires-port "^1.0.0" -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - use-local-storage-state@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/use-local-storage-state/-/use-local-storage-state-10.0.0.tgz#862d142e5d1fff30820102f0cd871e96e5527342" @@ -13493,24 +11344,11 @@ use-location-state@^2.5.0: dependencies: query-state-core "^2.5.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - util.promisify@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" @@ -13521,20 +11359,6 @@ util.promisify@~1.0.0: has-symbols "^1.0.1" object.getownpropertydescriptors "^2.1.0" -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -13545,17 +11369,12 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^7.0.0: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== -uuid@^8.3.0, uuid@^8.3.2: +uuid@^8.0.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -13565,10 +11384,10 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" - integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -13582,7 +11401,7 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -validator@^12.0.0, validator@^13.7.0: +validator@^13.0.0, validator@^13.7.0: version "13.7.0" resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== @@ -13597,20 +11416,6 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - vis-data@^7.1.0: version "7.1.4" resolved "https://registry.yarnpkg.com/vis-data/-/vis-data-7.1.4.tgz#90e5e796a79e1901de14c0808fb32a1a0735c1dc" @@ -13626,11 +11431,6 @@ vis-util@^4.3.4: resolved "https://registry.yarnpkg.com/vis-util/-/vis-util-4.3.4.tgz#02319fbd909f82782b96a36d1224f1beea67f8b2" integrity sha512-hJIZNrwf4ML7FYjs+m+zjJfaNvhjk3/1hbMdQZVnwwpOFJS/8dMG8rdbOHXcKoIEM6U5VOh3HNpaDXxGkOZGpw== -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - w3c-hr-time@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -13645,35 +11445,20 @@ w3c-xmlserializer@^2.0.0: dependencies: xml-name-validator "^3.0.0" -wait-for-expect@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463" - integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag== - -walker@^1.0.7, walker@~1.0.5: +walker@^1.0.7: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== +watchpack@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" + integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== dependencies: + glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -13689,72 +11474,63 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -webdriver@5.18.4: - version "5.18.4" - resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-5.18.4.tgz#5f88184754c70a76d436a3496ef41c6dc388dee0" - integrity sha512-9Wkzb/LldcGRniPHnmLicKGtdiQFMfezWwjv0mHlKx2B1kx/EhVDQ4gQjon03o891CEcazDKBcVh19eSJbZllQ== - dependencies: - "@wdio/config" "5.18.4" - "@wdio/logger" "5.16.10" - "@wdio/protocols" "5.16.7" - "@wdio/utils" "5.16.15" +webdriver@7.19.7, webdriver@^7.19.7: + version "7.19.7" + resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-7.19.7.tgz#be2ba4052d9fad9cfdc88024949a55cb2f28168f" + integrity sha512-3gygDpwaCMZlUhh7Wv1SbjTvfdLGbPqRQ3poZ7lKvsVAAmciLziJDeR8LrNTyS9R418MgNbBdWOQrHGS+gp0ZQ== + dependencies: + "@types/node" "^17.0.4" + "@wdio/config" "7.19.5" + "@wdio/logger" "7.19.0" + "@wdio/protocols" "7.19.0" + "@wdio/types" "7.19.5" + "@wdio/utils" "7.19.7" + got "^11.0.2" + ky "^0.30.0" lodash.merge "^4.6.1" - request "^2.83.0" -webdriver@5.23.0, webdriver@^5.0.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/webdriver/-/webdriver-5.23.0.tgz#5373e3e43803aaf962da24b47bbdb98bf8f84cc6" - integrity sha512-r7IrbZ2SuTIRyWV8mv4a4hZoFcT9Qt4MznOkdRWPE1sPpZ8lyLZsIEjKCEbHelOzPwURqk+biwGrm4z2OZRAiw== - dependencies: - "@types/request" "^2.48.4" - "@wdio/config" "5.22.4" - "@wdio/logger" "5.16.10" - "@wdio/protocols" "5.22.1" - "@wdio/utils" "5.23.0" - lodash.merge "^4.6.1" - request "^2.83.0" - -webdriverio@5.18.5: - version "5.18.5" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-5.18.5.tgz#100c1ae61eef35cffee3c17ae0ecfa2e9b001df4" - integrity sha512-1DR9l4eQb9SQNbiG/yywF7dpGoCWcUWpkO4dzUR7bSvhDo4hay/EK/5U5CYoxT13HfYV9QFKkpyOiXb2vMziqw== - dependencies: - "@wdio/config" "5.18.4" - "@wdio/logger" "5.16.10" - "@wdio/repl" "5.16.15" - "@wdio/utils" "5.16.15" - archiver "^3.0.0" +webdriverio@7.19.7, webdriverio@^7.19.7: + version "7.19.7" + resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-7.19.7.tgz#781d43cf4db272537cd5422649145f93225b6aa2" + integrity sha512-GaekRmFN3wokW3VN08hFjTJ3GagJxuKR6AV8kVvlxxMye9nfU3TQPzsrqGrue8uWYvyZ3x0SVkUluwtImZNzPA== + dependencies: + "@types/aria-query" "^5.0.0" + "@types/node" "^17.0.4" + "@wdio/config" "7.19.5" + "@wdio/logger" "7.19.0" + "@wdio/protocols" "7.19.0" + "@wdio/repl" "7.19.7" + "@wdio/types" "7.19.5" + "@wdio/utils" "7.19.7" + archiver "^5.0.0" + aria-query "^5.0.0" + css-shorthand-properties "^1.1.1" css-value "^0.0.1" + devtools "7.19.7" + devtools-protocol "^0.0.998712" + fs-extra "^10.0.0" grapheme-splitter "^1.0.2" lodash.clonedeep "^4.5.0" lodash.isobject "^3.0.2" lodash.isplainobject "^4.0.6" lodash.zip "^4.2.0" - resq "^1.6.0" - rgb2hex "^0.1.0" - serialize-error "^5.0.0" - webdriver "5.18.4" + minimatch "^5.0.0" + puppeteer-core "^13.1.3" + query-selector-shadow-dom "^1.0.0" + resq "^1.9.1" + rgb2hex "0.2.5" + serialize-error "^8.0.0" + webdriver "7.19.7" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= -webdriverio@^5.0.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/webdriverio/-/webdriverio-5.23.0.tgz#ec7191c127f8b7c561832c2b5f5fd1dcc9386ef9" - integrity sha512-hxt6Nuu2bBrTsVk7GfoFRTh63l4fRVXlK9U30RtPbHoWO5tcFdyUz2UTgeHEZ54ea1DQEVPfsgFiLnJULkWp1Q== - dependencies: - "@wdio/config" "5.22.4" - "@wdio/logger" "5.16.10" - "@wdio/repl" "5.23.0" - "@wdio/utils" "5.23.0" - archiver "^3.0.0" - css-value "^0.0.1" - grapheme-splitter "^1.0.2" - lodash.clonedeep "^4.5.0" - lodash.isobject "^3.0.2" - lodash.isplainobject "^4.0.6" - lodash.zip "^4.2.0" - resq "^1.6.0" - rgb2hex "^0.1.0" - serialize-error "^5.0.0" - webdriver "5.23.0" +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== webidl-conversions@^5.0.0: version "5.0.0" @@ -13766,75 +11542,60 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-dev-middleware@^3.7.2: - version "3.7.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" - integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== +webpack-dev-middleware@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" + integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" + colorette "^2.0.10" + memfs "^3.4.1" + mime-types "^2.1.31" range-parser "^1.2.1" - webpack-log "^2.0.0" - -webpack-dev-server@3.11.1: - version "3.11.1" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz#c74028bf5ba8885aaf230e48a20e8936ab8511f0" - integrity sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ== - dependencies: - ansi-html "0.0.7" - bonjour "^3.5.0" - chokidar "^2.1.8" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.9.0.tgz#737dbf44335bb8bde68f8f39127fc401c97a1557" + integrity sha512-+Nlb39iQSOSsFv0lWUuUTim3jDQO8nhK3E68f//J2r5rIcp4lULHXz2oZ0UVdEeWXEh5lSzYUlzarZhDAeAVQw== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.1" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" - express "^4.17.1" - html-entities "^1.3.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.8" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.26" - schema-utils "^1.0.0" - selfsigned "^1.10.8" - semver "^6.3.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.0.1" serve-index "^1.9.1" sockjs "^0.3.21" - sockjs-client "^1.5.0" spdy "^4.0.2" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "^13.3.2" - -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== - dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" -webpack-manifest-plugin@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz#19ca69b435b0baec7e29fbe90fb4015de2de4f16" - integrity sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ== +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz#10f8dbf4714ff93a215d5a45bcc416d80506f94f" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== dependencies: - fs-extra "^7.0.0" - lodash ">=3.5 <5" - object.entries "^1.1.0" - tapable "^1.0.0" + tapable "^2.0.0" + webpack-sources "^2.2.0" -webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: +webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -13842,34 +11603,48 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0, webpack- source-list-map "^2.0.0" source-map "~0.6.1" -webpack@4.44.2: - version "4.44.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.44.2.tgz#6bfe2b0af055c8b2d1e90ed2cd9363f841266b72" - integrity sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.3.1.tgz#570de0af163949fe272233c2cefe1b56f74511fd" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.64.4: + version "5.72.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13" + integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^0.0.51" + "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/wasm-edit" "1.11.1" + "@webassemblyjs/wasm-parser" "1.11.1" + acorn "^8.4.1" + acorn-import-assertions "^1.7.6" + browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^4.3.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" + enhanced-resolve "^5.9.3" + es-module-lexer "^0.9.0" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.1.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.1.3" + watchpack "^2.3.1" + webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" @@ -13892,7 +11667,7 @@ whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" -whatwg-fetch@^3.4.1: +whatwg-fetch@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== @@ -13902,6 +11677,23 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + whatwg-url@^8.0.0, whatwg-url@^8.5.0: version "8.7.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77" @@ -13922,12 +11714,7 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1.3.1, which@^1.2.9, which@^1.3.1: +which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -13941,198 +11728,189 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -workbox-background-sync@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz#5ae0bbd455f4e9c319e8d827c055bb86c894fd12" - integrity sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA== +workbox-background-sync@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz#7c66c1836aeca6f3762dc48d17a1852a33b3168c" + integrity sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw== dependencies: - workbox-core "^5.1.4" + idb "^6.1.4" + workbox-core "6.5.3" -workbox-broadcast-update@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz#0eeb89170ddca7f6914fa3523fb14462891f2cfc" - integrity sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA== +workbox-broadcast-update@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz#fc2ad79cf507e22950cda9baf1e9a0ccc43f31bc" + integrity sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg== dependencies: - workbox-core "^5.1.4" + workbox-core "6.5.3" -workbox-build@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-5.1.4.tgz#23d17ed5c32060c363030c8823b39d0eabf4c8c7" - integrity sha512-xUcZn6SYU8usjOlfLb9Y2/f86Gdo+fy1fXgH8tJHjxgpo53VVsqRX0lUDw8/JuyzNmXuo8vXX14pXX2oIm9Bow== - dependencies: - "@babel/core" "^7.8.4" - "@babel/preset-env" "^7.8.4" - "@babel/runtime" "^7.8.4" - "@hapi/joi" "^15.1.0" - "@rollup/plugin-node-resolve" "^7.1.1" - "@rollup/plugin-replace" "^2.3.1" - "@surma/rollup-plugin-off-main-thread" "^1.1.1" +workbox-build@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-build/-/workbox-build-6.5.3.tgz#38e3f286d63d2745bff4d1478bb3a6ab5c8b1170" + integrity sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" common-tags "^1.8.0" fast-json-stable-stringify "^2.1.0" - fs-extra "^8.1.0" + fs-extra "^9.0.1" glob "^7.1.6" - lodash.template "^4.5.0" + lodash "^4.17.20" pretty-bytes "^5.3.0" - rollup "^1.31.1" - rollup-plugin-babel "^4.3.3" - rollup-plugin-terser "^5.3.1" - source-map "^0.7.3" - source-map-url "^0.4.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" stringify-object "^3.3.0" - strip-comments "^1.0.2" - tempy "^0.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" upath "^1.2.0" - workbox-background-sync "^5.1.4" - workbox-broadcast-update "^5.1.4" - workbox-cacheable-response "^5.1.4" - workbox-core "^5.1.4" - workbox-expiration "^5.1.4" - workbox-google-analytics "^5.1.4" - workbox-navigation-preload "^5.1.4" - workbox-precaching "^5.1.4" - workbox-range-requests "^5.1.4" - workbox-routing "^5.1.4" - workbox-strategies "^5.1.4" - workbox-streams "^5.1.4" - workbox-sw "^5.1.4" - workbox-window "^5.1.4" - -workbox-cacheable-response@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz#9ff26e1366214bdd05cf5a43da9305b274078a54" - integrity sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA== + workbox-background-sync "6.5.3" + workbox-broadcast-update "6.5.3" + workbox-cacheable-response "6.5.3" + workbox-core "6.5.3" + workbox-expiration "6.5.3" + workbox-google-analytics "6.5.3" + workbox-navigation-preload "6.5.3" + workbox-precaching "6.5.3" + workbox-range-requests "6.5.3" + workbox-recipes "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" + workbox-streams "6.5.3" + workbox-sw "6.5.3" + workbox-window "6.5.3" + +workbox-cacheable-response@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz#b1f8c2bc599a7be8f7e3c262535629c558738e47" + integrity sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ== dependencies: - workbox-core "^5.1.4" + workbox-core "6.5.3" -workbox-core@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-5.1.4.tgz#8bbfb2362ecdff30e25d123c82c79ac65d9264f4" - integrity sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg== +workbox-core@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-core/-/workbox-core-6.5.3.tgz#bca038a9ef0d7a634a6db2a60f45313ed22ac249" + integrity sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q== -workbox-expiration@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-5.1.4.tgz#92b5df461e8126114943a3b15c55e4ecb920b163" - integrity sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ== +workbox-expiration@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-6.5.3.tgz#efc0811f371a2ede1052b9de1c4f072b71d50503" + integrity sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw== dependencies: - workbox-core "^5.1.4" + idb "^6.1.4" + workbox-core "6.5.3" -workbox-google-analytics@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz#b3376806b1ac7d7df8418304d379707195fa8517" - integrity sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA== +workbox-google-analytics@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz#cc8c3a61f449131660a4ed2f5362d9a3599b18fe" + integrity sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw== dependencies: - workbox-background-sync "^5.1.4" - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - workbox-strategies "^5.1.4" + workbox-background-sync "6.5.3" + workbox-core "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" -workbox-navigation-preload@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz#30d1b720d26a05efc5fa11503e5cc1ed5a78902a" - integrity sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ== +workbox-navigation-preload@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz#81b74f598b11aa07e2cf1c21af7a826a4f0f70b3" + integrity sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg== dependencies: - workbox-core "^5.1.4" + workbox-core "6.5.3" -workbox-precaching@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-5.1.4.tgz#874f7ebdd750dd3e04249efae9a1b3f48285fe6b" - integrity sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA== +workbox-precaching@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-6.5.3.tgz#c870312b2ef901d790ab9e48da084e776c62af47" + integrity sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ== dependencies: - workbox-core "^5.1.4" + workbox-core "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" -workbox-range-requests@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz#7066a12c121df65bf76fdf2b0868016aa2bab859" - integrity sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw== +workbox-range-requests@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz#e624ac82ff266a5e4f236d055797def07949d941" + integrity sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA== dependencies: - workbox-core "^5.1.4" + workbox-core "6.5.3" -workbox-routing@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-5.1.4.tgz#3e8cd86bd3b6573488d1a2ce7385e547b547e970" - integrity sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw== +workbox-recipes@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-recipes/-/workbox-recipes-6.5.3.tgz#15beac9d8ae7a3a1c100218094a824b4dd3fd59a" + integrity sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig== dependencies: - workbox-core "^5.1.4" + workbox-cacheable-response "6.5.3" + workbox-core "6.5.3" + workbox-expiration "6.5.3" + workbox-precaching "6.5.3" + workbox-routing "6.5.3" + workbox-strategies "6.5.3" -workbox-strategies@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-5.1.4.tgz#96b1418ccdfde5354612914964074d466c52d08c" - integrity sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA== +workbox-routing@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-6.5.3.tgz#a0a699d8cc90b5692bd3df24679acbbda3913777" + integrity sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg== dependencies: - workbox-core "^5.1.4" - workbox-routing "^5.1.4" + workbox-core "6.5.3" -workbox-streams@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-5.1.4.tgz#05754e5e3667bdc078df2c9315b3f41210d8cac0" - integrity sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw== +workbox-strategies@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-6.5.3.tgz#4bea9a48fee16cf43766e0d8138296773c8a9783" + integrity sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w== dependencies: - workbox-core "^5.1.4" - workbox-routing "^5.1.4" - -workbox-sw@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-5.1.4.tgz#2bb34c9f7381f90d84cef644816d45150011d3db" - integrity sha512-9xKnKw95aXwSNc8kk8gki4HU0g0W6KXu+xks7wFuC7h0sembFnTrKtckqZxbSod41TDaGh+gWUA5IRXrL0ECRA== + workbox-core "6.5.3" -workbox-webpack-plugin@5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-5.1.4.tgz#7bfe8c16e40fe9ed8937080ac7ae9c8bde01e79c" - integrity sha512-PZafF4HpugZndqISi3rZ4ZK4A4DxO8rAqt2FwRptgsDx7NF8TVKP86/huHquUsRjMGQllsNdn4FNl8CD/UvKmQ== +workbox-streams@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-6.5.3.tgz#b6860290031caa7d0e46ad7142315c94359c780b" + integrity sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w== dependencies: - "@babel/runtime" "^7.5.5" - fast-json-stable-stringify "^2.0.0" - source-map-url "^0.4.0" - upath "^1.1.2" - webpack-sources "^1.3.0" - workbox-build "^5.1.4" + workbox-core "6.5.3" + workbox-routing "6.5.3" -workbox-window@^5.1.4: - version "5.1.4" - resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-5.1.4.tgz#2740f7dea7f93b99326179a62f1cc0ca2c93c863" - integrity sha512-vXQtgTeMCUq/4pBWMfQX8Ee7N2wVC4Q7XYFqLnfbXJ2hqew/cU1uMTD2KqGEgEpE4/30luxIxgE+LkIa8glBYw== - dependencies: - workbox-core "^5.1.4" +workbox-sw@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-6.5.3.tgz#cd2f0c086f4496acd25774ed02c48504189bebdd" + integrity sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A== -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== +workbox-webpack-plugin@^6.4.1: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz#c37bb323be4952311565c07db51054fe59c87d73" + integrity sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA== dependencies: - errno "~0.1.7" + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.5.3" -worker-rpc@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz#cb565bd6d7071a8f16660686051e969ad32f54d5" - integrity sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg== +workbox-window@6.5.3: + version "6.5.3" + resolved "https://registry.yarnpkg.com/workbox-window/-/workbox-window-6.5.3.tgz#4ade70056cb73477ef1cd8fea7cfd0ecbd825c7f" + integrity sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw== dependencies: - microevent.ts "~0.1.1" + "@types/trusted-types" "^2.0.2" + workbox-core "6.5.3" -wrap-ansi@^5.0.0, wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" @@ -14153,27 +11931,30 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -ws@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" - integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== - dependencies: - async-limiter "~1.0.0" +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== ws@^7.4.6: version "7.5.7" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67" integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A== +ws@^8.4.2: + version "8.6.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23" + integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw== + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== -xmlbuilder@^10.0.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" - integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== +xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== xmlchars@^2.2.0: version "2.2.0" @@ -14188,93 +11969,81 @@ xss@^1.0.8: commander "^2.20.3" cssfilter "0.0.10" -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0: +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== +yargs-parser@^21.0.0: + version "21.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" + integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" -yargs@13.3.2, yargs@^13.3.0, yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== +yargs@16.2.0, yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^15.0.1, yargs@^15.4.1: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.0.0: + version "17.5.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.0.tgz#2706c5431f8c119002a2b106fc9f58b9bb9097a3" + integrity sha512-3sLxVhbAB5OC8qvVRebCLWuouhwh/rswsiDYx3WGxajUk/l4G20SKfrKKFeNIHboUFt2JFgv2yfn+5cgOr/t5A== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" yarn-install@^1.0.0: version "1.0.0" @@ -14311,11 +12080,11 @@ yup@^0.32.11: property-expr "^2.0.4" toposort "^2.0.2" -zip-stream@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.1.3.tgz#26cc4bdb93641a8590dd07112e1f77af1758865b" - integrity sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q== +zip-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79" + integrity sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A== dependencies: archiver-utils "^2.1.0" - compress-commons "^2.1.1" - readable-stream "^3.4.0" + compress-commons "^4.1.0" + readable-stream "^3.6.0" diff --git a/zookeeper-lock/build.gradle b/zookeeper-lock/build.gradle deleted file mode 100644 index ea42008da..000000000 --- a/zookeeper-lock/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -dependencies { - implementation project(':conductor-core') - compileOnly 'org.springframework.boot:spring-boot-starter' - - implementation "org.apache.commons:commons-lang3" - implementation "org.apache.curator:curator-recipes:${revCuratorRecipes}" - - testImplementation "org.apache.curator:curator-test:${revCuratorTest}" -} diff --git a/zookeeper-lock/dependencies.lock b/zookeeper-lock/dependencies.lock deleted file mode 100644 index 731bddf80..000000000 --- a/zookeeper-lock/dependencies.lock +++ /dev/null @@ -1,396 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.6.6" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-core": { - "project": true - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.curator:curator-recipes": { - "locked": "2.4.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.6.6" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.curator:curator-recipes": { - "locked": "2.4.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-core": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.curator:curator-recipes": { - "locked": "2.4.0" - }, - "org.apache.curator:curator-test": { - "locked": "2.4.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.1" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.13.2.2" - }, - "com.github.rholder:guava-retrying": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.0" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.13.0" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.6.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.3.8" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.3.3" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.12.0" - }, - "org.apache.curator:curator-recipes": { - "locked": "2.4.0" - }, - "org.apache.curator:curator-test": { - "locked": "2.4.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.17.1" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.6.6" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.6.6" - } - } -} \ No newline at end of file diff --git a/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/config/ZookeeperLockConfiguration.java b/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/config/ZookeeperLockConfiguration.java deleted file mode 100644 index 048f6c7a9..000000000 --- a/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/config/ZookeeperLockConfiguration.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.zookeeper.config; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import com.netflix.conductor.core.sync.Lock; -import com.netflix.conductor.zookeeper.lock.ZookeeperLock; - -@Configuration -@EnableConfigurationProperties(ZookeeperProperties.class) -@ConditionalOnProperty(name = "conductor.workflow-execution-lock.type", havingValue = "zookeeper") -public class ZookeeperLockConfiguration { - - @Bean - public Lock provideLock(ZookeeperProperties properties) { - return new ZookeeperLock(properties); - } -} diff --git a/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/config/ZookeeperProperties.java b/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/config/ZookeeperProperties.java deleted file mode 100644 index 8620ac7b1..000000000 --- a/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/config/ZookeeperProperties.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.zookeeper.config; - -import java.time.Duration; - -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties("conductor.zookeeper-lock") -public class ZookeeperProperties { - - /** The connection string to be used to connect to the Zookeeper cluster */ - private String connectionString = "localhost:2181"; - - /** The session timeout for the curator */ - private Duration sessionTimeout = - Duration.ofMillis(CuratorFrameworkFactory.builder().getSessionTimeoutMs()); - - /** The connection timeout for the curator */ - private Duration connectionTimeout = - Duration.ofMillis(CuratorFrameworkFactory.builder().getConnectionTimeoutMs()); - - /** The namespace to use within the zookeeper cluster */ - private String namespace = ""; - - public String getConnectionString() { - return connectionString; - } - - public void setConnectionString(String connectionString) { - this.connectionString = connectionString; - } - - public Duration getSessionTimeout() { - return sessionTimeout; - } - - public void setSessionTimeout(Duration sessionTimeout) { - this.sessionTimeout = sessionTimeout; - } - - public Duration getConnectionTimeout() { - return connectionTimeout; - } - - public void setConnectionTimeout(Duration connectionTimeout) { - this.connectionTimeout = connectionTimeout; - } - - public String getNamespace() { - return namespace; - } - - public void setNamespace(String namespace) { - this.namespace = namespace; - } -} diff --git a/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/lock/ZookeeperLock.java b/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/lock/ZookeeperLock.java deleted file mode 100644 index 714822131..000000000 --- a/zookeeper-lock/src/main/java/com/netflix/conductor/zookeeper/lock/ZookeeperLock.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.zookeeper.lock; - -import java.util.concurrent.TimeUnit; - -import org.apache.commons.lang3.StringUtils; -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.framework.recipes.locks.InterProcessMutex; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.core.sync.Lock; -import com.netflix.conductor.zookeeper.config.ZookeeperProperties; - -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; - -@SuppressWarnings("UnstableApiUsage") -public class ZookeeperLock implements Lock { - - public static final int CACHE_MAXSIZE = 20000; - public static final int CACHE_EXPIRY_TIME = 10; - - private static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperLock.class); - private final CuratorFramework client; - private final LoadingCache zkLocks; - private final String zkPath; - - public ZookeeperLock(ZookeeperProperties properties) { - String lockNamespace = properties.getNamespace(); - RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); - client = - CuratorFrameworkFactory.newClient( - properties.getConnectionString(), - (int) properties.getSessionTimeout().toMillis(), - (int) properties.getConnectionTimeout().toMillis(), - retryPolicy); - client.start(); - zkLocks = - CacheBuilder.newBuilder() - .maximumSize(CACHE_MAXSIZE) - .expireAfterAccess(CACHE_EXPIRY_TIME, TimeUnit.MINUTES) - .build( - new CacheLoader() { - @Override - public InterProcessMutex load(String key) { - return new InterProcessMutex(client, zkPath.concat(key)); - } - }); - - zkPath = - StringUtils.isEmpty(lockNamespace) - ? ("/conductor/") - : ("/conductor/" + lockNamespace + "/"); - } - - public void acquireLock(String lockId) { - if (StringUtils.isEmpty(lockId)) { - throw new IllegalArgumentException("lockId cannot be NULL or empty: lockId=" + lockId); - } - try { - InterProcessMutex mutex = zkLocks.get(lockId); - mutex.acquire(); - } catch (Exception e) { - LOGGER.debug("Failed in acquireLock: ", e); - } - } - - public boolean acquireLock(String lockId, long timeToTry, TimeUnit unit) { - if (StringUtils.isEmpty(lockId)) { - throw new IllegalArgumentException("lockId cannot be NULL or empty: lockId=" + lockId); - } - try { - InterProcessMutex mutex = zkLocks.get(lockId); - return mutex.acquire(timeToTry, unit); - } catch (Exception e) { - LOGGER.debug("Failed in acquireLock: ", e); - } - return false; - } - - public boolean acquireLock(String lockId, long timeToTry, long leaseTime, TimeUnit unit) { - return acquireLock(lockId, timeToTry, unit); - } - - public void releaseLock(String lockId) { - if (StringUtils.isEmpty(lockId)) { - throw new IllegalArgumentException("lockId cannot be NULL or empty: lockId=" + lockId); - } - try { - InterProcessMutex lock = zkLocks.getIfPresent(lockId); - if (lock != null) { - lock.release(); - } - } catch (Exception e) { - LOGGER.debug("Failed in releaseLock: ", e); - } - } - - public void deleteLock(String lockId) { - try { - LOGGER.debug("Deleting lock {}", zkPath.concat(lockId)); - client.delete().guaranteed().forPath(zkPath.concat(lockId)); - } catch (Exception e) { - LOGGER.debug("Failed to removeLock: ", e); - } - } -} diff --git a/zookeeper-lock/src/test/java/com/netflix/conductor/zookeeper/lock/ZookeeperLockTest.java b/zookeeper-lock/src/test/java/com/netflix/conductor/zookeeper/lock/ZookeeperLockTest.java deleted file mode 100644 index 9570ca41d..000000000 --- a/zookeeper-lock/src/test/java/com/netflix/conductor/zookeeper/lock/ZookeeperLockTest.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2020 Netflix, Inc. - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -package com.netflix.conductor.zookeeper.lock; - -import java.time.Duration; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.test.TestingServer; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.netflix.conductor.core.sync.Lock; -import com.netflix.conductor.service.ExecutionLockService; -import com.netflix.conductor.zookeeper.config.ZookeeperProperties; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class ZookeeperLockTest { - - private static final Logger LOGGER = LoggerFactory.getLogger(ZookeeperLockTest.class); - - TestingServer zkServer; - ZookeeperProperties properties; - - @Before - public void setUp() throws Exception { - zkServer = new TestingServer(2181); - properties = mock(ZookeeperProperties.class); - when(properties.getConnectionString()).thenReturn("localhost:2181"); - when(properties.getSessionTimeout()) - .thenReturn( - Duration.ofMillis(CuratorFrameworkFactory.builder().getSessionTimeoutMs())); - when(properties.getConnectionTimeout()) - .thenReturn( - Duration.ofMillis( - CuratorFrameworkFactory.builder().getConnectionTimeoutMs())); - when(properties.getNamespace()).thenReturn(""); - } - - @After - public void tearDown() throws Exception { - zkServer.stop(); - } - - @Test - public void testLockReentrance() { - Lock zkLock = new ZookeeperLock(properties); - boolean hasLock = zkLock.acquireLock("reentrantLock1", 50, TimeUnit.MILLISECONDS); - assertTrue(hasLock); - - hasLock = zkLock.acquireLock("reentrantLock1", 50, TimeUnit.MILLISECONDS); - assertTrue(hasLock); - zkLock.releaseLock("reentrantLock1"); - zkLock.releaseLock("reentrantLock1"); - } - - @Test - public void testZkLock() throws InterruptedException { - Lock zkLock = new ZookeeperLock(properties); - String lock1 = "lock1"; - String lock2 = "lock2"; - - Worker worker1 = new Worker(zkLock, lock1); - worker1.start(); - worker1.lockNotify.acquire(); - assertTrue(worker1.isLocked); - Thread.sleep(30000); - - Worker worker2 = new Worker(zkLock, lock1); - worker2.start(); - assertTrue(worker2.isAlive()); - assertFalse(worker2.isLocked); - Thread.sleep(30000); - - Worker worker3 = new Worker(zkLock, lock2); - worker3.start(); - worker3.lockNotify.acquire(); - assertTrue(worker3.isLocked); - Thread.sleep(30000); - - worker1.unlockNotify.release(); - worker1.join(); - - Thread.sleep(30000); - worker2.lockNotify.acquire(); - assertTrue(worker2.isLocked); - worker2.unlockNotify.release(); - worker2.join(); - - worker3.unlockNotify.release(); - worker3.join(); - } - - private static class Worker extends Thread { - - private final Lock lock; - private final String lockID; - Semaphore unlockNotify = new Semaphore(0); - Semaphore lockNotify = new Semaphore(0); - boolean isLocked = false; - - Worker(Lock lock, String lockID) { - super("TestWorker-" + lockID); - this.lock = lock; - this.lockID = lockID; - } - - @Override - public void run() { - lock.acquireLock(lockID, 5, TimeUnit.MILLISECONDS); - isLocked = true; - lockNotify.release(); - try { - unlockNotify.acquire(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - isLocked = false; - lock.releaseLock(lockID); - } - } - } - - private static class MultiLockWorker extends Thread { - - private final ExecutionLockService lock; - private final Iterable lockIDs; - private boolean finishedSuccessfully = false; - - public MultiLockWorker(ExecutionLockService executionLock, Iterable lockIDs) { - super(); - this.lock = executionLock; - this.lockIDs = lockIDs; - } - - @Override - public void run() { - try { - int iterations = 0; - for (String lockID : lockIDs) { - lock.acquireLock(lockID); - Thread.sleep(100); - lock.releaseLock(lockID); - iterations++; - if (iterations % 10 == 0) { - LOGGER.info("Finished iterations: {}", iterations); - } - } - finishedSuccessfully = true; - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - public boolean isFinishedSuccessfully() { - return finishedSuccessfully; - } - } -}