From 1426741761712a34575084b8d0ddb89ccf84aa34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ognjen=20Kati=C4=87?= <44910579+ognjenkatic@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:39:11 +0200 Subject: [PATCH] Merge in recent changes (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update README.md * Fix CVEs in 3.16. (#46) * Upgraded ES7 to 7.17.16, alpine to 3.19 * Update ElasticSearch to 7.17.16, some sdk tests are failing. * Server would not run, StackOverflow - 54742540 had this handy fix. * Use the new image in test container. * Update Spring Boot to 3.2.1. One failing test in end to end. * Handle the change in exceptions from Spring Framework. * Update AWS SDK for CVE fix. * Replace generic import with specific class. * Removed dependencies.lock file from projects. No longer used. * prevents orkes-queues from pulling in old version of condcutor (#55) * Documentation link update in Readme (#54) * Update README.md * Revert "Update README.md" This reverts commit fe16da94b68dff80313a262c6db49f4a78425fe9. * Update README.md * Change dependency group,version (#48) * Remove unnecessary Autowired from Constructors (#36) * Remove unnecessary Autowired from Constructors * Add @Autowired back to property classes --------- Co-authored-by: tiffany jernigan * upgrade from gradle 7.6.2 to gradle 8.5 (#28) * Fix redundant taskDef in DB (#17) * Add imports file that define auto configure classes supported by spring-boot 2.7 (#60) * update the workflow template * fixes * Update README.md * Left menu URL fix for docs site (#77) Update mkdocs.yml by @RizaFarheen * Update source.md (#75) changed excuted -> executed * Update README.md (#72) againt -> against * Optimise the postgres queries for popping messages (#76) * Feature - use environment variable to set ES6 support mode for Nashorn script evaluator (#88) Use environment variable CONDUCTOR_NASHORN_ES6_ENABLED=true to set ES6 support mode for Nashorn script evaluator. * Fix an issue with the postgres indices as they weren't being used properly (#92) * Upgrade the postgres lib to prevent CVE-2024-1597 (#94) * Enable finer-grained control over the postgres indexing and searching (#93) * Enable the searching of the JSON field in Postgres to be configured * Enable the indexing of tasks to be enabled / disabled * Implement removeWorkflow for postgres index * Enable the migration to run without always recreating an index (#98) * Feature: Use TaskStatusListener.onTaskInProgress() (#58) * apply task-task-status-listener * fix test error * prevent NPE * Fix SpringBoot imports file location error (#89) * Implementation of Postgres PollDataDAO with read and write caching (#82) * Initial implementation of an experimental queue optimisation using Postgres LISTEN/NOTIFY (#87) * Initial implementation of an experimental queue optimisation using Postgres LISTEN/NOTIFY * Use Optional instead of returning null for getSize() * Update connection method for queue listener to make it more thread safe * Only apply the queue notify migrations if configured * Update the postgres docs with all configurable properties (#99) * Fix ElasticSearch health check failure when ES sets password (#59) * Add option to only index workflows on Postgres when their status changes (#83) * Implement postgres lock DAO * add postgres locking mention in docs * rename locking db migration * refactor query - the pg now() function is already UTC * fix test * fix pg query * simplify query * Adding redis username support for clusters (#105) Co-authored-by: Anup Chatterjee * fix tests * timeunit ms * Update README.md * Workflow and task status notifier Co-authored-by: ToastedTaco Co-authored-by: BabyBlue0214 Co-authored-by: Elijah Spicer * Fix PostgresIndexQueryBuilder null pointer exception (#116) * Throw IllegalArgumentException when query string does not match regex * Unit test for exception * Update README.md (#113) * Add a migration to relax the size constraint on task_index columns (#114) * Fix of exception handler trying to write response to a disconnected client (#109) Why: On Conductor server side, an exception gets raised `Failure in @ExceptionHandler com.netflix.conductor.rest.controllers.ApplicationExceptionMapper#handleAll(HttpServletRequest, Throwable)`. Cause is attempting to write while the client aborted the connection `org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe` What: Added a ClientAbortException handler. Testing done: Local run. Not trivial to emulate the issue in a test. Such a test may rely on timing out the client before server responded. Signed-off-by: Iva Avramova * Workflow bulk deletion API and action module options (#110) * Initial commit to add bulk workflow deletion * Added an API endpoint for bulk deletion * Add archiveworkflow param * Added bulk delete action to BulkActionModule * Added archive option to bulk delete * Addition of terminateRemove() Functions (#9) * Added an API endpoint for bulk deletion * Fixed WorkflowBulkServiceTest, added test cases for deleteWorkflow an… (#10) * Fixed WorkflowBulkServiceTest, added test cases for deleteWorkflow and terminateRemove, and added WorkflowResourceTest test for single terminateRemove * pass spotlessjava --------- Co-authored-by: JeffP --------- Co-authored-by: jeffp1 Co-authored-by: Ayush Thengne Co-authored-by: Jeff P <28172529+JeffP07@users.noreply.github.com> Co-authored-by: Doe1111 <106997600+Doe1111@users.noreply.github.com> * revert WorkflowDef changes * Join task fixes (#117) * fix join completing with errors when a task has failed or some tasks are not terminal yet * add more tests * add more comments to join routine * mark join task synchronous * Revert unrelated changes * Status Notifier Properties Cleanup * fix tests * fix formatting * update the tests for the JOIN task fix * Fix the name of the task index migration * Update README.md * Fix of exception handler trying to write response to a disconnected client Why: On Conductor server side, an exception gets raised `Failure in @ExceptionHandler com.netflix.conductor.rest.controllers.ApplicationExceptionMapper#handleAll(HttpServletRequest, Throwable)`. Cause is attempting to write while the client aborted the connection `org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe`, while the exception was wrapped in `ClosedChannelException`. What: Added a ClosedChannelException handler for such exceptions root caused by ClientAbortException. Testing done: Local run. Not trivial to emulate the issue in a test. Such a test may rely on timing out the client before server responded. Signed-off-by: Iva Avramova * Fix of exception handler trying to write response to a disconnected client Why: On Conductor server side, an exception gets raised `Failure in @ExceptionHandler com.netflix.conductor.rest.controllers.ApplicationExceptionMapper#handleAll(HttpServletRequest, Throwable)`. Cause is attempting to write while the client aborted the connection `org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe`, while the exception was nested in `ClosedChannelException`. What: Added a ClosedChannelException handler for exception chain containing ClientAbortException. Testing done: Local run. Not trivial to emulate the issue in a test. Such a test may rely on timing out the client before server responded. Signed-off-by: Iva Avramova * fix: Fix error with headers in webhook * Added logic to remove stale iteration outputs based on keepLastN parameter * Remove unused code block * Remove unused code block * Fixed formatting issues * Updating DoWhileTask keepLastN iteration endIndex * style: Fix style * added tests; generalized the exception Signed-off-by: Iva Avramova * added tests; generalized the exception Signed-off-by: Iva Avramova * Why: Ignoring a particular exception based on its stack trace should be rather an alerting concern. What: Reverted ClientAbortedException specific handler. Added test coverage for the existing exception handler. Testing done: local run Signed-off-by: Iva Avramova * Update README.md * if status-listener error, task not executed * change the point of cancellation * Wrap PGExecutionDAO createTasks in a single transaction * publish roadmap * add link to the roadmap * Create codacy.yml * Delete .github/workflows/codacy.yml * Bump io.micrometer:micrometer-registry-datadog from 1.12.1 to 1.13.0 Bumps [io.micrometer:micrometer-registry-datadog](https://github.com/micrometer-metrics/micrometer) from 1.12.1 to 1.13.0. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.12.1...v1.13.0) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-datadog dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * Fix for concurrentExecLimit * Bump com.diffplug.spotless from 5.0.0 to 6.25.0 Bumps com.diffplug.spotless from 5.0.0 to 6.25.0. --- updated-dependencies: - dependency-name: com.diffplug.spotless dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --------- Signed-off-by: Iva Avramova Signed-off-by: dependabot[bot] Co-authored-by: Viren Baraiya Co-authored-by: Dennis Caldwell Co-authored-by: Brian Hawkins Co-authored-by: Riza Farheen <82656175+RizaFarheen@users.noreply.github.com> Co-authored-by: Hoony <68694844+ghkdwlgns612@users.noreply.github.com> Co-authored-by: tiffany jernigan Co-authored-by: tiffany jernigan Co-authored-by: HOA PHAN Co-authored-by: Richard Meng Co-authored-by: Young-Zen <40934357+Young-Zen@users.noreply.github.com> Co-authored-by: Kunal Kumar Co-authored-by: Ikko Eltociear Ashimine Co-authored-by: Ben Pirt Co-authored-by: Vasiliy Pankov Co-authored-by: Boney Co-authored-by: Bert Verstraete Co-authored-by: Anup Chatterjee Co-authored-by: Anup Chatterjee Co-authored-by: CollinDewey Co-authored-by: ToastedTaco Co-authored-by: BabyBlue0214 Co-authored-by: Elijah Spicer Co-authored-by: omadaan <165099174+omadaan@users.noreply.github.com> Co-authored-by: ivakoleva Co-authored-by: Olivia Bailey <78293238+olibaim@users.noreply.github.com> Co-authored-by: jeffp1 Co-authored-by: Ayush Thengne Co-authored-by: Jeff P <28172529+JeffP07@users.noreply.github.com> Co-authored-by: Doe1111 <106997600+Doe1111@users.noreply.github.com> Co-authored-by: Juan Cruz Co-authored-by: Srihari Malagi Co-authored-by: Srihari K. Malagi Co-authored-by: Martini <110882768+martini612@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: manan164 <1897158+manan164@users.noreply.github.com> --- README.md | 40 +- ROADMAP.md | 75 + amqp/dependencies.lock | 177 -- annotations-processor/dependencies.lock | 241 -- annotations/dependencies.lock | 99 - awss3-storage/dependencies.lock | 414 --- awssqs-event-queue/dependencies.lock | 438 --- azureblob-storage/dependencies.lock | 150 -- build.gradle | 10 +- cassandra-persistence/dependencies.lock | 447 --- client-spring/dependencies.lock | 477 ---- ...ot.autoconfigure.AutoConfiguration.imports | 1 + client/dependencies.lock | 394 --- common-persistence/dependencies.lock | 159 -- common/dependencies.lock | 304 --- .../conductor/common/metadata/tasks/Task.java | 2 + core/dependencies.lock | 430 --- .../core/config/ConductorProperties.java | 11 + .../core/dal/ExecutionDAOFacade.java | 2 +- .../conductor/core/events/EventQueues.java | 2 - .../core/events/ScriptEvaluator.java | 31 +- .../core/execution/WorkflowExecutor.java | 9 + .../execution/mapper/DoWhileTaskMapper.java | 2 - .../execution/mapper/DynamicTaskMapper.java | 2 - .../execution/mapper/EventTaskMapper.java | 2 - .../mapper/ForkJoinDynamicTaskMapper.java | 2 - .../core/execution/mapper/HTTPTaskMapper.java | 2 - .../mapper/KafkaPublishTaskMapper.java | 2 - .../execution/mapper/SwitchTaskMapper.java | 2 - .../core/execution/tasks/DoWhile.java | 12 + .../conductor/core/execution/tasks/Join.java | 63 +- .../core/reconciliation/WorkflowSweeper.java | 2 - .../netflix/conductor/model/TaskModel.java | 5 + .../service/ExecutionLockService.java | 2 - .../conductor/service/ExecutionService.java | 11 +- .../service/WorkflowBulkService.java | 19 + .../service/WorkflowBulkServiceImpl.java | 71 +- .../conductor/service/WorkflowService.java | 13 + .../service/WorkflowServiceImpl.java | 13 + .../conductor/core/events/TestScriptEval.java | 41 + .../core/execution/tasks/TestJoin.java | 192 ++ .../service/ExecutionServiceTest.java | 5 +- .../service/WorkflowBulkServiceTest.java | 34 +- dependencies.gradle | 7 +- dependencies.lock | 99 - docker/server/Dockerfile | 4 +- .../Workers/build-a-java-task-worker.md | 12 +- docs/devguide/running/source.md | 2 +- docs/documentation/advanced/postgresql.md | 93 + docs/documentation/advanced/redis.md | 32 +- es6-persistence/dependencies.lock | 477 ---- .../config/ElasticSearchV6Configuration.java | 18 +- es7-persistence/build.gradle | 4 +- es7-persistence/dependencies.lock | 547 ---- .../config/ElasticSearchV7Configuration.java | 19 +- .../es7/dao/index/ElasticSearchRestDAOV7.java | 2 +- .../es7/dao/index/ElasticSearchTest.java | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 60756 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 6 +- gradlew | 25 +- gradlew.bat | 1 + grpc-client/dependencies.lock | 379 --- grpc-server/dependencies.lock | 518 ---- grpc/build.gradle | 1 + grpc/dependencies.lock | 499 ---- http-task/dependencies.lock | 453 ---- .../DefaultRestTemplateProvider.java | 2 - java-sdk/dependencies.lock | 475 ---- .../sdk/testing/LocalServerRunner.java | 2 +- .../sdk/workflow/def/tasks/Javascript.java | 20 +- json-jq-task/dependencies.lock | 414 --- .../conductor/tasks/json/JsonJqTransform.java | 2 - kafka/dependencies.lock | 990 ------- .../tasks/kafka/KafkaProducerManager.java | 2 - .../tasks/kafka/KafkaPublishTask.java | 2 - .../mapper/KafkaPublishTaskMapper.java | 2 - metrics/build.gradle | 2 +- metrics/dependencies.lock | 525 ---- mkdocs.yml | 3 +- mysql-persistence/dependencies.lock | 1229 --------- nats-streaming/dependencies.lock | 189 -- nats/dependencies.lock | 177 -- postgres-external-storage/build.gradle | 2 +- postgres-external-storage/dependencies.lock | 201 -- postgres-persistence/build.gradle | 2 +- postgres-persistence/dependencies.lock | 1229 --------- .../config/PostgresConfiguration.java | 47 +- .../postgres/config/PostgresProperties.java | 94 + .../postgres/dao/PostgresExecutionDAO.java | 107 +- .../postgres/dao/PostgresIndexDAO.java | 118 +- .../postgres/dao/PostgresLockDAO.java | 82 + .../postgres/dao/PostgresPollDataDAO.java | 218 ++ .../postgres/dao/PostgresQueueDAO.java | 68 +- .../util/PostgresIndexQueryBuilder.java | 26 +- .../postgres/util/PostgresQueueListener.java | 226 ++ .../conductor/postgres/util/QueueStats.java | 39 + .../V10__poll_data_check.sql | 13 + .../db/migration_postgres/V11__locking.sql | 4 + .../V12__task_index_columns.sql | 5 + .../V9__indexing_index_fix.sql | 12 + .../V10.1__notify.sql | 59 + .../PostgresIndexDAOStatusChangeOnlyTest.java | 180 ++ .../postgres/dao/PostgresIndexDAOTest.java | 47 + .../postgres/dao/PostgresLockDAOTest.java | 159 ++ .../postgres/dao/PostgresMetadataDAOTest.java | 2 +- .../dao/PostgresPollDataDAOCacheTest.java | 155 ++ .../dao/PostgresPollDataDAONoCacheTest.java | 200 ++ .../util/PostgresIndexQueryBuilderTest.java | 55 +- .../util/PostgresQueueListenerTest.java | 193 ++ .../postgres/PostgresGrpcEndToEndTest.java | 4 +- .../src/test/resources/application.properties | 1 - redis-concurrency-limit/dependencies.lock | 468 ---- redis-lock/dependencies.lock | 414 --- redis-persistence/dependencies.lock | 444 --- .../config/RedisClusterConfiguration.java | 13 +- .../redis/dao/RedisExecutionDAO.java | 2 +- rest/dependencies.lock | 429 --- .../ApplicationExceptionMapper.java | 2 + .../controllers/WorkflowBulkResource.java | 30 + .../rest/controllers/WorkflowResource.java | 10 + .../ApplicationExceptionMapperTest.java | 90 + .../controllers/WorkflowResourceTest.java | 7 + server/build.gradle | 5 +- server/dependencies.lock | 2393 ----------------- .../src/main/resources/application.properties | 28 +- settings.gradle | 1 + springboot-bom-overrides.gradle | 2 +- task-status-listener/build.gradle | 24 + .../contribs/listener/RestClientManager.java | 254 ++ .../contribs/listener/StatusNotifier.java | 46 + .../StatusNotifierNotificationProperties.java | 154 ++ .../contribs/listener/TaskNotification.java | 108 + .../listener/TaskStatusPublisher.java | 202 ++ .../TaskStatusPublisherConfiguration.java | 36 + test-harness/dependencies.lock | 786 ------ .../test/integration/ForkJoinSpec.groovy | 4 +- .../integration/AbstractEndToEndTest.java | 4 +- .../utils/MockExternalPayloadStorage.java | 2 - .../conductor/test/utils/UserTask.java | 2 - test-util/dependencies.lock | 1452 ---------- .../integration/AbstractEndToEndTest.java | 4 +- ui/src/data/bulkactions.js | 17 + ui/src/pages/executions/BulkActionModule.jsx | 26 +- ui/src/schema/workflow.js | 42 +- workflow-event-listener/build.gradle | 6 + workflow-event-listener/dependencies.lock | 1170 -------- .../StatusChangeNotification.java | 99 + .../statuschange/StatusChangePublisher.java | 149 + .../StatusChangePublisherConfiguration.java | 48 + 149 files changed, 4078 insertions(+), 20091 deletions(-) create mode 100644 ROADMAP.md delete mode 100644 amqp/dependencies.lock delete mode 100644 annotations-processor/dependencies.lock delete mode 100644 annotations/dependencies.lock delete mode 100644 awss3-storage/dependencies.lock delete mode 100644 awssqs-event-queue/dependencies.lock delete mode 100644 azureblob-storage/dependencies.lock delete mode 100644 cassandra-persistence/dependencies.lock delete mode 100644 client-spring/dependencies.lock create mode 100644 client-spring/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports delete mode 100644 client/dependencies.lock delete mode 100644 common-persistence/dependencies.lock delete mode 100644 common/dependencies.lock delete mode 100644 core/dependencies.lock create mode 100644 core/src/test/java/com/netflix/conductor/core/execution/tasks/TestJoin.java delete mode 100644 dependencies.lock create mode 100644 docs/documentation/advanced/postgresql.md delete mode 100644 es6-persistence/dependencies.lock delete mode 100644 es7-persistence/dependencies.lock delete mode 100644 grpc-client/dependencies.lock delete mode 100644 grpc-server/dependencies.lock delete mode 100644 grpc/dependencies.lock delete mode 100644 http-task/dependencies.lock delete mode 100644 java-sdk/dependencies.lock delete mode 100644 json-jq-task/dependencies.lock delete mode 100644 kafka/dependencies.lock delete mode 100644 metrics/dependencies.lock delete mode 100644 mysql-persistence/dependencies.lock delete mode 100644 nats-streaming/dependencies.lock delete mode 100644 nats/dependencies.lock delete mode 100644 postgres-external-storage/dependencies.lock delete mode 100644 postgres-persistence/dependencies.lock create mode 100644 postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresLockDAO.java create mode 100644 postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAO.java create mode 100644 postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresQueueListener.java create mode 100644 postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueueStats.java create mode 100644 postgres-persistence/src/main/resources/db/migration_postgres/V10__poll_data_check.sql create mode 100644 postgres-persistence/src/main/resources/db/migration_postgres/V11__locking.sql create mode 100644 postgres-persistence/src/main/resources/db/migration_postgres/V12__task_index_columns.sql create mode 100644 postgres-persistence/src/main/resources/db/migration_postgres/V9__indexing_index_fix.sql create mode 100644 postgres-persistence/src/main/resources/db/migration_postgres_notify/V10.1__notify.sql create mode 100644 postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOStatusChangeOnlyTest.java create mode 100644 postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresLockDAOTest.java create mode 100644 postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAOCacheTest.java create mode 100644 postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAONoCacheTest.java create mode 100644 postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresQueueListenerTest.java delete mode 100644 redis-concurrency-limit/dependencies.lock delete mode 100644 redis-lock/dependencies.lock delete mode 100644 redis-persistence/dependencies.lock delete mode 100644 rest/dependencies.lock create mode 100644 rest/src/test/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapperTest.java delete mode 100644 server/dependencies.lock create mode 100644 task-status-listener/build.gradle create mode 100644 task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/RestClientManager.java create mode 100644 task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifier.java create mode 100644 task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifierNotificationProperties.java create mode 100644 task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskNotification.java create mode 100644 task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisher.java create mode 100644 task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisherConfiguration.java delete mode 100644 test-harness/dependencies.lock delete mode 100644 test-util/dependencies.lock delete mode 100644 workflow-event-listener/dependencies.lock create mode 100644 workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangeNotification.java create mode 100644 workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisher.java create mode 100644 workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisherConfiguration.java diff --git a/README.md b/README.md index eac404a6c..27846faf1 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![Conductor](docs/img/logo.svg) -[![Github release](https://img.shields.io/github/v/release/Netflix/conductor.svg)](https://GitHub.com/Netflix/conductor/releases) +[![Github release](https://img.shields.io/github/v/release/conductor-oss/conductor.svg)](https://GitHub.com/Netflix/conductor-oss/releases) [![License](https://img.shields.io/github/license/conductor-oss/conductor.svg)](http://www.apache.org/licenses/LICENSE-2.0) @@ -28,21 +28,22 @@ Please update your forks to point to this repo. This will ensure your commits a git remote set-url origin https://github.com/conductor-oss/conductor ``` > [!IMPORTANT] -> **Follow the steps below if you have an active PR againt the Netflix/Conductor repository** +> **Follow the steps below if you have an active PR against the Netflix/Conductor repository** > 1. Fork **this** repository > 2. Update your local repository to change the remote to this repository > 3. Send a PR against the `main` branch -## Releases -The latest version is [![Github release](https://img.shields.io/github/v/release/Netflix/conductor.svg)](https://GitHub.com/Netflix/conductor/releases) +## Conductor OSS Roadmap +[See the roadmap for the Conductor](ROADMAP.md) -The next scheduled release is in Dec 2023. +## Releases +The latest version is [![Github release](https://img.shields.io/github/v/release/conductor-oss/conductor.svg)](https://GitHub.com/conductor-oss/conductor/releases) ## Resources -#### [Slack Community](https://join.slack.com/t/orkes-conductor/shared_invite/zt-xyxqyseb-YZ3hwwAgHJH97bsrYRnSZg) -We have an active [community](https://join.slack.com/t/orkes-conductor/shared_invite/zt-xyxqyseb-YZ3hwwAgHJH97bsrYRnSZg) of Conductor users and contributors on the channel. -#### [Documentation Site](https://orkes.io/content) -[Documentation](https://orkes.io/content) and tutorial on how to use Conductor +#### [Slack Community](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2hmxn0i3n-_W~a9rWMbvMoYmlJo3Y15g) +We have an active [community](https://join.slack.com/t/orkes-conductor/shared_invite/zt-2hmxn0i3n-_W~a9rWMbvMoYmlJo3Y15g) of Conductor users and contributors on the channel. +#### [Documentation Site](https://docs.conductor-oss.org/) +[Documentation](https://docs.conductor-oss.org/) and tutorial on how to use Conductor [Discussion Forum](https://github.com/conductor-oss/conductor/discussions): Please use the forum for questions and discussing ideas and join the community. @@ -61,28 +62,17 @@ The runnable server is in server/ module. Follow the steps below to launch the docker container: ```shell - -# Create volumes for persistent stores -# Used to create a persistent volume that will preserve the -docker volume create postgres -docker volume create redis - -docker run --init -p 8080:8080 -p 1234:5000 --mount source=redis,target=/redis \ ---mount source=postgres,target=/pgdata conductoross/conductor-standalone:3.15.0 -``` - -Navigate to http://localhost:1234 once the container starts to launch UI. - -## Docker Containers for production usage -```shell -docker pull conductoross/conductor:3.15.0 +docker compose -f docker/docker-compose.yaml up ``` +* Navigate to http://localhost:5000 once the container starts to launch UI. +* APIs are accessible at http://localhost:8080 +* Swagger Docs:http://localhost:8080/swagger-ui/index.html?configUrl=/api-docs/swagger-config#/ ## Database Requirements * The default persistence used is Redis -* The indexing backend is [Elasticsearch](https://www.elastic.co/) (6.x) +* The indexing backend is [Elasticsearch](https://www.elastic.co/) (7.x) ## Other Requirements * JDK 17+ diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 000000000..35d01abe2 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,75 @@ +# Conductor OSS Roadmap + + +## New Features +### Type safety for workflow inputs and task input/output through JSON Schema + +* Allow type safe workflows and workers with support for JSON schema and protobuf +* Enable scaffolding code generation for workers through schema for workers using CLI tool + +### New System Tasks + +* Database task to work with relational & no-sql databases +* Polling support for HTTP task +* Operators + * * For..Each with parallel and sequential execution + * * Improved While loop + * * Try..Catch for improved error handling at the task level + +### LLM Integrations +Conductor is a perfect platform to build your next LLM powered application or incorporating genAI into your applications. +Enable system tasks for LLM integrations that lets you work with various language models for: +1. Text completion +2. Chat completion with memory +3. Embedding generation + +### CLI for Conductor +Allow developers to manage their conductor instance via CLI. + +* Manage metadata +* Query and manage workflow executions (terminate, pause, resume, retry) +* Start | Stop manage conductor server + +### Support Python as a scripting language for INLINE task +Extend usability of Conductor by allowing lightweight python code as INLINE tasks. + +### New APIs for workflow state management + +* Synchronous execution of workflows +* update workflow variables +* Update tasks synchronously + +## SDKs + +* Rust +* Kotlin +* C++ +* Ruby +* Swift +* Flutter / Dart +* PHP + +### Worker metrics on server +Expose an endpoint on the server that can be used by workers to publish worker specific metrics. +This will allow monitoring metrics for all the workers in a distributed system across the entire system. + +## Testing +Infrastructure to make workflows easier to test and debug right from the UI and IDE. + +### Workflow Debugger + +* Ability to debug your workflows during development just like you would do when you write code +* All functionality of a debugger +* Breakpoints add/remove +* Step to next +* Drop to a certain task that was already executed. (going back in time) +* Ability to inspect, modify, add input / output parameters +* Watch Windows to see values of interesting  parameters during execution +* Attaching to a certain WF execution +* Remote Task debugging (with SDK Support).. Enable step by step execution in a task worker from the server + +## Maintenance + +1. Deprecate support for Elasticsearch 6 +2. Update support for newer versions of Elasticsearch +2. Improve/Fix JOIN task performance (less about making it performant and more about just fixing the usability)  - Done \ No newline at end of file diff --git a/amqp/dependencies.lock b/amqp/dependencies.lock deleted file mode 100644 index f9f37598f..000000000 --- a/amqp/dependencies.lock +++ /dev/null @@ -1,177 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.7.16" - } - }, - "compileClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.7.16" - } - }, - "runtimeClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - } - }, - "testCompileClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - }, - "testRuntimeClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - } -} \ No newline at end of file diff --git a/annotations-processor/dependencies.lock b/annotations-processor/dependencies.lock deleted file mode 100644 index f0c8b22ee..000000000 --- a/annotations-processor/dependencies.lock +++ /dev/null @@ -1,241 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.github.jknack:handlebars": { - "locked": "4.3.1" - }, - "com.google.guava:guava": { - "locked": "31.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "com.squareup:javapoet": { - "locked": "1.13.0" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "exampleCompileClasspath": { - "com.netflix.conductor:conductor-annotations": { - "project": true - } - }, - "exampleRuntimeClasspath": { - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - } - }, - "runtimeClasspath": { - "com.github.jknack:handlebars": { - "locked": "4.3.1" - }, - "com.google.guava:guava": { - "locked": "31.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "com.squareup:javapoet": { - "locked": "1.13.0" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - } - }, - "testCompileClasspath": { - "com.github.jknack:handlebars": { - "locked": "4.3.1" - }, - "com.google.guava:guava": { - "locked": "31.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "com.squareup:javapoet": { - "locked": "1.13.0" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.github.jknack:handlebars": { - "locked": "4.3.1" - }, - "com.google.guava:guava": { - "locked": "31.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "com.squareup:javapoet": { - "locked": "1.13.0" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/annotations/dependencies.lock b/annotations/dependencies.lock deleted file mode 100644 index 545a15902..000000000 --- a/annotations/dependencies.lock +++ /dev/null @@ -1,99 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "runtimeClasspath": { - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "testCompileClasspath": { - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/awss3-storage/dependencies.lock b/awss3-storage/dependencies.lock deleted file mode 100644 index c8239eb17..000000000 --- a/awss3-storage/dependencies.lock +++ /dev/null @@ -1,414 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - } - }, - "testCompileClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/awssqs-event-queue/dependencies.lock b/awssqs-event-queue/dependencies.lock deleted file mode 100644 index 3bb1559cd..000000000 --- a/awssqs-event-queue/dependencies.lock +++ /dev/null @@ -1,438 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "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 - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.amazonaws:aws-java-sdk-sqs": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - } - }, - "testCompileClasspath": { - "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 - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-sqs": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/azureblob-storage/dependencies.lock b/azureblob-storage/dependencies.lock deleted file mode 100644 index 9691cd2d6..000000000 --- a/azureblob-storage/dependencies.lock +++ /dev/null @@ -1,150 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.7.16" - } - }, - "compileClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.7.16" - } - }, - "runtimeClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - } - }, - "testCompileClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - }, - "testRuntimeClasspath": { - "com.azure:azure-storage-blob": { - "locked": "12.7.0" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - } -} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 98fed4641..67084b75d 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { } } dependencies { - classpath 'org.springframework.boot:spring-boot-gradle-plugin:3.1.4' + classpath 'org.springframework.boot:spring-boot-gradle-plugin:3.2.1' classpath 'com.diffplug.spotless:spotless-plugin-gradle:6.+' } } @@ -20,7 +20,7 @@ plugins { id 'maven-publish' id 'signing' id 'java-library' - id "com.diffplug.spotless" version "5.0.0" + id "com.diffplug.spotless" version "6.25.0" } // Establish version and status @@ -39,6 +39,12 @@ allprojects { apply plugin: 'java-library' apply plugin: 'project-report' + java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } + sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 diff --git a/cassandra-persistence/dependencies.lock b/cassandra-persistence/dependencies.lock deleted file mode 100644 index 152c73575..000000000 --- a/cassandra-persistence/dependencies.lock +++ /dev/null @@ -1,447 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.datastax.cassandra:cassandra-driver-core": { - "locked": "3.10.2" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.datastax.cassandra:cassandra-driver-core": { - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - } - }, - "testCompileClasspath": { - "com.datastax.cassandra:cassandra-driver-core": { - "locked": "3.10.2" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "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.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.testcontainers:cassandra": { - "locked": "1.15.3" - }, - "org.testcontainers:spock": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.datastax.cassandra:cassandra-driver-core": { - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.testcontainers:cassandra": { - "locked": "1.15.3" - }, - "org.testcontainers:spock": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/client-spring/dependencies.lock b/client-spring/dependencies.lock deleted file mode 100644 index c9914c60a..000000000 --- a/client-spring/dependencies.lock +++ /dev/null @@ -1,477 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-java-sdk": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "locked": "1.10.10" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "cglib:cglib": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "3.3.0" - }, - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "project": true - }, - "com.netflix.conductor:conductor-java-sdk": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.1.1" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "3.1.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "15.4" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.0.9" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-java-sdk": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "locked": "1.10.10" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "cglib:cglib": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "3.3.0" - }, - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "project": true - }, - "com.netflix.conductor:conductor-java-sdk": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "3.1.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-java-sdk" - ], - "locked": "15.4" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.0.9" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/client-spring/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/client-spring/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..4cf1dd0b4 --- /dev/null +++ b/client-spring/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.netflix.conductor.client.spring.ConductorClientAutoConfiguration \ No newline at end of file diff --git a/client/dependencies.lock b/client/dependencies.lock deleted file mode 100644 index eca08ea7a..000000000 --- a/client/dependencies.lock +++ /dev/null @@ -1,394 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.15.2" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "locked": "2.1.1" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "locked": "2.22.2" - }, - "org.jetbrains:annotations": { - "locked": "23.0.0" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - } - }, - "runtimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "locked": "2.1.1" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "locked": "2.22.2" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - } - }, - "testCompileClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.15.2" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "locked": "2.22.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.powermock:powermock-api-mockito2": { - "locked": "2.0.9" - }, - "org.powermock:powermock-module-junit4": { - "locked": "2.0.9" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.eureka:eureka-client": { - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "locked": "2.22.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.powermock:powermock-api-mockito2": { - "locked": "2.0.9" - }, - "org.powermock:powermock-module-junit4": { - "locked": "2.0.9" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/common-persistence/dependencies.lock b/common-persistence/dependencies.lock deleted file mode 100644 index 0a6426ed9..000000000 --- a/common-persistence/dependencies.lock +++ /dev/null @@ -1,159 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.7.16" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.5" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.5" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.5" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.5" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.5" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.5" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.13.5" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.13.5" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - } -} \ No newline at end of file diff --git a/common/dependencies.lock b/common/dependencies.lock deleted file mode 100644 index 4dfa1dd58..000000000 --- a/common/dependencies.lock +++ /dev/null @@ -1,304 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "annotationsProcessorCodegen": { - "com.github.jknack:handlebars": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "4.3.1" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "31.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations-processor" - ], - "project": true - }, - "com.netflix.conductor:conductor-annotations-processor": { - "project": true - }, - "com.squareup:javapoet": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "1.13.0" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.1.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-annotations-processor" - ], - "locked": "2.20.0" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "locked": "2.15.3" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "org.apache.bval:bval-jsr": { - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "locked": "2.15.3" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "org.apache.bval:bval-jsr": { - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "locked": "2.15.3" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "locked": "2.15.3" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - } - } -} \ No newline at end of file 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 90fd0ee4a..ea98133f3 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 @@ -24,6 +24,7 @@ import com.netflix.conductor.annotations.protogen.ProtoMessage; import com.netflix.conductor.common.metadata.workflow.WorkflowTask; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.google.protobuf.Any; import io.swagger.v3.oas.annotations.Hidden; @@ -629,6 +630,7 @@ public void setOutputMessage(Any outputMessage) { /** * @return {@link Optional} containing the task definition if available */ + @JsonIgnore public Optional getTaskDefinition() { return Optional.ofNullable(this.getWorkflowTask()).map(WorkflowTask::getTaskDefinition); } diff --git a/core/dependencies.lock b/core/dependencies.lock deleted file mode 100644 index b1a1eee7e..000000000 --- a/core/dependencies.lock +++ /dev/null @@ -1,430 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.github.ben-manes.caffeine:caffeine": { - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "locked": "2.4.0" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "locked": "4.0.1" - }, - "org.apache.bval:bval-jsr": { - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "locked": "2.4.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "locked": "4.0.1" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.github.ben-manes.caffeine:caffeine": { - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "locked": "2.4.0" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "locked": "4.0.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "locked": "4.0.1" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "locked": "2.4.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.spectator:spectator-api": { - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "locked": "0.3.3" - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "locked": "2.0.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "locked": "4.0.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "locked": "4.0.1" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - } -} \ No newline at end of file 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 80b127372..b1bfb4adb 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 @@ -81,6 +81,9 @@ public class ConductorProperties { @DurationUnit(ChronoUnit.SECONDS) private Duration taskExecutionPostponeDuration = Duration.ofSeconds(60); + /** Used to enable/disable the indexing of tasks. */ + private boolean taskIndexingEnabled = true; + /** Used to enable/disable the indexing of task execution logs. */ private boolean taskExecLogIndexingEnabled = true; @@ -333,6 +336,14 @@ public void setTaskExecLogIndexingEnabled(boolean taskExecLogIndexingEnabled) { this.taskExecLogIndexingEnabled = taskExecLogIndexingEnabled; } + public boolean isTaskIndexingEnabled() { + return taskIndexingEnabled; + } + + public void setTaskIndexingEnabled(boolean taskIndexingEnabled) { + this.taskIndexingEnabled = taskIndexingEnabled; + } + public boolean isAsyncIndexingEnabled() { return asyncIndexingEnabled; } 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 da843222d..3180dfc5b 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 @@ -513,7 +513,7 @@ public void updateTask(TaskModel taskModel) { * of tasks on a system failure. So only index for each update if async indexing is not enabled. * If it *is* enabled, tasks will be indexed only when a workflow is in terminal state. */ - if (!properties.isAsyncIndexingEnabled()) { + if (!properties.isAsyncIndexingEnabled() && properties.isTaskIndexingEnabled()) { indexDAO.indexTask(new TaskSummary(taskModel.toTask())); } } catch (TerminateWorkflowException e) { diff --git a/core/src/main/java/com/netflix/conductor/core/events/EventQueues.java b/core/src/main/java/com/netflix/conductor/core/events/EventQueues.java index 9cbe08a46..139aad0c4 100644 --- a/core/src/main/java/com/netflix/conductor/core/events/EventQueues.java +++ b/core/src/main/java/com/netflix/conductor/core/events/EventQueues.java @@ -18,7 +18,6 @@ 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.lang.NonNull; import org.springframework.stereotype.Component; @@ -37,7 +36,6 @@ public class EventQueues { private final ParametersUtils parametersUtils; private final Map providers; - @Autowired public EventQueues( @Qualifier(EVENT_QUEUE_PROVIDERS_QUALIFIER) Map providers, ParametersUtils parametersUtils) { diff --git a/core/src/main/java/com/netflix/conductor/core/events/ScriptEvaluator.java b/core/src/main/java/com/netflix/conductor/core/events/ScriptEvaluator.java index 1cd5e4a89..c77f3860d 100644 --- a/core/src/main/java/com/netflix/conductor/core/events/ScriptEvaluator.java +++ b/core/src/main/java/com/netflix/conductor/core/events/ScriptEvaluator.java @@ -17,6 +17,8 @@ import javax.script.ScriptEngineManager; import javax.script.ScriptException; +import org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory; + public class ScriptEvaluator { private static ScriptEngine engine; @@ -25,7 +27,7 @@ private ScriptEvaluator() {} /** * Evaluates the script with the help of input provided but converts the result to a boolean - * value. + * value. Set environment variable CONDUCTOR_NASHORN_ES6_ENABLED=true for Nashorn ES6 support. * * @param script Script to be evaluated. * @param input Input parameters. @@ -37,7 +39,8 @@ public static Boolean evalBool(String script, Object input) throws ScriptExcepti } /** - * Evaluates the script with the help of input provided. + * Evaluates the script with the help of input provided. Set environment variable + * CONDUCTOR_NASHORN_ES6_ENABLED=true for Nashorn ES6 support. * * @param script Script to be evaluated. * @param input Input parameters. @@ -45,16 +48,30 @@ public static Boolean evalBool(String script, Object input) throws ScriptExcepti * @return Generic object, the result of the evaluated expression. */ public static Object eval(String script, Object input) throws ScriptException { - if (engine == null) { - engine = new ScriptEngineManager().getEngineByName("Nashorn"); + initEngine(false); + Bindings bindings = engine.createBindings(); + bindings.put("$", input); + return engine.eval(script, bindings); + } + + // to mock in a test + public static String getEnv(String name) { + return System.getenv(name); + } + + public static void initEngine(boolean reInit) { + if (engine == null || reInit) { + if ("true".equalsIgnoreCase(getEnv("CONDUCTOR_NASHORN_ES6_ENABLED"))) { + NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + engine = factory.getScriptEngine("--language=es6"); + } else { + engine = new ScriptEngineManager().getEngineByName("Nashorn"); + } } if (engine == null) { throw new RuntimeException( "missing nashorn engine. Ensure you are running supported JVM"); } - Bindings bindings = engine.createBindings(); - bindings.put("$", input); - return engine.eval(script, bindings); } /** 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 a25f06dd1..c35547a69 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 @@ -1203,6 +1203,15 @@ List cancelNonTerminalTasks(WorkflowModel workflow) { if (!task.getStatus().isTerminal()) { // Cancel the ones which are not completed yet.... task.setStatus(CANCELED); + try { + notifyTaskStatusListener(task); + } catch (Exception e) { + String errorMsg = + String.format( + "Error while notifying TaskStatusListener: %s for workflow: %s", + task.getTaskId(), task.getWorkflowInstanceId()); + LOGGER.error(errorMsg, e); + } if (systemTaskRegistry.isSystemTask(task.getTaskType())) { WorkflowSystemTask workflowSystemTask = systemTaskRegistry.get(task.getTaskType()); 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 85ff93e81..054d854de 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 @@ -18,7 +18,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.common.metadata.tasks.TaskDef; @@ -42,7 +41,6 @@ public class DoWhileTaskMapper implements TaskMapper { private final MetadataDAO metadataDAO; private final ParametersUtils parametersUtils; - @Autowired public DoWhileTaskMapper(MetadataDAO metadataDAO, ParametersUtils parametersUtils) { this.metadataDAO = metadataDAO; this.parametersUtils = parametersUtils; 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 d94af8f0b..4ab0480d8 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 @@ -19,7 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.annotations.VisibleForTesting; @@ -46,7 +45,6 @@ public class DynamicTaskMapper implements TaskMapper { private final ParametersUtils parametersUtils; private final MetadataDAO metadataDAO; - @Autowired public DynamicTaskMapper(ParametersUtils parametersUtils, MetadataDAO metadataDAO) { this.parametersUtils = parametersUtils; this.metadataDAO = metadataDAO; diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/EventTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/EventTaskMapper.java index 96b9d582f..0ec323530 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/EventTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/EventTaskMapper.java @@ -17,7 +17,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.common.metadata.tasks.TaskType; @@ -35,7 +34,6 @@ public class EventTaskMapper implements TaskMapper { private final ParametersUtils parametersUtils; - @Autowired public EventTaskMapper(ParametersUtils parametersUtils) { this.parametersUtils = parametersUtils; } 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 8eed7a00d..113f9b41d 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 @@ -25,7 +25,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.annotations.VisibleForTesting; @@ -68,7 +67,6 @@ public class ForkJoinDynamicTaskMapper implements TaskMapper { private static final TypeReference> ListOfWorkflowTasks = new TypeReference<>() {}; - @Autowired public ForkJoinDynamicTaskMapper( IDGenerator idGenerator, ParametersUtils parametersUtils, diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapper.java index 837e49549..4ac2bb4b8 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/HTTPTaskMapper.java @@ -16,7 +16,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.common.metadata.tasks.TaskDef; @@ -42,7 +41,6 @@ public class HTTPTaskMapper implements TaskMapper { private final ParametersUtils parametersUtils; private final MetadataDAO metadataDAO; - @Autowired public HTTPTaskMapper(ParametersUtils parametersUtils, MetadataDAO metadataDAO) { this.parametersUtils = parametersUtils; this.metadataDAO = metadataDAO; diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java index 862504666..455e337f2 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java @@ -20,7 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.common.metadata.tasks.TaskDef; @@ -41,7 +40,6 @@ public class KafkaPublishTaskMapper implements TaskMapper { private final ParametersUtils parametersUtils; private final MetadataDAO metadataDAO; - @Autowired public KafkaPublishTaskMapper(ParametersUtils parametersUtils, MetadataDAO metadataDAO) { this.parametersUtils = parametersUtils; this.metadataDAO = metadataDAO; diff --git a/core/src/main/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapper.java b/core/src/main/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapper.java index 2401b5c2c..b59f861b7 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapper.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/mapper/SwitchTaskMapper.java @@ -18,7 +18,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.common.metadata.tasks.TaskType; @@ -42,7 +41,6 @@ public class SwitchTaskMapper implements TaskMapper { private final Map evaluators; - @Autowired public SwitchTaskMapper(Map evaluators) { this.evaluators = evaluators; } 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 f273a8512..2e61b4fe7 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 @@ -14,6 +14,7 @@ import java.util.*; import java.util.stream.Collectors; +import java.util.stream.IntStream; import javax.script.ScriptException; @@ -111,6 +112,17 @@ public boolean execute( } doWhileTaskModel.addOutput(String.valueOf(doWhileTaskModel.getIteration()), output); + Optional keepLastN = + Optional.ofNullable(doWhileTaskModel.getWorkflowTask().getInputParameters()) + .map(parameters -> parameters.get("keepLastN")) + .map(value -> (Integer) value); + if (keepLastN.isPresent() && doWhileTaskModel.getIteration() > keepLastN.get()) { + Integer iteration = doWhileTaskModel.getIteration(); + IntStream.range(0, iteration - keepLastN.get() - 1) + .mapToObj(Integer::toString) + .forEach(doWhileTaskModel::removeOutput); + } + if (hasFailures) { LOGGER.debug( "Task {} failed in {} iteration", diff --git a/core/src/main/java/com/netflix/conductor/core/execution/tasks/Join.java b/core/src/main/java/com/netflix/conductor/core/execution/tasks/Join.java index 4114e39ab..23c9acd63 100644 --- a/core/src/main/java/com/netflix/conductor/core/execution/tasks/Join.java +++ b/core/src/main/java/com/netflix/conductor/core/execution/tasks/Join.java @@ -13,6 +13,7 @@ package com.netflix.conductor.core.execution.tasks; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -36,9 +37,6 @@ public Join() { @SuppressWarnings("unchecked") public boolean execute( WorkflowModel workflow, TaskModel task, WorkflowExecutor workflowExecutor) { - - boolean allDone = true; - boolean hasFailures = false; StringBuilder failureReason = new StringBuilder(); StringBuilder optionalTaskFailures = new StringBuilder(); List joinOn = (List) task.getInputData().get("joinOn"); @@ -47,41 +45,47 @@ public boolean execute( joinOn = joinOn.stream() .map(name -> TaskUtils.appendIteration(name, task.getIteration())) - .collect(Collectors.toList()); + .toList(); } + + boolean allTasksTerminal = + joinOn.stream() + .map(workflow::getTaskByRefName) + .allMatch(t -> t != null && t.getStatus().isTerminal()); + for (String joinOnRef : joinOn) { TaskModel forkedTask = workflow.getTaskByRefName(joinOnRef); if (forkedTask == null) { - // Task is not even scheduled yet - allDone = false; - break; + // Continue checking other tasks if a referenced task is not yet scheduled + continue; } + TaskModel.Status taskStatus = forkedTask.getStatus(); - hasFailures = + + // Only add to task output if it's not empty + if (!forkedTask.getOutputData().isEmpty()) { + task.addOutput(joinOnRef, forkedTask.getOutputData()); + } + + // Determine if the join task fails immediately due to a non-optional, non-permissive + // task failure, + // or waits for all tasks to be terminal if the failed task is permissive. + var isJoinFailure = !taskStatus.isSuccessful() && !forkedTask.getWorkflowTask().isOptional() - && (!forkedTask.getWorkflowTask().isPermissive() - || joinOn.stream() - .map(workflow::getTaskByRefName) - .allMatch(t -> t.getStatus().isTerminal())); - if (hasFailures) { + && (!forkedTask.getWorkflowTask().isPermissive() || allTasksTerminal); + if (isJoinFailure) { final String failureReasons = joinOn.stream() .map(workflow::getTaskByRefName) + .filter(Objects::nonNull) .filter(t -> !t.getStatus().isSuccessful()) .map(TaskModel::getReasonForIncompletion) .collect(Collectors.joining(" ")); failureReason.append(failureReasons); - } - // Only add to task output if it's not empty - if (!forkedTask.getOutputData().isEmpty()) { - task.addOutput(joinOnRef, forkedTask.getOutputData()); - } - if (!taskStatus.isTerminal()) { - allDone = false; - } - if (hasFailures) { - break; + task.setReasonForIncompletion(failureReason.toString()); + task.setStatus(TaskModel.Status.FAILED); + return true; } // check for optional task failures @@ -95,11 +99,10 @@ public boolean execute( .append(" "); } } - if (allDone || hasFailures || optionalTaskFailures.length() > 0) { - if (hasFailures) { - task.setReasonForIncompletion(failureReason.toString()); - task.setStatus(TaskModel.Status.FAILED); - } else if (optionalTaskFailures.length() > 0) { + + // Finalize the join task's status based on the outcomes of all referenced tasks. + if (allTasksTerminal) { + if (!optionalTaskFailures.isEmpty()) { task.setStatus(TaskModel.Status.COMPLETED_WITH_ERRORS); optionalTaskFailures.append("completed with errors"); task.setReasonForIncompletion(optionalTaskFailures.toString()); @@ -108,6 +111,8 @@ public boolean execute( } return true; } + + // Task execution not complete, waiting on more tasks to reach terminal state. return false; } @@ -121,6 +126,6 @@ public Optional getEvaluationOffset(TaskModel taskModel, long defaultOffse } public boolean isAsync() { - return true; + return false; } } 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 a83ea4d39..b12529a62 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 @@ -19,7 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -53,7 +52,6 @@ public class WorkflowSweeper { private static final String CLASS_NAME = WorkflowSweeper.class.getSimpleName(); - @Autowired public WorkflowSweeper( WorkflowExecutor workflowExecutor, Optional workflowRepairService, 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 59875ac43..122c31b5b 100644 --- a/core/src/main/java/com/netflix/conductor/model/TaskModel.java +++ b/core/src/main/java/com/netflix/conductor/model/TaskModel.java @@ -571,6 +571,7 @@ public void incrementPollCount() { /** * @return {@link Optional} containing the task definition if available */ + @JsonIgnore public Optional getTaskDefinition() { return Optional.ofNullable(this.getWorkflowTask()).map(WorkflowTask::getTaskDefinition); } @@ -873,6 +874,10 @@ public void addOutput(String key, Object value) { this.outputData.put(key, value); } + public void removeOutput(String key) { + this.outputData.remove(key); + } + public void addOutput(Map outputData) { if (outputData != null) { this.outputData.putAll(outputData); diff --git a/core/src/main/java/com/netflix/conductor/service/ExecutionLockService.java b/core/src/main/java/com/netflix/conductor/service/ExecutionLockService.java index b7539ca4d..d9dbf6b7b 100644 --- a/core/src/main/java/com/netflix/conductor/service/ExecutionLockService.java +++ b/core/src/main/java/com/netflix/conductor/service/ExecutionLockService.java @@ -16,7 +16,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.netflix.conductor.annotations.Trace; @@ -34,7 +33,6 @@ public class ExecutionLockService { private final long lockLeaseTime; private final long lockTimeToTry; - @Autowired public ExecutionLockService(ConductorProperties properties, Lock lock) { this.properties = properties; this.lock = lock; 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 33360c625..2c985dec0 100644 --- a/core/src/main/java/com/netflix/conductor/service/ExecutionService.java +++ b/core/src/main/java/com/netflix/conductor/service/ExecutionService.java @@ -35,6 +35,7 @@ import com.netflix.conductor.core.exception.NotFoundException; import com.netflix.conductor.core.execution.WorkflowExecutor; import com.netflix.conductor.core.execution.tasks.SystemTaskRegistry; +import com.netflix.conductor.core.listener.TaskStatusListener; import com.netflix.conductor.core.utils.QueueUtils; import com.netflix.conductor.core.utils.Utils; import com.netflix.conductor.dao.QueueDAO; @@ -52,6 +53,7 @@ public class ExecutionService { private final QueueDAO queueDAO; private final ExternalPayloadStorage externalPayloadStorage; private final SystemTaskRegistry systemTaskRegistry; + private final TaskStatusListener taskStatusListener; private final long queueTaskMessagePostponeSecs; @@ -65,7 +67,8 @@ public ExecutionService( QueueDAO queueDAO, ConductorProperties properties, ExternalPayloadStorage externalPayloadStorage, - SystemTaskRegistry systemTaskRegistry) { + SystemTaskRegistry systemTaskRegistry, + TaskStatusListener taskStatusListener) { this.workflowExecutor = workflowExecutor; this.executionDAOFacade = executionDAOFacade; this.queueDAO = queueDAO; @@ -74,6 +77,7 @@ public ExecutionService( this.queueTaskMessagePostponeSecs = properties.getTaskExecutionPostponeDuration().getSeconds(); this.systemTaskRegistry = systemTaskRegistry; + this.taskStatusListener = taskStatusListener; } public Task poll(String taskType, String workerId) { @@ -181,6 +185,11 @@ public List poll( queueDAO.postpone(queueName, taskId, 0, queueTaskMessagePostponeSecs); } } + taskIds.stream() + .map(executionDAOFacade::getTaskModel) + .filter(Objects::nonNull) + .filter(task -> TaskModel.Status.IN_PROGRESS.equals(task.getStatus())) + .forEach(taskStatusListener::onTaskInProgress); executionDAOFacade.updateTaskLastPoll(taskType, domain, workerId); Monitors.recordTaskPoll(queueName); tasks.forEach(this::ackTaskReceived); diff --git a/core/src/main/java/com/netflix/conductor/service/WorkflowBulkService.java b/core/src/main/java/com/netflix/conductor/service/WorkflowBulkService.java index de6bd4292..ca240b1a9 100644 --- a/core/src/main/java/com/netflix/conductor/service/WorkflowBulkService.java +++ b/core/src/main/java/com/netflix/conductor/service/WorkflowBulkService.java @@ -67,4 +67,23 @@ BulkResponse terminate( "Cannot process more than {max} workflows. Please use multiple requests.") List workflowIds, String reason); + + BulkResponse deleteWorkflow( + @NotEmpty(message = "WorkflowIds list cannot be null.") + @Size( + max = MAX_REQUEST_ITEMS, + message = + "Cannot process more than {max} workflows. Please use multiple requests.") + List workflowIds, + boolean archiveWorkflow); + + BulkResponse terminateRemove( + @NotEmpty(message = "WorkflowIds list cannot be null.") + @Size( + max = MAX_REQUEST_ITEMS, + message = + "Cannot process more than {max} workflows. Please use multiple requests.") + List workflowIds, + String reason, + boolean archiveWorkflow); } diff --git a/core/src/main/java/com/netflix/conductor/service/WorkflowBulkServiceImpl.java b/core/src/main/java/com/netflix/conductor/service/WorkflowBulkServiceImpl.java index 5e05ae453..fcbdbe3bc 100644 --- a/core/src/main/java/com/netflix/conductor/service/WorkflowBulkServiceImpl.java +++ b/core/src/main/java/com/netflix/conductor/service/WorkflowBulkServiceImpl.java @@ -30,9 +30,12 @@ public class WorkflowBulkServiceImpl implements WorkflowBulkService { private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowBulkService.class); private final WorkflowExecutor workflowExecutor; + private final WorkflowService workflowService; - public WorkflowBulkServiceImpl(WorkflowExecutor workflowExecutor) { + public WorkflowBulkServiceImpl( + WorkflowExecutor workflowExecutor, WorkflowService workflowService) { this.workflowExecutor = workflowExecutor; + this.workflowService = workflowService; } /** @@ -164,4 +167,70 @@ public BulkResponse terminate(List workflowIds, String reason) { } return bulkResponse; } + + /** + * Removes a list of workflows from the system. + * + * @param workflowIds List of WorkflowIDs of the workflows you want to remove from system. + * @param archiveWorkflow Archives the workflow and associated tasks instead of removing them. + */ + public BulkResponse deleteWorkflow(List workflowIds, boolean archiveWorkflow) { + BulkResponse bulkResponse = new BulkResponse(); + for (String workflowId : workflowIds) { + try { + workflowService.deleteWorkflow( + workflowId, + archiveWorkflow); // TODO: change this to method that cancels then deletes + bulkResponse.appendSuccessResponse(workflowId); + } catch (Exception e) { + LOGGER.error( + "bulk delete exception, workflowId {}, message: {} ", + workflowId, + e.getMessage(), + e); + bulkResponse.appendFailedResponse(workflowId, e.getMessage()); + } + } + return bulkResponse; + } + + /** + * Terminates execution for workflows in a list, then removes each workflow. + * + * @param workflowIds List of workflow IDs to terminate and delete. + * @param reason Reason for terminating the workflow. + * @param archiveWorkflow Archives the workflow and associated tasks instead of removing them. + * @return bulk response object containing a list of succeeded workflows and a list of failed + * ones with errors + */ + public BulkResponse terminateRemove( + List workflowIds, String reason, boolean archiveWorkflow) { + BulkResponse bulkResponse = new BulkResponse(); + for (String workflowId : workflowIds) { + try { + workflowExecutor.terminateWorkflow(workflowId, reason); + bulkResponse.appendSuccessResponse(workflowId); + } catch (Exception e) { + LOGGER.error( + "bulk terminate exception, workflowId {}, message: {} ", + workflowId, + e.getMessage(), + e); + bulkResponse.appendFailedResponse(workflowId, e.getMessage()); + } + + try { + workflowService.deleteWorkflow(workflowId, archiveWorkflow); + bulkResponse.appendSuccessResponse(workflowId); + } catch (Exception e) { + LOGGER.error( + "bulk delete exception, workflowId {}, message: {} ", + workflowId, + e.getMessage(), + e); + bulkResponse.appendFailedResponse(workflowId, e.getMessage()); + } + } + return bulkResponse; + } } diff --git a/core/src/main/java/com/netflix/conductor/service/WorkflowService.java b/core/src/main/java/com/netflix/conductor/service/WorkflowService.java index 2253cad54..07fff88e0 100644 --- a/core/src/main/java/com/netflix/conductor/service/WorkflowService.java +++ b/core/src/main/java/com/netflix/conductor/service/WorkflowService.java @@ -242,6 +242,19 @@ void terminateWorkflow( @NotEmpty(message = "WorkflowId cannot be null or empty.") String workflowId, String reason); + /** + * Terminate workflow execution, and then remove it from the system. Acts as terminate and + * remove combined. + * + * @param workflowId WorkflowId of the workflow + * @param reason Reason for terminating the workflow. + * @param archiveWorkflow Archives the workflow and associated tasks instead of removing them. + */ + void terminateRemove( + @NotEmpty(message = "WorkflowId cannot be null or empty.") String workflowId, + String reason, + boolean archiveWorkflow); + /** * Search for workflows based on payload and given parameters. Use sort options as sort ASCor * DESC e.g. sort=name or sort=workflowId:DESC. If order is not specified, defaults to ASC. diff --git a/core/src/main/java/com/netflix/conductor/service/WorkflowServiceImpl.java b/core/src/main/java/com/netflix/conductor/service/WorkflowServiceImpl.java index 93777afd5..bc6a700ee 100644 --- a/core/src/main/java/com/netflix/conductor/service/WorkflowServiceImpl.java +++ b/core/src/main/java/com/netflix/conductor/service/WorkflowServiceImpl.java @@ -196,6 +196,19 @@ public void deleteWorkflow(String workflowId, boolean archiveWorkflow) { executionService.removeWorkflow(workflowId, archiveWorkflow); } + /** + * Terminate workflow execution, and then remove it from the system. Acts as terminate and + * remove combined. + * + * @param workflowId WorkflowId of the workflow + * @param reason Reason for terminating the workflow. + * @param archiveWorkflow Archives the workflow and associated tasks instead of removing them. + */ + public void terminateRemove(String workflowId, String reason, boolean archiveWorkflow) { + workflowExecutor.terminateWorkflow(workflowId, reason); + executionService.removeWorkflow(workflowId, archiveWorkflow); + } + /** * Retrieves all the running workflows. * diff --git a/core/src/test/java/com/netflix/conductor/core/events/TestScriptEval.java b/core/src/test/java/com/netflix/conductor/core/events/TestScriptEval.java index 313c02bc3..3877a2093 100644 --- a/core/src/test/java/com/netflix/conductor/core/events/TestScriptEval.java +++ b/core/src/test/java/com/netflix/conductor/core/events/TestScriptEval.java @@ -16,6 +16,8 @@ import java.util.Map; import org.junit.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -44,4 +46,43 @@ public void testScript() throws Exception { assertTrue(ScriptEvaluator.evalBool(script3, payload)); assertFalse(ScriptEvaluator.evalBool(script4, payload)); } + + @Test + public void testES6Setting() throws Exception { + Map payload = new HashMap<>(); + Map app = new HashMap<>(); + app.put("name", "conductor"); + app.put("version", 2.0); + app.put("license", "Apache 2.0"); + + payload.put("app", app); + payload.put("author", "Netflix"); + payload.put("oss", true); + + String script1 = + """ + (function(){\s + const variable = 1; // const support => es6\s + return $.app.name == 'conductor';})();"""; // true + + MockedStatic evaluator = Mockito.mockStatic(ScriptEvaluator.class); + evaluator + .when(() -> ScriptEvaluator.getEnv("CONDUCTOR_NASHORN_ES6_ENABLED")) + .thenReturn("true"); + evaluator + .when(() -> ScriptEvaluator.eval(Mockito.any(), Mockito.any())) + .thenCallRealMethod(); + evaluator + .when(() -> ScriptEvaluator.evalBool(Mockito.any(), Mockito.any())) + .thenCallRealMethod(); + evaluator.when(() -> ScriptEvaluator.initEngine(Mockito.anyBoolean())).thenCallRealMethod(); + evaluator.when(() -> ScriptEvaluator.toBoolean(Mockito.any())).thenCallRealMethod(); + ScriptEvaluator.initEngine(true); + assertTrue(ScriptEvaluator.evalBool(script1, payload)); + evaluator + .when(() -> ScriptEvaluator.getEnv("CONDUCTOR_NASHORN_ES6_ENABLED")) + .thenReturn("false"); + ScriptEvaluator.initEngine(true); + evaluator.close(); + } } diff --git a/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestJoin.java b/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestJoin.java new file mode 100644 index 000000000..66082edd0 --- /dev/null +++ b/core/src/test/java/com/netflix/conductor/core/execution/tasks/TestJoin.java @@ -0,0 +1,192 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.tuple.Pair; +import org.junit.Test; + +import com.netflix.conductor.common.metadata.workflow.WorkflowTask; +import com.netflix.conductor.core.execution.WorkflowExecutor; +import com.netflix.conductor.model.TaskModel; +import com.netflix.conductor.model.WorkflowModel; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; + +public class TestJoin { + private final WorkflowExecutor executor = mock(WorkflowExecutor.class); + + private TaskModel createTask( + String referenceName, + TaskModel.Status status, + boolean isOptional, + boolean isPermissive) { + TaskModel task = new TaskModel(); + task.setStatus(status); + task.setReferenceTaskName(referenceName); + WorkflowTask workflowTask = new WorkflowTask(); + workflowTask.setOptional(isOptional); + workflowTask.setPermissive(isPermissive); + task.setWorkflowTask(workflowTask); + return task; + } + + private Pair createJoinWorkflow( + List tasks, String... extraTaskRefNames) { + WorkflowModel workflow = new WorkflowModel(); + var join = new TaskModel(); + join.setReferenceTaskName("join"); + var taskRefNames = + tasks.stream().map(TaskModel::getReferenceTaskName).collect(Collectors.toList()); + taskRefNames.addAll(List.of(extraTaskRefNames)); + join.getInputData().put("joinOn", taskRefNames); + workflow.getTasks().addAll(tasks); + workflow.getTasks().add(join); + return Pair.of(workflow, join); + } + + @Test + public void testShouldNotMarkJoinAsCompletedWithErrorsWhenNotDone() { + var task1 = createTask("task1", TaskModel.Status.COMPLETED_WITH_ERRORS, true, false); + + // task2 is not scheduled yet, so the join is not completed + var wfJoinPair = createJoinWorkflow(List.of(task1), "task2"); + + var join = new Join(); + var result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertFalse(result); + } + + @Test + public void testJoinCompletesSuccessfullyWhenAllTasksSucceed() { + var task1 = createTask("task1", TaskModel.Status.COMPLETED, false, false); + var task2 = createTask("task2", TaskModel.Status.COMPLETED, false, false); + + var wfJoinPair = createJoinWorkflow(List.of(task1, task2)); + + var join = new Join(); + var result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertTrue("Join task should execute successfully when all tasks succeed", result); + assertEquals( + "Join task status should be COMPLETED when all tasks succeed", + TaskModel.Status.COMPLETED, + wfJoinPair.getRight().getStatus()); + } + + @Test + public void testJoinWaitsWhenAnyTaskIsNotTerminal() { + var task1 = createTask("task1", TaskModel.Status.IN_PROGRESS, false, false); + var task2 = createTask("task2", TaskModel.Status.COMPLETED, false, false); + + var wfJoinPair = createJoinWorkflow(List.of(task1, task2)); + + var join = new Join(); + var result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertFalse("Join task should wait when any task is not in terminal state", result); + } + + @Test + public void testJoinFailsWhenMandatoryTaskFails() { + // Mandatory task fails + var task1 = createTask("task1", TaskModel.Status.FAILED, false, false); + // Optional task completes with errors + var task2 = createTask("task2", TaskModel.Status.COMPLETED_WITH_ERRORS, true, false); + + var wfJoinPair = createJoinWorkflow(List.of(task1, task2)); + + var join = new Join(); + var result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertTrue("Join task should be executed when a mandatory task fails", result); + assertEquals( + "Join task status should be FAILED when a mandatory task fails", + TaskModel.Status.FAILED, + wfJoinPair.getRight().getStatus()); + } + + @Test + public void testJoinCompletesWithErrorsWhenOnlyOptionalTasksFail() { + // Mandatory task succeeds + var task1 = createTask("task1", TaskModel.Status.COMPLETED, false, false); + // Optional task completes with errors + var task2 = createTask("task2", TaskModel.Status.COMPLETED_WITH_ERRORS, true, false); + + var wfJoinPair = createJoinWorkflow(List.of(task1, task2)); + + var join = new Join(); + var result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertTrue("Join task should be executed when only optional tasks fail", result); + assertEquals( + "Join task status should be COMPLETED_WITH_ERRORS when only optional tasks fail", + TaskModel.Status.COMPLETED_WITH_ERRORS, + wfJoinPair.getRight().getStatus()); + } + + @Test + public void testJoinAggregatesFailureReasonsCorrectly() { + var task1 = createTask("task1", TaskModel.Status.FAILED, false, false); + task1.setReasonForIncompletion("Task1 failed"); + var task2 = createTask("task2", TaskModel.Status.FAILED, false, false); + task2.setReasonForIncompletion("Task2 failed"); + + var wfJoinPair = createJoinWorkflow(List.of(task1, task2)); + + var join = new Join(); + var result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertTrue("Join task should be executed when tasks fail", result); + assertEquals( + "Join task status should be FAILED when tasks fail", + TaskModel.Status.FAILED, + wfJoinPair.getRight().getStatus()); + assertTrue( + "Join task reason for incompletion should aggregate failure reasons", + wfJoinPair.getRight().getReasonForIncompletion().contains("Task1 failed") + && wfJoinPair + .getRight() + .getReasonForIncompletion() + .contains("Task2 failed")); + } + + @Test + public void testJoinWaitsForAllTasksBeforeFailingDueToPermissiveTaskFailure() { + // Task 1 is a permissive task that fails. + var task1 = createTask("task1", TaskModel.Status.FAILED, false, true); + // Task 2 is a non-permissive task that eventually succeeds. + var task2 = + createTask( + "task2", + TaskModel.Status.IN_PROGRESS, + false, + false); // Initially not in a terminal state. + + var wfJoinPair = createJoinWorkflow(List.of(task1, task2)); + + // First execution: Task 2 is not yet terminal. + var join = new Join(); + boolean result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertFalse("Join task should wait as not all tasks are terminal", result); + + // Simulate Task 2 reaching a terminal state. + task2.setStatus(TaskModel.Status.COMPLETED); + + // Second execution: Now all tasks are terminal. + result = join.execute(wfJoinPair.getLeft(), wfJoinPair.getRight(), executor); + assertTrue("Join task should proceed as now all tasks are terminal", result); + assertEquals( + "Join task should be marked as FAILED due to permissive task failure", + TaskModel.Status.FAILED, + wfJoinPair.getRight().getStatus()); + } +} diff --git a/core/src/test/java/com/netflix/conductor/service/ExecutionServiceTest.java b/core/src/test/java/com/netflix/conductor/service/ExecutionServiceTest.java index 9c7a631e3..a1974c713 100644 --- a/core/src/test/java/com/netflix/conductor/service/ExecutionServiceTest.java +++ b/core/src/test/java/com/netflix/conductor/service/ExecutionServiceTest.java @@ -34,6 +34,7 @@ import com.netflix.conductor.core.dal.ExecutionDAOFacade; import com.netflix.conductor.core.execution.WorkflowExecutor; import com.netflix.conductor.core.execution.tasks.SystemTaskRegistry; +import com.netflix.conductor.core.listener.TaskStatusListener; import com.netflix.conductor.dao.QueueDAO; import static junit.framework.TestCase.assertEquals; @@ -48,6 +49,7 @@ public class ExecutionServiceTest { @Mock private ConductorProperties conductorProperties; @Mock private ExternalPayloadStorage externalPayloadStorage; @Mock private SystemTaskRegistry systemTaskRegistry; + @Mock private TaskStatusListener taskStatusListener; private ExecutionService executionService; @@ -68,7 +70,8 @@ public void setup() { queueDAO, conductorProperties, externalPayloadStorage, - systemTaskRegistry); + systemTaskRegistry, + taskStatusListener); WorkflowDef workflowDef = new WorkflowDef(); workflow1 = new Workflow(); workflow1.setWorkflowId("wf1"); diff --git a/core/src/test/java/com/netflix/conductor/service/WorkflowBulkServiceTest.java b/core/src/test/java/com/netflix/conductor/service/WorkflowBulkServiceTest.java index 27c23b992..25f70fd35 100644 --- a/core/src/test/java/com/netflix/conductor/service/WorkflowBulkServiceTest.java +++ b/core/src/test/java/com/netflix/conductor/service/WorkflowBulkServiceTest.java @@ -50,8 +50,14 @@ WorkflowExecutor workflowExecutor() { } @Bean - public WorkflowBulkService workflowBulkService(WorkflowExecutor workflowExecutor) { - return new WorkflowBulkServiceImpl(workflowExecutor); + WorkflowService workflowService() { + return mock(WorkflowService.class); + } + + @Bean + public WorkflowBulkService workflowBulkService( + WorkflowExecutor workflowExecutor, WorkflowService workflowService) { + return new WorkflowBulkServiceImpl(workflowExecutor, workflowService); } } @@ -144,4 +150,28 @@ public void testTerminateNull() { throw ex; } } + + @Test(expected = ConstraintViolationException.class) + public void testDeleteWorkflowNull() { + try { + workflowBulkService.deleteWorkflow(null, false); + } catch (ConstraintViolationException ex) { + assertEquals(1, ex.getConstraintViolations().size()); + Set messages = getConstraintViolationMessages(ex.getConstraintViolations()); + assertTrue(messages.contains("WorkflowIds list cannot be null.")); + throw ex; + } + } + + @Test(expected = ConstraintViolationException.class) + public void testTerminateRemoveNull() { + try { + workflowBulkService.terminateRemove(null, null, false); + } catch (ConstraintViolationException ex) { + assertEquals(1, ex.getConstraintViolations().size()); + Set messages = getConstraintViolationMessages(ex.getConstraintViolations()); + assertTrue(messages.contains("WorkflowIds list cannot be null.")); + throw ex; + } + } } diff --git a/dependencies.gradle b/dependencies.gradle index ed1c08fa1..272458f46 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -18,7 +18,7 @@ ext { revActivation = '2.0.1' revApacheHttpComponentsClient5 = '5.2.1' revAwaitility = '3.1.6' - revAwsSdk = '1.11.86' + revAwsSdk = '1.12.635' revBval = '2.0.5' revCassandra = '3.10.2' revCassandraUnit = '3.11.2.0' @@ -32,6 +32,7 @@ ext { revGuava = '30.0-jre' revHamcrestAllMatchers = '1.8' revHealth = '1.1.4' + revPostgres = '42.7.2' revProtoBuf = '3.21.12' revJakartaAnnotation = '2.1.1' revJAXB = '4.0.1' @@ -55,13 +56,13 @@ ext { revSpectator = '0.122.0' revSpock = '2.4-M1-groovy-4.0' revSpotifyCompletableFutures = '0.3.3' - revTestContainer = '1.15.3' + revTestContainer = '1.19.3' revFasterXml = '2.15.3' revAmqpClient = '5.13.0' revKafka = '2.6.0' revMicrometer = '1.8.12' revPrometheus = '0.9.0' - revElasticSearch7 = '7.12.1' + revElasticSearch7 = '7.17.16' revCodec = '1.15' revAzureStorageBlobSdk = '12.7.0' revNatsStreaming = '2.6.5' diff --git a/dependencies.lock b/dependencies.lock deleted file mode 100644 index 545a15902..000000000 --- a/dependencies.lock +++ /dev/null @@ -1,99 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "runtimeClasspath": { - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "testCompileClasspath": { - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/docker/server/Dockerfile b/docker/server/Dockerfile index c7ffe1c0e..abf09aa8d 100644 --- a/docker/server/Dockerfile +++ b/docker/server/Dockerfile @@ -24,7 +24,7 @@ RUN ls -ltr # =========================================================================================================== # 1. Builder stage 2 # =========================================================================================================== -FROM alpine:3.18 AS ui-builder +FROM alpine:3.19 AS ui-builder LABEL maintainer="Orkes OSS " @@ -44,7 +44,7 @@ RUN echo "Done building UI" # =========================================================================================================== # 2. Bin stage # =========================================================================================================== -FROM alpine:3.18 +FROM alpine:3.19 LABEL maintainer="Orkes OSS " diff --git a/docs/devguide/how-tos/Workers/build-a-java-task-worker.md b/docs/devguide/how-tos/Workers/build-a-java-task-worker.md index 75bb44fe0..0acc25e15 100644 --- a/docs/devguide/how-tos/Workers/build-a-java-task-worker.md +++ b/docs/devguide/how-tos/Workers/build-a-java-task-worker.md @@ -10,22 +10,22 @@ Conductor provides Java client libraries, which we will use to build a simple ta ```xml - com.netflix.conductor + org.conductoross conductor-client - 3.13.2 + 3.16.0 - com.netflix.conductor + org.conductoross conductor-common - 3.13.2 + 3.16.0 ``` ### Gradle ```groovy -implementation group: 'com.netflix.conductor', name: 'conductor-client', version: '3.13.2' -implementation group: 'com.netflix.conductor', name: 'conductor-common', version: '3.13.2' +implementation group: 'org.conductoross', name: 'conductor-client', version: '3.16.0' +implementation group: 'org.conductoross', name: 'conductor-common', version: '3.16.0' ``` ## Implementing a Task Worker diff --git a/docs/devguide/running/source.md b/docs/devguide/running/source.md index 0897cc42e..0c4c4dd82 100644 --- a/docs/devguide/running/source.md +++ b/docs/devguide/running/source.md @@ -90,6 +90,6 @@ Launch UI [http://localhost:5000](http://localhost:5000) ![conductor ui](conductorUI.png) ## Summary -1. By default in-memory persistence is used, so any workflows created or excuted will be wiped out once the server is terminated. +1. By default in-memory persistence is used, so any workflows created or executed will be wiped out once the server is terminated. 2. Without indexing configured, the search functionality in UI will not work and will result an empty set. 3. See how to install Conductor using [Docker](docker.md) with persistence and indexing. diff --git a/docs/documentation/advanced/postgresql.md b/docs/documentation/advanced/postgresql.md new file mode 100644 index 000000000..3a1d2ff3b --- /dev/null +++ b/docs/documentation/advanced/postgresql.md @@ -0,0 +1,93 @@ +# PostgreSQL + +By default conductor runs with an in-memory Redis mock. However, you +can run Conductor against PostgreSQL which provides workflow management, queues, indexing, and locking. +There are a number of configuration options that enable you to use more or less of PostgreSQL functionality for your needs. +It has the benefit of requiring fewer moving parts for the infrastructure, but does not scale as well to handle high volumes of workflows. +You should benchmark Conductor with Postgres against your specific workload to be sure. + + +## Configuration + +To enable the basic use of PostgreSQL to manage workflow metadata, set the following property: + +```properties +conductor.db.type=postgres +spring.datasource.url=jdbc:postgresql://postgres:5432/conductor +spring.datasource.username=conductor +spring.datasource.password=password +# optional +conductor.postgres.schema=public +``` + +To also use PostgreSQL for queues, you can set: + +```properties +conductor.queue.type=postgres +``` + +You can also use PostgreSQL to index workflows, configure this as follows: + +```properties +conductor.indexing.enabled=true +conductor.indexing.type=postgres +conductor.elasticsearch.version=0 +``` + +To use PostgreSQL for locking, set the following configurations: +```properties +conductor.app.workflowExecutionLockEnabled=true +conductor.workflow-execution-lock.type=postgres +``` + +## Performance Optimisations + +### Poll Data caching + +By default, Conductor writes the latest poll for tasks to the database so that it can be used to determine which tasks and domains are active. This creates a lot of database traffic. +To avoid some of this traffic you can configure the PollDataDAO with a write buffer so that it only flushes every x milliseconds. If you keep this value around 5s then there should be no impact on behaviour. Conductor uses a default duration of 10s to determine whether a queue for a domain is active or not (also configurable using `conductor.app.activeWorkerLastPollTimeout`) so this will ensure that there is plenty of time for the data to get to the database to be shared by other instances: + +```properties +# Flush the data every 5 seconds +conductor.postgres.pollDataFlushInterval=5000 +``` + +You can also configure a duration when the cached poll data will be considered stale. This means that the PollDataDAO will try to use the cached data, but if it is older than the configured period, it will check against the database. There is no downside to setting this as if this Conductor node already can confirm that the queue is active then there's no need to go to the database. If the record in the cache is out of date, then we still go to the database to check. + +```properties +# Data older than 5 seconds is considered stale +conductor.postgres.pollDataCacheValidityPeriod=5000 +``` + +### Workflow and Task indexing on status change + +If you have a workflow with many tasks, Conductor will index that workflow every time a task completes which can result in a lot of extra load on the database. By setting this parameter you can configure Conductor to only index the workflow when its status changes: + +```properties +conductor.postgres.onlyIndexOnStatusChange=true +``` + +### Control over what gets indexed + +By default Conductor will index both workflows and tasks to enable searching via the UI. If you find that you don't search for tasks, but only workflows, you can use the following option to disable task indexing: + +```properties +conductor.app.taskIndexingEnabled=false +``` + +### Experimental LISTEN/NOTIFY based queues + +By default, Conductor will query the queues in the database 10 times per second for every task, which can result in a lot of traffic. +By enabling this option, Conductor makes use of [LISTEN](https://www.postgresql.org/docs/current/sql-listen.html)/[NOTIFY](https://www.postgresql.org/docs/current/sql-notify.html) to use triggers that distribute metadata about the state of the queues to all of the Conductor servers. This drastically reduces the load on the database because a single message containing the state of the queues is sent to all subscribers. +Enable it as follows: + +```properties +conductor.postgres.experimentalQueueNotify=true +``` + +You can also configure how long Conductor will wait before considering a notification stale using the following property: + +```properties +# Data older than 5 seconds is considered stale +conductor.postgres.experimentalQueueNotifyStalePeriod=5000 +``` diff --git a/docs/documentation/advanced/redis.md b/docs/documentation/advanced/redis.md index ee96c6c08..c0c329f99 100644 --- a/docs/documentation/advanced/redis.md +++ b/docs/documentation/advanced/redis.md @@ -1,9 +1,9 @@ # Redis 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`. +can change the configuration by setting the properties mentioned below. -## `conductor.db.type` +## `conductor.db.type` and `conductor.queue.type` | Value | Description | |--------------------------------|----------------------------------------------------------------------------------------| @@ -13,8 +13,6 @@ can change the configuration by setting the properties `conductor.db.type` and ` | redis_sentinel | Redis Sentinel configuration. | | redis_standalone | Redis Standalone configuration. | - - ## `conductor.redis.hosts` Expected format is `host:port:rack` separated by semicolon, e.g.: @@ -23,16 +21,32 @@ Expected format is `host:port:rack` separated by semicolon, e.g.: conductor.redis.hosts=host0:6379:us-east-1c;host1:6379:us-east-1c;host2:6379:us-east-1c ``` -### Auth Support +## `conductor.redis.database` +Redis database value other than default of 0 is supported in sentinel and standalone configurations. +Redis cluster mode only uses database 0, and the configuration is ignored. + +```properties +conductor.redis.database=1 +``` + -Password authentication is supported. The password should be set as the 4th param of the first host `host:port:rack:password`, e.g.: +## `conductor.redis.username` +[Redis ACL](https://redis.io/docs/management/security/acl/) using username and password authentication is now supported. + +The username property should be set as `conductor.redis.username`, e.g.: ```properties -conductor.redis.hosts=host0:6379:us-east-1c:my_str0ng_pazz;host1:6379:us-east-1c;host2:6379:us-east-1c +conductor.redis.username=conductor ``` +If not set, the client uses `default` as the username. + +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. +- In a cluster, all nodes use the same username and password. +- In a sentinel configuration, sentinels and redis nodes use the same database index, username, and password. diff --git a/es6-persistence/dependencies.lock b/es6-persistence/dependencies.lock deleted file mode 100644 index 0aa67059d..000000000 --- a/es6-persistence/dependencies.lock +++ /dev/null @@ -1,477 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "locked": "6.8.23" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "locked": "6.8.23" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - } - }, - "testCompileClasspath": { - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.awaitility:awaitility": { - "locked": "3.1.6" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "locked": "6.8.23" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.awaitility:awaitility": { - "locked": "3.1.6" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "locked": "6.8.23" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - } - } -} \ 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 3282c5c26..3e37adf7e 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 @@ -84,16 +84,7 @@ public Client client(ElasticSearchProperties properties) { @Bean @Conditional(IsHttpProtocol.class) - public RestClient restClient(ElasticSearchProperties properties) { - RestClientBuilder restClientBuilder = - RestClient.builder(convertToHttpHosts(properties.toURLs())); - if (properties.getRestClientConnectionRequestTimeout() > 0) { - restClientBuilder.setRequestConfigCallback( - requestConfigBuilder -> - requestConfigBuilder.setConnectionRequestTimeout( - properties.getRestClientConnectionRequestTimeout())); - } - + public RestClient restClient(RestClientBuilder restClientBuilder) { return restClientBuilder.build(); } @@ -102,6 +93,13 @@ public RestClient restClient(ElasticSearchProperties properties) { public RestClientBuilder restClientBuilder(ElasticSearchProperties properties) { RestClientBuilder builder = RestClient.builder(convertToHttpHosts(properties.toURLs())); + if (properties.getRestClientConnectionRequestTimeout() > 0) { + builder.setRequestConfigCallback( + requestConfigBuilder -> + requestConfigBuilder.setConnectionRequestTimeout( + properties.getRestClientConnectionRequestTimeout())); + } + if (properties.getUsername() != null && properties.getPassword() != null) { log.info( "Configure ElasticSearch with BASIC authentication. User:{}", diff --git a/es7-persistence/build.gradle b/es7-persistence/build.gradle index fdb652950..e4a33d343 100644 --- a/es7-persistence/build.gradle +++ b/es7-persistence/build.gradle @@ -41,7 +41,7 @@ dependencies { // 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 + archiveClassifier = null // Service files are not included by default. mergeServiceFiles { @@ -49,6 +49,4 @@ shadowJar { 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 4f4e8d446..000000000 --- a/es7-persistence/dependencies.lock +++ /dev/null @@ -1,547 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.12.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.12.1" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence" - ], - "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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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-common-persistence", - "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-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.12.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.12.1" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - } - }, - "shadow": { - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "commons-io:commons-io": { - "locked": "2.7" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.java.dev.jna:jna": { - "locked": "5.7.0" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.awaitility:awaitility": { - "locked": "3.1.6" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.12.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.12.1" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - } - }, - "testRuntime": { - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence" - ], - "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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.java.dev.jna:jna": { - "locked": "5.7.0" - }, - "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-common-persistence", - "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-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.awaitility:awaitility": { - "locked": "3.1.6" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "7.12.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "7.12.1" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "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/ElasticSearchV7Configuration.java b/es7-persistence/src/main/java/com/netflix/conductor/es7/config/ElasticSearchV7Configuration.java index 4b6e65922..f1f67cf74 100644 --- 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 @@ -46,22 +46,21 @@ 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())); - } + public RestClient restClient(RestClientBuilder restClientBuilder) { return restClientBuilder.build(); } @Bean - public RestClientBuilder restClientBuilder(ElasticSearchProperties properties) { + public RestClientBuilder elasticRestClientBuilder(ElasticSearchProperties properties) { RestClientBuilder builder = RestClient.builder(convertToHttpHosts(properties.toURLs())); + if (properties.getRestClientConnectionRequestTimeout() > 0) { + builder.setRequestConfigCallback( + requestConfigBuilder -> + requestConfigBuilder.setConnectionRequestTimeout( + properties.getRestClientConnectionRequestTimeout())); + } + if (properties.getUsername() != null && properties.getPassword() != null) { log.info( "Configure ElasticSearch with BASIC authentication. User:{}", 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 index 8af6d8135..7de1b0419 100644 --- 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 @@ -42,7 +42,6 @@ import org.elasticsearch.client.*; import org.elasticsearch.client.core.CountRequest; import org.elasticsearch.client.core.CountResponse; -import org.elasticsearch.common.xcontent.*; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; @@ -51,6 +50,7 @@ import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.FieldSortBuilder; import org.elasticsearch.search.sort.SortOrder; +import org.elasticsearch.xcontent.XContentType; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 index 6183b9182..d86f65442 100644 --- 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 @@ -47,8 +47,8 @@ public ElasticSearchProperties elasticSearchProperties() { protected static final ElasticsearchContainer container = new ElasticsearchContainer( - DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch-oss") - .withTag("7.10.2")); // this should match the client version + DockerImageName.parse("elasticsearch") + .withTag("7.17.16")); // this should match the client version @Autowired protected ObjectMapper objectMapper; diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f090a2944b7473328c07c9755baa3196..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44091 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 F{tsc4gtPzv delta 41205 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 jFA#1K+D2e>Q|zP /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -133,22 +131,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,6 +198,10 @@ if "$cygwin" || "$msys" ; then done fi + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in diff --git a/gradlew.bat b/gradlew.bat index 53a6b238d..6689b85be 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% diff --git a/grpc-client/dependencies.lock b/grpc-client/dependencies.lock deleted file mode 100644 index a0dd3f493..000000000 --- a/grpc-client/dependencies.lock +++ /dev/null @@ -1,379 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "project": true - }, - "io.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "project": true - }, - "io.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "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-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - } - }, - "testCompileClasspath": { - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "project": true - }, - "io.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "project": true - }, - "io.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "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-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.slf4j:slf4j-api": { - "locked": "2.0.9" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/grpc-server/dependencies.lock b/grpc-server/dependencies.lock deleted file mode 100644 index ae4dd2f1c..000000000 --- a/grpc-server/dependencies.lock +++ /dev/null @@ -1,518 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "project": true - }, - "io.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "locked": "1.57.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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", - "com.netflix.conductor:conductor-grpc" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "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.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "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": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.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", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "project": true - }, - "io.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "locked": "1.57.2" - }, - "io.grpc:grpc-testing": { - "locked": "1.57.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.testinfected.hamcrest-matchers:all-matchers": { - "locked": "1.8" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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", - "com.netflix.conductor:conductor-grpc" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "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.grpc:grpc-netty": { - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-testing": { - "locked": "1.57.2" - }, - "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": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "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", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.testinfected.hamcrest-matchers:all-matchers": { - "locked": "1.8" - } - } -} \ No newline at end of file diff --git a/grpc/build.gradle b/grpc/build.gradle index e7ec30c88..7993dc50e 100644 --- a/grpc/build.gradle +++ b/grpc/build.gradle @@ -87,4 +87,5 @@ sourceSets { } } +tasks.getByPath(':conductor-grpc:sourcesJar').dependsOn(':conductor-grpc:generateProto') compileJava.dependsOn(tasks.getByPath(':conductor-common:protogen')) diff --git a/grpc/dependencies.lock b/grpc/dependencies.lock deleted file mode 100644 index c36eb50e6..000000000 --- a/grpc/dependencies.lock +++ /dev/null @@ -1,499 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "locked": "1.3.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "compileProtoPath": { - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "locked": "1.3.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - } - }, - "protobufToolsLocator_grpc": { - "io.grpc:protoc-gen-grpc-java": { - "locked": "1.57.2" - } - }, - "protobufToolsLocator_protoc": { - "com.google.protobuf:protoc": { - "locked": "3.14.0" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "locked": "1.3.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - } - }, - "testCompileClasspath": { - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "locked": "1.3.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testCompileProtoPath": { - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "locked": "1.3.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "locked": "2.1.1" - }, - "javax.annotation:javax.annotation-api": { - "locked": "1.3.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/http-task/dependencies.lock b/http-task/dependencies.lock deleted file mode 100644 index 8fd71e7f0..000000000 --- a/http-task/dependencies.lock +++ /dev/null @@ -1,453 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "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.httpcomponents.client5:httpclient5": { - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.bouncycastle:bcpkix-jdk15on": { - "locked": "1.70" - }, - "org.bouncycastle:bcprov-jdk15on": { - "locked": "1.70" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.12.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.11.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": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "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.httpcomponents.client5:httpclient5": { - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.bouncycastle:bcpkix-jdk15on": { - "locked": "1.70" - }, - "org.bouncycastle:bcprov-jdk15on": { - "locked": "1.70" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.12.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProvider.java b/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProvider.java index 0efae0591..b37770f69 100644 --- a/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProvider.java +++ b/http-task/src/main/java/com/netflix/conductor/tasks/http/providers/DefaultRestTemplateProvider.java @@ -18,7 +18,6 @@ import org.apache.hc.core5.http.io.SocketConfig; import org.apache.hc.core5.util.Timeout; -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; @@ -40,7 +39,6 @@ public class DefaultRestTemplateProvider implements RestTemplateProvider { private final int defaultReadTimeout; private final int defaultConnectTimeout; - @Autowired public DefaultRestTemplateProvider( @Value("${conductor.tasks.http.readTimeout:150ms}") Duration readTimeout, @Value("${conductor.tasks.http.connectTimeout:100ms}") Duration connectTimeout) { diff --git a/java-sdk/dependencies.lock b/java-sdk/dependencies.lock deleted file mode 100644 index 0d209a90f..000000000 --- a/java-sdk/dependencies.lock +++ /dev/null @@ -1,475 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "cglib:cglib": { - "locked": "3.3.0" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.sun.jersey:jersey-client": { - "locked": "1.19.4" - }, - "javax.ws.rs:javax.ws.rs-api": { - "locked": "2.1.1" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "locked": "2.22.2" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - } - }, - "runtimeClasspath": { - "cglib:cglib": { - "locked": "3.3.0" - }, - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "project": true - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.22.2" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.0.9" - } - }, - "testCompileClasspath": { - "cglib:cglib": { - "locked": "3.3.0" - }, - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.sun.jersey:jersey-client": { - "locked": "1.19.4" - }, - "javax.ws.rs:javax.ws.rs-api": { - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "locked": "2.22.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework:spring-web": { - "locked": "6.0.12" - } - }, - "testRuntimeClasspath": { - "cglib:cglib": { - "locked": "3.3.0" - }, - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "project": true - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "0.122.0" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.7" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.bval:bval-jsr": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.0.5" - }, - "org.apache.commons:commons-lang3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common" - ], - "locked": "2.20.0" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.22.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "locked": "15.4" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.0.9" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework:spring-web": { - "locked": "6.0.12" - } - } -} \ No newline at end of file diff --git a/java-sdk/src/main/java/com/netflix/conductor/sdk/testing/LocalServerRunner.java b/java-sdk/src/main/java/com/netflix/conductor/sdk/testing/LocalServerRunner.java index 0d60c9f4d..5bf2bb5fe 100644 --- a/java-sdk/src/main/java/com/netflix/conductor/sdk/testing/LocalServerRunner.java +++ b/java-sdk/src/main/java/com/netflix/conductor/sdk/testing/LocalServerRunner.java @@ -163,7 +163,7 @@ private synchronized void installAndStartServer(String repositoryURL, int localS + serverFile; LOGGER.info("Running command {}", command); - serverProcess = Runtime.getRuntime().exec(command); + serverProcess = Runtime.getRuntime().exec(new String[] {"bash", "-l", "-c", command}); BufferedReader error = new BufferedReader(new InputStreamReader(serverProcess.getErrorStream())); BufferedReader op = diff --git a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Javascript.java b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Javascript.java index 7260a0586..d6d4af2ba 100644 --- a/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Javascript.java +++ b/java-sdk/src/main/java/com/netflix/conductor/sdk/workflow/def/tasks/Javascript.java @@ -22,6 +22,7 @@ import javax.script.ScriptEngineManager; import javax.script.ScriptException; +import org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -49,7 +50,8 @@ public class Javascript extends Task { * Javascript tasks are executed on the Conductor server without having to write worker code * *

Use {@link Javascript#validate()} method to validate the javascript to ensure the script - * is valid. + * is valid. Set environment variable CONDUCTOR_NASHORN_ES6_ENABLED=true for Nashorn ES6 support + * during validation. * * @param taskReferenceName * @param script script to execute @@ -100,7 +102,13 @@ public String getExpression() { * @return */ public Javascript validate() { - ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("Nashorn"); + ScriptEngine scriptEngine; + if ("true".equalsIgnoreCase(System.getenv("CONDUCTOR_NASHORN_ES6_ENABLED"))) { + NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + scriptEngine = factory.getScriptEngine("--language=es6"); + } else { + scriptEngine = new ScriptEngineManager().getEngineByName("Nashorn"); + } if (scriptEngine == null) { LOGGER.error("missing " + ENGINE + " engine. Ensure you are running supported JVM"); return this; @@ -128,7 +136,13 @@ public Javascript validate() { */ public Object test(Map input) { - ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("Nashorn"); + ScriptEngine scriptEngine; + if ("true".equalsIgnoreCase(System.getenv("CONDUCTOR_NASHORN_ES6_ENABLED"))) { + NashornScriptEngineFactory factory = new NashornScriptEngineFactory(); + scriptEngine = factory.getScriptEngine("--language=es6"); + } else { + scriptEngine = new ScriptEngineManager().getEngineByName("Nashorn"); + } if (scriptEngine == null) { LOGGER.error("missing " + ENGINE + " engine. Ensure you are running supported JVM"); return this; diff --git a/json-jq-task/dependencies.lock b/json-jq-task/dependencies.lock deleted file mode 100644 index 010c2e434..000000000 --- a/json-jq-task/dependencies.lock +++ /dev/null @@ -1,414 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.github.ben-manes.caffeine:caffeine": { - "locked": "3.1.8" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "net.thisptr:jackson-jq": { - "locked": "0.0.13" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.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.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - } - }, - "testCompileClasspath": { - "com.github.ben-manes.caffeine:caffeine": { - "locked": "3.1.8" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.thisptr:jackson-jq": { - "locked": "0.0.13" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.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.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/json-jq-task/src/main/java/com/netflix/conductor/tasks/json/JsonJqTransform.java b/json-jq-task/src/main/java/com/netflix/conductor/tasks/json/JsonJqTransform.java index 583b2f492..afae74b39 100644 --- a/json-jq-task/src/main/java/com/netflix/conductor/tasks/json/JsonJqTransform.java +++ b/json-jq-task/src/main/java/com/netflix/conductor/tasks/json/JsonJqTransform.java @@ -19,7 +19,6 @@ 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; @@ -51,7 +50,6 @@ public class JsonJqTransform extends WorkflowSystemTask { private final ObjectMapper objectMapper; private final LoadingCache queryCache = createQueryCache(); - @Autowired public JsonJqTransform(ObjectMapper objectMapper) { super(NAME); this.objectMapper = objectMapper; diff --git a/kafka/dependencies.lock b/kafka/dependencies.lock deleted file mode 100644 index 080a6e521..000000000 --- a/kafka/dependencies.lock +++ /dev/null @@ -1,990 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-test": { - "locked": "3.1.4" - }, - "org.springframework:spring-web": { - "locked": "6.0.12" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - } - }, - "testCompileClasspath": { - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-test-util": { - "project": true - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.kafka:kafka-clients": { - "locked": "2.6.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.12.0" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "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-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-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", - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "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", - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-es6-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-test-util" - ], - "project": true - }, - "com.netflix.conductor:conductor-test-util": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.0.20" - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-test-util" - ], - "locked": "5.17.1" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.11.0" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.57.2" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "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-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-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-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", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "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-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-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", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "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-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-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", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "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-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-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", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "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-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-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", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "3.1.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.12.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.0.9" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "org.testcontainers:elasticsearch": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-test-util" - ], - "locked": "1.18.3" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - }, - "org.testcontainers:mysql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-test-util" - ], - "locked": "1.18.3" - }, - "org.testcontainers:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-test-util" - ], - "locked": "1.18.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-test-util" - ], - "locked": "3.3.0" - } - } -} \ No newline at end of file diff --git a/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java b/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java index 013f83ed9..7eccad462 100644 --- a/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java +++ b/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaProducerManager.java @@ -24,7 +24,6 @@ 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; @@ -53,7 +52,6 @@ public class KafkaProducerManager { } }; - @Autowired public KafkaProducerManager( @Value("${conductor.tasks.kafka-publish.requestTimeout:100ms}") Duration requestTimeout, @Value("${conductor.tasks.kafka-publish.maxBlock:500ms}") Duration maxBlock, diff --git a/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java b/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java index 0a7377d8e..b446174c1 100644 --- a/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java +++ b/kafka/src/main/java/com/netflix/conductor/contribs/tasks/kafka/KafkaPublishTask.java @@ -31,7 +31,6 @@ 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; @@ -66,7 +65,6 @@ public class KafkaPublishTask extends WorkflowSystemTask { 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; diff --git a/kafka/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java b/kafka/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java index f9926e459..d68982ae1 100644 --- a/kafka/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java +++ b/kafka/src/main/java/com/netflix/conductor/core/execution/mapper/KafkaPublishTaskMapper.java @@ -20,7 +20,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.netflix.conductor.common.metadata.tasks.TaskDef; @@ -41,7 +40,6 @@ public class KafkaPublishTaskMapper implements TaskMapper { private final ParametersUtils parametersUtils; private final MetadataDAO metadataDAO; - @Autowired public KafkaPublishTaskMapper(ParametersUtils parametersUtils, MetadataDAO metadataDAO) { this.parametersUtils = parametersUtils; this.metadataDAO = metadataDAO; diff --git a/metrics/build.gradle b/metrics/build.gradle index 25d0a8d92..fdf9fe89e 100644 --- a/metrics/build.gradle +++ b/metrics/build.gradle @@ -19,7 +19,7 @@ dependencies { implementation "io.prometheus:simpleclient:${revPrometheus}" implementation "io.micrometer:micrometer-registry-prometheus:${revMicrometer}" - implementation 'io.micrometer:micrometer-registry-datadog:1.12.1' + implementation 'io.micrometer:micrometer-registry-datadog:1.13.0' testImplementation 'org.springframework.boot:spring-boot-starter-web' diff --git a/metrics/dependencies.lock b/metrics/dependencies.lock deleted file mode 100644 index 79272c513..000000000 --- a/metrics/dependencies.lock +++ /dev/null @@ -1,525 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "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" - }, - "io.micrometer:micrometer-registry-datadog": { - "locked": "1.12.1" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.8.12" - }, - "io.prometheus:simpleclient": { - "locked": "0.9.0" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.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-datadog": { - "locked": "1.12.1" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.8.12" - }, - "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": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - } - }, - "testCompileClasspath": { - "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" - }, - "io.micrometer:micrometer-registry-datadog": { - "locked": "1.12.1" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.8.12" - }, - "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" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.12.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.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.11.0" - }, - "io.micrometer:micrometer-registry-datadog": { - "locked": "1.12.1" - }, - "io.micrometer:micrometer-registry-prometheus": { - "locked": "1.8.12" - }, - "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": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.ws.rs:jsr311-api": { - "locked": "1.1.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.mock-server:mockserver-client-java": { - "locked": "5.12.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.testcontainers:mockserver": { - "locked": "1.15.3" - } - } -} \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index f94c96a8b..fa4794b0f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -101,6 +101,7 @@ nav: - documentation/advanced/azureblob-storage.md - documentation/advanced/externalpayloadstorage.md - documentation/advanced/redis.md + - documentation/advanced/postgresql.md - Client SDKs: - documentation/clientsdks/index.md - documentation/clientsdks/java-sdk.md @@ -111,7 +112,7 @@ nav: - documentation/clientsdks/js-sdk.md - Resources: - Contributing: resources/contributing.md - - Code of Conduct: resources/code-of-conduct.md + - Code of Conduct: https://orkes.io/orkes-conductor-community-code-of-conduct - Related Projects: resources/related.md - License: resources/license.md theme: diff --git a/mysql-persistence/dependencies.lock b/mysql-persistence/dependencies.lock deleted file mode 100644 index 9a4fe189f..000000000 --- a/mysql-persistence/dependencies.lock +++ /dev/null @@ -1,1229 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "mysql:mysql-connector-java": { - "locked": "8.0.33" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.flywaydb:flyway-mysql": { - "locked": "9.16.3" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence" - ], - "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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "mysql:mysql-connector-java": { - "locked": "8.0.33" - }, - "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-common-persistence", - "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-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.flywaydb:flyway-mysql": { - "locked": "9.16.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "3.1.4" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-client": { - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "locked": "8.0.33" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.flywaydb:flyway-mysql": { - "locked": "9.16.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.azure:azure-storage-blob": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-azureblob-storage" - ], - "locked": "12.7.0" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-amqp": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-azureblob-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-kafka": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-metrics": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-mysql-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-nats": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-postgres-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.conductor:conductor-workflow-event-listener": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "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-metrics" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp" - ], - "locked": "5.17.1" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-codec:commons-codec": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage" - ], - "locked": "1.15" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.57.2" - }, - "io.micrometer:micrometer-registry-datadog": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.2.3" - }, - "io.nats:jnats": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.15.6" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.16.0" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.33" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-kafka" - ], - "locked": "3.4.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "7.12.1" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "9.16.3" - }, - "org.flywaydb:flyway-mysql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "9.16.3" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "3.1.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.6.0" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.0.9" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "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": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "4.3.2" - } - } -} \ No newline at end of file diff --git a/nats-streaming/dependencies.lock b/nats-streaming/dependencies.lock deleted file mode 100644 index e0a43899f..000000000 --- a/nats-streaming/dependencies.lock +++ /dev/null @@ -1,189 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.7.16" - } - }, - "compileClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:java-nats-streaming": { - "locked": "2.2.3" - }, - "io.nats:jnats": { - "locked": "2.6.5" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.7.16" - } - }, - "runtimeClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:java-nats-streaming": { - "locked": "2.2.3" - }, - "io.nats:jnats": { - "locked": "2.6.5" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - } - }, - "testCompileClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:java-nats-streaming": { - "locked": "2.2.3" - }, - "io.nats:jnats": { - "locked": "2.6.5" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - }, - "testRuntimeClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:java-nats-streaming": { - "locked": "2.2.3" - }, - "io.nats:jnats": { - "locked": "2.6.5" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - } -} \ No newline at end of file diff --git a/nats/dependencies.lock b/nats/dependencies.lock deleted file mode 100644 index caa98cf44..000000000 --- a/nats/dependencies.lock +++ /dev/null @@ -1,177 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.7.16" - } - }, - "compileClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:jnats": { - "locked": "2.15.6" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.7.16" - } - }, - "runtimeClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:jnats": { - "locked": "2.15.6" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - } - }, - "testCompileClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:jnats": { - "locked": "2.15.6" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - }, - "testRuntimeClasspath": { - "com.google.guava:guava": { - "locked": "32.1.2-jre" - }, - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "io.nats:jnats": { - "locked": "2.15.6" - }, - "io.reactivex:rxjava": { - "locked": "1.2.2" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - } - } -} \ No newline at end of file diff --git a/postgres-external-storage/build.gradle b/postgres-external-storage/build.gradle index 9d103eca7..a429cc067 100644 --- a/postgres-external-storage/build.gradle +++ b/postgres-external-storage/build.gradle @@ -5,7 +5,7 @@ dependencies { compileOnly 'org.springframework.boot:spring-boot-starter' compileOnly 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.postgresql:postgresql' + implementation "org.postgresql:postgresql:${revPostgres}" implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.flywaydb:flyway-core' implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:${revSpringDoc}" diff --git a/postgres-external-storage/dependencies.lock b/postgres-external-storage/dependencies.lock deleted file mode 100644 index 34362330d..000000000 --- a/postgres-external-storage/dependencies.lock +++ /dev/null @@ -1,201 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "2.7.16" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "commons-codec:commons-codec": { - "locked": "1.15" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.flywaydb:flyway-core": { - "locked": "8.5.13" - }, - "org.postgresql:postgresql": { - "locked": "42.3.8" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.7.16" - } - }, - "runtimeClasspath": { - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "commons-codec:commons-codec": { - "locked": "1.15" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.flywaydb:flyway-core": { - "locked": "8.5.13" - }, - "org.postgresql:postgresql": { - "locked": "42.3.8" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.7.16" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "commons-codec:commons-codec": { - "locked": "1.15" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.flywaydb:flyway-core": { - "locked": "8.5.13" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.postgresql:postgresql": { - "locked": "42.3.8" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.7.16" - }, - "org.testcontainers:postgresql": { - "locked": "1.18.3" - } - }, - "testRuntimeClasspath": { - "com.netflix.conductor:conductor-common": { - "locked": "3.15.0" - }, - "com.netflix.conductor:conductor-core": { - "locked": "3.15.0" - }, - "commons-codec:commons-codec": { - "locked": "1.15" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.17.2" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.17.2" - }, - "org.flywaydb:flyway-core": { - "locked": "8.5.13" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.8.2" - }, - "org.postgresql:postgresql": { - "locked": "42.3.8" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "2.7.16" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "2.7.16" - }, - "org.testcontainers:postgresql": { - "locked": "1.18.3" - } - } -} \ No newline at end of file diff --git a/postgres-persistence/build.gradle b/postgres-persistence/build.gradle index acc925b51..a9f740b64 100644 --- a/postgres-persistence/build.gradle +++ b/postgres-persistence/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation "com.fasterxml.jackson.core:jackson-core" implementation "org.apache.commons:commons-lang3" - implementation "org.postgresql:postgresql:42.3.8" + implementation "org.postgresql:postgresql:${revPostgres}" implementation "org.springframework.boot:spring-boot-starter-jdbc" implementation "org.flywaydb:flyway-core" diff --git a/postgres-persistence/dependencies.lock b/postgres-persistence/dependencies.lock deleted file mode 100644 index d3f1c6c7c..000000000 --- a/postgres-persistence/dependencies.lock +++ /dev/null @@ -1,1229 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.flywaydb:flyway-core": { - "locked": "9.16.3" - }, - "org.postgresql:postgresql": { - "locked": "42.3.8" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common-persistence" - ], - "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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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-common-persistence", - "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-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.flywaydb:flyway-core": { - "locked": "9.16.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.postgresql:postgresql": { - "locked": "42.3.8" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "3.1.4" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-client": { - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.flywaydb:flyway-core": { - "locked": "9.16.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.postgresql:postgresql": { - "locked": "42.3.8" - }, - "org.springframework.boot:spring-boot-starter-jdbc": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.azure:azure-storage-blob": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-azureblob-storage" - ], - "locked": "12.7.0" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-amqp": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-azureblob-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-kafka": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-metrics": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-mysql-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-nats": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-postgres-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.conductor:conductor-workflow-event-listener": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "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-metrics" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp" - ], - "locked": "5.17.1" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-codec:commons-codec": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage" - ], - "locked": "1.15" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.57.2" - }, - "io.micrometer:micrometer-registry-datadog": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.2.3" - }, - "io.nats:jnats": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.15.6" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.16.0" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.33" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-kafka" - ], - "locked": "3.4.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "7.12.1" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "9.16.3" - }, - "org.flywaydb:flyway-mysql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "9.16.3" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "3.1.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.3.8" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.0.9" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "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": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "4.3.2" - } - } -} \ 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 index 62ed27eff..1e00cb067 100644 --- 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 @@ -13,11 +13,13 @@ package com.netflix.conductor.postgres.config; import java.sql.SQLException; +import java.util.Map; import java.util.Optional; import javax.sql.DataSource; import org.flywaydb.core.Flyway; +import org.flywaydb.core.api.configuration.FluentConfiguration; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @@ -29,10 +31,7 @@ import org.springframework.retry.policy.SimpleRetryPolicy; import org.springframework.retry.support.RetryTemplate; -import com.netflix.conductor.postgres.dao.PostgresExecutionDAO; -import com.netflix.conductor.postgres.dao.PostgresIndexDAO; -import com.netflix.conductor.postgres.dao.PostgresMetadataDAO; -import com.netflix.conductor.postgres.dao.PostgresQueueDAO; +import com.netflix.conductor.postgres.dao.*; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.*; @@ -57,8 +56,16 @@ public PostgresConfiguration(DataSource dataSource, PostgresProperties propertie @Bean(initMethod = "migrate") @PostConstruct public Flyway flywayForPrimaryDb() { - return Flyway.configure() - .locations("classpath:db/migration_postgres") + FluentConfiguration config = Flyway.configure(); + + if (properties.getExperimentalQueueNotify()) { + config.locations( + "classpath:db/migration_postgres", "classpath:db/migration_postgres_notify"); + } else { + config.locations("classpath:db/migration_postgres"); + } + + return config.configuration(Map.of("flyway.postgresql.transactional.lock", "false")) .schemas(properties.getSchema()) .dataSource(dataSource) .outOfOrder(true) @@ -83,21 +90,43 @@ public PostgresExecutionDAO postgresExecutionDAO( return new PostgresExecutionDAO(retryTemplate, objectMapper, dataSource); } + @Bean + @DependsOn({"flywayForPrimaryDb"}) + public PostgresPollDataDAO postgresPollDataDAO( + @Qualifier("postgresRetryTemplate") RetryTemplate retryTemplate, + ObjectMapper objectMapper, + PostgresProperties properties) { + return new PostgresPollDataDAO(retryTemplate, objectMapper, dataSource, properties); + } + @Bean @DependsOn({"flywayForPrimaryDb"}) public PostgresQueueDAO postgresQueueDAO( @Qualifier("postgresRetryTemplate") RetryTemplate retryTemplate, - ObjectMapper objectMapper) { - return new PostgresQueueDAO(retryTemplate, objectMapper, dataSource); + ObjectMapper objectMapper, + PostgresProperties properties) { + return new PostgresQueueDAO(retryTemplate, objectMapper, dataSource, properties); } @Bean @DependsOn({"flywayForPrimaryDb"}) @ConditionalOnProperty(name = "conductor.indexing.type", havingValue = "postgres") public PostgresIndexDAO postgresIndexDAO( + @Qualifier("postgresRetryTemplate") RetryTemplate retryTemplate, + ObjectMapper objectMapper, + PostgresProperties properties) { + return new PostgresIndexDAO(retryTemplate, objectMapper, dataSource, properties); + } + + @Bean + @DependsOn({"flywayForPrimaryDb"}) + @ConditionalOnProperty( + name = "conductor.workflow-execution-lock.type", + havingValue = "postgres") + public PostgresLockDAO postgresLockDAO( @Qualifier("postgresRetryTemplate") RetryTemplate retryTemplate, ObjectMapper objectMapper) { - return new PostgresIndexDAO(retryTemplate, objectMapper, dataSource); + return new PostgresLockDAO(retryTemplate, objectMapper, dataSource); } @Bean 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 index 5c392cb52..0ddf80098 100644 --- 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 @@ -27,8 +27,46 @@ public class PostgresProperties { private Integer deadlockRetryMax = 3; + @DurationUnit(ChronoUnit.MILLIS) + private Duration pollDataFlushInterval = Duration.ofMillis(0); + + @DurationUnit(ChronoUnit.MILLIS) + private Duration pollDataCacheValidityPeriod = Duration.ofMillis(0); + + private boolean experimentalQueueNotify = false; + + private Integer experimentalQueueNotifyStalePeriod = 5000; + + private boolean onlyIndexOnStatusChange = false; + public String schema = "public"; + public boolean allowFullTextQueries = true; + + public boolean allowJsonQueries = true; + + /** The maximum number of threads allowed in the async pool */ + private int asyncMaxPoolSize = 12; + + /** The size of the queue used for holding async indexing tasks */ + private int asyncWorkerQueueSize = 100; + + public boolean getExperimentalQueueNotify() { + return experimentalQueueNotify; + } + + public void setExperimentalQueueNotify(boolean experimentalQueueNotify) { + this.experimentalQueueNotify = experimentalQueueNotify; + } + + public Integer getExperimentalQueueNotifyStalePeriod() { + return experimentalQueueNotifyStalePeriod; + } + + public void setExperimentalQueueNotifyStalePeriod(Integer experimentalQueueNotifyStalePeriod) { + this.experimentalQueueNotifyStalePeriod = experimentalQueueNotifyStalePeriod; + } + public Duration getTaskDefCacheRefreshInterval() { return taskDefCacheRefreshInterval; } @@ -37,6 +75,14 @@ public void setTaskDefCacheRefreshInterval(Duration taskDefCacheRefreshInterval) this.taskDefCacheRefreshInterval = taskDefCacheRefreshInterval; } + public boolean getOnlyIndexOnStatusChange() { + return onlyIndexOnStatusChange; + } + + public void setOnlyIndexOnStatusChange(boolean onlyIndexOnStatusChange) { + this.onlyIndexOnStatusChange = onlyIndexOnStatusChange; + } + public Integer getDeadlockRetryMax() { return deadlockRetryMax; } @@ -52,4 +98,52 @@ public String getSchema() { public void setSchema(String schema) { this.schema = schema; } + + public boolean getAllowFullTextQueries() { + return allowFullTextQueries; + } + + public void setAllowFullTextQueries(boolean allowFullTextQueries) { + this.allowFullTextQueries = allowFullTextQueries; + } + + public boolean getAllowJsonQueries() { + return allowJsonQueries; + } + + public void setAllowJsonQueries(boolean allowJsonQueries) { + this.allowJsonQueries = allowJsonQueries; + } + + 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 getPollDataFlushInterval() { + return pollDataFlushInterval; + } + + public void setPollDataFlushInterval(Duration interval) { + this.pollDataFlushInterval = interval; + } + + public Duration getPollDataCacheValidityPeriod() { + return pollDataCacheValidityPeriod; + } + + public void setPollDataCacheValidityPeriod(Duration period) { + this.pollDataCacheValidityPeriod = period; + } } 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 index cf6afae4e..aa5233f6b 100644 --- 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 @@ -14,7 +14,6 @@ import java.sql.Connection; import java.sql.Date; -import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.Executors; @@ -27,12 +26,10 @@ import org.springframework.retry.support.RetryTemplate; 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.NonTransientException; 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; @@ -47,7 +44,7 @@ import jakarta.annotation.*; public class PostgresExecutionDAO extends PostgresBaseDAO - implements ExecutionDAO, RateLimitingDAO, PollDataDAO, ConcurrentExecutionLimitDAO { + implements ExecutionDAO, RateLimitingDAO, ConcurrentExecutionLimitDAO { private final ScheduledExecutorService scheduledExecutorService; @@ -139,9 +136,10 @@ private static String taskKey(TaskModel task) { public List createTasks(List tasks) { List created = Lists.newArrayListWithCapacity(tasks.size()); - for (TaskModel task : tasks) { - withTransaction( - connection -> { + withTransaction( + connection -> { + for (TaskModel task : tasks) { + validate(task); task.setScheduledTime(System.currentTimeMillis()); @@ -158,7 +156,7 @@ public List createTasks(List tasks) { + task.getReferenceTaskName() + ", key=" + taskKey); - return; + continue; } insertOrUpdateTaskData(connection, task); @@ -167,8 +165,8 @@ public List createTasks(List tasks) { updateTask(connection, task); created.add(task); - }); - } + } + }); return created; } @@ -558,45 +556,6 @@ public List getEventExecutions( } } - @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 NonTransientException(th.getMessage(), th); - } finally { - tx.setAutoCommit(previousAutoCommitMode); - } - } catch (SQLException ex) { - throw new NonTransientException(ex.getMessage(), ex); - } - } - private List getTasks(Connection connection, List taskIds) { if (taskIds.isEmpty()) { return Lists.newArrayList(); @@ -1027,56 +986,6 @@ private EventExecution readEventExecution( .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 ?"; diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresIndexDAO.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresIndexDAO.java index cbd36da28..6d80818d5 100644 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresIndexDAO.java +++ b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresIndexDAO.java @@ -18,6 +18,10 @@ import java.time.temporal.TemporalAccessor; import java.util.*; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import javax.sql.DataSource; @@ -30,15 +34,49 @@ import com.netflix.conductor.common.run.WorkflowSummary; import com.netflix.conductor.core.events.queue.Message; import com.netflix.conductor.dao.IndexDAO; +import com.netflix.conductor.metrics.Monitors; +import com.netflix.conductor.postgres.config.PostgresProperties; import com.netflix.conductor.postgres.util.PostgresIndexQueryBuilder; import com.fasterxml.jackson.databind.ObjectMapper; public class PostgresIndexDAO extends PostgresBaseDAO implements IndexDAO { + private final PostgresProperties properties; + private final ExecutorService executorService; + + private static final int CORE_POOL_SIZE = 6; + private static final long KEEP_ALIVE_TIME = 1L; + + private boolean onlyIndexOnStatusChange; + public PostgresIndexDAO( - RetryTemplate retryTemplate, ObjectMapper objectMapper, DataSource dataSource) { + RetryTemplate retryTemplate, + ObjectMapper objectMapper, + DataSource dataSource, + PostgresProperties properties) { super(retryTemplate, objectMapper, dataSource); + this.properties = properties; + this.onlyIndexOnStatusChange = properties.getOnlyIndexOnStatusChange(); + + int maximumPoolSize = properties.getAsyncMaxPoolSize(); + int workerQueueSize = properties.getAsyncWorkerQueueSize(); + + // 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"); + }); } @Override @@ -49,19 +87,25 @@ public void indexWorkflow(WorkflowSummary workflow) { + "DO UPDATE SET correlation_id = EXCLUDED.correlation_id, workflow_type = EXCLUDED.workflow_type, " + "start_time = EXCLUDED.start_time, status = EXCLUDED.status, json_data = EXCLUDED.json_data"; + if (onlyIndexOnStatusChange) { + INSERT_WORKFLOW_INDEX_SQL += " WHERE workflow_index.status != EXCLUDED.status"; + } + TemporalAccessor ta = DateTimeFormatter.ISO_INSTANT.parse(workflow.getStartTime()); Timestamp startTime = Timestamp.from(Instant.from(ta)); - queryWithTransaction( - INSERT_WORKFLOW_INDEX_SQL, - q -> - q.addParameter(workflow.getWorkflowId()) - .addParameter(workflow.getCorrelationId()) - .addParameter(workflow.getWorkflowType()) - .addParameter(startTime) - .addParameter(workflow.getStatus().toString()) - .addJsonParameter(workflow) - .executeUpdate()); + int rowsUpdated = + queryWithTransaction( + INSERT_WORKFLOW_INDEX_SQL, + q -> + q.addParameter(workflow.getWorkflowId()) + .addParameter(workflow.getCorrelationId()) + .addParameter(workflow.getWorkflowType()) + .addParameter(startTime) + .addParameter(workflow.getStatus().toString()) + .addJsonParameter(workflow) + .executeUpdate()); + logger.debug("Postgres index workflow rows updated: {}", rowsUpdated); } @Override @@ -69,7 +113,7 @@ public SearchResult searchWorkflowSummary( String query, String freeText, int start, int count, List sort) { PostgresIndexQueryBuilder queryBuilder = new PostgresIndexQueryBuilder( - "workflow_index", query, freeText, start, count, sort); + "workflow_index", query, freeText, start, count, sort, properties); List results = queryWithTransaction( @@ -93,31 +137,38 @@ public void indexTask(TaskSummary task) { + "DO UPDATE SET task_type = EXCLUDED.task_type, task_def_name = EXCLUDED.task_def_name, " + "status = EXCLUDED.status, update_time = EXCLUDED.update_time, json_data = EXCLUDED.json_data"; + if (onlyIndexOnStatusChange) { + INSERT_TASK_INDEX_SQL += " WHERE task_index.status != EXCLUDED.status"; + } + TemporalAccessor updateTa = DateTimeFormatter.ISO_INSTANT.parse(task.getUpdateTime()); Timestamp updateTime = Timestamp.from(Instant.from(updateTa)); TemporalAccessor startTa = DateTimeFormatter.ISO_INSTANT.parse(task.getStartTime()); Timestamp startTime = Timestamp.from(Instant.from(startTa)); - queryWithTransaction( - INSERT_TASK_INDEX_SQL, - q -> - q.addParameter(task.getTaskId()) - .addParameter(task.getTaskType()) - .addParameter(task.getTaskDefName()) - .addParameter(task.getStatus().toString()) - .addParameter(startTime) - .addParameter(updateTime) - .addParameter(task.getWorkflowType()) - .addJsonParameter(task) - .executeUpdate()); + int rowsUpdated = + queryWithTransaction( + INSERT_TASK_INDEX_SQL, + q -> + q.addParameter(task.getTaskId()) + .addParameter(task.getTaskType()) + .addParameter(task.getTaskDefName()) + .addParameter(task.getStatus().toString()) + .addParameter(startTime) + .addParameter(updateTime) + .addParameter(task.getWorkflowType()) + .addJsonParameter(task) + .executeUpdate()); + logger.debug("Postgres index task rows updated: {}", rowsUpdated); } @Override public SearchResult searchTaskSummary( String query, String freeText, int start, int count, List sort) { PostgresIndexQueryBuilder queryBuilder = - new PostgresIndexQueryBuilder("task_index", query, freeText, start, count, sort); + new PostgresIndexQueryBuilder( + "task_index", query, freeText, start, count, sort, properties); List results = queryWithTransaction( @@ -200,13 +251,14 @@ public SearchResult searchTasks( @Override public void removeWorkflow(String workflowId) { - logger.info("removeWorkflow is not supported for postgres indexing"); + String REMOVE_WORKFLOW_SQL = "DELETE FROM workflow_index WHERE workflow_id = ?"; + + queryWithTransaction(REMOVE_WORKFLOW_SQL, q -> q.addParameter(workflowId).executeUpdate()); } @Override public CompletableFuture asyncRemoveWorkflow(String workflowId) { - logger.info("asyncRemoveWorkflow is not supported for postgres indexing"); - return CompletableFuture.completedFuture(null); + return CompletableFuture.runAsync(() -> removeWorkflow(workflowId), executorService); } @Override @@ -223,13 +275,17 @@ public CompletableFuture asyncUpdateWorkflow( @Override public void removeTask(String workflowId, String taskId) { - logger.info("removeTask is not supported for postgres indexing"); + String REMOVE_TASK_SQL = + "WITH task_delete AS (DELETE FROM task_index WHERE task_id = ?)" + + "DELETE FROM task_execution_logs WHERE task_id =?"; + + queryWithTransaction( + REMOVE_TASK_SQL, q -> q.addParameter(taskId).addParameter(taskId).executeUpdate()); } @Override public CompletableFuture asyncRemoveTask(String workflowId, String taskId) { - logger.info("asyncRemoveTask is not supported for postgres indexing"); - return CompletableFuture.completedFuture(null); + return CompletableFuture.runAsync(() -> removeTask(workflowId, taskId), executorService); } @Override diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresLockDAO.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresLockDAO.java new file mode 100644 index 000000000..072ec1524 --- /dev/null +++ b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresLockDAO.java @@ -0,0 +1,82 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.concurrent.TimeUnit; + +import javax.sql.DataSource; + +import org.springframework.retry.support.RetryTemplate; + +import com.netflix.conductor.core.sync.Lock; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class PostgresLockDAO extends PostgresBaseDAO implements Lock { + private final long DAY_MS = 24 * 60 * 60 * 1000; + + public PostgresLockDAO( + RetryTemplate retryTemplate, ObjectMapper objectMapper, DataSource dataSource) { + super(retryTemplate, objectMapper, dataSource); + } + + @Override + public void acquireLock(String lockId) { + acquireLock(lockId, DAY_MS, DAY_MS, TimeUnit.MILLISECONDS); + } + + @Override + public boolean acquireLock(String lockId, long timeToTry, TimeUnit unit) { + return acquireLock(lockId, timeToTry, DAY_MS, unit); + } + + @Override + public boolean acquireLock(String lockId, long timeToTry, long leaseTime, TimeUnit unit) { + long endTime = System.currentTimeMillis() + unit.toMillis(timeToTry); + while (System.currentTimeMillis() < endTime) { + var sql = + "INSERT INTO locks(lock_id, lease_expiration) VALUES (?, now() + (?::text || ' milliseconds')::interval) ON CONFLICT (lock_id) DO UPDATE SET lease_expiration = EXCLUDED.lease_expiration WHERE locks.lease_expiration <= now()"; + + int rowsAffected = + queryWithTransaction( + sql, + q -> + q.addParameter(lockId) + .addParameter(unit.toMillis(leaseTime)) + .executeUpdate()); + + if (rowsAffected > 0) { + return true; + } + + try { + Thread.sleep(100); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + return false; + } + } + return false; + } + + @Override + public void releaseLock(String lockId) { + var sql = "DELETE FROM locks WHERE lock_id = ?"; + queryWithTransaction(sql, q -> q.addParameter(lockId).executeDelete()); + } + + @Override + public void deleteLock(String lockId) { + releaseLock(lockId); + } +} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAO.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAO.java new file mode 100644 index 000000000..d79bdc5da --- /dev/null +++ b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAO.java @@ -0,0 +1,218 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.SQLException; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import javax.sql.DataSource; + +import org.springframework.retry.support.RetryTemplate; + +import com.netflix.conductor.common.metadata.tasks.PollData; +import com.netflix.conductor.core.exception.NonTransientException; +import com.netflix.conductor.dao.PollDataDAO; +import com.netflix.conductor.postgres.config.PostgresProperties; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Preconditions; +import jakarta.annotation.PostConstruct; + +public class PostgresPollDataDAO extends PostgresBaseDAO implements PollDataDAO { + + private ConcurrentHashMap> pollDataCache = + new ConcurrentHashMap<>(); + + private long pollDataFlushInterval; + + private long cacheValidityPeriod; + + private long lastFlushTime = 0; + + private boolean useReadCache; + + public PostgresPollDataDAO( + RetryTemplate retryTemplate, + ObjectMapper objectMapper, + DataSource dataSource, + PostgresProperties properties) { + super(retryTemplate, objectMapper, dataSource); + this.pollDataFlushInterval = properties.getPollDataFlushInterval().toMillis(); + if (this.pollDataFlushInterval > 0) { + logger.info("Using Postgres pollData write cache"); + } + this.cacheValidityPeriod = properties.getPollDataCacheValidityPeriod().toMillis(); + this.useReadCache = cacheValidityPeriod > 0; + if (this.useReadCache) { + logger.info("Using Postgres pollData read cache"); + } + } + + @PostConstruct + public void schedulePollDataRefresh() { + if (pollDataFlushInterval > 0) { + Executors.newSingleThreadScheduledExecutor() + .scheduleWithFixedDelay( + this::flushData, + pollDataFlushInterval, + pollDataFlushInterval, + TimeUnit.MILLISECONDS); + } + } + + @Override + public void updateLastPollData(String taskDefName, String domain, String workerId) { + Preconditions.checkNotNull(taskDefName, "taskDefName name cannot be null"); + + String effectiveDomain = domain == null ? "DEFAULT" : domain; + PollData pollData = new PollData(taskDefName, domain, workerId, System.currentTimeMillis()); + + if (pollDataFlushInterval > 0) { + ConcurrentHashMap domainPollData = pollDataCache.get(taskDefName); + if (domainPollData == null) { + domainPollData = new ConcurrentHashMap<>(); + pollDataCache.put(taskDefName, domainPollData); + } + domainPollData.put(effectiveDomain, pollData); + } else { + withTransaction(tx -> insertOrUpdatePollData(tx, pollData, effectiveDomain)); + } + } + + @Override + public PollData getPollData(String taskDefName, String domain) { + PollData result; + + if (useReadCache) { + ConcurrentHashMap domainPollData = pollDataCache.get(taskDefName); + if (domainPollData == null) { + return null; + } + result = domainPollData.get(domain == null ? "DEFAULT" : domain); + long diffSeconds = System.currentTimeMillis() - result.getLastPollTime(); + if (diffSeconds < cacheValidityPeriod) { + return result; + } + } + + 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 NonTransientException(th.getMessage(), th); + } finally { + tx.setAutoCommit(previousAutoCommitMode); + } + } catch (SQLException ex) { + throw new NonTransientException(ex.getMessage(), ex); + } + } + + public long getLastFlushTime() { + return lastFlushTime; + } + + private void insertOrUpdatePollData(Connection connection, PollData pollData, String domain) { + try { + /* + * 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()); + } + } catch (NonTransientException e) { + if (!e.getMessage().startsWith("ERROR: lastPollTime cannot be set to a lower value")) { + throw e; + } + } + } + + 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 void flushData() { + try { + for (Map.Entry> queue : + pollDataCache.entrySet()) { + for (Map.Entry domain : queue.getValue().entrySet()) { + withTransaction( + tx -> { + insertOrUpdatePollData(tx, domain.getValue(), domain.getKey()); + }); + } + } + lastFlushTime = System.currentTimeMillis(); + } catch (Exception e) { + logger.error("Postgres pollData cache flush failed ", e); + } + } +} 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 index 693b48c06..ab38281aa 100644 --- 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 @@ -25,7 +25,9 @@ import com.netflix.conductor.core.events.queue.Message; import com.netflix.conductor.dao.QueueDAO; +import com.netflix.conductor.postgres.config.PostgresProperties; import com.netflix.conductor.postgres.util.ExecutorsUtil; +import com.netflix.conductor.postgres.util.PostgresQueueListener; import com.netflix.conductor.postgres.util.Query; import com.fasterxml.jackson.databind.ObjectMapper; @@ -40,8 +42,13 @@ public class PostgresQueueDAO extends PostgresBaseDAO implements QueueDAO { private final ScheduledExecutorService scheduledExecutorService; + private PostgresQueueListener queueListener; + public PostgresQueueDAO( - RetryTemplate retryTemplate, ObjectMapper objectMapper, DataSource dataSource) { + RetryTemplate retryTemplate, + ObjectMapper objectMapper, + DataSource dataSource, + PostgresProperties properties) { super(retryTemplate, objectMapper, dataSource); this.scheduledExecutorService = @@ -53,6 +60,10 @@ public PostgresQueueDAO( UNACK_SCHEDULE_MS, TimeUnit.MILLISECONDS); logger.debug("{} is ready to serve", PostgresQueueDAO.class.getName()); + + if (properties.getExperimentalQueueNotify()) { + this.queueListener = new PostgresQueueListener(dataSource, properties); + } } @PreDestroy @@ -169,6 +180,13 @@ public void remove(String queueName, String messageId) { @Override public int getSize(String queueName) { + if (queueListener != null) { + Optional size = queueListener.getSize(queueName); + if (size.isPresent()) { + return size.get(); + } + } + 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()); @@ -422,17 +440,25 @@ private boolean removeMessage(Connection connection, String queueName, String me q -> q.addParameter(queueName).addParameter(messageId).executeDelete()); } - private List peekMessages(Connection connection, String queueName, int count) { - if (count < 1) { - return Collections.emptyList(); + private List popMessages( + Connection connection, String queueName, int count, int timeout) { + + if (this.queueListener != null) { + if (!this.queueListener.hasMessagesReady(queueName)) { + return new ArrayList<>(); + } } - 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"; + String POP_QUERY = + "UPDATE queue_message SET popped = true WHERE message_id IN (" + + "SELECT message_id 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" + + ") RETURNING message_id, priority, payload"; return query( connection, - PEEK_MESSAGES, + POP_QUERY, p -> p.addParameter(queueName) .addParameter(count) @@ -450,34 +476,6 @@ private List peekMessages(Connection connection, String queueName, int })); } - 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)); diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilder.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilder.java index 141df11b2..9e73df686 100644 --- a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilder.java +++ b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilder.java @@ -24,6 +24,8 @@ import org.apache.commons.lang3.StringUtils; +import com.netflix.conductor.postgres.config.PostgresProperties; + public class PostgresIndexQueryBuilder { private final String table; @@ -33,6 +35,10 @@ public class PostgresIndexQueryBuilder { private final List sort; private final List conditions = new ArrayList<>(); + private boolean allowJsonQueries; + + private boolean allowFullTextQueries; + private static final String[] VALID_FIELDS = { "workflow_id", "correlation_id", @@ -44,7 +50,7 @@ public class PostgresIndexQueryBuilder { "task_def_name", "update_time", "json_data", - "to_tsvector(json_data::text)" + "jsonb_to_tsvector('english', json_data, '[\"all\"]')" }; private static final String[] VALID_SORT_ORDER = {"ASC", "DESC"}; @@ -69,6 +75,8 @@ public Condition(String query) { if (this.attribute.endsWith("_time")) { values.set(0, millisToUtc(values.get(0))); } + } else { + throw new IllegalArgumentException("Incorrectly formatted query string: " + query); } } @@ -128,12 +136,20 @@ public void setValues(List values) { } public PostgresIndexQueryBuilder( - String table, String query, String freeText, int start, int count, List sort) { + String table, + String query, + String freeText, + int start, + int count, + List sort, + PostgresProperties properties) { this.table = table; this.freeText = freeText; this.start = start; this.count = count; this.sort = sort; + this.allowFullTextQueries = properties.getAllowFullTextQueries(); + this.allowJsonQueries = properties.getAllowJsonQueries(); this.parseQuery(query); this.parseFreeText(freeText); } @@ -177,16 +193,16 @@ private void parseQuery(String query) { private void parseFreeText(String freeText) { if (!StringUtils.isEmpty(freeText) && !freeText.equals("*")) { - if (freeText.startsWith("{") && freeText.endsWith("}")) { + if (allowJsonQueries && freeText.startsWith("{") && freeText.endsWith("}")) { Condition cond = new Condition(); cond.setAttribute("json_data"); cond.setOperator("@>"); String[] values = {freeText}; cond.setValues(Arrays.asList(values)); conditions.add(cond); - } else { + } else if (allowFullTextQueries) { Condition cond = new Condition(); - cond.setAttribute("to_tsvector(json_data::text)"); + cond.setAttribute("jsonb_to_tsvector('english', json_data, '[\"all\"]')"); cond.setOperator("@@"); String[] values = {freeText}; cond.setValues(Arrays.asList(values)); diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresQueueListener.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresQueueListener.java new file mode 100644 index 000000000..4fcbe5326 --- /dev/null +++ b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/PostgresQueueListener.java @@ -0,0 +1,226 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Optional; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import javax.sql.DataSource; + +import org.postgresql.PGConnection; +import org.postgresql.PGNotification; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.netflix.conductor.core.exception.NonTransientException; +import com.netflix.conductor.postgres.config.PostgresProperties; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class PostgresQueueListener { + + private PGConnection pgconn; + + private volatile Connection conn; + + private final Lock connectionLock = new ReentrantLock(); + + private DataSource dataSource; + + private HashMap queues; + + private volatile boolean connected = false; + + private long lastNotificationTime = 0; + + private Integer stalePeriod; + + protected final Logger logger = LoggerFactory.getLogger(getClass()); + + public PostgresQueueListener(DataSource dataSource, PostgresProperties properties) { + logger.info("Using experimental PostgresQueueListener"); + this.dataSource = dataSource; + this.stalePeriod = properties.getExperimentalQueueNotifyStalePeriod(); + connect(); + } + + public boolean hasMessagesReady(String queueName) { + checkUpToDate(); + handleNotifications(); + if (notificationIsStale() || !connected) { + connect(); + return true; + } + + QueueStats queueStats = queues.get(queueName); + if (queueStats == null) { + return false; + } + + if (queueStats.getNextDelivery() > System.currentTimeMillis()) { + return false; + } + + return true; + } + + public Optional getSize(String queueName) { + checkUpToDate(); + handleNotifications(); + if (notificationIsStale() || !connected) { + connect(); + return Optional.empty(); + } + + QueueStats queueStats = queues.get(queueName); + if (queueStats == null) { + return Optional.of(0); + } + + return Optional.of(queueStats.getDepth()); + } + + private boolean notificationIsStale() { + return System.currentTimeMillis() - lastNotificationTime > this.stalePeriod; + } + + private void connect() { + // Attempt to acquire the lock without waiting. + if (!connectionLock.tryLock()) { + // If the lock is not available, return early. + return; + } + + boolean newConnectedState = false; + + try { + // Check if the connection is null or not valid. + if (conn == null || !conn.isValid(1)) { + // Close the old connection if it exists and is not valid. + if (conn != null) { + try { + conn.close(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } + + // Establish a new connection. + try { + this.conn = dataSource.getConnection(); + this.pgconn = conn.unwrap(PGConnection.class); + + boolean previousAutoCommitMode = conn.getAutoCommit(); + conn.setAutoCommit(true); + try { + conn.prepareStatement("LISTEN conductor_queue_state").execute(); + newConnectedState = true; + } catch (Throwable th) { + conn.rollback(); + logger.error(th.getMessage()); + } finally { + conn.setAutoCommit(previousAutoCommitMode); + } + requestStats(); + } catch (SQLException e) { + throw new NonTransientException(e.getMessage(), e); + } + } + } catch (Exception e) { + throw new NonTransientException(e.getMessage(), e); + } finally { + connected = newConnectedState; + // Ensure the lock is always released. + connectionLock.unlock(); + } + } + + private void requestStats() { + try { + boolean previousAutoCommitMode = conn.getAutoCommit(); + conn.setAutoCommit(true); + try { + conn.prepareStatement("SELECT queue_notify()").execute(); + connected = true; + } catch (Throwable th) { + conn.rollback(); + logger.error(th.getMessage()); + } finally { + conn.setAutoCommit(previousAutoCommitMode); + } + } catch (SQLException e) { + if (!e.getSQLState().equals("08003")) { + logger.error("Error fetching notifications {}", e.getSQLState()); + } + connect(); + } + } + + private void checkUpToDate() { + if (System.currentTimeMillis() - lastNotificationTime > this.stalePeriod * 0.75) { + requestStats(); + } + } + + private void handleNotifications() { + try { + PGNotification[] notifications = pgconn.getNotifications(); + if (notifications == null || notifications.length == 0) { + return; + } + processPayload(notifications[notifications.length - 1].getParameter()); + } catch (SQLException e) { + if (e.getSQLState() != "08003") { + logger.error("Error fetching notifications {}", e.getSQLState()); + } + connect(); + } + } + + private void processPayload(String payload) { + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode notification = objectMapper.readTree(payload); + JsonNode lastNotificationTime = notification.get("__now__"); + if (lastNotificationTime != null) { + this.lastNotificationTime = lastNotificationTime.asLong(); + } + Iterator iterator = notification.fieldNames(); + + HashMap queueStats = new HashMap<>(); + iterator.forEachRemaining( + key -> { + if (!key.equals("__now__")) { + try { + QueueStats stats = + objectMapper.treeToValue( + notification.get(key), QueueStats.class); + queueStats.put(key, stats); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + }); + this.queues = queueStats; + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueueStats.java b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueueStats.java new file mode 100644 index 000000000..6cbb9cecd --- /dev/null +++ b/postgres-persistence/src/main/java/com/netflix/conductor/postgres/util/QueueStats.java @@ -0,0 +1,39 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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; + +public class QueueStats { + private Integer depth; + + private long nextDelivery; + + public void setDepth(Integer depth) { + this.depth = depth; + } + + public Integer getDepth() { + return depth; + } + + public void setNextDelivery(long nextDelivery) { + this.nextDelivery = nextDelivery; + } + + public long getNextDelivery() { + return nextDelivery; + } + + public String toString() { + return "{nextDelivery: " + nextDelivery + " depth: " + depth + "}"; + } +} diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V10__poll_data_check.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V10__poll_data_check.sql new file mode 100644 index 000000000..8bdbebe7c --- /dev/null +++ b/postgres-persistence/src/main/resources/db/migration_postgres/V10__poll_data_check.sql @@ -0,0 +1,13 @@ +CREATE OR REPLACE FUNCTION poll_data_update_check () + RETURNS TRIGGER + AS $$ +BEGIN + IF(NEW.json_data::json ->> 'lastPollTime')::BIGINT < (OLD.json_data::json ->> 'lastPollTime')::BIGINT THEN + RAISE EXCEPTION 'lastPollTime cannot be set to a lower value'; + END IF; + RETURN NEW; +END; +$$ +LANGUAGE plpgsql; + +CREATE TRIGGER poll_data_update_check_trigger BEFORE UPDATE ON poll_data FOR EACH ROW EXECUTE FUNCTION poll_data_update_check (); \ No newline at end of file diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V11__locking.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V11__locking.sql new file mode 100644 index 000000000..f2062d9c3 --- /dev/null +++ b/postgres-persistence/src/main/resources/db/migration_postgres/V11__locking.sql @@ -0,0 +1,4 @@ +CREATE TABLE IF NOT EXISTS locks ( + lock_id VARCHAR PRIMARY KEY, + lease_expiration TIMESTAMP WITH TIME ZONE NOT NULL +); diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V12__task_index_columns.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V12__task_index_columns.sql new file mode 100644 index 000000000..62697e767 --- /dev/null +++ b/postgres-persistence/src/main/resources/db/migration_postgres/V12__task_index_columns.sql @@ -0,0 +1,5 @@ +ALTER TABLE task_index +ALTER COLUMN task_type TYPE TEXT; + +ALTER TABLE task_index +ALTER COLUMN task_def_name TYPE TEXT; diff --git a/postgres-persistence/src/main/resources/db/migration_postgres/V9__indexing_index_fix.sql b/postgres-persistence/src/main/resources/db/migration_postgres/V9__indexing_index_fix.sql new file mode 100644 index 000000000..410d01bd0 --- /dev/null +++ b/postgres-persistence/src/main/resources/db/migration_postgres/V9__indexing_index_fix.sql @@ -0,0 +1,12 @@ +-- Drop the unused text index on the json_data column +DROP INDEX CONCURRENTLY IF EXISTS workflow_index_json_data_text_idx; +-- Create a new index to enable querying the json by attribute and value +CREATE INDEX CONCURRENTLY IF NOT EXISTS workflow_index_json_data_gin_idx ON workflow_index USING GIN (json_data jsonb_path_ops); + +-- Drop the incorrectly created indices on the workflow_index that should be on the task_index table +DROP INDEX CONCURRENTLY IF EXISTS task_index_json_data_json_idx; +DROP INDEX CONCURRENTLY IF EXISTS task_index_json_data_text_idx; +-- Create the full text index on the json_data column of the task_index table +CREATE INDEX CONCURRENTLY IF NOT EXISTS task_index_json_data_fulltext_idx ON task_index USING GIN (jsonb_to_tsvector('english', json_data, '["all"]')); +-- Create a new index to enable querying the json by attribute and value +CREATE INDEX CONCURRENTLY IF NOT EXISTS task_index_json_data_gin_idx ON task_index USING GIN (json_data jsonb_path_ops); diff --git a/postgres-persistence/src/main/resources/db/migration_postgres_notify/V10.1__notify.sql b/postgres-persistence/src/main/resources/db/migration_postgres_notify/V10.1__notify.sql new file mode 100644 index 000000000..7d40d6eda --- /dev/null +++ b/postgres-persistence/src/main/resources/db/migration_postgres_notify/V10.1__notify.sql @@ -0,0 +1,59 @@ +-- This function notifies on 'conductor_queue_state' with a JSON string containing +-- queue metadata that looks like: +-- { +-- "queue_name_1": { +-- "nextDelivery": 1234567890123, +-- "depth": 10 +-- }, +-- "queue_name_2": { +-- "nextDelivery": 1234567890456, +-- "depth": 5 +-- }, +-- "__now__": 1234567890999 +-- } +-- +CREATE OR REPLACE FUNCTION queue_notify() RETURNS void +LANGUAGE SQL +AS $$ + SELECT pg_notify('conductor_queue_state', ( + SELECT + COALESCE(jsonb_object_agg(KEY, val), '{}'::jsonb) || + jsonb_build_object('__now__', (extract('epoch' from CURRENT_TIMESTAMP)*1000)::bigint) + FROM ( + SELECT + queue_name AS KEY, + jsonb_build_object( + 'nextDelivery', + (extract('epoch' from min(deliver_on))*1000)::bigint, + 'depth', + count(*) + ) AS val + FROM + queue_message + WHERE + popped = FALSE + GROUP BY + queue_name) AS sq)::text); +$$; + + +CREATE FUNCTION queue_notify_trigger() + RETURNS TRIGGER + LANGUAGE PLPGSQL +AS $$ +BEGIN + PERFORM queue_notify(); + RETURN NULL; +END; +$$; + +CREATE TRIGGER queue_update + AFTER UPDATE ON queue_message + FOR EACH ROW + WHEN (OLD.popped IS DISTINCT FROM NEW.popped) + EXECUTE FUNCTION queue_notify_trigger(); + +CREATE TRIGGER queue_insert_delete + AFTER INSERT OR DELETE ON queue_message + FOR EACH ROW + EXECUTE FUNCTION queue_notify_trigger(); diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOStatusChangeOnlyTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOStatusChangeOnlyTest.java new file mode 100644 index 000000000..80811e80e --- /dev/null +++ b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOStatusChangeOnlyTest.java @@ -0,0 +1,180 @@ +/* + * Copyright 2023 Conductor Authors. + *

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

+ * 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.SQLException; +import java.util.*; + +import javax.sql.DataSource; + +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.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.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.netflix.conductor.common.config.TestObjectMapperConfiguration; +import com.netflix.conductor.common.metadata.tasks.Task; +import com.netflix.conductor.common.run.TaskSummary; +import com.netflix.conductor.common.run.Workflow; +import com.netflix.conductor.common.run.WorkflowSummary; +import com.netflix.conductor.postgres.config.PostgresConfiguration; +import com.netflix.conductor.postgres.util.Query; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import static org.junit.Assert.assertEquals; + +@ContextConfiguration( + classes = { + TestObjectMapperConfiguration.class, + PostgresConfiguration.class, + FlywayAutoConfiguration.class + }) +@RunWith(SpringRunner.class) +@TestPropertySource( + properties = { + "conductor.app.asyncIndexingEnabled=false", + "conductor.elasticsearch.version=0", + "conductor.indexing.type=postgres", + "conductor.postgres.onlyIndexOnStatusChange=true", + "spring.flyway.clean-disabled=false" + }) +@SpringBootTest +public class PostgresIndexDAOStatusChangeOnlyTest { + + @Autowired private PostgresIndexDAO indexDAO; + + @Autowired private ObjectMapper objectMapper; + + @Qualifier("dataSource") + @Autowired + private DataSource dataSource; + + @Autowired Flyway flyway; + + // clean the database between tests. + @Before + public void before() { + flyway.migrate(); + } + + private WorkflowSummary getMockWorkflowSummary(String id) { + WorkflowSummary wfs = new WorkflowSummary(); + wfs.setWorkflowId(id); + wfs.setCorrelationId("correlation-id"); + wfs.setWorkflowType("workflow-type"); + wfs.setStartTime("2023-02-07T08:42:45Z"); + wfs.setStatus(Workflow.WorkflowStatus.RUNNING); + return wfs; + } + + private TaskSummary getMockTaskSummary(String taskId) { + TaskSummary ts = new TaskSummary(); + ts.setTaskId(taskId); + ts.setTaskType("task-type"); + ts.setTaskDefName("task-def-name"); + ts.setStatus(Task.Status.SCHEDULED); + ts.setStartTime("2023-02-07T09:41:45Z"); + ts.setUpdateTime("2023-02-07T09:42:45Z"); + ts.setWorkflowType("workflow-type"); + return ts; + } + + private List> queryDb(String query) throws SQLException { + try (Connection c = dataSource.getConnection()) { + try (Query q = new Query(objectMapper, c, query)) { + return q.executeAndFetchMap(); + } + } + } + + public void checkWorkflow(String workflowId, String status, String correlationId) + throws SQLException { + List> result = + queryDb( + String.format( + "SELECT * FROM workflow_index WHERE workflow_id = '%s'", + workflowId)); + assertEquals("Wrong number of rows returned", 1, result.size()); + assertEquals("Wrong status returned", status, result.get(0).get("status")); + assertEquals( + "Correlation id does not match", + correlationId, + result.get(0).get("correlation_id")); + } + + public void checkTask(String taskId, String status, String updateTime) throws SQLException { + List> result = + queryDb(String.format("SELECT * FROM task_index WHERE task_id = '%s'", taskId)); + assertEquals("Wrong number of rows returned", 1, result.size()); + assertEquals("Wrong status returned", status, result.get(0).get("status")); + assertEquals( + "Update time does not match", + updateTime, + result.get(0).get("update_time").toString()); + } + + @Test + public void testIndexWorkflowOnlyStatusChange() throws SQLException { + WorkflowSummary wfs = getMockWorkflowSummary("workflow-id"); + indexDAO.indexWorkflow(wfs); + + // retrieve the record, make sure it exists + checkWorkflow("workflow-id", "RUNNING", "correlation-id"); + + // Change the record, but not the status, and re-index + wfs.setCorrelationId("new-correlation-id"); + indexDAO.indexWorkflow(wfs); + + // retrieve the record, make sure it hasn't changed + checkWorkflow("workflow-id", "RUNNING", "correlation-id"); + + // Change the status and re-index + wfs.setStatus(Workflow.WorkflowStatus.FAILED); + indexDAO.indexWorkflow(wfs); + + // retrieve the record, make sure it has changed + checkWorkflow("workflow-id", "FAILED", "new-correlation-id"); + } + + public void testIndexTaskOnlyStatusChange() throws SQLException { + TaskSummary ts = getMockTaskSummary("task-id"); + + indexDAO.indexTask(ts); + + // retrieve the record, make sure it exists + checkTask("task-id", "SCHEDULED", "2023-02-07 09:42:45.0"); + + // Change the record, but not the status + ts.setUpdateTime("2023-02-07T10:42:45Z"); + indexDAO.indexTask(ts); + + // retrieve the record, make sure it hasn't changed + checkTask("task-id", "SCHEDULED", "2023-02-07 09:42:45.0"); + + // Change the status and re-index + ts.setStatus(Task.Status.FAILED); + indexDAO.indexTask(ts); + + // retrieve the record, make sure it has changed + checkTask("task-id", "FAILED", "2023-02-07 10:42:45.0"); + } +} diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOTest.java index c6238b6a8..3d7c80d99 100644 --- a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOTest.java +++ b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresIndexDAOTest.java @@ -403,4 +403,51 @@ public void testGetTaskExecutionLogs() throws SQLException { assertEquals(logs.get(1).getLog(), records.get(1).getLog()); assertEquals(logs.get(1).getCreatedTime(), 1675845987000L); } + + @Test + public void testRemoveWorkflow() throws SQLException { + String workflowId = UUID.randomUUID().toString(); + WorkflowSummary wfs = getMockWorkflowSummary(workflowId); + indexDAO.indexWorkflow(wfs); + + List> workflow_records = + queryDb("SELECT * FROM workflow_index WHERE workflow_id = '" + workflowId + "'"); + assertEquals("Workflow index record was not created", 1, workflow_records.size()); + + indexDAO.removeWorkflow(workflowId); + + workflow_records = + queryDb("SELECT * FROM workflow_index WHERE workflow_id = '" + workflowId + "'"); + assertEquals("Workflow index record was not deleted", 0, workflow_records.size()); + } + + @Test + public void testRemoveTask() throws SQLException { + String workflowId = UUID.randomUUID().toString(); + + String taskId = UUID.randomUUID().toString(); + TaskSummary ts = getMockTaskSummary(taskId); + indexDAO.indexTask(ts); + + List logs = new ArrayList<>(); + logs.add(getMockTaskExecutionLog(taskId, new Date(1675845986000L).getTime(), "Log 1")); + logs.add(getMockTaskExecutionLog(taskId, new Date(1675845987000L).getTime(), "Log 2")); + indexDAO.addTaskExecutionLogs(logs); + + List> task_records = + queryDb("SELECT * FROM task_index WHERE task_id = '" + taskId + "'"); + assertEquals("Task index record was not created", 1, task_records.size()); + + List> log_records = + queryDb("SELECT * FROM task_execution_logs WHERE task_id = '" + taskId + "'"); + assertEquals("Task execution logs were not created", 2, log_records.size()); + + indexDAO.removeTask(workflowId, taskId); + + task_records = queryDb("SELECT * FROM task_index WHERE task_id = '" + taskId + "'"); + assertEquals("Task index record was not deleted", 0, task_records.size()); + + log_records = queryDb("SELECT * FROM task_execution_logs WHERE task_id = '" + taskId + "'"); + assertEquals("Task execution logs were not deleted", 0, log_records.size()); + } } diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresLockDAOTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresLockDAOTest.java new file mode 100644 index 000000000..695f15f10 --- /dev/null +++ b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresLockDAOTest.java @@ -0,0 +1,159 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.PreparedStatement; +import java.sql.SQLException; +import java.time.Instant; +import java.util.UUID; +import java.util.concurrent.*; + +import javax.sql.DataSource; + +import org.flywaydb.core.Flyway; +import org.junit.Before; +import org.junit.Test; +import org.junit.jupiter.api.Assertions; +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.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.netflix.conductor.common.config.TestObjectMapperConfiguration; +import com.netflix.conductor.postgres.config.PostgresConfiguration; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@RunWith(SpringRunner.class) +@ContextConfiguration( + classes = { + TestObjectMapperConfiguration.class, + PostgresConfiguration.class, + FlywayAutoConfiguration.class + }) +@TestPropertySource( + properties = { + "conductor.workflow-execution-lock.type=postgres", + "spring.flyway.clean-disabled=false" + }) +@SpringBootTest +public class PostgresLockDAOTest { + + @Autowired private PostgresLockDAO postgresLock; + + @Autowired private DataSource dataSource; + + @Autowired private Flyway flyway; + + @Before + public void before() { + flyway.migrate(); // Clean and migrate the database before each test. + } + + @Test + public void testLockAcquisitionAndRelease() throws SQLException { + String lockId = UUID.randomUUID().toString(); + Instant beforeAcquisitionTimeUtc = Instant.now(); + long leaseTime = 2000; + + try (var connection = dataSource.getConnection()) { + assertTrue( + postgresLock.acquireLock(lockId, 500, leaseTime, TimeUnit.MILLISECONDS), + "Lock acquisition failed"); + Instant afterAcquisitionTimeUtc = Instant.now(); + + try (var ps = connection.prepareStatement("SELECT * FROM locks WHERE lock_id = ?")) { + ps.setString(1, lockId); + var rs = ps.executeQuery(); + + if (rs.next()) { + assertEquals(lockId, rs.getString("lock_id")); + long leaseExpirationTime = rs.getTimestamp("lease_expiration").getTime(); + assertTrue( + leaseExpirationTime + >= beforeAcquisitionTimeUtc + .plusMillis(leaseTime) + .toEpochMilli(), + "Lease expiration is too early"); + assertTrue( + leaseExpirationTime + <= afterAcquisitionTimeUtc.plusMillis(leaseTime).toEpochMilli(), + "Lease expiration is too late"); + } else { + Assertions.fail("Lock not found in the database"); + } + } + + postgresLock.releaseLock(lockId); + + try (PreparedStatement ps = + connection.prepareStatement("SELECT * FROM locks WHERE lock_id = ?")) { + ps.setString(1, lockId); + var rs = ps.executeQuery(); + Assertions.assertFalse(rs.next(), "Lock was not released properly"); + } + } + } + + @Test + public void testExpiredLockCanBeAcquiredAgain() throws InterruptedException { + String lockId = UUID.randomUUID().toString(); + assertTrue( + postgresLock.acquireLock(lockId, 500, 500, TimeUnit.MILLISECONDS), + "First lock acquisition failed"); + + Thread.sleep(1000); // Ensure the lock has expired. + + assertTrue( + postgresLock.acquireLock(lockId, 500, 500, TimeUnit.MILLISECONDS), + "Lock acquisition after expiration failed"); + + postgresLock.releaseLock(lockId); + } + + @Test + public void testConcurrentLockAcquisition() throws ExecutionException, InterruptedException { + ExecutorService executorService = Executors.newFixedThreadPool(2); + String lockId = UUID.randomUUID().toString(); + + Future future1 = + executorService.submit( + () -> postgresLock.acquireLock(lockId, 2000, TimeUnit.MILLISECONDS)); + Future future2 = + executorService.submit( + () -> postgresLock.acquireLock(lockId, 2000, TimeUnit.MILLISECONDS)); + + assertTrue( + future1.get() + ^ future2.get()); // One of the futures should hold the lock, the other + // should get rejected + + executorService.shutdown(); + executorService.awaitTermination(5, TimeUnit.SECONDS); + + postgresLock.releaseLock(lockId); + } + + @Test + public void testDifferentLockCanBeAcquiredConcurrently() { + String lockId1 = UUID.randomUUID().toString(); + String lockId2 = UUID.randomUUID().toString(); + + assertTrue(postgresLock.acquireLock(lockId1, 2000, 10000, TimeUnit.MILLISECONDS)); + assertTrue(postgresLock.acquireLock(lockId2, 2000, 10000, TimeUnit.MILLISECONDS)); + } +} 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 index 252b096f6..1a0df0fb8 100644 --- 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 @@ -54,7 +54,7 @@ FlywayAutoConfiguration.class }) @RunWith(SpringRunner.class) -@SpringBootTest(properties = "spring.flyway.clean-disabled=false") +@SpringBootTest(properties = "spring.flyway.clean-disabled=true") public class PostgresMetadataDAOTest { @Autowired private PostgresMetadataDAO metadataDAO; diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAOCacheTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAOCacheTest.java new file mode 100644 index 000000000..8b1c41efe --- /dev/null +++ b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAOCacheTest.java @@ -0,0 +1,155 @@ +/* + * Copyright 2023 Conductor Authors. + *

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

+ * 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.SQLException; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +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.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.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.netflix.conductor.common.config.TestObjectMapperConfiguration; +import com.netflix.conductor.common.metadata.tasks.PollData; +import com.netflix.conductor.dao.PollDataDAO; +import com.netflix.conductor.postgres.config.PostgresConfiguration; +import com.netflix.conductor.postgres.util.Query; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import static org.junit.Assert.*; + +@ContextConfiguration( + classes = { + TestObjectMapperConfiguration.class, + PostgresConfiguration.class, + FlywayAutoConfiguration.class + }) +@RunWith(SpringRunner.class) +@TestPropertySource( + properties = { + "conductor.app.asyncIndexingEnabled=false", + "conductor.elasticsearch.version=0", + "conductor.indexing.type=postgres", + "conductor.postgres.pollDataFlushInterval=200", + "conductor.postgres.pollDataCacheValidityPeriod=100", + "spring.flyway.clean-disabled=false" + }) +@SpringBootTest +public class PostgresPollDataDAOCacheTest { + + @Autowired private PollDataDAO pollDataDAO; + + @Autowired private ObjectMapper objectMapper; + + @Qualifier("dataSource") + @Autowired + private DataSource dataSource; + + @Autowired Flyway flyway; + + // clean the database between tests. + @Before + public void before() { + try (Connection conn = dataSource.getConnection()) { + conn.setAutoCommit(true); + conn.prepareStatement("truncate table poll_data").executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private List> queryDb(String query) throws SQLException { + try (Connection c = dataSource.getConnection()) { + try (Query q = new Query(objectMapper, c, query)) { + return q.executeAndFetchMap(); + } + } + } + + private void waitForCacheFlush() throws InterruptedException { + long startTime = System.currentTimeMillis(); + long lastDiff = + System.currentTimeMillis() - ((PostgresPollDataDAO) pollDataDAO).getLastFlushTime(); + + if (lastDiff == 0) { + return; + } + + while (true) { + long currentDiff = + System.currentTimeMillis() + - ((PostgresPollDataDAO) pollDataDAO).getLastFlushTime(); + + if (currentDiff < lastDiff || System.currentTimeMillis() - startTime > 1000) { + return; + } + + lastDiff = currentDiff; + + Thread.sleep(1); + } + } + + @Test + public void cacheFlushTest() + throws SQLException, JsonProcessingException, InterruptedException { + waitForCacheFlush(); + pollDataDAO.updateLastPollData("dummy-task", "dummy-domain", "dummy-worker-id"); + + List> records = + queryDb("SELECT * FROM poll_data WHERE queue_name = 'dummy-task'"); + + assertEquals("Poll data records returned", 0, records.size()); + + waitForCacheFlush(); + + records = queryDb("SELECT * FROM poll_data WHERE queue_name = 'dummy-task'"); + assertEquals("Poll data records returned", 1, records.size()); + assertEquals("Wrong domain set", "dummy-domain", records.get(0).get("domain")); + + JsonNode jsonData = objectMapper.readTree(records.get(0).get("json_data").toString()); + assertEquals( + "Poll data is incorrect", "dummy-worker-id", jsonData.get("workerId").asText()); + } + + @Test + public void getCachedPollDataByDomainTest() throws InterruptedException, SQLException { + waitForCacheFlush(); + pollDataDAO.updateLastPollData("dummy-task2", "dummy-domain2", "dummy-worker-id2"); + + PollData pollData = pollDataDAO.getPollData("dummy-task2", "dummy-domain2"); + assertNotNull("pollData is null", pollData); + assertEquals("dummy-worker-id2", pollData.getWorkerId()); + + List> records = + queryDb("SELECT * FROM poll_data WHERE queue_name = 'dummy-task2'"); + + assertEquals("Poll data records returned", 0, records.size()); + } +} diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAONoCacheTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAONoCacheTest.java new file mode 100644 index 000000000..527bf3943 --- /dev/null +++ b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/dao/PostgresPollDataDAONoCacheTest.java @@ -0,0 +1,200 @@ +/* + * Copyright 2023 Conductor Authors. + *

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

+ * 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.SQLException; +import java.util.*; +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.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.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import com.netflix.conductor.common.config.TestObjectMapperConfiguration; +import com.netflix.conductor.common.metadata.tasks.PollData; +import com.netflix.conductor.dao.PollDataDAO; +import com.netflix.conductor.postgres.config.PostgresConfiguration; +import com.netflix.conductor.postgres.util.Query; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import static org.junit.Assert.*; + +@ContextConfiguration( + classes = { + TestObjectMapperConfiguration.class, + PostgresConfiguration.class, + FlywayAutoConfiguration.class + }) +@RunWith(SpringRunner.class) +@TestPropertySource( + properties = { + "conductor.app.asyncIndexingEnabled=false", + "conductor.elasticsearch.version=0", + "conductor.indexing.type=postgres", + "conductor.postgres.pollDataFlushInterval=0", + "conductor.postgres.pollDataCacheValidityPeriod=0", + "spring.flyway.clean-disabled=false" + }) +@SpringBootTest +public class PostgresPollDataDAONoCacheTest { + + @Autowired private PollDataDAO pollDataDAO; + + @Autowired private ObjectMapper objectMapper; + + @Qualifier("dataSource") + @Autowired + private DataSource dataSource; + + @Autowired Flyway flyway; + + // clean the database between tests. + @Before + public void before() { + try (Connection conn = dataSource.getConnection()) { + conn.setAutoCommit(true); + conn.prepareStatement("truncate table poll_data").executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private List> queryDb(String query) throws SQLException { + try (Connection c = dataSource.getConnection()) { + try (Query q = new Query(objectMapper, c, query)) { + return q.executeAndFetchMap(); + } + } + } + + @Test + public void updateLastPollDataTest() throws SQLException, JsonProcessingException { + pollDataDAO.updateLastPollData("dummy-task", "dummy-domain", "dummy-worker-id"); + + List> records = + queryDb("SELECT * FROM poll_data WHERE queue_name = 'dummy-task'"); + + assertEquals("More than one poll data records returned", 1, records.size()); + assertEquals("Wrong domain set", "dummy-domain", records.get(0).get("domain")); + + JsonNode jsonData = objectMapper.readTree(records.get(0).get("json_data").toString()); + assertEquals( + "Poll data is incorrect", "dummy-worker-id", jsonData.get("workerId").asText()); + } + + @Test + public void updateLastPollDataNullDomainTest() throws SQLException, JsonProcessingException { + pollDataDAO.updateLastPollData("dummy-task", null, "dummy-worker-id"); + + List> records = + queryDb("SELECT * FROM poll_data WHERE queue_name = 'dummy-task'"); + + assertEquals("More than one poll data records returned", 1, records.size()); + assertEquals("Wrong domain set", "DEFAULT", records.get(0).get("domain")); + + JsonNode jsonData = objectMapper.readTree(records.get(0).get("json_data").toString()); + assertEquals( + "Poll data is incorrect", "dummy-worker-id", jsonData.get("workerId").asText()); + } + + @Test + public void getPollDataByDomainTest() { + pollDataDAO.updateLastPollData("dummy-task", "dummy-domain", "dummy-worker-id"); + + PollData pollData = pollDataDAO.getPollData("dummy-task", "dummy-domain"); + assertEquals("dummy-task", pollData.getQueueName()); + assertEquals("dummy-domain", pollData.getDomain()); + assertEquals("dummy-worker-id", pollData.getWorkerId()); + } + + @Test + public void getPollDataByNullDomainTest() { + pollDataDAO.updateLastPollData("dummy-task", null, "dummy-worker-id"); + + PollData pollData = pollDataDAO.getPollData("dummy-task", null); + assertEquals("dummy-task", pollData.getQueueName()); + assertNull(pollData.getDomain()); + assertEquals("dummy-worker-id", pollData.getWorkerId()); + } + + @Test + public void getPollDataByTaskTest() { + pollDataDAO.updateLastPollData("dummy-task1", "domain1", "dummy-worker-id1"); + pollDataDAO.updateLastPollData("dummy-task1", "domain2", "dummy-worker-id2"); + pollDataDAO.updateLastPollData("dummy-task1", null, "dummy-worker-id3"); + pollDataDAO.updateLastPollData("dummy-task2", "domain2", "dummy-worker-id4"); + + List pollData = pollDataDAO.getPollData("dummy-task1"); + assertEquals("Wrong number of records returned", 3, pollData.size()); + + List queueNames = + pollData.stream().map(x -> x.getQueueName()).collect(Collectors.toList()); + assertEquals(3, Collections.frequency(queueNames, "dummy-task1")); + + List domains = + pollData.stream().map(x -> x.getDomain()).collect(Collectors.toList()); + assertTrue(domains.contains("domain1")); + assertTrue(domains.contains("domain2")); + assertTrue(domains.contains(null)); + + List workerIds = + pollData.stream().map(x -> x.getWorkerId()).collect(Collectors.toList()); + assertTrue(workerIds.contains("dummy-worker-id1")); + assertTrue(workerIds.contains("dummy-worker-id2")); + assertTrue(workerIds.contains("dummy-worker-id3")); + } + + @Test + public void getAllPollDataTest() { + pollDataDAO.updateLastPollData("dummy-task1", "domain1", "dummy-worker-id1"); + pollDataDAO.updateLastPollData("dummy-task1", "domain2", "dummy-worker-id2"); + pollDataDAO.updateLastPollData("dummy-task1", null, "dummy-worker-id3"); + pollDataDAO.updateLastPollData("dummy-task2", "domain2", "dummy-worker-id4"); + + List pollData = pollDataDAO.getAllPollData(); + assertEquals("Wrong number of records returned", 4, pollData.size()); + + List queueNames = + pollData.stream().map(x -> x.getQueueName()).collect(Collectors.toList()); + assertEquals(3, Collections.frequency(queueNames, "dummy-task1")); + assertEquals(1, Collections.frequency(queueNames, "dummy-task2")); + + List domains = + pollData.stream().map(x -> x.getDomain()).collect(Collectors.toList()); + assertEquals(1, Collections.frequency(domains, "domain1")); + assertEquals(2, Collections.frequency(domains, "domain2")); + assertEquals(1, Collections.frequency(domains, null)); + + List workerIds = + pollData.stream().map(x -> x.getWorkerId()).collect(Collectors.toList()); + assertTrue(workerIds.contains("dummy-worker-id1")); + assertTrue(workerIds.contains("dummy-worker-id2")); + assertTrue(workerIds.contains("dummy-worker-id3")); + assertTrue(workerIds.contains("dummy-worker-id4")); + } +} diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilderTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilderTest.java index 2036e2f4a..dd8d3a489 100644 --- a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilderTest.java +++ b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresIndexQueryBuilderTest.java @@ -21,16 +21,22 @@ import org.mockito.InOrder; import org.mockito.Mockito; +import com.netflix.conductor.postgres.config.PostgresProperties; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Mockito.*; public class PostgresIndexQueryBuilderTest { + + private PostgresProperties properties = new PostgresProperties(); + @Test void shouldGenerateQueryForEmptyString() throws SQLException { String inputQuery = ""; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals("SELECT json_data::TEXT FROM table_name LIMIT ? OFFSET ?", generatedQuery); Query mockQuery = mock(Query.class); @@ -46,7 +52,7 @@ void shouldGenerateQueryForNull() throws SQLException { String inputQuery = null; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals("SELECT json_data::TEXT FROM table_name LIMIT ? OFFSET ?", generatedQuery); Query mockQuery = mock(Query.class); @@ -62,7 +68,7 @@ void shouldGenerateQueryForWorkflowId() throws SQLException { String inputQuery = "workflowId=\"abc123\""; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE workflow_id = ? LIMIT ? OFFSET ?", @@ -81,7 +87,7 @@ void shouldGenerateQueryForMultipleInClause() throws SQLException { String inputQuery = "status IN (COMPLETED,RUNNING)"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE status = ANY(?) LIMIT ? OFFSET ?", @@ -100,7 +106,7 @@ void shouldGenerateQueryForSingleInClause() throws SQLException { String inputQuery = "status IN (COMPLETED)"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE status = ? LIMIT ? OFFSET ?", @@ -119,7 +125,7 @@ void shouldGenerateQueryForStartTimeGt() throws SQLException { String inputQuery = "startTime>1675702498000"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE start_time > ?::TIMESTAMPTZ LIMIT ? OFFSET ?", @@ -138,7 +144,7 @@ void shouldGenerateQueryForStartTimeLt() throws SQLException { String inputQuery = "startTime<1675702498000"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE start_time < ?::TIMESTAMPTZ LIMIT ? OFFSET ?", @@ -157,7 +163,7 @@ void shouldGenerateQueryForUpdateTimeGt() throws SQLException { String inputQuery = "updateTime>1675702498000"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE update_time > ?::TIMESTAMPTZ LIMIT ? OFFSET ?", @@ -176,7 +182,7 @@ void shouldGenerateQueryForUpdateTimeLt() throws SQLException { String inputQuery = "updateTime<1675702498000"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE update_time < ?::TIMESTAMPTZ LIMIT ? OFFSET ?", @@ -196,7 +202,7 @@ void shouldGenerateQueryForMultipleConditions() throws SQLException { "workflowId=\"abc123\" AND workflowType IN (one,two) AND status IN (COMPLETED,RUNNING) AND startTime>1675701498000 AND startTime<1675702498000"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String generatedQuery = builder.getQuery(); assertEquals( "SELECT json_data::TEXT FROM table_name WHERE start_time < ?::TIMESTAMPTZ AND start_time > ?::TIMESTAMPTZ AND status = ANY(?) AND workflow_id = ? AND workflow_type = ANY(?) LIMIT ? OFFSET ?", @@ -220,7 +226,7 @@ void shouldGenerateOrderBy() throws SQLException { String[] query = {"updateTime:DESC"}; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, Arrays.asList(query)); + "table_name", inputQuery, "", 0, 15, Arrays.asList(query), properties); String expectedQuery = "SELECT json_data::TEXT FROM table_name WHERE update_time < ?::TIMESTAMPTZ ORDER BY update_time DESC LIMIT ? OFFSET ?"; assertEquals(expectedQuery, builder.getQuery()); @@ -232,7 +238,7 @@ void shouldGenerateOrderByMultiple() throws SQLException { String[] query = {"updateTime:DESC", "correlationId:ASC"}; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, Arrays.asList(query)); + "table_name", inputQuery, "", 0, 15, Arrays.asList(query), properties); String expectedQuery = "SELECT json_data::TEXT FROM table_name WHERE update_time < ?::TIMESTAMPTZ ORDER BY update_time DESC, correlation_id ASC LIMIT ? OFFSET ?"; assertEquals(expectedQuery, builder.getQuery()); @@ -243,7 +249,7 @@ void shouldNotAllowInvalidColumns() throws SQLException { String inputQuery = "sqlInjection<1675702498000"; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, new ArrayList<>()); + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); String expectedQuery = "SELECT json_data::TEXT FROM table_name LIMIT ? OFFSET ?"; assertEquals(expectedQuery, builder.getQuery()); } @@ -254,7 +260,7 @@ void shouldNotAllowInvalidSortColumn() throws SQLException { String[] query = {"sqlInjection:DESC"}; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", inputQuery, "", 0, 15, Arrays.asList(query)); + "table_name", inputQuery, "", 0, 15, Arrays.asList(query), properties); String expectedQuery = "SELECT json_data::TEXT FROM table_name WHERE update_time < ?::TIMESTAMPTZ LIMIT ? OFFSET ?"; assertEquals(expectedQuery, builder.getQuery()); @@ -266,9 +272,9 @@ void shouldAllowFullTextSearch() throws SQLException { String[] query = {"sqlInjection:DESC"}; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", "", freeText, 0, 15, Arrays.asList(query)); + "table_name", "", freeText, 0, 15, Arrays.asList(query), properties); String expectedQuery = - "SELECT json_data::TEXT FROM table_name WHERE to_tsvector(json_data::text) @@ to_tsquery(?) LIMIT ? OFFSET ?"; + "SELECT json_data::TEXT FROM table_name WHERE jsonb_to_tsvector('english', json_data, '[\"all\"]') @@ to_tsquery(?) LIMIT ? OFFSET ?"; assertEquals(expectedQuery, builder.getQuery()); } @@ -278,9 +284,24 @@ void shouldAllowJsonSearch() throws SQLException { String[] query = {"sqlInjection:DESC"}; PostgresIndexQueryBuilder builder = new PostgresIndexQueryBuilder( - "table_name", "", freeText, 0, 15, Arrays.asList(query)); + "table_name", "", freeText, 0, 15, Arrays.asList(query), properties); String expectedQuery = "SELECT json_data::TEXT FROM table_name WHERE json_data @> ?::JSONB LIMIT ? OFFSET ?"; assertEquals(expectedQuery, builder.getQuery()); } + + @Test() + void shouldThrowIllegalArgumentExceptionWhenQueryStringIsInvalid() { + String inputQuery = + "workflowType IN (one,two) AND status IN (COMPLETED,RUNNING) AND startTime>1675701498000 AND xyz"; + + try { + new PostgresIndexQueryBuilder( + "table_name", inputQuery, "", 0, 15, new ArrayList<>(), properties); + + fail("should have failed since xyz does not conform to expected format"); + } catch (IllegalArgumentException e) { + assertEquals("Incorrectly formatted query string: xyz", e.getMessage()); + } + } } diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresQueueListenerTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresQueueListenerTest.java new file mode 100644 index 000000000..700813ba5 --- /dev/null +++ b/postgres-persistence/src/test/java/com/netflix/conductor/postgres/util/PostgresQueueListenerTest.java @@ -0,0 +1,193 @@ +/* + * Copyright 2023 Conductor Authors. + *

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

+ * 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.PreparedStatement; +import java.util.*; + +import javax.sql.DataSource; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +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.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; +import org.testcontainers.shaded.com.fasterxml.jackson.databind.node.JsonNodeFactory; +import org.testcontainers.shaded.com.fasterxml.jackson.databind.node.ObjectNode; + +import com.netflix.conductor.common.config.TestObjectMapperConfiguration; +import com.netflix.conductor.postgres.config.PostgresConfiguration; +import com.netflix.conductor.postgres.config.PostgresProperties; + +import static org.junit.Assert.*; + +@ContextConfiguration( + classes = { + TestObjectMapperConfiguration.class, + PostgresConfiguration.class, + FlywayAutoConfiguration.class + }) +@RunWith(SpringRunner.class) +@TestPropertySource( + properties = { + "conductor.elasticsearch.version=0", + "spring.flyway.clean-disabled=false", + "conductor.database.type=postgres", + "conductor.postgres.experimentalQueueNotify=true", + "conductor.postgres.experimentalQueueNotifyStalePeriod=5000" + }) +@SpringBootTest +public class PostgresQueueListenerTest { + + private PostgresQueueListener listener; + + @Qualifier("dataSource") + @Autowired + private DataSource dataSource; + + @Autowired private PostgresProperties properties; + + private void clearDb() { + try (Connection conn = dataSource.getConnection()) { + conn.setAutoCommit(true); + conn.prepareStatement("truncate table queue_message").executeUpdate(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private void sendNotification(String queueName, int queueDepth, long nextDelivery) { + JsonNodeFactory factory = JsonNodeFactory.instance; + ObjectNode payload = factory.objectNode(); + ObjectNode queueNode = factory.objectNode(); + queueNode.put("depth", queueDepth); + queueNode.put("nextDelivery", nextDelivery); + payload.put("__now__", System.currentTimeMillis()); + payload.put(queueName, queueNode); + + try (Connection conn = dataSource.getConnection()) { + conn.setAutoCommit(true); + PreparedStatement stmt = + conn.prepareStatement("SELECT pg_notify('conductor_queue_state', ?)"); + stmt.setString(1, payload.toString()); + stmt.execute(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private void createQueueMessage(String queue_name, String message_id) { + try (Connection conn = dataSource.getConnection()) { + conn.setAutoCommit(true); + PreparedStatement stmt = + conn.prepareStatement( + "INSERT INTO queue_message (deliver_on, queue_name, message_id, priority, offset_time_seconds, payload) VALUES (current_timestamp, ?,?,?,?,?)"); + stmt.setString(1, queue_name); + stmt.setString(2, message_id); + stmt.setInt(3, 0); + stmt.setInt(4, 0); + stmt.setString(5, "dummy-payload"); + stmt.execute(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private void popQueueMessage(String message_id) { + try (Connection conn = dataSource.getConnection()) { + conn.setAutoCommit(true); + PreparedStatement stmt = + conn.prepareStatement( + "UPDATE queue_message SET popped = TRUE where message_id = ?"); + stmt.setString(1, message_id); + stmt.execute(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private void deleteQueueMessage(String message_id) { + try (Connection conn = dataSource.getConnection()) { + conn.setAutoCommit(true); + PreparedStatement stmt = + conn.prepareStatement("DELETE FROM queue_message where message_id = ?"); + stmt.setString(1, message_id); + stmt.execute(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + @Before + public void before() { + listener = new PostgresQueueListener(dataSource, properties); + clearDb(); + } + + @Test + public void testHasReadyMessages() { + assertFalse(listener.hasMessagesReady("dummy-task")); + sendNotification("dummy-task", 3, System.currentTimeMillis() - 1); + assertTrue(listener.hasMessagesReady("dummy-task")); + } + + @Test + public void testHasReadyMessagesInFuture() throws InterruptedException { + assertFalse(listener.hasMessagesReady("dummy-task")); + sendNotification("dummy-task", 3, System.currentTimeMillis() + 100); + assertFalse(listener.hasMessagesReady("dummy-task")); + Thread.sleep(101); + assertTrue(listener.hasMessagesReady("dummy-task")); + } + + @Test + public void testGetSize() { + assertEquals(0, listener.getSize("dummy-task").get().intValue()); + sendNotification("dummy-task", 3, System.currentTimeMillis() + 100); + assertEquals(3, listener.getSize("dummy-task").get().intValue()); + } + + @Test + public void testTrigger() throws InterruptedException { + assertEquals(0, listener.getSize("dummy-task").get().intValue()); + assertFalse(listener.hasMessagesReady("dummy-task")); + + createQueueMessage("dummy-task", "dummy-id1"); + createQueueMessage("dummy-task", "dummy-id2"); + assertEquals(2, listener.getSize("dummy-task").get().intValue()); + assertTrue(listener.hasMessagesReady("dummy-task")); + + popQueueMessage("dummy-id2"); + assertEquals(1, listener.getSize("dummy-task").get().intValue()); + assertTrue(listener.hasMessagesReady("dummy-task")); + + deleteQueueMessage("dummy-id2"); + assertEquals(1, listener.getSize("dummy-task").get().intValue()); + assertTrue(listener.hasMessagesReady("dummy-task")); + + deleteQueueMessage("dummy-id1"); + assertEquals(0, listener.getSize("dummy-task").get().intValue()); + assertFalse(listener.hasMessagesReady("test-task")); + } +} diff --git a/postgres-persistence/src/test/java/com/netflix/conductor/test/integration/grpc/postgres/PostgresGrpcEndToEndTest.java b/postgres-persistence/src/test/java/com/netflix/conductor/test/integration/grpc/postgres/PostgresGrpcEndToEndTest.java index 657b402a4..00651d34f 100644 --- a/postgres-persistence/src/test/java/com/netflix/conductor/test/integration/grpc/postgres/PostgresGrpcEndToEndTest.java +++ b/postgres-persistence/src/test/java/com/netflix/conductor/test/integration/grpc/postgres/PostgresGrpcEndToEndTest.java @@ -27,6 +27,7 @@ @TestPropertySource( properties = { "conductor.db.type=postgres", + "conductor.postgres.experimentalQueueNotify=true", "conductor.app.asyncIndexingEnabled=false", "conductor.elasticsearch.version=7", "conductor.grpc-server.port=8098", @@ -37,7 +38,8 @@ "spring.datasource.username=postgres", "spring.datasource.password=postgres", "spring.datasource.hikari.maximum-pool-size=8", - "spring.datasource.hikari.minimum-idle=300000" + "spring.datasource.hikari.minimum-idle=300000", + "spring.flyway.clean-disabled=true" }) public class PostgresGrpcEndToEndTest extends AbstractGrpcEndToEndTest { diff --git a/postgres-persistence/src/test/resources/application.properties b/postgres-persistence/src/test/resources/application.properties index 06ea54aa4..d4ac858f7 100644 --- a/postgres-persistence/src/test/resources/application.properties +++ b/postgres-persistence/src/test/resources/application.properties @@ -5,4 +5,3 @@ 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 deleted file mode 100644 index 3a3cb7f21..000000000 --- a/redis-concurrency-limit/dependencies.lock +++ /dev/null @@ -1,468 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.data:spring-data-redis": { - "locked": "2.7.16" - }, - "redis.clients:jedis": { - "locked": "3.6.0" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - }, - "redis.clients:jedis": { - "locked": "3.6.0" - } - }, - "testCompileClasspath": { - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "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.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.data:spring-data-redis": { - "locked": "2.7.16" - }, - "org.testcontainers:spock": { - "locked": "1.15.3" - }, - "org.testcontainers:testcontainers": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "locked": "3.6.0" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.data:spring-data-redis": { - "locked": "2.7.16" - }, - "org.testcontainers:spock": { - "locked": "1.15.3" - }, - "org.testcontainers:testcontainers": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "locked": "3.6.0" - } - } -} \ No newline at end of file diff --git a/redis-lock/dependencies.lock b/redis-lock/dependencies.lock deleted file mode 100644 index 82ba26589..000000000 --- a/redis-lock/dependencies.lock +++ /dev/null @@ -1,414 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-core": { - "project": true - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.redisson:redisson": { - "locked": "3.13.3" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.redisson:redisson": { - "locked": "3.13.3" - } - }, - "testCompileClasspath": { - "com.github.kstyrc:embedded-redis": { - "locked": "0.6" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.redisson:redisson": { - "locked": "3.13.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.github.kstyrc:embedded-redis": { - "locked": "0.6" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.redisson:redisson": { - "locked": "3.13.3" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/redis-persistence/dependencies.lock b/redis-persistence/dependencies.lock deleted file mode 100644 index 4da148cad..000000000 --- a/redis-persistence/dependencies.lock +++ /dev/null @@ -1,444 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "locked": "2.0.20" - }, - "com.thoughtworks.xstream:xstream": { - "locked": "1.4.20" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.rarefiedredis.redis:redis-java": { - "locked": "0.0.17" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.dyno-queues:dyno-queues-redis": { - "locked": "2.0.20" - }, - "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" - }, - "com.thoughtworks.xstream:xstream": { - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "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": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "locked": "0.0.17" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "locked": "2.0.20" - }, - "com.thoughtworks.xstream:xstream": { - "locked": "1.4.20" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.rarefiedredis.redis:redis-java": { - "locked": "0.0.17" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.dyno-queues:dyno-queues-redis": { - "locked": "2.0.20" - }, - "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" - }, - "com.thoughtworks.xstream:xstream": { - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.7" - }, - "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": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "locked": "0.0.17" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - } -} \ 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 9aa823e1c..fed5e60b9 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 @@ -55,7 +55,18 @@ protected JedisCommands createJedisCommands( .collect(Collectors.toSet()); String password = getPassword(hostSupplier.getHosts()); - if (password != null) { + if (properties.getUsername() != null && password != null) { + log.info("Connecting to Redis Cluster with user AUTH"); + return new JedisCluster( + new redis.clients.jedis.JedisCluster( + hosts, + Protocol.DEFAULT_TIMEOUT, + Protocol.DEFAULT_TIMEOUT, + DEFAULT_MAX_ATTEMPTS, + properties.getUsername(), + password, + genericObjectPoolConfig)); + } else if (password != null) { log.info("Connecting to Redis Cluster with AUTH"); return new JedisCluster( new redis.clients.jedis.JedisCluster( diff --git a/redis-persistence/src/main/java/com/netflix/conductor/redis/dao/RedisExecutionDAO.java b/redis-persistence/src/main/java/com/netflix/conductor/redis/dao/RedisExecutionDAO.java index b5fbff6a0..c66cf1fae 100644 --- a/redis-persistence/src/main/java/com/netflix/conductor/redis/dao/RedisExecutionDAO.java +++ b/redis-persistence/src/main/java/com/netflix/conductor/redis/dao/RedisExecutionDAO.java @@ -289,7 +289,7 @@ public boolean exceedsLimit(TaskModel task) { jedisProxy.zaddnx(rateLimitKey, score, taskId); recordRedisDaoRequests("checkTaskRateLimiting", task.getTaskType(), task.getWorkflowType()); - Set ids = jedisProxy.zrangeByScore(rateLimitKey, 0, score + 1, limit); + Set ids = jedisProxy.zrangeByScore(rateLimitKey, 0, score + 1, Integer.MAX_VALUE); boolean rateLimited = !ids.contains(taskId); if (rateLimited) { LOGGER.info( diff --git a/rest/dependencies.lock b/rest/dependencies.lock deleted file mode 100644 index 77e50509f..000000000 --- a/rest/dependencies.lock +++ /dev/null @@ -1,429 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.runtime:health-api": { - "locked": "1.1.4" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.runtime:health-api": { - "locked": "1.1.4" - }, - "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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.runtime:health-api": { - "locked": "1.1.4" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "3.1.8" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.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.runtime:health-api": { - "locked": "1.1.4" - }, - "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.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.springdoc:springdoc-openapi-ui": { - "locked": "1.6.15" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - } -} \ No newline at end of file diff --git a/rest/src/main/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapper.java b/rest/src/main/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapper.java index 6aa1aa904..486853b9f 100644 --- a/rest/src/main/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapper.java +++ b/rest/src/main/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapper.java @@ -22,6 +22,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.resource.NoResourceFoundException; import com.netflix.conductor.common.validation.ErrorResponse; import com.netflix.conductor.core.exception.ConflictException; @@ -49,6 +50,7 @@ public class ApplicationExceptionMapper { EXCEPTION_STATUS_MAP.put(ConflictException.class, HttpStatus.CONFLICT); EXCEPTION_STATUS_MAP.put(IllegalArgumentException.class, HttpStatus.BAD_REQUEST); EXCEPTION_STATUS_MAP.put(InvalidFormatException.class, HttpStatus.INTERNAL_SERVER_ERROR); + EXCEPTION_STATUS_MAP.put(NoResourceFoundException.class, HttpStatus.NOT_FOUND); } @ExceptionHandler(Throwable.class) diff --git a/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowBulkResource.java b/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowBulkResource.java index 6c5d99ff1..9005b9343 100644 --- a/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowBulkResource.java +++ b/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowBulkResource.java @@ -14,6 +14,7 @@ import java.util.List; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -111,4 +112,33 @@ public BulkResponse terminate( @RequestParam(value = "reason", required = false) String reason) { return workflowBulkService.terminate(workflowIds, reason); } + + /** + * Delete the list of workflows. + * + * @param workflowIds - list of workflow Ids to be deleted + * @return bulk reponse object containing a list of successfully deleted workflows + */ + @DeleteMapping("/remove") + public BulkResponse deleteWorkflow( + @RequestBody List workflowIds, + @RequestParam(value = "archiveWorkflow", defaultValue = "true", required = false) + boolean archiveWorkflow) { + return workflowBulkService.deleteWorkflow(workflowIds, archiveWorkflow); + } + + /** + * Terminate then delete the list of workflows. + * + * @param workflowIds - list of workflow Ids to be deleted + * @return bulk response object containing a list of successfully deleted workflows + */ + @DeleteMapping("/terminate-remove") + public BulkResponse terminateRemove( + @RequestBody List workflowIds, + @RequestParam(value = "archiveWorkflow", defaultValue = "true", required = false) + boolean archiveWorkflow, + @RequestParam(value = "reason", required = false) String reason) { + return workflowBulkService.terminateRemove(workflowIds, reason, archiveWorkflow); + } } diff --git a/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowResource.java b/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowResource.java index 7200ab756..6c4353490 100644 --- a/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowResource.java +++ b/rest/src/main/java/com/netflix/conductor/rest/controllers/WorkflowResource.java @@ -207,6 +207,16 @@ public void terminate( workflowService.terminateWorkflow(workflowId, reason); } + @DeleteMapping("/{workflowId}/terminate-remove") + @Operation(summary = "Terminate workflow execution and remove the workflow from the system") + public void terminateRemove( + @PathVariable("workflowId") String workflowId, + @RequestParam(value = "reason", required = false) String reason, + @RequestParam(value = "archiveWorkflow", defaultValue = "true", required = false) + boolean archiveWorkflow) { + workflowService.terminateRemove(workflowId, reason, archiveWorkflow); + } + @Operation( summary = "Search for workflows based on payload and other parameters", description = diff --git a/rest/src/test/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapperTest.java b/rest/src/test/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapperTest.java new file mode 100644 index 000000000..c800d5b3f --- /dev/null +++ b/rest/src/test/java/com/netflix/conductor/rest/controllers/ApplicationExceptionMapperTest.java @@ -0,0 +1,90 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.rest.controllers; + +import java.util.Collections; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; + +import com.netflix.conductor.model.TaskModel; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + +public class ApplicationExceptionMapperTest { + + private QueueAdminResource queueAdminResource; + + private MockMvc mockMvc; + + private static MockedStatic mockLoggerFactory; + private static final Logger logger = mock(Logger.class); + + @Before + public void before() { + mockLoggerFactory = Mockito.mockStatic(LoggerFactory.class); + when(LoggerFactory.getLogger(ApplicationExceptionMapper.class)).thenReturn(logger); + + this.queueAdminResource = mock(QueueAdminResource.class); + this.mockMvc = + MockMvcBuilders.standaloneSetup(this.queueAdminResource) + .setControllerAdvice(new ApplicationExceptionMapper()) + .build(); + } + + @After + public void after() { + mockLoggerFactory.close(); + } + + @Test + public void testException() throws Exception { + var exception = new Exception(); + // pick a method that raises a generic exception + doThrow(exception).when(this.queueAdminResource).update(any(), any(), any(), any()); + + // verify we do send an error response + this.mockMvc + .perform( + MockMvcRequestBuilders.post( + "/api/queue/update/workflowId/taskRefName/{status}", + TaskModel.Status.SKIPPED) + .contentType(MediaType.APPLICATION_JSON) + .content( + new ObjectMapper() + .writeValueAsString(Collections.emptyMap()))) + .andDo(print()) + .andExpect(status().is5xxServerError()); + // verify the error was logged + verify(logger) + .error( + "Error {} url: '{}'", + "Exception", + "/api/queue/update/workflowId/taskRefName/SKIPPED", + exception); + verifyNoMoreInteractions(logger); + } +} diff --git a/rest/src/test/java/com/netflix/conductor/rest/controllers/WorkflowResourceTest.java b/rest/src/test/java/com/netflix/conductor/rest/controllers/WorkflowResourceTest.java index 8c10bc346..d3ab4276b 100644 --- a/rest/src/test/java/com/netflix/conductor/rest/controllers/WorkflowResourceTest.java +++ b/rest/src/test/java/com/netflix/conductor/rest/controllers/WorkflowResourceTest.java @@ -210,6 +210,13 @@ public void testTerminate() { verify(mockWorkflowService, times(1)).terminateWorkflow(anyString(), anyString()); } + @Test + public void testTerminateRemove() { + workflowResource.terminateRemove("w123", "test", false); + verify(mockWorkflowService, times(1)) + .terminateRemove(anyString(), anyString(), anyBoolean()); + } + @Test public void testSearch() { workflowResource.search(0, 100, "asc", "*", "*"); diff --git a/server/build.gradle b/server/build.gradle index dc9dd8303..09c0ce0c2 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -65,9 +65,12 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-log4j2' implementation 'org.apache.logging.log4j:log4j-web' implementation "redis.clients:jedis:${revJedis}" + implementation "org.postgresql:postgresql:${revPostgres}" implementation 'org.springframework.boot:spring-boot-starter-actuator' - implementation "io.orkes.queues:orkes-conductor-queues:${revOrkesQueues}" + implementation ("io.orkes.queues:orkes-conductor-queues:${revOrkesQueues}") { + exclude group: 'com.netflix.conductor', module: 'conductor-core' + } implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:${revSpringDoc}" diff --git a/server/dependencies.lock b/server/dependencies.lock deleted file mode 100644 index 8d28e79b1..000000000 --- a/server/dependencies.lock +++ /dev/null @@ -1,2393 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-amqp": { - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "project": true - }, - "com.netflix.conductor:conductor-azureblob-storage": { - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "project": true - }, - "com.netflix.conductor:conductor-kafka": { - "project": true - }, - "com.netflix.conductor:conductor-metrics": { - "project": true - }, - "com.netflix.conductor:conductor-mysql-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-nats": { - "project": true - }, - "com.netflix.conductor:conductor-nats-streaming": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-workflow-event-listener": { - "project": true - }, - "io.orkes.queues:orkes-conductor-queues": { - "locked": "1.0.7" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "productionRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.azure:azure-storage-blob": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-azureblob-storage" - ], - "locked": "12.7.0" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "32.0.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-amqp": { - "project": true - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "project": true - }, - "com.netflix.conductor:conductor-azureblob-storage": { - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "project": true - }, - "com.netflix.conductor:conductor-kafka": { - "project": true - }, - "com.netflix.conductor:conductor-metrics": { - "project": true - }, - "com.netflix.conductor:conductor-mysql-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-nats": { - "project": true - }, - "com.netflix.conductor:conductor-nats-streaming": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-workflow-event-listener": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp" - ], - "locked": "5.17.1" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-codec:commons-codec": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage" - ], - "locked": "1.15" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.micrometer:micrometer-registry-datadog": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.2.3" - }, - "io.nats:jnats": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.15.6" - }, - "io.orkes.queues:orkes-conductor-queues": { - "locked": "1.0.7" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.16.0" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.1.1" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.33" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-kafka" - ], - "locked": "3.4.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "7.12.1" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "9.16.3" - }, - "org.flywaydb:flyway-mysql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "9.16.3" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "locked": "4.0.1" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.6.0" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "3.1.4" - }, - "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": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "3.3.0" - } - }, - "runtimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.azure:azure-storage-blob": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-azureblob-storage" - ], - "locked": "12.7.0" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "32.0.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-amqp": { - "project": true - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "project": true - }, - "com.netflix.conductor:conductor-azureblob-storage": { - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "project": true - }, - "com.netflix.conductor:conductor-kafka": { - "project": true - }, - "com.netflix.conductor:conductor-metrics": { - "project": true - }, - "com.netflix.conductor:conductor-mysql-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-nats": { - "project": true - }, - "com.netflix.conductor:conductor-nats-streaming": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-workflow-event-listener": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp" - ], - "locked": "5.17.1" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-codec:commons-codec": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage" - ], - "locked": "1.15" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.micrometer:micrometer-registry-datadog": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.2.3" - }, - "io.nats:jnats": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.15.6" - }, - "io.orkes.queues:orkes-conductor-queues": { - "locked": "1.0.7" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.16.0" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.1.1" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.33" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-kafka" - ], - "locked": "3.4.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "7.12.1" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "9.16.3" - }, - "org.flywaydb:flyway-mysql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "9.16.3" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "locked": "4.0.1" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.6.0" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "3.1.4" - }, - "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": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "3.3.0" - } - }, - "testCompileClasspath": { - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-amqp": { - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "project": true - }, - "com.netflix.conductor:conductor-azureblob-storage": { - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "project": true - }, - "com.netflix.conductor:conductor-kafka": { - "project": true - }, - "com.netflix.conductor:conductor-metrics": { - "project": true - }, - "com.netflix.conductor:conductor-mysql-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-nats": { - "project": true - }, - "com.netflix.conductor:conductor-nats-streaming": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-workflow-event-listener": { - "project": true - }, - "io.grpc:grpc-protobuf": { - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "locked": "1.57.2" - }, - "io.grpc:grpc-testing": { - "locked": "1.57.2" - }, - "io.orkes.queues:orkes-conductor-queues": { - "locked": "1.0.7" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.azure:azure-storage-blob": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-azureblob-storage" - ], - "locked": "12.7.0" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "32.0.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-amqp": { - "project": true - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "project": true - }, - "com.netflix.conductor:conductor-azureblob-storage": { - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-common-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "project": true - }, - "com.netflix.conductor:conductor-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-es7-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "project": true - }, - "com.netflix.conductor:conductor-kafka": { - "project": true - }, - "com.netflix.conductor:conductor-metrics": { - "project": true - }, - "com.netflix.conductor:conductor-mysql-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-nats": { - "project": true - }, - "com.netflix.conductor:conductor-nats-streaming": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-external-storage": { - "project": true - }, - "com.netflix.conductor:conductor-postgres-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-workflow-event-listener": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-metrics3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.netflix.spectator:spectator-reg-micrometer": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp" - ], - "locked": "5.17.1" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-codec:commons-codec": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage" - ], - "locked": "1.15" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-testing": { - "locked": "1.57.2" - }, - "io.micrometer:micrometer-registry-datadog": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.micrometer:micrometer-registry-prometheus": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.11.4" - }, - "io.nats:java-nats-streaming": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.2.3" - }, - "io.nats:jnats": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "2.15.6" - }, - "io.orkes.queues:orkes-conductor-queues": { - "locked": "1.0.7" - }, - "io.prometheus:simpleclient": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-metrics" - ], - "locked": "0.16.0" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics" - ], - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "mysql:mysql-connector-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "8.0.33" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-amqp", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-persistence", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.kafka:kafka-clients": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-kafka" - ], - "locked": "3.4.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-amqp", - "com.netflix.conductor:conductor-annotations", - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-azureblob-storage", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-common-persistence", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es7-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-http-task", - "com.netflix.conductor:conductor-json-jq-task", - "com.netflix.conductor:conductor-kafka", - "com.netflix.conductor:conductor-metrics", - "com.netflix.conductor:conductor-mysql-persistence", - "com.netflix.conductor:conductor-nats", - "com.netflix.conductor:conductor-nats-streaming", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence", - "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-workflow-event-listener" - ], - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es7-persistence" - ], - "locked": "7.12.1" - }, - "org.flywaydb:flyway-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "9.16.3" - }, - "org.flywaydb:flyway-mysql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-mysql-persistence" - ], - "locked": "9.16.3" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "locked": "4.0.1" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.postgresql:postgresql": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-postgres-persistence" - ], - "locked": "42.6.0" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-postgres-external-storage", - "com.netflix.conductor:conductor-rest" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "locked": "3.1.4" - }, - "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": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-workflow-event-listener" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "3.3.0" - } - } -} \ No newline at end of file diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 5c7903190..4fcb33594 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -120,8 +120,10 @@ conductor.workflow-execution-lock.type=noop_lock # conductor.app.summary-input-output-json-serialization.enabled=true # Additional modules for metrics collection exposed to Prometheus (optional) - conductor.metrics-prometheus.enabled=true -# management.endpoints.web.exposure.include=prometheus +conductor.metrics-prometheus.enabled=true +management.endpoints.web.exposure.include=health,info,prometheus +management.endpoint.health.show-details=always +management.metrics.tags.application=${spring.application.name} # Additional modules for metrics collection exposed to Datadog (optional) management.datadog.metrics.export.enabled=false @@ -129,6 +131,22 @@ management.datadog.metrics.export.enabled=false # management.datadog.metrics.export.uri=dd instance URL # management.datadog.metrics.export.step=10s - - -management.endpoints.web.exposure.include=prometheus +# To enable webhook module for TaskStatus and WorkflowStatus notifications +#conductor.workflow-status-listener.type=workflow_publisher +#conductor.task-status-listener.type=task_publisher + +# Webhook Push notification properties (Use enums in TaskModel.Status) +#conductor.status-notifier.notification.url= +#conductor.status-notifier.notification.endpointWorkflow= +#conductor.status-notifier.notification.endpointTask= +#conductor.status-notifier.notification.subscribedTaskStatuses=SCHEDULED + +#conductor.status-notifier.notification.headerPrefer= +#conductor.status-notifier.notification.headerPreferValue= +#conductor.status-notifier.notification.requestTimeoutMsConnect=100 +#conductor.status-notifier.notification.requestTimeoutMsRead=300 +#conductor.status-notifier.notification.requestTimeoutMsConnMgr=300 +#conductor.status-notifier.notification.requestRetryCount=3 +#conductor.status-notifier.notification.requestRetryIntervalMs=50 +#conductor.status-notifier.notification.connectionPoolMaxRequest=3 +#conductor.status-notifier.notification.connectionPoolMaxRequestPerRoute=3 diff --git a/settings.gradle b/settings.gradle index 5c39b77fe..605765ede 100644 --- a/settings.gradle +++ b/settings.gradle @@ -62,6 +62,7 @@ include 'java-sdk' // community modules include 'workflow-event-listener' +include 'task-status-listener' include 'test-util' include 'kafka' include 'common-persistence' diff --git a/springboot-bom-overrides.gradle b/springboot-bom-overrides.gradle index 8d726a6d9..aa5bd41ad 100644 --- a/springboot-bom-overrides.gradle +++ b/springboot-bom-overrides.gradle @@ -15,7 +15,7 @@ // Dependency version override properties can be found at https://docs.spring.io/spring-boot/docs/3.1.4/reference/htmlsingle/#appendix.dependency-versions.properties // Conductor's default is ES6, but SB brings in ES7 -ext['elasticsearch.version'] = revElasticSearch6 +ext['elasticsearch.version'] = revElasticSearch7 // SB brings groovy 3.0.x which is not compatible with Spock ext['groovy.version'] = revGroovy diff --git a/task-status-listener/build.gradle b/task-status-listener/build.gradle new file mode 100644 index 000000000..871c2264e --- /dev/null +++ b/task-status-listener/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'groovy' +} +dependencies { + + implementation project(':conductor-common') + implementation project(':conductor-core') + implementation project(':conductor-redis-persistence') + implementation project(':conductor-annotations') + + implementation group: 'javax.inject', name: 'javax.inject', version: '1' + implementation "org.apache.commons:commons-lang3:" + implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.14' + + compileOnly 'org.springframework.boot:spring-boot-starter' + compileOnly 'org.springframework.boot:spring-boot-starter-web' + + implementation "org.springframework.boot:spring-boot-starter-log4j2" + testImplementation project(':conductor-test-util').sourceSets.test.output + + //In memory + implementation "org.rarefiedredis.redis:redis-java:${revRarefiedRedis}" + +} \ No newline at end of file diff --git a/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/RestClientManager.java b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/RestClientManager.java new file mode 100644 index 000000000..801417d7b --- /dev/null +++ b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/RestClientManager.java @@ -0,0 +1,254 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.io.IOException; +import java.io.InterruptedIOException; +import java.net.SocketException; +import java.util.HashMap; +import java.util.Map; + +import javax.net.ssl.SSLException; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpRequestRetryHandler; +import org.apache.http.client.ServiceUnavailableRetryStrategy; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.protocol.HttpContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class RestClientManager { + private static final Logger logger = LoggerFactory.getLogger(RestClientManager.class); + private StatusNotifierNotificationProperties config; + private CloseableHttpClient client; + private String notifType; + private String notifId; + + public enum NotificationType { + TASK, + WORKFLOW + }; + + public RestClientManager(StatusNotifierNotificationProperties config) { + logger.info("created RestClientManager" + System.currentTimeMillis()); + this.config = config; + this.client = prepareClient(); + } + + private PoolingHttpClientConnectionManager prepareConnManager() { + PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(); + connManager.setMaxTotal(config.getConnectionPoolMaxRequest()); + connManager.setDefaultMaxPerRoute(config.getConnectionPoolMaxRequestPerRoute()); + return connManager; + } + + private RequestConfig prepareRequestConfig() { + return RequestConfig.custom() + // The time to establish the connection with the remote host + // [http.connection.timeout]. + // Responsible for java.net.SocketTimeoutException: connect timed out. + .setConnectTimeout(config.getRequestTimeOutMsConnect()) + + // The time waiting for data after the connection was established + // [http.socket.timeout]. The maximum time + // of inactivity between two data packets. Responsible for + // java.net.SocketTimeoutException: Read timed out. + .setSocketTimeout(config.getRequestTimeoutMsread()) + + // The time to wait for a connection from the connection manager/pool + // [http.connection-manager.timeout]. + // Responsible for org.apache.http.conn.ConnectionPoolTimeoutException. + .setConnectionRequestTimeout(config.getRequestTimeoutMsConnMgr()) + .build(); + } + + /** + * Custom HttpRequestRetryHandler implementation to customize retries for different IOException + */ + private class CustomHttpRequestRetryHandler implements HttpRequestRetryHandler { + int maxRetriesCount = config.getRequestRetryCount(); + int retryIntervalInMilisec = config.getRequestRetryCountIntervalMs(); + + /** + * Triggered only in case of exception + * + * @param exception The cause + * @param executionCount Retry attempt sequence number + * @param context {@link HttpContext} + * @return True if we want to retry request, false otherwise + */ + public boolean retryRequest( + IOException exception, int executionCount, HttpContext context) { + Throwable rootCause = ExceptionUtils.getRootCause(exception); + logger.warn( + "Retrying {} notification. Id: {}, root cause: {}", + notifType, + notifId, + rootCause.toString()); + + if (executionCount >= maxRetriesCount) { + logger.warn( + "{} notification failed after {} retries. Id: {} .", + notifType, + executionCount, + notifId); + return false; + } else if (rootCause instanceof SocketException + || rootCause instanceof InterruptedIOException + || exception instanceof SSLException) { + try { + Thread.sleep(retryIntervalInMilisec); + } catch (InterruptedException e) { + e.printStackTrace(); // do nothing + } + return true; + } else return false; + } + } + + /** + * Custom ServiceUnavailableRetryStrategy implementation to retry on HTTP 503 (= service + * unavailable) + */ + private class CustomServiceUnavailableRetryStrategy implements ServiceUnavailableRetryStrategy { + int maxRetriesCount = config.getRequestRetryCount(); + int retryIntervalInMilisec = config.getRequestRetryCountIntervalMs(); + + @Override + public boolean retryRequest( + final HttpResponse response, final int executionCount, final HttpContext context) { + + int httpStatusCode = response.getStatusLine().getStatusCode(); + if (httpStatusCode != 503) return false; // retry only on HTTP 503 + + if (executionCount >= maxRetriesCount) { + logger.warn( + "HTTP 503 error. {} notification failed after {} retries. Id: {} .", + notifType, + executionCount, + notifId); + return false; + } else { + logger.warn( + "HTTP 503 error. {} notification failed after {} retries. Id: {} .", + notifType, + executionCount, + notifId); + return true; + } + } + + @Override + public long getRetryInterval() { + // Retry interval between subsequent requests, in milliseconds. + // If not set, the default value is 1000 milliseconds. + return retryIntervalInMilisec; + } + } + + // By default retries 3 times + private CloseableHttpClient prepareClient() { + return HttpClients.custom() + .setConnectionManager(prepareConnManager()) + .setDefaultRequestConfig(prepareRequestConfig()) + .setRetryHandler(new CustomHttpRequestRetryHandler()) + .setServiceUnavailableRetryStrategy(new CustomServiceUnavailableRetryStrategy()) + .build(); + } + + public void postNotification( + RestClientManager.NotificationType notifType, + String data, + String id, + StatusNotifier statusNotifier) + throws IOException { + this.notifType = notifType.toString(); + notifId = id; + String url = prepareUrl(notifType, statusNotifier); + + Map headers = new HashMap<>(); + if (config.getHeaderPrefer() != "" && config.getHeaderPreferValue() != "") + headers.put(config.getHeaderPrefer(), config.getHeaderPreferValue()); + + HttpPost request = createPostRequest(url, data, headers); + long start = System.currentTimeMillis(); + executePost(request); + long duration = System.currentTimeMillis() - start; + if (duration > 100) { + logger.info("Round trip response time = " + (duration) + " millis"); + } + } + + private String prepareUrl( + RestClientManager.NotificationType notifType, StatusNotifier statusNotifier) { + String urlEndPoint = ""; + + if (notifType == RestClientManager.NotificationType.TASK) { + if (statusNotifier != null + && StringUtils.isNotBlank(statusNotifier.getEndpointTask())) { + urlEndPoint = statusNotifier.getEndpointTask(); + } else { + urlEndPoint = config.getEndpointTask(); + } + } else if (notifType == RestClientManager.NotificationType.WORKFLOW) { + if (statusNotifier != null + && StringUtils.isNotBlank(statusNotifier.getEndpointTask())) { + urlEndPoint = statusNotifier.getEndpointWorkflow(); + } else { + urlEndPoint = config.getEndpointWorkflow(); + } + } + String url; + if (statusNotifier != null) { + url = statusNotifier.getUrl(); + } else { + url = config.getUrl(); + } + + return url + "/" + urlEndPoint; + } + + private HttpPost createPostRequest(String url, String data, Map headers) + throws IOException { + HttpPost httpPost = new HttpPost(url); + StringEntity entity = new StringEntity(data); + httpPost.setEntity(entity); + httpPost.setHeader("Accept", "application/json"); + httpPost.setHeader("Content-type", "application/json"); + headers.forEach(httpPost::setHeader); + return httpPost; + } + + private void executePost(HttpPost httpPost) throws IOException { + try (CloseableHttpResponse response = client.execute(httpPost)) { + int sc = response.getStatusLine().getStatusCode(); + if (!(sc == HttpStatus.SC_ACCEPTED || sc == HttpStatus.SC_OK)) { + throw new ClientProtocolException("Unexpected response status: " + sc); + } + } finally { + httpPost.releaseConnection(); // Release the connection gracefully so the connection can + // be reused by connection manager + } + } +} diff --git a/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifier.java b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifier.java new file mode 100644 index 000000000..47675ddf0 --- /dev/null +++ b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifier.java @@ -0,0 +1,46 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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; + +public class StatusNotifier { + + private String url; + + private String endpointTask; + + private String endpointWorkflow; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getEndpointTask() { + return endpointTask; + } + + public void setEndpointTask(String endpointTask) { + this.endpointTask = endpointTask; + } + + public String getEndpointWorkflow() { + return endpointWorkflow; + } + + public void setEndpointWorkflow(String endpointWorkflow) { + this.endpointWorkflow = endpointWorkflow; + } +} diff --git a/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifierNotificationProperties.java b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifierNotificationProperties.java new file mode 100644 index 000000000..7eaeddccb --- /dev/null +++ b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/StatusNotifierNotificationProperties.java @@ -0,0 +1,154 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.List; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("conductor.status-notifier.notification") +public class StatusNotifierNotificationProperties { + + private String url; + + private String endpointTask; + + /* + * TBD: list of Task status we are interested in + */ + private List subscribedTaskStatuses; + + private String endpointWorkflow; + + private String headerPrefer = ""; + + private String headerPreferValue = ""; + + private int requestTimeOutMsConnect = 100; + + private int requestTimeoutMsread = 300; + + private int requestTimeoutMsConnMgr = 300; + + private int requestRetryCount = 3; + + private int requestRetryCountIntervalMs = 50; + + private int connectionPoolMaxRequest = 3; + + private int connectionPoolMaxRequestPerRoute = 3; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getEndpointTask() { + return endpointTask; + } + + public void setEndpointTask(String endpointTask) { + this.endpointTask = endpointTask; + } + + public String getEndpointWorkflow() { + return endpointWorkflow; + } + + public void setEndpointWorkflow(String endpointWorkflow) { + this.endpointWorkflow = endpointWorkflow; + } + + public String getHeaderPrefer() { + return headerPrefer; + } + + public void setHeaderPrefer(String headerPrefer) { + this.headerPrefer = headerPrefer; + } + + public String getHeaderPreferValue() { + return headerPreferValue; + } + + public void setHeaderPreferValue(String headerPreferValue) { + this.headerPreferValue = headerPreferValue; + } + + public int getRequestTimeOutMsConnect() { + return requestTimeOutMsConnect; + } + + public void setRequestTimeOutMsConnect(int requestTimeOutMsConnect) { + this.requestTimeOutMsConnect = requestTimeOutMsConnect; + } + + public int getRequestTimeoutMsread() { + return requestTimeoutMsread; + } + + public void setRequestTimeoutMsread(int requestTimeoutMsread) { + this.requestTimeoutMsread = requestTimeoutMsread; + } + + public int getRequestTimeoutMsConnMgr() { + return requestTimeoutMsConnMgr; + } + + public void setRequestTimeoutMsConnMgr(int requestTimeoutMsConnMgr) { + this.requestTimeoutMsConnMgr = requestTimeoutMsConnMgr; + } + + public int getRequestRetryCount() { + return requestRetryCount; + } + + public void setRequestRetryCount(int requestRetryCount) { + this.requestRetryCount = requestRetryCount; + } + + public int getRequestRetryCountIntervalMs() { + return requestRetryCountIntervalMs; + } + + public void setRequestRetryCountIntervalMs(int requestRetryCountIntervalMs) { + this.requestRetryCountIntervalMs = requestRetryCountIntervalMs; + } + + public int getConnectionPoolMaxRequest() { + return connectionPoolMaxRequest; + } + + public void setConnectionPoolMaxRequest(int connectionPoolMaxRequest) { + this.connectionPoolMaxRequest = connectionPoolMaxRequest; + } + + public int getConnectionPoolMaxRequestPerRoute() { + return connectionPoolMaxRequestPerRoute; + } + + public void setConnectionPoolMaxRequestPerRoute(int connectionPoolMaxRequestPerRoute) { + this.connectionPoolMaxRequestPerRoute = connectionPoolMaxRequestPerRoute; + } + + public List getSubscribedTaskStatuses() { + return subscribedTaskStatuses; + } + + public void setSubscribedTaskStatuses(List subscribedTaskStatuses) { + this.subscribedTaskStatuses = subscribedTaskStatuses; + } +} diff --git a/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskNotification.java b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskNotification.java new file mode 100644 index 000000000..3098e42f0 --- /dev/null +++ b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskNotification.java @@ -0,0 +1,108 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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 org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.netflix.conductor.common.metadata.tasks.Task; +import com.netflix.conductor.common.run.TaskSummary; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; + +@JsonFilter("SecretRemovalFilter") +public class TaskNotification extends TaskSummary { + + private static final Logger LOGGER = LoggerFactory.getLogger(TaskStatusPublisher.class); + + public String workflowTaskType; + + /** + * Following attributes doesnt exist in TaskSummary so add it here. Not adding in TaskSummary as + * it belongs to conductor-common + */ + private String referenceTaskName; + + private int retryCount; + + private String taskDescription; + + private ObjectMapper objectMapper = new ObjectMapper(); + + public String getReferenceTaskName() { + return referenceTaskName; + } + + public int getRetryCount() { + return retryCount; + } + + public String getTaskDescription() { + return taskDescription; + } + + public TaskNotification(Task task) { + super(task); + + referenceTaskName = task.getReferenceTaskName(); + retryCount = task.getRetryCount(); + taskDescription = task.getWorkflowTask().getDescription(); + + workflowTaskType = task.getWorkflowTask().getType(); + + boolean isFusionMetaPresent = task.getInputData().containsKey("_ioMeta"); + if (!isFusionMetaPresent) { + return; + } + } + + String toJsonString() { + String jsonString; + SimpleBeanPropertyFilter theFilter = + SimpleBeanPropertyFilter.serializeAllExcept("input", "output"); + FilterProvider provider = + new SimpleFilterProvider().addFilter("SecretRemovalFilter", theFilter); + try { + jsonString = objectMapper.writer(provider).writeValueAsString(this); + } catch (JsonProcessingException e) { + LOGGER.error("Failed to convert Task: {} to String. Exception: {}", this, e); + throw new RuntimeException(e); + } + return jsonString; + } + + /* + * https://github.com/Netflix/conductor/pull/2128 + * To enable Workflow/Task Summary Input/Output JSON Serialization, use the following: + * conductor.app.summary-input-output-json-serialization.enabled=true + */ + String toJsonStringWithInputOutput() { + String jsonString; + try { + SimpleBeanPropertyFilter emptyFilter = SimpleBeanPropertyFilter.serializeAllExcept(); + FilterProvider provider = + new SimpleFilterProvider().addFilter("SecretRemovalFilter", emptyFilter); + + jsonString = objectMapper.writer(provider).writeValueAsString(this); + } catch (JsonProcessingException e) { + LOGGER.error("Failed to convert Task: {} to String. Exception: {}", this, e); + throw new RuntimeException(e); + } + return jsonString; + } +} diff --git a/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisher.java b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisher.java new file mode 100644 index 000000000..9cc8ea197 --- /dev/null +++ b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisher.java @@ -0,0 +1,202 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.io.IOException; +import java.util.List; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.netflix.conductor.core.dal.ExecutionDAOFacade; +import com.netflix.conductor.core.listener.TaskStatusListener; +import com.netflix.conductor.model.TaskModel; + +@Singleton +public class TaskStatusPublisher implements TaskStatusListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(TaskStatusPublisher.class); + private static final Integer QDEPTH = + Integer.parseInt( + System.getenv().getOrDefault("ENV_TASK_NOTIFICATION_QUEUE_SIZE", "50")); + private BlockingQueue blockingQueue = new LinkedBlockingDeque<>(QDEPTH); + + private RestClientManager rcm; + private ExecutionDAOFacade executionDAOFacade; + private List subscribedTaskStatusList; + + class ExceptionHandler implements Thread.UncaughtExceptionHandler { + public void uncaughtException(Thread t, Throwable e) { + LOGGER.info("An exception has been captured\n"); + LOGGER.info("Thread: {}\n", t.getName()); + LOGGER.info("Exception: {}: {}\n", e.getClass().getName(), e.getMessage()); + LOGGER.info("Stack Trace: \n"); + e.printStackTrace(System.out); + LOGGER.info("Thread status: {}\n", t.getState()); + new ConsumerThread().start(); + } + } + + class ConsumerThread extends Thread { + + public void run() { + this.setUncaughtExceptionHandler(new ExceptionHandler()); + String tName = Thread.currentThread().getName(); + LOGGER.info("{}: Starting consumer thread", tName); + TaskModel task = null; + TaskNotification taskNotification = null; + while (true) { + try { + task = blockingQueue.take(); + taskNotification = new TaskNotification(task.toTask()); + String jsonTask = taskNotification.toJsonString(); + LOGGER.info("Publishing TaskNotification: {}", jsonTask); + if (taskNotification.getTaskType().equals("SUB_WORKFLOW")) { + LOGGER.info( + "Skip task '{}' notification. Task type is SUB_WORKFLOW.", + taskNotification.getTaskId()); + continue; + } + publishTaskNotification(taskNotification); + LOGGER.debug("Task {} publish is successful.", taskNotification.getTaskId()); + Thread.sleep(5); + } catch (Exception e) { + if (taskNotification != null) { + LOGGER.error( + "Error while publishing task. Hence updating elastic search index taskId {} taskname {}", + task.getTaskId(), + task.getTaskDefName()); + // TBD executionDAOFacade.indexTask(task); + + } else { + LOGGER.error("Failed to publish task: Task is NULL"); + } + LOGGER.error("Error on publishing ", e); + } + } + } + } + + @Inject + public TaskStatusPublisher( + RestClientManager rcm, + ExecutionDAOFacade executionDAOFacade, + List subscribedTaskStatuses) { + this.rcm = rcm; + this.executionDAOFacade = executionDAOFacade; + this.subscribedTaskStatusList = subscribedTaskStatuses; + validateSubscribedTaskStatuses(subscribedTaskStatuses); + ConsumerThread consumerThread = new ConsumerThread(); + consumerThread.start(); + } + + private void validateSubscribedTaskStatuses(List subscribedTaskStatuses) { + for (String taskStausType : subscribedTaskStatuses) { + if (!taskStausType.equals("SCHEDULED")) { + LOGGER.error( + "Task Status Type {} will only push notificaitons when updated through the API. Automatic notifications only work for SCHEDULED type.", + taskStausType); + } + } + } + + private void enqueueTask(TaskModel task) { + try { + blockingQueue.put(task); + } catch (Exception e) { + LOGGER.debug( + "Failed to enqueue task: Id {} Type {} of workflow {} ", + task.getTaskId(), + task.getTaskType(), + task.getWorkflowInstanceId()); + LOGGER.debug(e.toString()); + } + } + + @Override + public void onTaskScheduled(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.SCHEDULED.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskCanceled(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.CANCELED.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskCompleted(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.COMPLETED.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskCompletedWithErrors(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.COMPLETED_WITH_ERRORS.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskFailed(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.FAILED.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskFailedWithTerminalError(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.FAILED_WITH_TERMINAL_ERROR.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskInProgress(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.IN_PROGRESS.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskSkipped(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.SKIPPED.name())) { + enqueueTask(task); + } + } + + @Override + public void onTaskTimedOut(TaskModel task) { + if (subscribedTaskStatusList.contains(TaskModel.Status.TIMED_OUT.name())) { + enqueueTask(task); + } + } + + private void publishTaskNotification(TaskNotification taskNotification) throws IOException { + String jsonTask = taskNotification.toJsonStringWithInputOutput(); + rcm.postNotification( + RestClientManager.NotificationType.TASK, + jsonTask, + taskNotification.getTaskId(), + null); + } +} diff --git a/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisherConfiguration.java b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisherConfiguration.java new file mode 100644 index 000000000..d73e865cf --- /dev/null +++ b/task-status-listener/src/main/java/com/netflix/conductor/contribs/listener/TaskStatusPublisherConfiguration.java @@ -0,0 +1,36 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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 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.TaskStatusListener; + +@Configuration +@EnableConfigurationProperties(StatusNotifierNotificationProperties.class) +@ConditionalOnProperty(name = "conductor.task-status-listener.type", havingValue = "task_publisher") +public class TaskStatusPublisherConfiguration { + + @Bean + public TaskStatusListener getTaskStatusListener( + RestClientManager rcm, + ExecutionDAOFacade executionDAOFacade, + StatusNotifierNotificationProperties config) { + + return new TaskStatusPublisher(rcm, executionDAOFacade, config.getSubscribedTaskStatuses()); + } +} diff --git a/test-harness/dependencies.lock b/test-harness/dependencies.lock deleted file mode 100644 index cb0863f6f..000000000 --- a/test-harness/dependencies.lock +++ /dev/null @@ -1,786 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "runtimeClasspath": { - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.3" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-es6-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-client": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "locked": "2.0.20" - }, - "javax.ws.rs:javax.ws.rs-api": { - "locked": "2.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "6.8.23" - }, - "org.glassfish.jersey.core:jersey-common": { - "locked": "2.22.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "locked": "2.0.3" - }, - "org.springframework:spring-web": { - "locked": "6.0.12" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.3" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "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-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-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-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.57.2" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.23" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.22.2" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.0.9" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "org.springframework:spring-web": { - "locked": "6.0.12" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.3.0" - } - } -} \ No newline at end of file diff --git a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ForkJoinSpec.groovy b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ForkJoinSpec.groovy index 4494874f3..1274eb99b 100644 --- a/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ForkJoinSpec.groovy +++ b/test-harness/src/test/groovy/com/netflix/conductor/test/integration/ForkJoinSpec.groovy @@ -331,13 +331,13 @@ class ForkJoinSpec extends AbstractSpecification { and: "the workflow is in the failed state" with(workflowExecutionService.getExecutionStatus(workflowInstanceId, true)) { - status == Workflow.WorkflowStatus.RUNNING + status == Workflow.WorkflowStatus.FAILED tasks.size() == 4 tasks[1].status == Task.Status.FAILED tasks[1].taskType == 'integration_task_1' tasks[2].status == Task.Status.COMPLETED tasks[2].taskType == 'integration_task_2' - tasks[3].status == Task.Status.IN_PROGRESS + tasks[3].status == Task.Status.FAILED tasks[3].taskType == 'JOIN' } diff --git a/test-harness/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java b/test-harness/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java index 66b883022..fd034d2ac 100644 --- a/test-harness/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java +++ b/test-harness/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java @@ -65,8 +65,8 @@ public abstract class AbstractEndToEndTest { private static final ElasticsearchContainer container = new ElasticsearchContainer( - DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch-oss") - .withTag("7.10.2")); // this should match the client version + DockerImageName.parse("elasticsearch") + .withTag("7.17.16")); // this should match the client version private static RestClient restClient; 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 18efe513e..c1d57ae86 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 @@ -23,7 +23,6 @@ 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; @@ -48,7 +47,6 @@ public class MockExternalPayloadStorage implements ExternalPayloadStorage { private final ObjectMapper objectMapper; private final File payloadDir; - @Autowired public MockExternalPayloadStorage(ObjectMapper objectMapper) throws IOException { this.objectMapper = objectMapper; this.payloadDir = Files.createTempDirectory("payloads").toFile(); diff --git a/test-harness/src/test/java/com/netflix/conductor/test/utils/UserTask.java b/test-harness/src/test/java/com/netflix/conductor/test/utils/UserTask.java index ae1fc9ac9..2c369390d 100644 --- a/test-harness/src/test/java/com/netflix/conductor/test/utils/UserTask.java +++ b/test-harness/src/test/java/com/netflix/conductor/test/utils/UserTask.java @@ -20,7 +20,6 @@ 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; @@ -44,7 +43,6 @@ public class UserTask extends WorkflowSystemTask { private static final TypeReference>>> mapStringListObjects = new TypeReference<>() {}; - @Autowired public UserTask(ObjectMapper objectMapper) { super(NAME); this.objectMapper = objectMapper; diff --git a/test-util/dependencies.lock b/test-util/dependencies.lock deleted file mode 100644 index c2a6b65a5..000000000 --- a/test-util/dependencies.lock +++ /dev/null @@ -1,1452 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-client": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "locked": "2.0.20" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "6.8.23" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "runtimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "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-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-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-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.57.2" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "1.1.1" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "3.1.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.0.9" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.3.0" - } - }, - "testCompileClasspath": { - "com.fasterxml.jackson.core:jackson-core": { - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "locked": "2.15.2" - }, - "com.google.guava:guava": { - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "locked": "3.21.12" - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-client": { - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "locked": "2.0.20" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.commons:commons-lang3": { - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "locked": "6.8.23" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "locked": "3.1.4" - }, - "org.springframework:spring-web": { - "locked": "6.0.12" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "locked": "3.3.0" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "30.0-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "3.21.12" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-client": { - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "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-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-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-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.eureka:eureka-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.10.10" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "com.netflix.spectator:spectator-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core" - ], - "locked": "0.122.0" - }, - "com.rabbitmq:amqp-client": { - "locked": "5.13.0" - }, - "com.spotify:completable-futures": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "0.3.3" - }, - "com.sun.jersey:jersey-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "1.19.4" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "1.57.2" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:javax.ws.rs-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "2.1.1" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-client", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "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-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-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.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.23" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.23" - }, - "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.glassfish.jersey.core:jersey-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client" - ], - "locked": "3.1.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.slf4j:slf4j-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-client", - "com.netflix.conductor:conductor-grpc-client" - ], - "locked": "2.0.9" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "org.springframework:spring-web": { - "locked": "6.0.12" - }, - "org.testcontainers:elasticsearch": { - "locked": "1.15.3" - }, - "org.testcontainers:mysql": { - "locked": "1.15.3" - }, - "org.testcontainers:postgresql": { - "locked": "1.15.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.3.0" - } - } -} \ No newline at end of file diff --git a/test-util/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java b/test-util/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java index 4065241a5..a048a26e6 100644 --- a/test-util/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java +++ b/test-util/src/test/java/com/netflix/conductor/test/integration/AbstractEndToEndTest.java @@ -61,8 +61,8 @@ public abstract class AbstractEndToEndTest { private static final ElasticsearchContainer container = new ElasticsearchContainer( - DockerImageName.parse("docker.elastic.co/elasticsearch/elasticsearch-oss") - .withTag("7.10.2")); // this should match the client version + DockerImageName.parse("elasticsearch") + .withTag("7.17.16")); // this should match the client version private static RestClient restClient; diff --git a/ui/src/data/bulkactions.js b/ui/src/data/bulkactions.js index e5edd6cc0..42f3df62a 100644 --- a/ui/src/data/bulkactions.js +++ b/ui/src/data/bulkactions.js @@ -48,3 +48,20 @@ export const useBulkTerminateWithReasonAction = (callbacks) => { }); }, callbacks); }; + +export const useBulkDeleteAction = (callbacks) => { + const fetchContext = useFetchContext(); + + return useMutation((mutateParams) => { + const path = new Path("/workflow/bulk/remove"); + path.search.append("archiveWorkflow", mutateParams.archiveWorkflow); + + return fetchWithContext(path, fetchContext, { + method: "delete", + headers: { + "Content-Type": "application/json", + }, + body: _.get(mutateParams, "body"), + }); + }, callbacks); +}; diff --git a/ui/src/pages/executions/BulkActionModule.jsx b/ui/src/pages/executions/BulkActionModule.jsx index 80d961804..0fdf37451 100644 --- a/ui/src/pages/executions/BulkActionModule.jsx +++ b/ui/src/pages/executions/BulkActionModule.jsx @@ -21,6 +21,7 @@ import { useBulkPauseAction, useBulkRetryAction, useBulkTerminateWithReasonAction, + useBulkDeleteAction, } from "../../data/bulkactions"; const useStyles = makeStyles({ @@ -59,6 +60,8 @@ export default function BulkActionModule({ selectedRows }) { mutate: terminateWithReasonAction, isLoading: terminateWithReasonLoading, } = useBulkTerminateWithReasonAction({ onSuccess }); + const { mutate: deleteAction, isLoading: deleteLoading } = + useBulkDeleteAction({ onSuccess }); const isLoading = pauseLoading || @@ -67,7 +70,8 @@ export default function BulkActionModule({ selectedRows }) { restartLatestLoading || retryLoading || terminateLoading || - terminateWithReasonLoading; + terminateWithReasonLoading || + deleteLoading; function onSuccess(data, variables, context) { const retval = { @@ -133,6 +137,26 @@ export default function BulkActionModule({ selectedRows }) { } }, }, + { + label: "Archive", + handler: () => { + const archiveWorkflow = "true"; + deleteAction({ + body: JSON.stringify(selectedIds), + archiveWorkflow, + }); + }, + }, + { + label: "Delete", + handler: () => { + const archiveWorkflow = "false"; + deleteAction({ + body: JSON.stringify(selectedIds), + archiveWorkflow, + }); + }, + }, ]} > Bulk Action diff --git a/ui/src/schema/workflow.js b/ui/src/schema/workflow.js index 8742e19a7..5ef3e4387 100644 --- a/ui/src/schema/workflow.js +++ b/ui/src/schema/workflow.js @@ -7,11 +7,11 @@ export const NEW_WORKFLOW_TEMPLATE = { version: 1, tasks: [ { - name: "get_population_data", - taskReferenceName: "get_population_data", + name: "call_remote_api", + taskReferenceName: "call_remote_api", inputParameters: { http_request: { - uri: "https://datausa.io/api/data?drilldowns=Nation&measures=Population", + uri: "https://orkes-api-tester.orkesconductor.com/api", method: "GET", }, }, @@ -20,8 +20,8 @@ export const NEW_WORKFLOW_TEMPLATE = { ], inputParameters: [], outputParameters: { - data: "${get_population_data.output.response.body.data}", - source: "${get_population_data.output.response.body.source}", + data: "${call_remote_api.output.response.body.data}", + source: "${call_remote_api.output.response.body.source}", }, schemaVersion: 2, restartable: true, @@ -45,11 +45,11 @@ const WORKFLOW_SCHEMA = { version: 1, tasks: [ { - name: "get_population_data", - taskReferenceName: "get_population_data", + name: "call_remote_api", + taskReferenceName: "call_remote_api", inputParameters: { http_request: { - uri: "https://datausa.io/api/data?drilldowns=Nation&measures=Population", + uri: "https://orkes-api-tester.orkesconductor.com/api", method: "GET", }, }, @@ -58,8 +58,8 @@ const WORKFLOW_SCHEMA = { ], inputParameters: [], outputParameters: { - data: "${get_population_data.output.response.body.data}", - source: "${get_population_data.output.response.body.source}", + data: "${call_remote_api.output.response.body.data}", + source: "${call_remote_api.output.response.body.source}", }, schemaVersion: 2, restartable: true, @@ -108,11 +108,11 @@ const WORKFLOW_SCHEMA = { examples: [ [ { - name: "get_population_data", - taskReferenceName: "get_population_data", + name: "call_remote_api", + taskReferenceName: "call_remote_api", inputParameters: { http_request: { - uri: "https://datausa.io/api/data?drilldowns=Nation&measures=Population", + uri: "https://orkes-api-tester.orkesconductor.com/api", method: "GET", }, }, @@ -137,11 +137,11 @@ const WORKFLOW_SCHEMA = { }, examples: [ { - name: "get_population_data", - taskReferenceName: "get_population_data", + name: "call_remote_api", + taskReferenceName: "call_remote_api", inputParameters: { http_request: { - uri: "https://datausa.io/api/data?drilldowns=Nation&measures=Population", + uri: "https://orkes-api-tester.orkesconductor.com/api", method: "GET", }, }, @@ -156,7 +156,7 @@ const WORKFLOW_SCHEMA = { title: "Task name", description: "Task name", default: "", - examples: ["get_population_data"], + examples: ["call_remote_api"], }, taskReferenceName: { $id: "#/properties/tasks/items/anyOf/0/properties/taskReferenceName", @@ -165,7 +165,7 @@ const WORKFLOW_SCHEMA = { description: "A unique task reference name for this task in the entire workflow", default: "", - examples: ["get_population_data"], + examples: ["call_remote_api"], }, inputParameters: { $id: "#/properties/tasks/items/anyOf/0/properties/inputParameters", @@ -176,7 +176,7 @@ const WORKFLOW_SCHEMA = { examples: [ { http_request: { - uri: "https://datausa.io/api/data?drilldowns=Nation&measures=Population", + uri: "https://orkes-api-tester.orkesconductor.com/api", method: "GET", }, }, @@ -219,8 +219,8 @@ const WORKFLOW_SCHEMA = { default: {}, examples: [ { - data: "${get_population_data.output.response.body.data}", - source: "${get_population_data.output.response.body.source}", + data: "${call_remote_api.output.response.body.data}", + source: "${call_remote_api.output.response.body.source}", }, ], required: [], diff --git a/workflow-event-listener/build.gradle b/workflow-event-listener/build.gradle index bf322be9a..3445f4795 100644 --- a/workflow-event-listener/build.gradle +++ b/workflow-event-listener/build.gradle @@ -6,6 +6,12 @@ dependencies { implementation project(':conductor-common') implementation project(':conductor-core') implementation project(':conductor-redis-persistence') + implementation project(':conductor-task-status-listener') + implementation project(':conductor-annotations') + + implementation group: 'javax.inject', name: 'javax.inject', version: '1' + implementation "org.apache.commons:commons-lang3:" + implementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.14' compileOnly 'org.springframework.boot:spring-boot-starter' compileOnly 'org.springframework.boot:spring-boot-starter-web' diff --git a/workflow-event-listener/dependencies.lock b/workflow-event-listener/dependencies.lock deleted file mode 100644 index 88170b10d..000000000 --- a/workflow-event-listener/dependencies.lock +++ /dev/null @@ -1,1170 +0,0 @@ -{ - "annotationProcessor": { - "org.springframework.boot:spring-boot-configuration-processor": { - "locked": "3.1.4" - } - }, - "compileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.rarefiedredis.redis:redis-java": { - "locked": "0.0.17" - }, - "org.springframework.boot:spring-boot-starter": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - }, - "runtimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "32.0.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "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-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-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "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" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "1.1.1" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.3.0" - } - }, - "testCompileClasspath": { - "com.netflix.conductor:conductor-common": { - "project": true - }, - "com.netflix.conductor:conductor-core": { - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "junit:junit": { - "locked": "4.13.2" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.logging.log4j:log4j-api": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "locked": "2.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "locked": "2.20.0" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.rarefiedredis.redis:redis-java": { - "locked": "0.0.17" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "locked": "3.1.4" - } - }, - "testRuntimeClasspath": { - "com.amazonaws:aws-java-sdk-s3": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage" - ], - "locked": "1.11.86" - }, - "com.amazonaws:aws-java-sdk-sqs": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue" - ], - "locked": "1.11.86" - }, - "com.datastax.cassandra:cassandra-driver-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-cassandra-persistence" - ], - "locked": "3.10.2" - }, - "com.fasterxml.jackson.core:jackson-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.core:jackson-databind": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core" - ], - "locked": "2.15.2" - }, - "com.fasterxml.jackson.module:jackson-module-afterburner": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "locked": "2.15.2" - }, - "com.github.ben-manes.caffeine:caffeine": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-json-jq-task" - ], - "locked": "3.1.8" - }, - "com.google.guava:guava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "32.0.1-jre" - }, - "com.google.protobuf:protobuf-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-grpc" - ], - "locked": "3.22.3" - }, - "com.jayway.jsonpath:json-path": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.8.0" - }, - "com.netflix.conductor:conductor-annotations": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common" - ], - "project": true - }, - "com.netflix.conductor:conductor-awss3-storage": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-awssqs-event-queue": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-cassandra-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-common": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "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-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-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "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": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-grpc-server": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-http-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-json-jq-task": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-concurrency-limit": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-lock": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-redis-persistence": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-rest": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "project": true - }, - "com.netflix.conductor:conductor-server": { - "project": true - }, - "com.netflix.dyno-queues:dyno-queues-redis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "2.0.20" - }, - "com.netflix.runtime:health-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest" - ], - "locked": "1.1.4" - }, - "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" - }, - "com.thoughtworks.xstream:xstream": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "1.4.20" - }, - "commons-io:commons-io": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "2.7" - }, - "io.grpc:grpc-netty": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-protobuf": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-services": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc-server" - ], - "locked": "1.57.2" - }, - "io.grpc:grpc-stub": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.57.2" - }, - "io.orkes.queues:orkes-conductor-queues": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "1.0.7" - }, - "io.reactivex:rxjava": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-core" - ], - "locked": "1.2.2" - }, - "jakarta.activation:jakarta.activation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "2.1.2" - }, - "jakarta.annotation:jakarta.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "2.1.1" - }, - "jakarta.xml.bind:jakarta.xml.bind-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "4.0.1" - }, - "javax.annotation:javax.annotation-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-grpc" - ], - "locked": "1.3.2" - }, - "javax.ws.rs:jsr311-api": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "1.1.1" - }, - "junit:junit": { - "locked": "4.13.2" - }, - "net.thisptr:jackson-jq": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-json-jq-task" - ], - "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-awss3-storage", - "com.netflix.conductor:conductor-awssqs-event-queue", - "com.netflix.conductor:conductor-cassandra-persistence", - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc-server", - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.12.0" - }, - "org.apache.groovy:groovy-all": { - "locked": "4.0.9" - }, - "org.apache.httpcomponents.client5:httpclient5": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-http-task" - ], - "locked": "5.2.1" - }, - "org.apache.logging.log4j:log4j-api": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-core": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-jul": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-slf4j-impl": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.apache.logging.log4j:log4j-web": { - "firstLevelTransitive": [ - "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-core", - "com.netflix.conductor:conductor-es6-persistence", - "com.netflix.conductor:conductor-grpc", - "com.netflix.conductor:conductor-grpc-server", - "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.20.0" - }, - "org.elasticsearch.client:elasticsearch-rest-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "8.7.1" - }, - "org.elasticsearch.client:elasticsearch-rest-high-level-client": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.elasticsearch.client:transport": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-es6-persistence" - ], - "locked": "6.8.12" - }, - "org.glassfish.jaxb:jaxb-runtime": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "4.0.3" - }, - "org.junit.vintage:junit-vintage-engine": { - "locked": "5.9.3" - }, - "org.openjdk.nashorn:nashorn-core": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-core" - ], - "locked": "15.4" - }, - "org.rarefiedredis.redis:redis-java": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-persistence" - ], - "locked": "0.0.17" - }, - "org.redisson:redisson": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-lock" - ], - "locked": "3.13.3" - }, - "org.spockframework:spock-core": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.spockframework:spock-spring": { - "locked": "2.4-M1-groovy-4.0" - }, - "org.springdoc:springdoc-openapi-starter-webmvc-ui": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-common", - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "2.1.0" - }, - "org.springframework.boot:spring-boot-starter": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-actuator": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-log4j2": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-test": { - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-validation": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.boot:spring-boot-starter-web": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-rest", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.1.4" - }, - "org.springframework.retry:spring-retry": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-server" - ], - "locked": "2.0.3" - }, - "redis.clients:jedis": { - "firstLevelTransitive": [ - "com.netflix.conductor:conductor-redis-concurrency-limit", - "com.netflix.conductor:conductor-redis-persistence", - "com.netflix.conductor:conductor-server" - ], - "locked": "3.3.0" - } - } -} \ No newline at end of file diff --git a/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangeNotification.java b/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangeNotification.java new file mode 100644 index 000000000..4d0a46a79 --- /dev/null +++ b/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangeNotification.java @@ -0,0 +1,99 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.statuschange; + +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.netflix.conductor.common.run.Workflow; +import com.netflix.conductor.common.run.WorkflowSummary; +import com.netflix.conductor.contribs.listener.StatusNotifier; + +import com.fasterxml.jackson.annotation.JsonFilter; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ser.FilterProvider; +import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter; +import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider; + +@JsonFilter("SecretRemovalFilter") +class StatusChangeNotification extends WorkflowSummary { + private static final Logger LOGGER = LoggerFactory.getLogger(StatusChangePublisher.class); + private ObjectMapper objectMapper = new ObjectMapper(); + private StatusNotifier statusNotifier; + + StatusChangeNotification(Workflow workflow) { + super(workflow); + Map variables = workflow.getVariables(); + Object statusNotifierVariable = variables.get("statusNotifier"); + if (statusNotifier != null) { + try { + statusNotifier = + objectMapper.readValue( + statusNotifierVariable.toString(), new TypeReference<>() {}); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + } + + public StatusNotifier getStatusNotifier() { + return statusNotifier; + } + + String toJsonString() { + String jsonString; + try { + SimpleBeanPropertyFilter theFilter = + SimpleBeanPropertyFilter.serializeAllExcept("input", "output"); + FilterProvider provider = + new SimpleFilterProvider().addFilter("SecretRemovalFilter", theFilter); + jsonString = objectMapper.writer(provider).writeValueAsString(this); + } catch (JsonProcessingException e) { + LOGGER.error( + "Failed to convert workflow {} id: {} to String. Exception: {}", + this.getWorkflowType(), + this.getWorkflowId(), + e); + throw new RuntimeException(e); + } + return jsonString; + } + + /* + * https://github.com/Netflix/conductor/pull/2128 + * To enable Workflow/Task Summary Input/Output JSON Serialization, use the following: + * conductor.app.summary-input-output-json-serialization.enabled=true + */ + String toJsonStringWithInputOutput() { + String jsonString; + ObjectMapper objectMapper = new ObjectMapper(); + try { + SimpleBeanPropertyFilter emptyFilter = SimpleBeanPropertyFilter.serializeAllExcept(); + FilterProvider provider = + new SimpleFilterProvider().addFilter("SecretRemovalFilter", emptyFilter); + jsonString = objectMapper.writer(provider).writeValueAsString(this); + } catch (JsonProcessingException e) { + LOGGER.error( + "Failed to convert workflow {} id: {} to String. Exception: {}", + this.getWorkflowType(), + this.getWorkflowId(), + e); + throw new RuntimeException(e); + } + return jsonString; + } +} diff --git a/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisher.java b/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisher.java new file mode 100644 index 000000000..4fac33a3d --- /dev/null +++ b/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisher.java @@ -0,0 +1,149 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.statuschange; + +import java.io.IOException; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingDeque; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.netflix.conductor.contribs.listener.RestClientManager; +import com.netflix.conductor.core.dal.ExecutionDAOFacade; +import com.netflix.conductor.core.listener.WorkflowStatusListener; +import com.netflix.conductor.model.WorkflowModel; + +@Singleton +public class StatusChangePublisher implements WorkflowStatusListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(StatusChangePublisher.class); + private static final Integer QDEPTH = + Integer.parseInt( + System.getenv().getOrDefault("ENV_WORKFLOW_NOTIFICATION_QUEUE_SIZE", "50")); + private BlockingQueue blockingQueue = new LinkedBlockingDeque<>(QDEPTH); + private RestClientManager rcm; + private ExecutionDAOFacade executionDAOFacade; + + class ExceptionHandler implements Thread.UncaughtExceptionHandler { + public void uncaughtException(Thread t, Throwable e) { + LOGGER.info("An exception has been captured\n"); + LOGGER.info("Thread: {}\n", t.getName()); + LOGGER.info("Exception: {}: {}\n", e.getClass().getName(), e.getMessage()); + LOGGER.info("Stack Trace: \n"); + e.printStackTrace(System.out); + LOGGER.info("Thread status: {}\n", t.getState()); + new ConsumerThread().start(); + } + } + + class ConsumerThread extends Thread { + + public void run() { + this.setUncaughtExceptionHandler(new ExceptionHandler()); + String tName = Thread.currentThread().getName(); + LOGGER.info("{}: Starting consumer thread", tName); + + StatusChangeNotification statusChangeNotification = null; + WorkflowModel workflow = null; + while (true) { + try { + workflow = blockingQueue.take(); + statusChangeNotification = new StatusChangeNotification(workflow.toWorkflow()); + String jsonWorkflow = statusChangeNotification.toJsonString(); + LOGGER.info("Publishing StatusChangeNotification: {}", jsonWorkflow); + publishStatusChangeNotification(statusChangeNotification); + LOGGER.debug( + "Workflow {} publish is successful.", + statusChangeNotification.getWorkflowId()); + Thread.sleep(5); + } catch (Exception e) { + if (statusChangeNotification != null) { + LOGGER.error( + " Error while publishing workflow. Hence updating elastic search index workflowid {} workflowname {} correlationId {}", + workflow.getWorkflowId(), + workflow.getWorkflowName(), + workflow.getCorrelationId()); + // TBD executionDAOFacade.indexWorkflow(workflow); + } else { + LOGGER.error("Failed to publish workflow: Workflow is NULL"); + } + LOGGER.error("Error on publishing workflow", e); + } + } + } + } + + @Inject + public StatusChangePublisher(RestClientManager rcm, ExecutionDAOFacade executionDAOFacade) { + this.rcm = rcm; + this.executionDAOFacade = executionDAOFacade; + ConsumerThread consumerThread = new ConsumerThread(); + consumerThread.start(); + } + + @Override + public void onWorkflowCompleted(WorkflowModel workflow) { + LOGGER.debug( + "workflows completion {} {}", workflow.getWorkflowId(), workflow.getWorkflowName()); + try { + blockingQueue.put(workflow); + } catch (Exception e) { + LOGGER.error( + "Failed to enqueue workflow: Id {} Name {}", + workflow.getWorkflowId(), + workflow.getWorkflowName()); + LOGGER.error(e.toString()); + } + } + + @Override + public void onWorkflowTerminated(WorkflowModel workflow) { + LOGGER.debug( + "workflows termination {} {}", + workflow.getWorkflowId(), + workflow.getWorkflowName()); + try { + blockingQueue.put(workflow); + } catch (Exception e) { + LOGGER.error( + "Failed to enqueue workflow: Id {} Name {}", + workflow.getWorkflowId(), + workflow.getWorkflowName()); + LOGGER.error(e.getMessage()); + } + } + + @Override + public void onWorkflowCompletedIfEnabled(WorkflowModel workflow) { + onWorkflowCompleted(workflow); + } + + @Override + public void onWorkflowTerminatedIfEnabled(WorkflowModel workflow) { + onWorkflowTerminated(workflow); + } + + private void publishStatusChangeNotification(StatusChangeNotification statusChangeNotification) + throws IOException { + String jsonWorkflow = statusChangeNotification.toJsonStringWithInputOutput(); + rcm.postNotification( + RestClientManager.NotificationType.WORKFLOW, + jsonWorkflow, + statusChangeNotification.getWorkflowId(), + statusChangeNotification.getStatusNotifier()); + } +} diff --git a/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisherConfiguration.java b/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisherConfiguration.java new file mode 100644 index 000000000..441475caf --- /dev/null +++ b/workflow-event-listener/src/main/java/com/netflix/conductor/contribs/listener/statuschange/StatusChangePublisherConfiguration.java @@ -0,0 +1,48 @@ +/* + * Copyright 2024 Conductor Authors. + *

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

+ * 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.statuschange; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.listener.RestClientManager; +import com.netflix.conductor.contribs.listener.StatusNotifierNotificationProperties; +import com.netflix.conductor.core.dal.ExecutionDAOFacade; +import com.netflix.conductor.core.listener.WorkflowStatusListener; + +@Configuration +@EnableConfigurationProperties(StatusNotifierNotificationProperties.class) +@ConditionalOnProperty( + name = "conductor.workflow-status-listener.type", + havingValue = "workflow_publisher") +public class StatusChangePublisherConfiguration { + + private static final Logger log = + LoggerFactory.getLogger(StatusChangePublisherConfiguration.class); + + @Bean + public RestClientManager getRestClientManager(StatusNotifierNotificationProperties config) { + return new RestClientManager(config); + } + + @Bean + public WorkflowStatusListener getWorkflowStatusListener( + RestClientManager restClientManager, ExecutionDAOFacade executionDAOFacade) { + + return new StatusChangePublisher(restClientManager, executionDAOFacade); + } +}