diff --git a/.dockerignore b/.dockerignore index d4eb2c4321..c60668e82c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1 +1,8 @@ -server/build/libs \ No newline at end of file +# General + +# Backend +server/build/libs + +# UI +**/node_modules +ui/build \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index 6e4598114a..d226ef697a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,10 @@ +gradlew eol=lf +*.gradle eol=lf +*.java eol=lf +*.groovy eol=lf +spring.factories eol=lf +*.sh eol=lf + docs/* linguist-documentation server/src/main/resources/swagger-ui/* linguist-vendored diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 090bd97bb0..6ee796ba44 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,7 +1,7 @@ --- name: Bug report about: Create a report to help us improve -title: "[BUG]: " +title: "" labels: 'type: bug' assignees: '' @@ -12,10 +12,14 @@ A clear and concise description of what the bug is. **Details** Conductor version: +Persistence implementation: Cassandra, Postgres, MySQL, Dynomite etc +Queue implementation: Postgres, MySQL, Dynoqueues etc +Lock: Redis or Zookeeper? Workflow definition: Task definition: Event handler definition: + **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md deleted file mode 100644 index 764c49d645..0000000000 --- a/.github/ISSUE_TEMPLATE/question.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Question -about: Ask a question -title: "[QUESTION]: " -labels: question -assignees: '' - ---- - -Please do not create issues for questions. Use the [discussion forum](https://github.com/Netflix/conductor/discussions) instead! diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..ef87e0b826 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: + - package-ecosystem: "gradle" + directory: "/" + schedule: + interval: "weekly" + reviewers: + - "aravindanr" + - "jxu-nflx" + - "apanicker-nflx" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7581d43abd..4cd3eb4408 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,12 +1,14 @@ Pull Request type ---- - - [ ] Bugfix - [ ] Feature - [ ] Refactoring (no functional changes, no api changes) -- [ ] Build related changes +- [ ] Build related changes (Please run `./gradlew generateLock saveLock` to refresh dependencies) +- [ ] WHOSUSING.md - [ ] Other (please describe): +**NOTE**: Please remember to run `./gradlew spotlessApply` to fix any format violations. + Changes in this PR ---- diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 6aaea44868..aea460e5e9 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -35,3 +35,5 @@ version-resolver: exclude-labels: - 'skip-changelog' + - 'gradle-wrapper' + - 'github_actions' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b39e0b4061..9528884b4a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,25 +6,25 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} fetch-depth: 0 - name: Gradle wrapper validation uses: gradle/wrapper-validation-action@v1 - - name: Set up Zulu JDK 11 - uses: actions/setup-java@v2 + - name: Set up Zulu JDK 17 + uses: actions/setup-java@v3 with: distribution: 'zulu' - java-version: '11' + java-version: '17' - name: Cache SonarCloud packages - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - name: Cache Gradle packages - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | ~/.gradle/caches @@ -37,31 +37,73 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} run: | - echo "Running build for commit ${{ github.sha }} in ${{ github.head_ref }}" - ./gradlew build -x :conductor-contribs:test --scan + ./gradlew build --scan - name: Build and Publish snapshot if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main' run: | echo "Running build for commit ${{ github.sha }}" - ./gradlew build -x :conductor-contribs:test snapshot --scan + ./gradlew build snapshot --scan env: NETFLIX_OSS_SIGNING_KEY: ${{ secrets.ORG_SIGNING_KEY }} NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }} NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }} NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }} - - name: Publish Unit Test Results - uses: EnricoMi/publish-unit-test-result-action@v1 + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 if: always() with: - comment_on_pr: false - files: './**/**/test-results/**/*.xml' + report_paths: '**/build/test-results/test/TEST-*.xml' - name: Upload build artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: build-artifacts path: '**/build/reports' - name: Store Buildscan URL - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: build-scan path: 'buildscan.log' + build-ui: + runs-on: ubuntu-latest + container: cypress/browsers:node14.17.6-chrome100-ff98 + defaults: + run: + working-directory: ui + steps: + - uses: actions/checkout@v3 + + - name: Install Dependencies + run: yarn install + + - name: Build UI + run: yarn run build + + - name: Run E2E Tests + uses: cypress-io/github-action@v4 + with: + working-directory: ui + install: false + start: yarn run serve-build + wait-on: 'http://localhost:5000' + + - name: Run Component Tests + uses: cypress-io/github-action@v4 + with: + working-directory: ui + install: false + component: true + + - name: Archive test screenshots + uses: actions/upload-artifact@v2 + if: failure() + with: + name: cypress-screenshots + path: ui/cypress/screenshots + + - name: Archive test videos + uses: actions/upload-artifact@v2 + if: always() + with: + name: cypress-videos + path: ui/cypress/videos + diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 63dcfd1437..3bf0960ae3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -5,19 +5,22 @@ on: - released - prereleased +permissions: + contents: read + jobs: publish: runs-on: ubuntu-latest name: Gradle Build and Publish steps: - - uses: actions/checkout@v2 - - name: Set up Zulu JDK 11 - uses: actions/setup-java@v2 + - uses: actions/checkout@v3 + - name: Set up Zulu JDK 17 + uses: actions/setup-java@v3 with: distribution: 'zulu' - java-version: '11' + java-version: '17' - name: Cache Gradle packages - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: | ~/.gradle/caches @@ -27,7 +30,7 @@ jobs: ${{ runner.os }}-gradle- - name: Publish candidate if: startsWith(github.ref, 'refs/tags/v') && contains(github.ref, '-rc.') - run: ./gradlew -x :conductor-contribs:test -Prelease.useLastTag=true candidate --scan + run: ./gradlew -Prelease.useLastTag=true candidate --scan env: NETFLIX_OSS_SONATYPE_USERNAME: ${{ secrets.ORG_SONATYPE_USERNAME }} NETFLIX_OSS_SONATYPE_PASSWORD: ${{ secrets.ORG_SONATYPE_PASSWORD }} @@ -37,7 +40,7 @@ jobs: NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }} - name: Publish release if: startsWith(github.ref, 'refs/tags/v') && (!contains(github.ref, '-rc.')) - run: ./gradlew -x :conductor-contribs:test -Prelease.useLastTag=true final --scan + run: ./gradlew -Prelease.useLastTag=true final --scan env: NETFLIX_OSS_SONATYPE_USERNAME: ${{ secrets.ORG_SONATYPE_USERNAME }} NETFLIX_OSS_SONATYPE_PASSWORD: ${{ secrets.ORG_SONATYPE_PASSWORD }} @@ -45,3 +48,19 @@ jobs: NETFLIX_OSS_SIGNING_PASSWORD: ${{ secrets.ORG_SIGNING_PASSWORD }} NETFLIX_OSS_REPO_USERNAME: ${{ secrets.ORG_NETFLIXOSS_USERNAME }} NETFLIX_OSS_REPO_PASSWORD: ${{ secrets.ORG_NETFLIXOSS_PASSWORD }} + - name: Publish tag to community repo + if: startsWith(github.ref, 'refs/tags/v') + run: | + export TAG=$(git describe --tags --abbrev=0) + echo "Current release version is $TAG" + echo "Triggering community build" + curl \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: Bearer ${{ secrets.COMMUNITY_REPO_TRIGGER }}" \ + -X POST https://api.github.com/repos/Netflix/conductor-community/dispatches \ + -d '{"event_type": "publish_build","client_payload": {"tag":"'"$TAG"'"}}' + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + if: always() # always run even if the previous step fails + with: + report_paths: '**/build/test-results/test/TEST-*.xml' diff --git a/.github/workflows/release_draft.yml b/.github/workflows/release_draft.yml index 896edaf4a3..2f185417d7 100644 --- a/.github/workflows/release_draft.yml +++ b/.github/workflows/release_draft.yml @@ -5,8 +5,14 @@ on: branches: - main +permissions: + contents: read + jobs: update_release_draft: + permissions: + contents: write # for release-drafter/release-drafter to create a github release + pull-requests: write # for release-drafter/release-drafter to add label to PR runs-on: ubuntu-latest steps: - uses: release-drafter/release-drafter@v5 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 49086caac1..a90156f3b0 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -4,11 +4,17 @@ on: schedule: - cron: "0 0 * * *" +permissions: + contents: read + jobs: stale: + permissions: + issues: write # for actions/stale to close stale issues + pull-requests: write # for actions/stale to close stale PRs runs-on: ubuntu-latest steps: - - uses: actions/stale@v3 + - uses: actions/stale@v6 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'This issue is stale, because it has been open for 45 days with no activity. Remove the stale label or comment, or this will be closed in 7 days.' diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 5410c42039..831e6d5aab 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -9,10 +9,11 @@ jobs: update-gradle-wrapper: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 + - uses: actions/checkout@v3 + - name: Set up Zulu JDK 17 + uses: actions/setup-java@v3 with: - java-version: 1.8 + distribution: 'zulu' + java-version: '17' - name: Update Gradle Wrapper uses: gradle-update/update-gradle-wrapper-action@v1 diff --git a/.gitignore b/.gitignore index a988200f58..95729213ae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,27 +1,38 @@ -**/node_modules -**/npm-debug.log -ui/dist -ui/package-lock.json +# Java Build .gradle -.project +.classpath +dump.rdb +out bin -build -client/python/conductor.egg-info +target +buildscan.log +/docs/site + +# Python +/polyglot-clients/python/conductor.egg-info *.pyc -.classpath -docs/site -site -ui/.settings + +# OS & IDE +.DS_Store .settings -dump.rdb +.vscode .idea +.project *.iml -out/ -bin/ -target/ -.DS_Store -.vscode/ -buildscan.log + +# JS & UI Related +node_modules +/ui/build +/ui/public/monaco-editor # publishing secrets secrets/signing-key + +# local builds +lib/ +build/ +*/build/ + +# asdf version file +.tool-versions + diff --git a/CHANGELOG.md b/CHANGELOG.md index b453a5bfe0..c17a8bda8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,7 @@ Removed APIs: ## What's changed Changes to configurations: -`azureblob-storage` module: +### `azureblob-storage` module: | Old | New | Default | | --- | --- | --- | @@ -49,7 +49,7 @@ Changes to configurations: | workflow.external.payload.storage.azure_blob.task_input_path | conductor.external-payload-storage.azureblob.taskInputPath | task/input/ | | workflow.external.payload.storage.azure_blob.task_output_path | conductor.external-payload-storage.azureblob.taskOutputPath | task/output/ | -`cassandra-persistence` module: +### `cassandra-persistence` module: | Old | New | Default | | --- | --- | --- | @@ -67,7 +67,7 @@ Changes to configurations: | conductor.eventhandler.cache.refresh.time.seconds | conductor.cassandra.eventHandlerCacheRefreshInterval | 60s | | workflow.event.execution.persistence.ttl.seconds | conductor.cassandra.eventExecutionPersistenceTTL | 0s | -`contribs` module: +### `contribs` module: | Old | New | Default | | --- | --- | --- | @@ -121,7 +121,7 @@ Changes to configurations: | kafka.publish.producer.cache.size | conductor.tasks.kafka-publish.cacheSize | 10 | | kafka.publish.producer.cache.time.ms | conductor.tasks.kafka-publish.cacheTime | 120000ms | -`core` module: +### `core` module: | Old | New | Default | | --- | --- | --- | @@ -131,6 +131,7 @@ Changes to configurations: | workflow.executor.service.max.threads | conductor.app.executorServiceMaxThreadCount | 50 | | decider.sweep.frequency.seconds | conductor.app.sweepFrequency | 30s | | workflow.sweeper.thread.count | conductor.app.sweeperThreadCount | 5 | +| - | conductor.app.sweeperWorkflowPollTimeout | 2000ms | | workflow.event.processor.thread.count | conductor.app.eventProcessorThreadCount | 2 | | workflow.event.message.indexing.enabled | conductor.app.eventMessageIndexingEnabled | true | | workflow.event.execution.indexing.enabled | conductor.app.eventExecutionIndexingEnabled | true | @@ -174,7 +175,7 @@ Changes to configurations: | workflow.monitor.metadata.refresh.counter | conductor.workflow-monitor.metadataRefreshInterval | 10 | | workflow.monitor.stats.freq.seconds | conductor.workflow-monitor.statsFrequency | 60s | -`es6-persistence` module: +### `es6-persistence` module: | Old | New | Default | | --- | --- | --- | @@ -195,14 +196,37 @@ Changes to configurations: | workflow.elasticsearch.auto.index.management.enabled | conductor.elasticsearch.autoIndexManagementEnabled | true | | workflow.elasticsearch.document.type.override | conductor.elasticsearch.documentTypeOverride | "" | -`grpc-server` module: +### `es7-persistence` module: + +| Old | New | Default | +| --- | --- | --- | +| workflow.elasticsearch.version | conductor.elasticsearch.version | 7 | +| workflow.elasticsearch.url | conductor.elasticsearch.url | localhost:9300 | +| workflow.elasticsearch.index.name | conductor.elasticsearch.indexPrefix | conductor | +| workflow.elasticsearch.tasklog.index.name | _removed_ | | +| workflow.elasticsearch.cluster.health.color | conductor.elasticsearch.clusterHealthColor | green | +| workflow.elasticsearch.archive.search.batchSize | _removed_ | | +| workflow.elasticsearch.index.batchSize | conductor.elasticsearch.indexBatchSize | 1 | +| workflow.elasticsearch.async.dao.worker.queue.size | conductor.elasticsearch.asyncWorkerQueueSize | 100 | +| workflow.elasticsearch.async.dao.max.pool.size | conductor.elasticsearch.asyncMaxPoolSize | 12 | +| workflow.elasticsearch.async.buffer.flush.timeout.seconds | conductor.elasticsearch.asyncBufferFlushTimeout | 10s | +| workflow.elasticsearch.index.shard.count | conductor.elasticsearch.indexShardCount | 5 | +| workflow.elasticsearch.index.replicas.count | conductor.elasticsearch.indexReplicasCount | 1 | +| tasklog.elasticsearch.query.size | conductor.elasticsearch.taskLogResultLimit | 10 | +| workflow.elasticsearch.rest.client.connectionRequestTimeout.milliseconds | conductor.elasticsearch.restClientConnectionRequestTimeout | -1 | +| workflow.elasticsearch.auto.index.management.enabled | conductor.elasticsearch.autoIndexManagementEnabled | true | +| workflow.elasticsearch.document.type.override | conductor.elasticsearch.documentTypeOverride | "" | +| workflow.elasticsearch.basic.auth.username | conductor.elasticsearch.username | "" | +| workflow.elasticsearch.basic.auth.password | conductor.elasticsearch.password | "" | + +### `grpc-server` module: | Old | New | Default | | --- | --- | --- | | conductor.grpc.server.port | conductor.grpc-server.port | 8090 | | conductor.grpc.server.reflectionEnabled | conductor.grpc-server.reflectionEnabled | true | -`mysql-persistence` module (v3.0.0 - v3.0.5): +### `mysql-persistence` module (v3.0.0 - v3.0.5): | Old | New | Default | | --- | --- | --- | @@ -220,7 +244,7 @@ Changes to configurations: | conductor.mysql.autocommit | conductor.mysql.autoCommit | false | | conductor.taskdef.cache.refresh.time.seconds | conductor.mysql.taskDefCacheRefreshInterval | 60s | -`mysql-persistence` module (v3.0.5+): +### `mysql-persistence` module (v3.0.5+): | Old | New | | --- | --- | @@ -240,7 +264,7 @@ Changes to configurations: * for more properties and default values: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#application-properties.data.spring.datasource.hikari -`postgres-persistence` module (v3.0.0 - v3.0.5): +### `postgres-persistence` module (v3.0.0 - v3.0.5): | Old | New | Default | | --- | --- | --- | @@ -258,7 +282,7 @@ Changes to configurations: | conductor.postgres.autocommit | conductor.postgres.autoCommit | false | | conductor.taskdef.cache.refresh.time.seconds | conductor.postgres.taskDefCacheRefreshInterval | 60s | -`postgres-persistence` module (v3.0.5+): +### `postgres-persistence` module (v3.0.5+): | Old | New | | --- | --- | @@ -278,7 +302,7 @@ Changes to configurations: * for more properties and default values: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#application-properties.data.spring.datasource.hikari -`redis-lock` module: +### `redis-lock` module: | Old | New | Default | | --- | --- | --- | @@ -289,7 +313,7 @@ Changes to configurations: | workflow.decider.locking.namespace | conductor.redis-lock.namespace | "" | | workflow.decider.locking.exceptions.ignore | conductor.redis-lock.ignoreLockingExceptions | false | -`redis-persistence` module: +### `redis-persistence` module: | Old | New | Default | | --- | --- | --- | @@ -309,7 +333,7 @@ Changes to configurations: | conductor.taskdef.cache.refresh.time.seconds | conductor.redis.taskDefCacheRefreshInterval | 60s | | workflow.event.execution.persistence.ttl.seconds | conductor.redis.eventExecutionPersistenceTTL | 60s | -`zookeeper-lock` module: +### `zookeeper-lock` module: | Old | New | Default | | --- | --- | --- | @@ -318,7 +342,7 @@ Changes to configurations: | workflow.zookeeper.lock.connectionTimeoutMs | conductor.zookeeper-lock.connectionTimeout | 15000ms | | workflow.decider.locking.namespace | conductor.zookeeper-lock.namespace | "" | -Component configuration: +### Component configuration: | Old | New | Default | | --- | --- | --- | @@ -331,6 +355,7 @@ Component configuration: | workflow.default.event.processor.enabled | conductor.default-event-processor.enabled | true | | workflow.events.default.queue.type | conductor.default-event-queue.type | sqs | | workflow.status.listener.type | conductor.workflow-status-listener.type | stub | +| - | conductor.task-status-listener.type | stub | | workflow.decider.locking.server | conductor.workflow-execution-lock.type | noop_lock | | | | | | workflow.default.event.queue.enabled | conductor.event-queues.default.enabled | true | diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f8076bc629..b9c30c3292 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,49 +1 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment -include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at netflixoss@netflix.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see -https://www.contributor-covenant.org/faq +[Code of Conduct](docs/docs/resources/code-of-conduct.md) \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4cc22ae9c2..ba24e0019e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,72 +1 @@ -Thanks for your interest in Conductor! -This guide helps to find the most efficient way to contribute, ask questions, and report issues. - -Code of conduct ------ - -Please review our [code of conduct](CODE_OF_CONDUCT.md). - -I have a question! ------ - -We have a dedicated [discussion forum](https://github.com/Netflix/conductor/discussions) for asking "how to" questions and to discuss ideas. The discussion forum is a great place to start if you're considering creating a feature request or work on a Pull Request. -*Please do not create issues to ask questions.* - -I want to contribute! ------- - -We welcome Pull Requests and already had many outstanding community contributions! -Creating and reviewing Pull Requests take considerable time. This section helps you set up for a smooth Pull Request experience. - -The stable branch is [main](https://github.com/Netflix/conductor/tree/main). - -Please create pull requests for your contributions against [main](https://github.com/Netflix/conductor/tree/main) only. - -It's a great idea to discuss the new feature you're considering on the [discussion forum](https://github.com/Netflix/conductor/discussions) before writing any code. There are often different ways you can implement a feature. Getting some discussion about different options helps shape the best solution. When starting directly with a Pull Request, there is the risk of having to make considerable changes. Sometimes that is the best approach, though! Showing an idea with code can be very helpful; be aware that it might be throw-away work. Some of our best Pull Requests came out of multiple competing implementations, which helped shape it to perfection. - -Also, consider that not every feature is a good fit for Conductor. A few things to consider are: - -* Is it increasing complexity for the user, or might it be confusing? -* Does it, in any way, break backward compatibility (this is seldom acceptable) -* Does it require new dependencies (this is rarely acceptable for core modules) -* Should the feature be opt-in or enabled by default. For integration with a new Queuing recipe or persistence module, a separate module which can be optionally enabled is the right choice. -* Should the feature be implemented in the main Conductor repository, or would it be better to set up a separate repository? Especially for integration with other systems, a separate repository is often the right choice because the life-cycle of it will be different. - -Of course, for more minor bug fixes and improvements, the process can be more light-weight. - -We'll try to be responsive to Pull Requests. Do keep in mind that because of the inherently distributed nature of open source projects, responses to a PR might take some time because of time zones, weekends, and other things we may be working on. - -I want to report an issue ------ - -If you found a bug, it is much appreciated if you create an issue. Please include clear instructions on how to reproduce the issue, or even better, include a test case on a branch. Make sure to come up with a descriptive title for the issue because this helps while organizing issues. - -I have a great idea for a new feature ----- -Many features in Conductor have come from ideas from the community. If you think something is missing or certain use cases could be supported better, let us know! You can do so by opening a discussion on the [discussion forum](https://github.com/Netflix/conductor/discussions). Provide as much relevant context to why and when the feature would be helpful. Providing context is especially important for "Support XYZ" issues since we might not be familiar with what "XYZ" is and why it's useful. If you have an idea of how to implement the feature, include that as well. - -Once we have decided on a direction, it's time to summarize the idea by creating a new issue. - - -## License - -By contributing your code, you agree to license your contribution under the terms of the APLv2: https://github.com/Netflix/conductor/blob/master/LICENSE - -All files are released with the Apache 2.0 license. - -If you are adding a new file it should have a header like this: - -``` -/** - * Copyright 2021 Netflix, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on - * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the - * specific language governing permissions and limitations under the License. - */ -``` +[Contributing](docs/docs/resources/contributing.md) \ No newline at end of file diff --git a/README.md b/README.md index a58899807d..0d24f30669 100644 --- a/README.md +++ b/README.md @@ -1,89 +1,90 @@ -![Conductor](docs/docs/img/conductor-vector-x.png) +![Conductor](docs/docs/img/logo.png) +## Announcement -## Conductor -Conductor is an _orchestration_ engine that runs in the cloud. +> Effective **December 13, 2023**, Netflix will discontinue maintenance of Conductor OSS on GitHub. This strategic decision, while difficult, is essential for realigning our resources to better serve our business objectives with our internal Conductor fork. +> +> We are *deeply grateful* for your support and contributions over the years. While Netflix will no longer be maintaining this repo, members of the Conductor community have been active in promoting alternative forks of this project, we’ll leave the code as is and trust that the health of the community will remain strong and continue to develop moving forward. +# Conductor +[![NetflixOSS Lifecycle](https://img.shields.io/osslifecycle/Netflix/conductor.svg)]() [![Github release](https://img.shields.io/github/v/release/Netflix/conductor.svg)](https://GitHub.com/Netflix/conductor/releases) -[![CI](https://github.com/Netflix/conductor/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Netflix/conductor/actions/workflows/ci.yml) [![License](https://img.shields.io/github/license/Netflix/conductor.svg)](http://www.apache.org/licenses/LICENSE-2.0) -[![NetflixOSS Lifecycle](https://img.shields.io/osslifecycle/Netflix/conductor.svg)]() - -## Community -[Discussion Forum](https://github.com/Netflix/conductor/discussions) Please use the forum for questions and discussing ideas and join the community. - -[Access here other Conductor related projects made by the community!](/RELATED.md) - Backup tool, Cron like workflow starter, Docker containers... - -## Builds -| Branch | Build | -|:------:|:-------------------------------------------------------------------------------------------------------------:| -| main | [![CI](https://github.com/Netflix/conductor/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Netflix/conductor/actions/workflows/ci.yml) | -| 2.31 | [![Build Status](https://travis-ci.com/Netflix/conductor.svg?branch=2.31)](https://travis-ci.com/Netflix/conductor) | - - -## Running Conductor -The latest version is [![Github release](https://img.shields.io/github/v/release/Netflix/conductor.svg)](https://GitHub.com/Netflix/conductor/releases). Conductor can be started up with an in-memory persistence and queue implementation. It is not recommended for production use but can come in handy for quickly evaluating what Conductor's all about. For actual production use-cases, please use one of the supported persistence and queue implementations. - -If Docker is installed, please follow the instructions [here](https://github.com/Netflix/conductor/tree/main/docker). - -If Java 11 or above is installed, Conductor [publishes](https://artifacts.netflix.net/netflixoss/com/netflix/conductor/conductor-server/) an executable jar that can be run using, - -`java -jar conductor-server-*-boot.jar` - -## Documentation & Getting Started -[Documentation](http://netflix.github.io/conductor/) -[Roadmap](https://github.com/Netflix/conductor/wiki/Roadmap) - -[Getting Started](https://netflix.github.io/conductor/gettingstarted/basicconcepts/) guide. - -## Get Conductor -Binaries are available from [Netflix OSS Maven](https://artifacts.netflix.net/netflixoss/com/netflix/conductor/) repository. - -Below are the various artifacts published: -| Artifact | Description | -| ----------- | --------------- | -| conductor-common | Common models used by various conductor modules | -| conductor-core | Core Conductor module | -| conductor-redis-persistence | Persistence and queue using Redis/Dynomite | -| conductor-cassandra-persistence | Persistence using Cassandra | -| conductor-mysql-persistence | Persistence and queue using MySQL | -| conductor-postgres-persistence | Persistence and queue using Postgres | -| conductor-es6-persistence | Indexing using Elasticsearch 6.X | -| conductor-rest | Spring MVC resources for the core services | -| conductor-ui | node.js based UI for Conductor | -| conductor-contribs | Optional contrib package that holds extended workflow tasks and support for SQS, AMQP, etc| -| conductor-client | Java client for Conductor that includes helpers for running worker tasks | -| conductor-client-spring | Client starter kit for Spring | -| conductor-server | Spring Boot Web Application | -| conductor-azureblob-storage | External payload storage implementation using AzureBlob | -| conductor-redis-lock | Workflow execution lock implementation using Redis | -| conductor-zookeeper-lock | Workflow execution lock implementation using Zookeeper | -| conductor-grpc | Protobuf models used by the server and client | -| conductor-grpc-client | gRPC server Application | -| conductor-grpc-server | gRPC client to interact with the gRPC server | -| conductor-test-harness | Integration and regression tests | +[![GitHub stars](https://img.shields.io/github/stars/Netflix/conductor.svg?style=social&label=Star&maxAge=2592000)](https://GitHub.com/Netflix/conductor/stargazers/) +[![GitHub forks](https://img.shields.io/github/forks/Netflix/conductor.svg?style=social&label=Fork&maxAge=2592000)](https://GitHub.com/Netflix/conductor/network/) + +Conductor is a platform created by Netflix to orchestrate workflows that span across microservices. + +## Releases +The final release is [![Github release](https://img.shields.io/github/v/release/Netflix/conductor.svg)](https://GitHub.com/Netflix/conductor/releases) + +## Workflow Creation in Code +Conductor supports creating workflows using JSON and Code. +SDK support for creating workflows using code is available in multiple languages and can be found at https://github.com/conductor-sdk + +## Community Contributions +The modules contributed by the community are housed at [conductor-community](https://github.com/Netflix/conductor-community). Compatible versions of the community modules are released simultaneously with releases of the main modules. + +[Discussion Forum](https://github.com/Netflix/conductor/discussions): Please use the forum for questions and discussing ideas and join the community. + +[List of Conductor community projects](/docs/docs/resources/related.md): Backup tool, Cron like workflow starter, Docker containers and more. + +## Getting Started - Building & Running Conductor +### Using Docker: +The easiest way to get started is with Docker containers. Please follow the instructions [here](https://conductor.netflix.com/devguide/running/docker.html). + +### From Source: +Conductor Server is a [Spring Boot](https://spring.io/projects/spring-boot) project and follows all applicable conventions. See instructions [here](https://conductor.netflix.com/devguide/running/source.html). + +## Published Artifacts +Binaries are available from the [Maven Central Repository](https://search.maven.org/search?q=g:com.netflix.conductor). + +| Artifact | Description | +|---------------------------------|-------------------------------------------------------------------------------------------------| +| conductor-common | Common models used by various conductor modules | +| conductor-core | Core Conductor module | +| conductor-redis-persistence | Persistence and queue using Redis/Dynomite | +| conductor-cassandra-persistence | Persistence using Cassandra | +| conductor-es6-persistence | Indexing using Elasticsearch 6.X | +| conductor-rest | Spring MVC resources for the core services | +| conductor-ui | node.js based UI for Conductor | +| conductor-client | Java client for Conductor that includes helpers for running worker tasks | +| conductor-client-spring | Client starter kit for Spring | +| conductor-java-sdk | SDK for writing workflows in code | +| conductor-server | Spring Boot Web Application | +| conductor-redis-lock | Workflow execution lock implementation using Redis | +| conductor-awss3-storage | External payload storage implementation using AWS S3 | +| conductor-awssqs-event-queue | Event queue implementation using AWS SQS | +| conductor-http-task | Workflow system task implementation to send make requests | +| conductor-json-jq-task | Workflow system task implementation to evaluate JSON using [jq](https://stedolan.github.io/jq/) | +| conductor-grpc | Protobuf models used by the server and client | +| conductor-grpc-client | gRPC client to interact with the gRPC server | +| conductor-grpc-server | gRPC server Application | +| conductor-test-harness | Integration and regression tests | ## Database Requirements -* The default persistence used is [Dynomite](https://github.com/Netflix/dynomite) -* For queues, we are relying on [dyno-queues](https://github.com/Netflix/dyno-queues) +* The default persistence used is Redis * The indexing backend is [Elasticsearch](https://www.elastic.co/) (6.x) ## Other Requirements -* JDK 11+ +* JDK 17+ +* UI requires Node 14 to build. Earlier Node versions may work but is untested. ## Get Support -Conductor is maintained by Media Workflow Infrastructure team at Netflix. Use github issue tracking for filing issues and [Discussion Forum](https://github.com/Netflix/conductor/discussions) for any other questions, ideas or support requests. +There are several ways to get in touch with us: +* [Slack Community](https://join.slack.com/t/orkes-conductor/shared_invite/zt-xyxqyseb-YZ3hwwAgHJH97bsrYRnSZg) +* [GitHub Discussion Forum](https://github.com/Netflix/conductor/discussions) ## Contributions -Whether it is a small documentation correction, bug fix or new features, contributions are highly appreciated. We just ask to follow standard oss guidelines. [Discussion Forum](https://github.com/Netflix/conductor/discussions) is a good place to ask questions, discuss new features and explore ideas. Please check with us before spending too much time, only to find later that someone else is already working on a similar feature. +Whether it is a small documentation correction, bug fix or a new feature, contributions are highly appreciated. We just ask you to follow standard OSS guidelines. The [Discussion Forum](https://github.com/Netflix/conductor/discussions) is a good place to ask questions, discuss new features and explore ideas. Please check with us before spending too much time, only to find out later that someone else is already working on a similar feature. -`main` branch is the current working branch, while `2.31` branch is the latest stable 2.x branch. Please send your PR's to `main` branch, making sure that it builds on your local system successfully. Also, please make sure all the conflicts are resolved. +`main` branch is the current working branch. Please send your PR's to `main` branch, making sure that it builds on your local system successfully. Also, please make sure all the conflicts are resolved. ## License -Copyright 2021 Netflix, Inc. +Copyright 2022 Netflix, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/RELATED.md b/RELATED.md index 19ad4ef6b3..b7adabea3f 100644 --- a/RELATED.md +++ b/RELATED.md @@ -1,64 +1 @@ -# Community projects related to Conductor - - -## Microservices operations - -* https://github.com/flaviostutz/schellar - Schellar is a scheduler tool for instantiating Conductor workflows from time to time, mostly like a cron job, but with transport of input/output variables between calls. - -* https://github.com/flaviostutz/backtor - Backtor is a backup scheduler tool that uses Conductor workers to handle backup operations and decide when to expire backups (ex.: keep backup 3 days, 2 weeks, 2 months, 1 semester) - -* https://github.com/cquon/conductor-tools - Conductor CLI for launching workflows, polling tasks, listing running tasks etc - - -## Conductor deployment - -* https://github.com/flaviostutz/conductor-server - Docker container for running Conductor with Prometheus metrics plugin installed and some tweaks to ease provisioning of workflows from json files embedded to the container - -* https://github.com/flaviostutz/conductor-ui - Docker container for running Conductor UI so that you can easily scale UI independently - -* https://github.com/flaviostutz/elasticblast - "Elasticsearch to Bleve" bridge tailored for running Conductor on top of Bleve indexer. The footprint of Elasticsearch may cost too much for small deployments on Cloud environment. - -* https://github.com/mohelsaka/conductor-prometheus-metrics - Conductor plugin for exposing Prometheus metrics over path '/metrics' - -## OAuth2.0 Security Configuration -Forked Repository - [Conductor (Secure)](https://github.com/maheshyaddanapudi/conductor/tree/oauth2) - -[OAuth2.0 Role Based Security!](https://github.com/maheshyaddanapudi/conductor/blob/oauth2/SECURITY.md) - Spring Security with easy configuration to secure the Conductor server APIs. - -Docker image published to [Docker Hub](https://hub.docker.com/repository/docker/conductorboot/server) - -## Conductor Worker utilities - -* https://github.com/ggrcha/conductor-go-client - Conductor Golang client for writing Workers in Golang - -* https://github.com/courosh12/conductor-dotnet-client - Conductor DOTNET client for writing Workers in DOTNET - * https://github.com/TwoUnderscorez/serilog-sinks-conductor-task-log - Serilog sink for sending worker log events to Netflix Conductor - -* https://github.com/davidwadden/conductor-workers - Various ready made Conductor workers for common operations on some platforms (ex.: Jira, Github, Concourse) - -## Conductor Web UI - -* https://github.com/maheshyaddanapudi/conductor-ng-ui - Angular based - Conductor Workflow Management UI - -## Conductor Persistence - -### Mongo Persistence - -* https://github.com/maheshyaddanapudi/conductor/tree/mongo_persistence - With option to use Mongo Database as persistence unit. - * Mongo Persistence / Option to use Mongo Database as persistence unit. - * Docker Compose example with MongoDB Container. - -### Oracle Persistence - -* https://github.com/maheshyaddanapudi/conductor/tree/oracle_persistence - With option to use Oracle Database as persistence unit. - * Oracle Persistence / Option to use Oracle Database as persistence unit : version > 12.2 - Tested well with 19C - * Docker Compose example with Oracle Container. - -## Schedule Conductor Workflow -* https://github.com/jas34/scheduledwf - It solves the following problem statements: - * At times there are use cases in which we need to run some tasks/jobs only at a scheduled time. - * In microservice architecture maintaining schedulers in various microservices is a pain. - * We should have a central dedicate service that can do scheduling for us and provide a trigger to a microservices at expected time. -* It offers an additional module `io.github.jas34.scheduledwf.config.ScheduledWfServerModule` built on the existing core -of conductor and does not require deployment of any additional service. -For more details refer: [Schedule Conductor Workflows](https://jas34.github.io/scheduledwf) and [Capability In Conductor To Schedule Workflows](https://github.com/Netflix/conductor/discussions/2256) \ No newline at end of file +[Related Projects](docs/docs/resources/related.md) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..80978ee5bd --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 3.x.x | :white_check_mark: | +| 2.x.x | :x: | +| 1.x.x | :x: | + +## Reporting a Vulnerability + +Please email conductor@netflix.com to report vulnerabilities. diff --git a/USERS.md b/USERS.md new file mode 100644 index 0000000000..3fe8ab685b --- /dev/null +++ b/USERS.md @@ -0,0 +1,18 @@ + +## Who uses Conductor? + +We would like to keep track of whose using Conductor. Please send a pull request with your company name and Github handle. + +* [Netflix](https://www.netflix.com/) [[@aravindanr](https://github.com/aravindanr)] +* [Florida Blue](http://bcbsfl.com/) [[@rickfish](https://github.com/rickfish)] +* [UWM](https://www.uwm.com/) [[@zergrushjoe](https://github.com/ZergRushJoe)] +* [Deutsche Telekom Digital Labs](https://dtdl.in) [[@jas34](https://github.com/jas34)] [[@deoramanas](https://github.com/deoramanas)] +* [VMware](https://www.vmware.com/) [[@taojwmware](https://github.com/taojwmware)] [[@venkag](https://github.com/venkag)] +* [JP Morgan Chase](https://www.chase.com/) [[@maheshyaddanapudi](https://github.com/maheshyaddanapudi)] +* [Orkes](https://orkes.io/) [[@CherishSantoshi](https://github.com/CherishSantoshi)] +* [313X](https://313x.com.br) [[@dalmoveras](https://github.com/dalmoveras)] +* [Supercharge](https://supercharge.io) [[@team-supercharge](https://github.com/team-supercharge)] +* [GE Healthcare](https://www.gehealthcare.com/) [[@flavioschuindt](https://github.com/flavioschuindt)] +* [ReliaQuest](https://www.reliaquest.com/) [[@rq-dbrady](https://github.com/rq-dbrady)] [[@alexmay48](https://github.com/alexmay48)] +* [Clari](https://www.clari.com/) [[@TeamJOF](https://github.com/clari)] +* [Atlassian](https://www.atlassian.com/) [[@LuisLainez](https://github.com/LuisLainez)] [[@aradu](https://github.com/aradu-atlassian)] diff --git a/annotations-processor/README.md b/annotations-processor/README.md new file mode 100644 index 0000000000..13ec4a3d0f --- /dev/null +++ b/annotations-processor/README.md @@ -0,0 +1 @@ +[Annotations Processor](docs/docs/reference-docs/annotations-processor.md) \ No newline at end of file diff --git a/annotations-processor/build.gradle b/annotations-processor/build.gradle new file mode 100644 index 0000000000..008983429f --- /dev/null +++ b/annotations-processor/build.gradle @@ -0,0 +1,24 @@ + +sourceSets { + example +} + +dependencies { + implementation project(':conductor-annotations') + api 'com.google.guava:guava:32.1.2-jre' + api 'com.squareup:javapoet:1.13.+' + api 'com.github.jknack:handlebars:4.3.+' + api 'com.google.protobuf:protobuf-java:3.21.12' + api 'javax.annotation:javax.annotation-api:1.3.2' + api gradleApi() + + exampleImplementation sourceSets.main.output + exampleImplementation project(':conductor-annotations') +} + +task exampleJar(type: Jar) { + archiveFileName = 'example.jar' + from sourceSets.example.output.classesDirs +} + +testClasses.finalizedBy(exampleJar) diff --git a/annotations-processor/dependencies.lock b/annotations-processor/dependencies.lock new file mode 100644 index 0000000000..1c9fbc411d --- /dev/null +++ b/annotations-processor/dependencies.lock @@ -0,0 +1,535 @@ +{ + "annotationProcessor": { + "org.springframework.boot:spring-boot-configuration-processor": { + "locked": "2.7.16" + } + }, + "compileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-joda": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.module:jackson-module-afterburner": { + "locked": "2.15.0" + }, + "com.github.jknack:handlebars": { + "locked": "4.3.1" + }, + "com.google.guava:guava": { + "locked": "32.1.2-jre" + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.21.12" + }, + "com.netflix.conductor:conductor-annotations": { + "project": true + }, + "com.squareup:javapoet": { + "locked": "1.13.0" + }, + "javax.annotation:javax.annotation-api": { + "locked": "1.3.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.yaml:snakeyaml": { + "locked": "2.0" + } + }, + "exampleCompileClasspath": { + "com.netflix.conductor:conductor-annotations": { + "project": true + } + }, + "exampleRuntimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.core:jackson-core": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.core:jackson-databind": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-joda": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.fasterxml.jackson.module:jackson-module-afterburner": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.13.5" + }, + "com.netflix.conductor:conductor-annotations": { + "project": true + }, + "org.apache.logging.log4j:log4j-api": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-core": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-jul": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-web": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.yaml:snakeyaml": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "1.30" + } + }, + "runtimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-core": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-databind": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-joda": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.module:jackson-module-afterburner": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.github.jknack:handlebars": { + "locked": "4.3.1" + }, + "com.google.guava:guava": { + "locked": "32.1.2-jre" + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.21.12" + }, + "com.netflix.conductor:conductor-annotations": { + "project": true + }, + "com.squareup:javapoet": { + "locked": "1.13.0" + }, + "javax.annotation:javax.annotation-api": { + "locked": "1.3.2" + }, + "org.apache.logging.log4j:log4j-api": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-core": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-jul": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-web": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.yaml:snakeyaml": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.0" + } + }, + "testCompileClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-core": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-databind": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-joda": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { + "locked": "2.15.0" + }, + "com.fasterxml.jackson.module:jackson-module-afterburner": { + "locked": "2.15.0" + }, + "com.github.jknack:handlebars": { + "locked": "4.3.1" + }, + "com.google.guava:guava": { + "locked": "32.1.2-jre" + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.21.12" + }, + "com.netflix.conductor:conductor-annotations": { + "project": true + }, + "com.squareup:javapoet": { + "locked": "1.13.0" + }, + "javax.annotation:javax.annotation-api": { + "locked": "1.3.2" + }, + "junit:junit": { + "locked": "4.13.2" + }, + "net.java.dev.jna:jna": { + "locked": "5.13.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" + }, + "org.yaml:snakeyaml": { + "locked": "2.0" + } + }, + "testRuntimeClasspath": { + "com.fasterxml.jackson.core:jackson-annotations": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-core": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.core:jackson-databind": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-joda": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.fasterxml.jackson.module:jackson-module-afterburner": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.15.0" + }, + "com.github.jknack:handlebars": { + "locked": "4.3.1" + }, + "com.google.guava:guava": { + "locked": "32.1.2-jre" + }, + "com.google.protobuf:protobuf-java": { + "locked": "3.21.12" + }, + "com.netflix.conductor:conductor-annotations": { + "project": true + }, + "com.squareup:javapoet": { + "locked": "1.13.0" + }, + "javax.annotation:javax.annotation-api": { + "locked": "1.3.2" + }, + "junit:junit": { + "locked": "4.13.2" + }, + "net.java.dev.jna:jna": { + "locked": "5.13.0" + }, + "org.apache.logging.log4j:log4j-api": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-core": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-jul": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-slf4j-impl": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.17.2" + }, + "org.apache.logging.log4j:log4j-web": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "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" + }, + "org.yaml:snakeyaml": { + "firstLevelTransitive": [ + "com.netflix.conductor:conductor-annotations" + ], + "locked": "2.0" + } + } +} \ No newline at end of file diff --git a/annotations-processor/src/example/java/com/example/Example.java b/annotations-processor/src/example/java/com/example/Example.java new file mode 100644 index 0000000000..b3c7befe83 --- /dev/null +++ b/annotations-processor/src/example/java/com/example/Example.java @@ -0,0 +1,25 @@ +/* + * Copyright 2022 Netflix, Inc. + *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package com.example; + +import com.netflix.conductor.annotations.protogen.ProtoField; +import com.netflix.conductor.annotations.protogen.ProtoMessage; + +@ProtoMessage +public class Example { + @ProtoField(id = 1) + public String name; + + @ProtoField(id = 2) + public Long count; +} diff --git a/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/AbstractMessage.java b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/AbstractMessage.java new file mode 100644 index 0000000000..bc92d901f7 --- /dev/null +++ b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/AbstractMessage.java @@ -0,0 +1,134 @@ +/* + * Copyright 2022 Netflix, Inc. + *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + *
+ * http://www.apache.org/licenses/LICENSE-2.0 + *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.annotationsprocessor.protogen;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import com.netflix.conductor.annotations.protogen.ProtoEnum;
+import com.netflix.conductor.annotations.protogen.ProtoMessage;
+import com.netflix.conductor.annotationsprocessor.protogen.types.MessageType;
+import com.netflix.conductor.annotationsprocessor.protogen.types.TypeMapper;
+
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeSpec;
+
+public abstract class AbstractMessage {
+ protected Class> clazz;
+ protected MessageType type;
+ protected List
+ * 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.annotationsprocessor.protogen;
+
+import javax.lang.model.element.Modifier;
+
+import com.netflix.conductor.annotationsprocessor.protogen.types.MessageType;
+
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeName;
+import com.squareup.javapoet.TypeSpec;
+
+public class Enum extends AbstractMessage {
+ public enum MapType {
+ FROM_PROTO("fromProto"),
+ TO_PROTO("toProto");
+
+ private final String methodName;
+
+ MapType(String m) {
+ methodName = m;
+ }
+
+ public String getMethodName() {
+ return methodName;
+ }
+ }
+
+ public Enum(Class cls, MessageType parent) {
+ super(cls, parent);
+
+ int protoIndex = 0;
+ for (java.lang.reflect.Field field : cls.getDeclaredFields()) {
+ if (field.isEnumConstant()) fields.add(new EnumField(protoIndex++, field));
+ }
+ }
+
+ @Override
+ public String getProtoClass() {
+ return "enum";
+ }
+
+ private MethodSpec javaMap(MapType mt, TypeName from, TypeName to) {
+ MethodSpec.Builder method = MethodSpec.methodBuilder(mt.getMethodName());
+ method.addModifiers(Modifier.PUBLIC);
+ method.returns(to);
+ method.addParameter(from, "from");
+
+ method.addStatement("$T to", to);
+ method.beginControlFlow("switch (from)");
+
+ for (Field field : fields) {
+ String fromName = (mt == MapType.TO_PROTO) ? field.getName() : field.getProtoName();
+ String toName = (mt == MapType.TO_PROTO) ? field.getProtoName() : field.getName();
+ method.addStatement("case $L: to = $T.$L; break", fromName, to, toName);
+ }
+
+ method.addStatement(
+ "default: throw new $T(\"Unexpected enum constant: \" + from)",
+ IllegalArgumentException.class);
+ method.endControlFlow();
+ method.addStatement("return to");
+ return method.build();
+ }
+
+ @Override
+ protected void javaMapFromProto(TypeSpec.Builder type) {
+ type.addMethod(
+ javaMap(
+ MapType.FROM_PROTO,
+ this.type.getJavaProtoType(),
+ TypeName.get(this.clazz)));
+ }
+
+ @Override
+ protected void javaMapToProto(TypeSpec.Builder type) {
+ type.addMethod(
+ javaMap(MapType.TO_PROTO, TypeName.get(this.clazz), this.type.getJavaProtoType()));
+ }
+
+ public class EnumField extends Field {
+ protected EnumField(int index, java.lang.reflect.Field field) {
+ super(index, field);
+ }
+
+ @Override
+ public String getProtoTypeDeclaration() {
+ return String.format("%s = %d", getProtoName(), getProtoIndex());
+ }
+ }
+}
diff --git a/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/Message.java b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/Message.java
new file mode 100644
index 0000000000..9dfaf28832
--- /dev/null
+++ b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/Message.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.annotationsprocessor.protogen;
+
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.lang.model.element.Modifier;
+
+import com.netflix.conductor.annotations.protogen.ProtoField;
+import com.netflix.conductor.annotations.protogen.ProtoMessage;
+import com.netflix.conductor.annotationsprocessor.protogen.types.AbstractType;
+import com.netflix.conductor.annotationsprocessor.protogen.types.MessageType;
+import com.netflix.conductor.annotationsprocessor.protogen.types.TypeMapper;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeSpec;
+
+public class Message extends AbstractMessage {
+ public Message(Class> cls, MessageType parent) {
+ super(cls, parent);
+
+ for (java.lang.reflect.Field field : clazz.getDeclaredFields()) {
+ ProtoField ann = field.getAnnotation(ProtoField.class);
+ if (ann == null) continue;
+
+ fields.add(new MessageField(ann.id(), field));
+ }
+ }
+
+ protected ProtoMessage getAnnotation() {
+ return (ProtoMessage) this.clazz.getAnnotation(ProtoMessage.class);
+ }
+
+ @Override
+ public String getProtoClass() {
+ return "message";
+ }
+
+ @Override
+ protected void javaMapToProto(TypeSpec.Builder type) {
+ if (!getAnnotation().toProto() || getAnnotation().wrapper()) return;
+
+ ClassName javaProtoType = (ClassName) this.type.getJavaProtoType();
+ MethodSpec.Builder method = MethodSpec.methodBuilder("toProto");
+ method.addModifiers(Modifier.PUBLIC);
+ method.returns(javaProtoType);
+ method.addParameter(this.clazz, "from");
+
+ method.addStatement(
+ "$T to = $T.newBuilder()", javaProtoType.nestedClass("Builder"), javaProtoType);
+
+ for (Field field : this.fields) {
+ if (field instanceof MessageField) {
+ AbstractType fieldType = ((MessageField) field).getAbstractType();
+ fieldType.mapToProto(field.getName(), method);
+ }
+ }
+
+ method.addStatement("return to.build()");
+ type.addMethod(method.build());
+ }
+
+ @Override
+ protected void javaMapFromProto(TypeSpec.Builder type) {
+ if (!getAnnotation().fromProto() || getAnnotation().wrapper()) return;
+
+ MethodSpec.Builder method = MethodSpec.methodBuilder("fromProto");
+ method.addModifiers(Modifier.PUBLIC);
+ method.returns(this.clazz);
+ method.addParameter(this.type.getJavaProtoType(), "from");
+
+ method.addStatement("$T to = new $T()", this.clazz, this.clazz);
+
+ for (Field field : this.fields) {
+ if (field instanceof MessageField) {
+ AbstractType fieldType = ((MessageField) field).getAbstractType();
+ fieldType.mapFromProto(field.getName(), method);
+ }
+ }
+
+ method.addStatement("return to");
+ type.addMethod(method.build());
+ }
+
+ public static class MessageField extends Field {
+ protected AbstractType type;
+
+ protected MessageField(int index, java.lang.reflect.Field field) {
+ super(index, field);
+ }
+
+ public AbstractType getAbstractType() {
+ if (type == null) {
+ type = TypeMapper.INSTANCE.get(field.getGenericType());
+ }
+ return type;
+ }
+
+ private static Pattern CAMEL_CASE_RE = Pattern.compile("(?<=[a-z])[A-Z]");
+
+ private static String toUnderscoreCase(String input) {
+ Matcher m = CAMEL_CASE_RE.matcher(input);
+ StringBuilder sb = new StringBuilder();
+ while (m.find()) {
+ m.appendReplacement(sb, "_" + m.group());
+ }
+ m.appendTail(sb);
+ return sb.toString().toLowerCase();
+ }
+
+ @Override
+ public String getProtoTypeDeclaration() {
+ return String.format(
+ "%s %s = %d",
+ getAbstractType().getProtoType(), toUnderscoreCase(getName()), getProtoIndex());
+ }
+
+ @Override
+ public void getDependencies(Set
+ * 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.annotationsprocessor.protogen;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import com.netflix.conductor.annotationsprocessor.protogen.types.TypeMapper;
+
+import com.squareup.javapoet.ClassName;
+
+public class ProtoFile {
+ public static String PROTO_SUFFIX = "Pb";
+
+ private ClassName baseClass;
+ private AbstractMessage message;
+ private String filePath;
+
+ private String protoPackageName;
+ private String javaPackageName;
+ private String goPackageName;
+
+ public ProtoFile(
+ Class> object,
+ String protoPackageName,
+ String javaPackageName,
+ String goPackageName) {
+ this.protoPackageName = protoPackageName;
+ this.javaPackageName = javaPackageName;
+ this.goPackageName = goPackageName;
+
+ String className = object.getSimpleName() + PROTO_SUFFIX;
+ this.filePath = "model/" + object.getSimpleName().toLowerCase() + ".proto";
+ this.baseClass = ClassName.get(this.javaPackageName, className);
+ this.message = new Message(object, TypeMapper.INSTANCE.baseClass(baseClass, filePath));
+ }
+
+ public String getJavaClassName() {
+ return baseClass.simpleName();
+ }
+
+ public String getFilePath() {
+ return filePath;
+ }
+
+ public String getProtoPackageName() {
+ return protoPackageName;
+ }
+
+ public String getJavaPackageName() {
+ return javaPackageName;
+ }
+
+ public String getGoPackageName() {
+ return goPackageName;
+ }
+
+ public AbstractMessage getMessage() {
+ return message;
+ }
+
+ public Set
+ * 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.annotationsprocessor.protogen;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.*;
+
+import javax.annotation.Generated;
+import javax.lang.model.element.Modifier;
+
+import com.netflix.conductor.annotations.protogen.ProtoMessage;
+
+import com.github.jknack.handlebars.EscapingStrategy;
+import com.github.jknack.handlebars.Handlebars;
+import com.github.jknack.handlebars.Template;
+import com.github.jknack.handlebars.io.ClassPathTemplateLoader;
+import com.github.jknack.handlebars.io.TemplateLoader;
+import com.google.common.reflect.ClassPath;
+import com.squareup.javapoet.AnnotationSpec;
+import com.squareup.javapoet.JavaFile;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeSpec;
+
+public class ProtoGen {
+ private static final String GENERATOR_NAME =
+ "com.netflix.conductor.annotationsprocessor.protogen";
+
+ private String protoPackageName;
+ private String javaPackageName;
+ private String goPackageName;
+ private List
+ * 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.annotationsprocessor.protogen;
+
+import java.io.File;
+import java.io.IOException;
+
+public class ProtoGenTask {
+ private String protoPackage;
+ private String javaPackage;
+ private String goPackage;
+
+ private File protosDir;
+ private File mapperDir;
+ private String mapperPackage;
+
+ private File sourceJar;
+ private String sourcePackage;
+
+ public String getProtoPackage() {
+ return protoPackage;
+ }
+
+ public void setProtoPackage(String protoPackage) {
+ this.protoPackage = protoPackage;
+ }
+
+ public String getJavaPackage() {
+ return javaPackage;
+ }
+
+ public void setJavaPackage(String javaPackage) {
+ this.javaPackage = javaPackage;
+ }
+
+ public String getGoPackage() {
+ return goPackage;
+ }
+
+ public void setGoPackage(String goPackage) {
+ this.goPackage = goPackage;
+ }
+
+ public File getProtosDir() {
+ return protosDir;
+ }
+
+ public void setProtosDir(File protosDir) {
+ this.protosDir = protosDir;
+ }
+
+ public File getMapperDir() {
+ return mapperDir;
+ }
+
+ public void setMapperDir(File mapperDir) {
+ this.mapperDir = mapperDir;
+ }
+
+ public String getMapperPackage() {
+ return mapperPackage;
+ }
+
+ public void setMapperPackage(String mapperPackage) {
+ this.mapperPackage = mapperPackage;
+ }
+
+ public File getSourceJar() {
+ return sourceJar;
+ }
+
+ public void setSourceJar(File sourceJar) {
+ this.sourceJar = sourceJar;
+ }
+
+ public String getSourcePackage() {
+ return sourcePackage;
+ }
+
+ public void setSourcePackage(String sourcePackage) {
+ this.sourcePackage = sourcePackage;
+ }
+
+ public void generate() {
+ ProtoGen generator = new ProtoGen(protoPackage, javaPackage, goPackage);
+ try {
+ generator.processPackage(sourceJar, sourcePackage);
+ generator.writeMapper(mapperDir, mapperPackage);
+ generator.writeProtos(protosDir);
+ } catch (IOException e) {
+ System.err.printf("protogen: failed with %s\n", e);
+ }
+ }
+
+ public static void main(String[] args) {
+ if (args == null || args.length < 8) {
+ throw new RuntimeException(
+ "protogen configuration incomplete, please provide all required (8) inputs");
+ }
+ ProtoGenTask task = new ProtoGenTask();
+ int argsId = 0;
+ task.setProtoPackage(args[argsId++]);
+ task.setJavaPackage(args[argsId++]);
+ task.setGoPackage(args[argsId++]);
+ task.setProtosDir(new File(args[argsId++]));
+ task.setMapperDir(new File(args[argsId++]));
+ task.setMapperPackage(args[argsId++]);
+ task.setSourceJar(new File(args[argsId++]));
+ task.setSourcePackage(args[argsId]);
+ System.out.println("Running protogen with arguments: " + task);
+ task.generate();
+ System.out.println("protogen completed.");
+ }
+
+ @Override
+ public String toString() {
+ return "ProtoGenTask{"
+ + "protoPackage='"
+ + protoPackage
+ + '\''
+ + ", javaPackage='"
+ + javaPackage
+ + '\''
+ + ", goPackage='"
+ + goPackage
+ + '\''
+ + ", protosDir="
+ + protosDir
+ + ", mapperDir="
+ + mapperDir
+ + ", mapperPackage='"
+ + mapperPackage
+ + '\''
+ + ", sourceJar="
+ + sourceJar
+ + ", sourcePackage='"
+ + sourcePackage
+ + '\''
+ + '}';
+ }
+}
diff --git a/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/AbstractType.java b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/AbstractType.java
new file mode 100644
index 0000000000..fbfa8e72c7
--- /dev/null
+++ b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/AbstractType.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeName;
+
+public abstract class AbstractType {
+ Type javaType;
+ TypeName javaProtoType;
+
+ AbstractType(Type javaType, TypeName javaProtoType) {
+ this.javaType = javaType;
+ this.javaProtoType = javaProtoType;
+ }
+
+ public Type getJavaType() {
+ return javaType;
+ }
+
+ public TypeName getJavaProtoType() {
+ return javaProtoType;
+ }
+
+ public abstract String getProtoType();
+
+ public abstract TypeName getRawJavaType();
+
+ public abstract void mapToProto(String field, MethodSpec.Builder method);
+
+ public abstract void mapFromProto(String field, MethodSpec.Builder method);
+
+ public abstract void getDependencies(Set
+ * 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.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import javax.lang.model.element.Modifier;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.MethodSpec;
+
+public class ExternMessageType extends MessageType {
+ private String externProtoType;
+
+ public ExternMessageType(
+ Type javaType, ClassName javaProtoType, String externProtoType, String protoFilePath) {
+ super(javaType, javaProtoType, protoFilePath);
+ this.externProtoType = externProtoType;
+ }
+
+ @Override
+ public String getProtoType() {
+ return externProtoType;
+ }
+
+ @Override
+ public void generateAbstractMethods(Set
+ * 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.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeName;
+
+abstract class GenericType extends AbstractType {
+ public GenericType(Type type) {
+ super(type, null);
+ }
+
+ protected Class getRawType() {
+ ParameterizedType tt = (ParameterizedType) this.getJavaType();
+ return (Class) tt.getRawType();
+ }
+
+ protected AbstractType resolveGenericParam(int idx) {
+ ParameterizedType tt = (ParameterizedType) this.getJavaType();
+ Type[] types = tt.getActualTypeArguments();
+
+ AbstractType abstractType = TypeMapper.INSTANCE.get(types[idx]);
+ if (abstractType instanceof GenericType) {
+ return WrappedType.wrap((GenericType) abstractType);
+ }
+ return abstractType;
+ }
+
+ public abstract String getWrapperSuffix();
+
+ public abstract AbstractType getValueType();
+
+ public abstract TypeName resolveJavaProtoType();
+
+ @Override
+ public TypeName getRawJavaType() {
+ return ClassName.get(getRawType());
+ }
+
+ @Override
+ public void getDependencies(Set
+ * 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.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.Type;
+import java.util.stream.Collectors;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterizedTypeName;
+import com.squareup.javapoet.TypeName;
+
+public class ListType extends GenericType {
+ private AbstractType valueType;
+
+ public ListType(Type type) {
+ super(type);
+ }
+
+ @Override
+ public String getWrapperSuffix() {
+ return "List";
+ }
+
+ @Override
+ public AbstractType getValueType() {
+ if (valueType == null) {
+ valueType = resolveGenericParam(0);
+ }
+ return valueType;
+ }
+
+ @Override
+ public void mapToProto(String field, MethodSpec.Builder method) {
+ AbstractType subtype = getValueType();
+ if (subtype instanceof ScalarType) {
+ method.addStatement(
+ "to.$L( from.$L() )",
+ protoMethodName("addAll", field),
+ javaMethodName("get", field));
+ } else {
+ method.beginControlFlow(
+ "for ($T elem : from.$L())",
+ subtype.getJavaType(),
+ javaMethodName("get", field));
+ method.addStatement("to.$L( toProto(elem) )", protoMethodName("add", field));
+ method.endControlFlow();
+ }
+ }
+
+ @Override
+ public void mapFromProto(String field, MethodSpec.Builder method) {
+ AbstractType subtype = getValueType();
+ Type entryType = subtype.getJavaType();
+ Class collector = TypeMapper.PROTO_LIST_TYPES.get(getRawType());
+
+ if (subtype instanceof ScalarType) {
+ if (entryType.equals(String.class)) {
+ method.addStatement(
+ "to.$L( from.$L().stream().collect($T.toCollection($T::new)) )",
+ javaMethodName("set", field),
+ protoMethodName("get", field) + "List",
+ Collectors.class,
+ collector);
+ } else {
+ method.addStatement(
+ "to.$L( from.$L() )",
+ javaMethodName("set", field),
+ protoMethodName("get", field) + "List");
+ }
+ } else {
+ method.addStatement(
+ "to.$L( from.$L().stream().map(this::fromProto).collect($T.toCollection($T::new)) )",
+ javaMethodName("set", field),
+ protoMethodName("get", field) + "List",
+ Collectors.class,
+ collector);
+ }
+ }
+
+ @Override
+ public TypeName resolveJavaProtoType() {
+ return ParameterizedTypeName.get(
+ (ClassName) getRawJavaType(), getValueType().getJavaProtoType());
+ }
+
+ @Override
+ public String getProtoType() {
+ return "repeated " + getValueType().getProtoType();
+ }
+}
diff --git a/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MapType.java b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MapType.java
new file mode 100644
index 0000000000..fe642fdecc
--- /dev/null
+++ b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MapType.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.ParameterizedTypeName;
+import com.squareup.javapoet.TypeName;
+
+public class MapType extends GenericType {
+ private AbstractType keyType;
+ private AbstractType valueType;
+
+ public MapType(Type type) {
+ super(type);
+ }
+
+ @Override
+ public String getWrapperSuffix() {
+ return "Map";
+ }
+
+ @Override
+ public AbstractType getValueType() {
+ if (valueType == null) {
+ valueType = resolveGenericParam(1);
+ }
+ return valueType;
+ }
+
+ public AbstractType getKeyType() {
+ if (keyType == null) {
+ keyType = resolveGenericParam(0);
+ }
+ return keyType;
+ }
+
+ @Override
+ public void mapToProto(String field, MethodSpec.Builder method) {
+ AbstractType valueType = getValueType();
+ if (valueType instanceof ScalarType) {
+ method.addStatement(
+ "to.$L( from.$L() )",
+ protoMethodName("putAll", field),
+ javaMethodName("get", field));
+ } else {
+ TypeName typeName =
+ ParameterizedTypeName.get(
+ Map.Entry.class,
+ getKeyType().getJavaType(),
+ getValueType().getJavaType());
+ method.beginControlFlow(
+ "for ($T pair : from.$L().entrySet())", typeName, javaMethodName("get", field));
+ method.addStatement(
+ "to.$L( pair.getKey(), toProto( pair.getValue() ) )",
+ protoMethodName("put", field));
+ method.endControlFlow();
+ }
+ }
+
+ @Override
+ public void mapFromProto(String field, MethodSpec.Builder method) {
+ AbstractType valueType = getValueType();
+ if (valueType instanceof ScalarType) {
+ method.addStatement(
+ "to.$L( from.$L() )",
+ javaMethodName("set", field),
+ protoMethodName("get", field) + "Map");
+ } else {
+ Type keyType = getKeyType().getJavaType();
+ Type valueTypeJava = getValueType().getJavaType();
+ TypeName valueTypePb = getValueType().getJavaProtoType();
+
+ ParameterizedTypeName entryType =
+ ParameterizedTypeName.get(
+ ClassName.get(Map.Entry.class), TypeName.get(keyType), valueTypePb);
+ ParameterizedTypeName mapType =
+ ParameterizedTypeName.get(Map.class, keyType, valueTypeJava);
+ ParameterizedTypeName hashMapType =
+ ParameterizedTypeName.get(HashMap.class, keyType, valueTypeJava);
+ String mapName = field + "Map";
+
+ method.addStatement("$T $L = new $T()", mapType, mapName, hashMapType);
+ method.beginControlFlow(
+ "for ($T pair : from.$L().entrySet())",
+ entryType,
+ protoMethodName("get", field) + "Map");
+ method.addStatement("$L.put( pair.getKey(), fromProto( pair.getValue() ) )", mapName);
+ method.endControlFlow();
+ method.addStatement("to.$L($L)", javaMethodName("set", field), mapName);
+ }
+ }
+
+ @Override
+ public TypeName resolveJavaProtoType() {
+ return ParameterizedTypeName.get(
+ (ClassName) getRawJavaType(),
+ getKeyType().getJavaProtoType(),
+ getValueType().getJavaProtoType());
+ }
+
+ @Override
+ public String getProtoType() {
+ AbstractType keyType = getKeyType();
+ AbstractType valueType = getValueType();
+ if (!(keyType instanceof ScalarType)) {
+ throw new IllegalArgumentException(
+ "cannot map non-scalar map key: " + this.getJavaType());
+ }
+ return String.format("map<%s, %s>", keyType.getProtoType(), valueType.getProtoType());
+ }
+}
diff --git a/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MessageType.java b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MessageType.java
new file mode 100644
index 0000000000..d572287733
--- /dev/null
+++ b/annotations-processor/src/main/java/com/netflix/conductor/annotationsprocessor/protogen/types/MessageType.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Set;
+
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeName;
+
+public class MessageType extends AbstractType {
+ private String protoFilePath;
+
+ public MessageType(Type javaType, ClassName javaProtoType, String protoFilePath) {
+ super(javaType, javaProtoType);
+ this.protoFilePath = protoFilePath;
+ }
+
+ @Override
+ public String getProtoType() {
+ List
+ * 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.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeName;
+
+public class ScalarType extends AbstractType {
+ private String protoType;
+
+ public ScalarType(Type javaType, TypeName javaProtoType, String protoType) {
+ super(javaType, javaProtoType);
+ this.protoType = protoType;
+ }
+
+ @Override
+ public String getProtoType() {
+ return protoType;
+ }
+
+ @Override
+ public TypeName getRawJavaType() {
+ return getJavaProtoType();
+ }
+
+ @Override
+ public void mapFromProto(String field, MethodSpec.Builder method) {
+ method.addStatement(
+ "to.$L( from.$L() )", javaMethodName("set", field), protoMethodName("get", field));
+ }
+
+ private boolean isNullableType() {
+ final Type jt = getJavaType();
+ return jt.equals(Boolean.class)
+ || jt.equals(Byte.class)
+ || jt.equals(Character.class)
+ || jt.equals(Short.class)
+ || jt.equals(Integer.class)
+ || jt.equals(Long.class)
+ || jt.equals(Double.class)
+ || jt.equals(Float.class)
+ || jt.equals(String.class);
+ }
+
+ @Override
+ public void mapToProto(String field, MethodSpec.Builder method) {
+ final boolean nullable = isNullableType();
+ String getter =
+ (getJavaType().equals(boolean.class) || getJavaType().equals(Boolean.class))
+ ? javaMethodName("is", field)
+ : javaMethodName("get", field);
+
+ if (nullable) method.beginControlFlow("if (from.$L() != null)", getter);
+
+ method.addStatement("to.$L( from.$L() )", protoMethodName("set", field), getter);
+
+ if (nullable) method.endControlFlow();
+ }
+
+ @Override
+ public void getDependencies(Set
+ * 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.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.*;
+
+import com.google.protobuf.Any;
+import com.squareup.javapoet.ClassName;
+import com.squareup.javapoet.TypeName;
+
+public class TypeMapper {
+ static Map
+ * 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.annotationsprocessor.protogen.types;
+
+import java.lang.reflect.Type;
+import java.util.Set;
+
+import javax.lang.model.element.Modifier;
+
+import com.squareup.javapoet.MethodSpec;
+import com.squareup.javapoet.TypeName;
+
+public class WrappedType extends AbstractType {
+ private AbstractType realType;
+ private MessageType wrappedType;
+
+ public static WrappedType wrap(GenericType realType) {
+ Type valueType = realType.getValueType().getJavaType();
+ if (!(valueType instanceof Class))
+ throw new IllegalArgumentException("cannot wrap primitive type: " + valueType);
+
+ String className = ((Class) valueType).getSimpleName() + realType.getWrapperSuffix();
+ MessageType wrappedType = TypeMapper.INSTANCE.get(className);
+ if (wrappedType == null)
+ throw new IllegalArgumentException("missing wrapper class: " + className);
+ return new WrappedType(realType, wrappedType);
+ }
+
+ public WrappedType(AbstractType realType, MessageType wrappedType) {
+ super(realType.getJavaType(), wrappedType.getJavaProtoType());
+ this.realType = realType;
+ this.wrappedType = wrappedType;
+ }
+
+ @Override
+ public String getProtoType() {
+ return wrappedType.getProtoType();
+ }
+
+ @Override
+ public TypeName getRawJavaType() {
+ return realType.getRawJavaType();
+ }
+
+ @Override
+ public void mapToProto(String field, MethodSpec.Builder method) {
+ wrappedType.mapToProto(field, method);
+ }
+
+ @Override
+ public void mapFromProto(String field, MethodSpec.Builder method) {
+ wrappedType.mapFromProto(field, method);
+ }
+
+ @Override
+ public void getDependencies(Set
+ * 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.annotationsprocessor.protogen;
+
+import java.io.File;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+import com.google.common.io.Resources;
+
+import static org.junit.Assert.*;
+
+public class ProtoGenTest {
+ private static final Charset charset = StandardCharsets.UTF_8;
+
+ @Rule public TemporaryFolder folder = new TemporaryFolder();
+
+ @Test
+ public void happyPath() throws Exception {
+ File rootDir = folder.getRoot();
+ String protoPackage = "protoPackage";
+ String javaPackage = "abc.protogen.example";
+ String goPackage = "goPackage";
+ String sourcePackage = "com.example";
+ String mapperPackage = "mapperPackage";
+
+ File jarFile = new File("./build/libs/example.jar");
+ assertTrue(jarFile.exists());
+
+ File mapperDir = new File(rootDir, "mapperDir");
+ mapperDir.mkdirs();
+
+ File protosDir = new File(rootDir, "protosDir");
+ protosDir.mkdirs();
+
+ File modelDir = new File(protosDir, "model");
+ modelDir.mkdirs();
+
+ ProtoGen generator = new ProtoGen(protoPackage, javaPackage, goPackage);
+ generator.processPackage(jarFile, sourcePackage);
+ generator.writeMapper(mapperDir, mapperPackage);
+ generator.writeProtos(protosDir);
+
+ List
+ * 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.annotations.protogen;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * ProtoEnum annotates an enum type that will be exposed via the GRPC API as a native Protocol
+ * Buffers enum.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface ProtoEnum {}
diff --git a/annotations/src/main/java/com/netflix/conductor/annotations/protogen/ProtoField.java b/annotations/src/main/java/com/netflix/conductor/annotations/protogen/ProtoField.java
new file mode 100644
index 0000000000..25ab478c8c
--- /dev/null
+++ b/annotations/src/main/java/com/netflix/conductor/annotations/protogen/ProtoField.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.annotations.protogen;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * ProtoField annotates a field inside an struct with metadata on how to expose it on its
+ * corresponding Protocol Buffers struct. For a field to be exposed in a ProtoBuf struct, the
+ * containing struct must also be annotated with a {@link ProtoMessage} or {@link ProtoEnum} tag.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.FIELD)
+public @interface ProtoField {
+ /**
+ * Mandatory. Sets the Protocol Buffer ID for this specific field. Once a field has been
+ * annotated with a given ID, the ID can never change to a different value or the resulting
+ * Protocol Buffer struct will not be backwards compatible.
+ *
+ * @return the numeric ID for the field
+ */
+ int id();
+}
diff --git a/annotations/src/main/java/com/netflix/conductor/annotations/protogen/ProtoMessage.java b/annotations/src/main/java/com/netflix/conductor/annotations/protogen/ProtoMessage.java
new file mode 100644
index 0000000000..d66e4aa435
--- /dev/null
+++ b/annotations/src/main/java/com/netflix/conductor/annotations/protogen/ProtoMessage.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.annotations.protogen;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * ProtoMessage annotates a given Java class so it becomes exposed via the GRPC API as a native
+ * Protocol Buffers struct. The annotated class must be a POJO.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+public @interface ProtoMessage {
+ /**
+ * Sets whether the generated mapping code will contain a helper to translate the POJO for this
+ * class into the equivalent ProtoBuf object.
+ *
+ * @return whether this class will generate a mapper to ProtoBuf objects
+ */
+ boolean toProto() default true;
+
+ /**
+ * Sets whether the generated mapping code will contain a helper to translate the ProtoBuf
+ * object for this class into the equivalent POJO.
+ *
+ * @return whether this class will generate a mapper from ProtoBuf objects
+ */
+ boolean fromProto() default true;
+
+ /**
+ * Sets whether this is a wrapper class that will be used to encapsulate complex nested type
+ * interfaces. Wrapper classes are not directly exposed by the ProtoBuf API and must be mapped
+ * manually.
+ *
+ * @return whether this is a wrapper class
+ */
+ boolean wrapper() default false;
+}
diff --git a/awss3-storage/README.md b/awss3-storage/README.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/awss3-storage/build.gradle b/awss3-storage/build.gradle
new file mode 100644
index 0000000000..adda2bb426
--- /dev/null
+++ b/awss3-storage/build.gradle
@@ -0,0 +1,21 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+
+dependencies {
+ implementation project(':conductor-common')
+ implementation project(':conductor-core')
+ compileOnly 'org.springframework.boot:spring-boot-starter'
+
+ implementation "com.amazonaws:aws-java-sdk-s3:${revAwsSdk}"
+ implementation "org.apache.commons:commons-lang3"
+}
diff --git a/awss3-storage/dependencies.lock b/awss3-storage/dependencies.lock
new file mode 100644
index 0000000000..311ecc794b
--- /dev/null
+++ b/awss3-storage/dependencies.lock
@@ -0,0 +1,632 @@
+{
+ "annotationProcessor": {
+ "org.springframework.boot:spring-boot-configuration-processor": {
+ "locked": "2.7.16"
+ }
+ },
+ "compileClasspath": {
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "org.apache.commons:commons-lang3": {
+ "locked": "3.12.0"
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.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.yaml:snakeyaml": {
+ "locked": "2.0"
+ }
+ },
+ "runtimeClasspath": {
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.9.3"
+ },
+ "com.google.protobuf:protobuf-java": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.24.3"
+ },
+ "com.jayway.jsonpath:json-path": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.7.0"
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common"
+ ],
+ "project": true
+ },
+ "com.netflix.conductor:conductor-common": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.netflix.spectator:spectator-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "0.122.0"
+ },
+ "com.spotify:completable-futures": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "0.3.3"
+ },
+ "commons-io:commons-io": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.7"
+ },
+ "io.reactivex:rxjava": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "1.3.8"
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "1.2.2"
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.3.3"
+ },
+ "org.apache.bval:bval-jsr": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0.6"
+ },
+ "org.apache.commons:commons-lang3": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.12.0"
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.openjdk.nashorn:nashorn-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "15.4"
+ },
+ "org.yaml:snakeyaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0"
+ }
+ },
+ "testCompileClasspath": {
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "junit:junit": {
+ "locked": "4.13.2"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.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.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"
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "2.0"
+ }
+ },
+ "testRuntimeClasspath": {
+ "com.amazonaws:aws-java-sdk-s3": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.9.3"
+ },
+ "com.google.protobuf:protobuf-java": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.24.3"
+ },
+ "com.jayway.jsonpath:json-path": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.7.0"
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common"
+ ],
+ "project": true
+ },
+ "com.netflix.conductor:conductor-common": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
+ },
+ "com.netflix.spectator:spectator-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "0.122.0"
+ },
+ "com.spotify:completable-futures": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "0.3.3"
+ },
+ "commons-io:commons-io": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.7"
+ },
+ "io.reactivex:rxjava": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "1.3.8"
+ },
+ "jakarta.activation:jakarta.activation-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "1.2.2"
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.3.3"
+ },
+ "junit:junit": {
+ "locked": "4.13.2"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.0"
+ },
+ "org.apache.bval:bval-jsr": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0.6"
+ },
+ "org.apache.commons:commons-lang3": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.12.0"
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.8.2"
+ },
+ "org.openjdk.nashorn:nashorn-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "15.4"
+ },
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.7.16"
+ },
+ "org.springframework.boot:spring-boot-starter-test": {
+ "locked": "2.7.16"
+ },
+ "org.yaml:snakeyaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0"
+ }
+ }
+}
\ No newline at end of file
diff --git a/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java
new file mode 100644
index 0000000000..5b8e6b3dcd
--- /dev/null
+++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Configuration.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.s3.config;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.netflix.conductor.common.utils.ExternalPayloadStorage;
+import com.netflix.conductor.core.utils.IDGenerator;
+import com.netflix.conductor.s3.storage.S3PayloadStorage;
+
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.AmazonS3ClientBuilder;
+
+@Configuration
+@EnableConfigurationProperties(S3Properties.class)
+@ConditionalOnProperty(name = "conductor.external-payload-storage.type", havingValue = "s3")
+public class S3Configuration {
+
+ @Bean
+ public ExternalPayloadStorage s3ExternalPayloadStorage(
+ IDGenerator idGenerator, S3Properties properties, AmazonS3 s3Client) {
+ return new S3PayloadStorage(idGenerator, properties, s3Client);
+ }
+
+ @ConditionalOnProperty(
+ name = "conductor.external-payload-storage.s3.use_default_client",
+ havingValue = "true",
+ matchIfMissing = true)
+ @Bean
+ public AmazonS3 amazonS3(S3Properties properties) {
+ return AmazonS3ClientBuilder.standard().withRegion(properties.getRegion()).build();
+ }
+}
diff --git a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java
similarity index 84%
rename from contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java
rename to awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java
index 6b9109e34e..94a515f727 100644
--- a/contribs/src/main/java/com/netflix/conductor/contribs/storage/config/S3Properties.java
+++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/config/S3Properties.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -10,30 +10,25 @@
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package com.netflix.conductor.contribs.storage.config;
+package com.netflix.conductor.s3.config;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
+
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DurationUnit;
@ConfigurationProperties("conductor.external-payload-storage.s3")
public class S3Properties {
- /**
- * The s3 bucket name where the payloads will be stored
- */
+ /** The s3 bucket name where the payloads will be stored */
private String bucketName = "conductor_payloads";
- /**
- * The time (in seconds) for which the signed url will be valid
- */
+ /** The time (in seconds) for which the signed url will be valid */
@DurationUnit(ChronoUnit.SECONDS)
private Duration signedUrlExpirationDuration = Duration.ofSeconds(5);
- /**
- * The AWS region of the s3 bucket
- */
+ /** The AWS region of the s3 bucket */
private String region = "us-east-1";
public String getBucketName() {
diff --git a/awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java b/awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java
new file mode 100644
index 0000000000..838ab40889
--- /dev/null
+++ b/awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java
@@ -0,0 +1,179 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.s3.storage;
+
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.conductor.common.run.ExternalStorageLocation;
+import com.netflix.conductor.common.utils.ExternalPayloadStorage;
+import com.netflix.conductor.core.exception.NonTransientException;
+import com.netflix.conductor.core.exception.TransientException;
+import com.netflix.conductor.core.utils.IDGenerator;
+import com.netflix.conductor.s3.config.S3Properties;
+
+import com.amazonaws.HttpMethod;
+import com.amazonaws.SdkClientException;
+import com.amazonaws.services.s3.AmazonS3;
+import com.amazonaws.services.s3.model.*;
+
+/**
+ * An implementation of {@link ExternalPayloadStorage} using AWS S3 for storing large JSON payload
+ * data.
+ *
+ * NOTE: The S3 client assumes that access to S3 is configured on the instance.
+ *
+ * @see DefaultAWSCredentialsProviderChain
+ */
+public class S3PayloadStorage implements ExternalPayloadStorage {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(S3PayloadStorage.class);
+ private static final String CONTENT_TYPE = "application/json";
+
+ private final IDGenerator idGenerator;
+ private final AmazonS3 s3Client;
+ private final String bucketName;
+ private final long expirationSec;
+
+ public S3PayloadStorage(IDGenerator idGenerator, S3Properties properties, AmazonS3 s3Client) {
+ this.idGenerator = idGenerator;
+ this.s3Client = s3Client;
+ bucketName = properties.getBucketName();
+ expirationSec = properties.getSignedUrlExpirationDuration().getSeconds();
+ }
+
+ /**
+ * @param operation the type of {@link Operation} to be performed
+ * @param payloadType the {@link PayloadType} that is being accessed
+ * @return a {@link ExternalStorageLocation} object which contains the pre-signed URL and the s3
+ * object key for the json payload
+ */
+ @Override
+ public ExternalStorageLocation getLocation(
+ Operation operation, PayloadType payloadType, String path) {
+ try {
+ ExternalStorageLocation externalStorageLocation = new ExternalStorageLocation();
+
+ Date expiration = new Date();
+ long expTimeMillis = expiration.getTime() + 1000 * expirationSec;
+ expiration.setTime(expTimeMillis);
+
+ HttpMethod httpMethod = HttpMethod.GET;
+ if (operation == Operation.WRITE) {
+ httpMethod = HttpMethod.PUT;
+ }
+
+ String objectKey;
+ if (StringUtils.isNotBlank(path)) {
+ objectKey = path;
+ } else {
+ objectKey = getObjectKey(payloadType);
+ }
+ externalStorageLocation.setPath(objectKey);
+
+ GeneratePresignedUrlRequest generatePresignedUrlRequest =
+ new GeneratePresignedUrlRequest(bucketName, objectKey)
+ .withMethod(httpMethod)
+ .withExpiration(expiration);
+
+ externalStorageLocation.setUri(
+ s3Client.generatePresignedUrl(generatePresignedUrlRequest)
+ .toURI()
+ .toASCIIString());
+ return externalStorageLocation;
+ } catch (SdkClientException e) {
+ String msg =
+ String.format(
+ "Error communicating with S3 - operation:%s, payloadType: %s, path: %s",
+ operation, payloadType, path);
+ LOGGER.error(msg, e);
+ throw new TransientException(msg, e);
+ } catch (URISyntaxException e) {
+ String msg = "Invalid URI Syntax";
+ LOGGER.error(msg, e);
+ throw new NonTransientException(msg, e);
+ }
+ }
+
+ /**
+ * Uploads the payload to the given s3 object key. It is expected that the caller retrieves the
+ * object key using {@link #getLocation(Operation, PayloadType, String)} before making this
+ * call.
+ *
+ * @param path the s3 key of the object to be uploaded
+ * @param payload an {@link InputStream} containing the json payload which is to be uploaded
+ * @param payloadSize the size of the json payload in bytes
+ */
+ @Override
+ public void upload(String path, InputStream payload, long payloadSize) {
+ try {
+ ObjectMetadata objectMetadata = new ObjectMetadata();
+ objectMetadata.setContentType(CONTENT_TYPE);
+ objectMetadata.setContentLength(payloadSize);
+ PutObjectRequest request =
+ new PutObjectRequest(bucketName, path, payload, objectMetadata);
+ s3Client.putObject(request);
+ } catch (SdkClientException e) {
+ String msg =
+ String.format(
+ "Error uploading to S3 - path:%s, payloadSize: %d", path, payloadSize);
+ LOGGER.error(msg, e);
+ throw new TransientException(msg, e);
+ }
+ }
+
+ /**
+ * Downloads the payload stored in the s3 object.
+ *
+ * @param path the S3 key of the object
+ * @return an input stream containing the contents of the object Caller is expected to close the
+ * input stream.
+ */
+ @Override
+ public InputStream download(String path) {
+ try {
+ S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucketName, path));
+ return s3Object.getObjectContent();
+ } catch (SdkClientException e) {
+ String msg = String.format("Error downloading from S3 - path:%s", path);
+ LOGGER.error(msg, e);
+ throw new TransientException(msg, e);
+ }
+ }
+
+ private String getObjectKey(PayloadType payloadType) {
+ StringBuilder stringBuilder = new StringBuilder();
+ switch (payloadType) {
+ case WORKFLOW_INPUT:
+ stringBuilder.append("workflow/input/");
+ break;
+ case WORKFLOW_OUTPUT:
+ stringBuilder.append("workflow/output/");
+ break;
+ case TASK_INPUT:
+ stringBuilder.append("task/input/");
+ break;
+ case TASK_OUTPUT:
+ stringBuilder.append("task/output/");
+ break;
+ }
+ stringBuilder.append(idGenerator.generate()).append(".json");
+ return stringBuilder.toString();
+ }
+}
diff --git a/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json
new file mode 100644
index 0000000000..d8c1f34e5d
--- /dev/null
+++ b/awss3-storage/src/main/resources/META-INF/additional-spring-configuration-metadata.json
@@ -0,0 +1,13 @@
+{
+ "hints": [
+ {
+ "name": "conductor.external-payload-storage.type",
+ "values": [
+ {
+ "value": "s3",
+ "description": "Use AWS S3 as the external payload storage."
+ }
+ ]
+ }
+ ]
+}
diff --git a/awssqs-event-queue/README.md b/awssqs-event-queue/README.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/awssqs-event-queue/build.gradle b/awssqs-event-queue/build.gradle
new file mode 100644
index 0000000000..a795acf2ca
--- /dev/null
+++ b/awssqs-event-queue/build.gradle
@@ -0,0 +1,16 @@
+dependencies {
+ implementation project(':conductor-common')
+ implementation project(':conductor-core')
+ compileOnly 'org.springframework.boot:spring-boot-starter'
+
+ implementation "org.apache.commons:commons-lang3"
+ // SBMTODO: remove guava dep
+ implementation "com.google.guava:guava:${revGuava}"
+
+ implementation "com.amazonaws:aws-java-sdk-sqs:${revAwsSdk}"
+
+ implementation "io.reactivex:rxjava:${revRxJava}"
+
+ testImplementation 'org.springframework.boot:spring-boot-starter'
+ testImplementation project(':conductor-common').sourceSets.test.output
+}
\ No newline at end of file
diff --git a/awssqs-event-queue/dependencies.lock b/awssqs-event-queue/dependencies.lock
new file mode 100644
index 0000000000..3fe9d6ca96
--- /dev/null
+++ b/awssqs-event-queue/dependencies.lock
@@ -0,0 +1,656 @@
+{
+ "annotationProcessor": {
+ "org.springframework.boot:spring-boot-configuration-processor": {
+ "locked": "2.7.16"
+ }
+ },
+ "compileClasspath": {
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
+ },
+ "com.google.guava:guava": {
+ "locked": "32.1.2-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.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.yaml:snakeyaml": {
+ "locked": "2.0"
+ }
+ },
+ "runtimeClasspath": {
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.9.3"
+ },
+ "com.google.guava:guava": {
+ "locked": "32.1.2-jre"
+ },
+ "com.google.protobuf:protobuf-java": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.24.3"
+ },
+ "com.jayway.jsonpath:json-path": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.7.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": "1.2.2"
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.3.3"
+ },
+ "org.apache.bval:bval-jsr": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0.6"
+ },
+ "org.apache.commons:commons-lang3": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.12.0"
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.openjdk.nashorn:nashorn-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "15.4"
+ },
+ "org.yaml:snakeyaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0"
+ }
+ },
+ "testCompileClasspath": {
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
+ },
+ "com.google.guava:guava": {
+ "locked": "32.1.2-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"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.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.junit.vintage:junit-vintage-engine": {
+ "locked": "5.8.2"
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "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.yaml:snakeyaml": {
+ "locked": "2.0"
+ }
+ },
+ "testRuntimeClasspath": {
+ "com.amazonaws:aws-java-sdk-sqs": {
+ "locked": "1.12.535"
+ },
+ "com.fasterxml.jackson.core:jackson-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.core:jackson-databind": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.9.3"
+ },
+ "com.google.guava:guava": {
+ "locked": "32.1.2-jre"
+ },
+ "com.google.protobuf:protobuf-java": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.24.3"
+ },
+ "com.jayway.jsonpath:json-path": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.7.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": "1.2.2"
+ },
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.3.3"
+ },
+ "junit:junit": {
+ "locked": "4.13.2"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.0"
+ },
+ "org.apache.bval:bval-jsr": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0.6"
+ },
+ "org.apache.commons:commons-lang3": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.12.0"
+ },
+ "org.apache.logging.log4j:log4j-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.8.2"
+ },
+ "org.openjdk.nashorn:nashorn-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "15.4"
+ },
+ "org.springframework.boot:spring-boot-starter": {
+ "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.yaml:snakeyaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0"
+ }
+ }
+}
\ No newline at end of file
diff --git a/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java
new file mode 100644
index 0000000000..fb3065895f
--- /dev/null
+++ b/awssqs-event-queue/src/main/java/com/netflix/conductor/sqs/config/SQSEventQueueConfiguration.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.sqs.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+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.config.ConductorProperties;
+import com.netflix.conductor.core.events.EventQueueProvider;
+import com.netflix.conductor.core.events.queue.ObservableQueue;
+import com.netflix.conductor.model.TaskModel.Status;
+import com.netflix.conductor.sqs.eventqueue.SQSObservableQueue.Builder;
+
+import com.amazonaws.auth.AWSCredentialsProvider;
+import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
+import com.amazonaws.client.builder.AwsClientBuilder;
+import com.amazonaws.services.sqs.AmazonSQS;
+import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
+import rx.Scheduler;
+
+@Configuration
+@EnableConfigurationProperties(SQSEventQueueProperties.class)
+@ConditionalOnProperty(name = "conductor.event-queues.sqs.enabled", havingValue = "true")
+public class SQSEventQueueConfiguration {
+
+ @Autowired private SQSEventQueueProperties sqsProperties;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SQSEventQueueConfiguration.class);
+
+ @Bean
+ AWSCredentialsProvider createAWSCredentialsProvider() {
+ return new DefaultAWSCredentialsProviderChain();
+ }
+
+ @ConditionalOnMissingBean
+ @Bean
+ public AmazonSQS getSQSClient(AWSCredentialsProvider credentialsProvider) {
+ AmazonSQSClientBuilder builder =
+ AmazonSQSClientBuilder.standard().withCredentials(credentialsProvider);
+ if (!sqsProperties.getEndpoint().isEmpty()) {
+ LOGGER.info("Setting custom SQS endpoint to {}", sqsProperties.getEndpoint());
+ builder.withEndpointConfiguration(
+ new AwsClientBuilder.EndpointConfiguration(
+ sqsProperties.getEndpoint(), System.getenv("AWS_REGION")));
+ }
+ return builder.build();
+ }
+
+ @Bean
+ public EventQueueProvider sqsEventQueueProvider(
+ AmazonSQS sqsClient, SQSEventQueueProperties properties, Scheduler scheduler) {
+ return new SQSEventQueueProvider(sqsClient, properties, scheduler);
+ }
+
+ @ConditionalOnProperty(
+ name = "conductor.default-event-queue.type",
+ havingValue = "sqs",
+ matchIfMissing = true)
+ @Bean
+ public Map
+ * 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.sqs.config;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.springframework.lang.NonNull;
+
+import com.netflix.conductor.core.events.EventQueueProvider;
+import com.netflix.conductor.core.events.queue.ObservableQueue;
+import com.netflix.conductor.sqs.eventqueue.SQSObservableQueue;
+
+import com.amazonaws.services.sqs.AmazonSQS;
+import rx.Scheduler;
+
+public class SQSEventQueueProvider implements EventQueueProvider {
+
+ private final Map
+ * 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.sqs.eventqueue;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.conductor.core.events.queue.Message;
+import com.netflix.conductor.core.events.queue.ObservableQueue;
+import com.netflix.conductor.metrics.Monitors;
+
+import com.amazonaws.auth.policy.Action;
+import com.amazonaws.auth.policy.Policy;
+import com.amazonaws.auth.policy.Principal;
+import com.amazonaws.auth.policy.Resource;
+import com.amazonaws.auth.policy.Statement;
+import com.amazonaws.auth.policy.Statement.Effect;
+import com.amazonaws.auth.policy.actions.SQSActions;
+import com.amazonaws.services.sqs.AmazonSQS;
+import com.amazonaws.services.sqs.model.BatchResultErrorEntry;
+import com.amazonaws.services.sqs.model.ChangeMessageVisibilityRequest;
+import com.amazonaws.services.sqs.model.CreateQueueRequest;
+import com.amazonaws.services.sqs.model.CreateQueueResult;
+import com.amazonaws.services.sqs.model.DeleteMessageBatchRequest;
+import com.amazonaws.services.sqs.model.DeleteMessageBatchRequestEntry;
+import com.amazonaws.services.sqs.model.DeleteMessageBatchResult;
+import com.amazonaws.services.sqs.model.GetQueueAttributesResult;
+import com.amazonaws.services.sqs.model.ListQueuesRequest;
+import com.amazonaws.services.sqs.model.ListQueuesResult;
+import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
+import com.amazonaws.services.sqs.model.ReceiveMessageResult;
+import com.amazonaws.services.sqs.model.SendMessageBatchRequest;
+import com.amazonaws.services.sqs.model.SendMessageBatchRequestEntry;
+import com.amazonaws.services.sqs.model.SendMessageBatchResult;
+import com.amazonaws.services.sqs.model.SetQueueAttributesResult;
+import rx.Observable;
+import rx.Observable.OnSubscribe;
+import rx.Scheduler;
+
+public class SQSObservableQueue implements ObservableQueue {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SQSObservableQueue.class);
+ private static final String QUEUE_TYPE = "sqs";
+
+ private final String queueName;
+ private final int visibilityTimeoutInSeconds;
+ private final int batchSize;
+ private final AmazonSQS client;
+ private final long pollTimeInMS;
+ private final String queueURL;
+ private final Scheduler scheduler;
+ private volatile boolean running;
+
+ private SQSObservableQueue(
+ String queueName,
+ AmazonSQS client,
+ int visibilityTimeoutInSeconds,
+ int batchSize,
+ long pollTimeInMS,
+ List
+ * 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.sqs.eventqueue;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.stubbing.Answer;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import com.netflix.conductor.common.config.TestObjectMapperConfiguration;
+import com.netflix.conductor.common.metadata.tasks.Task;
+import com.netflix.conductor.common.metadata.tasks.TaskResult;
+import com.netflix.conductor.core.events.queue.DefaultEventQueueProcessor;
+import com.netflix.conductor.core.events.queue.Message;
+import com.netflix.conductor.core.events.queue.ObservableQueue;
+import com.netflix.conductor.core.execution.WorkflowExecutor;
+import com.netflix.conductor.model.TaskModel;
+import com.netflix.conductor.model.TaskModel.Status;
+import com.netflix.conductor.model.WorkflowModel;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.util.concurrent.Uninterruptibles;
+
+import static com.netflix.conductor.common.metadata.tasks.TaskType.TASK_TYPE_WAIT;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.Mockito.*;
+
+@SuppressWarnings("unchecked")
+@ContextConfiguration(classes = {TestObjectMapperConfiguration.class})
+@RunWith(SpringRunner.class)
+public class DefaultEventQueueProcessorTest {
+
+ private static SQSObservableQueue queue;
+ private static WorkflowExecutor workflowExecutor;
+ private DefaultEventQueueProcessor defaultEventQueueProcessor;
+
+ @Autowired private ObjectMapper objectMapper;
+
+ private static final List
+ * 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.sqs.eventqueue;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+import org.mockito.stubbing.Answer;
+
+import com.netflix.conductor.core.events.queue.Message;
+
+import com.amazonaws.services.sqs.AmazonSQS;
+import com.amazonaws.services.sqs.model.ListQueuesRequest;
+import com.amazonaws.services.sqs.model.ListQueuesResult;
+import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
+import com.amazonaws.services.sqs.model.ReceiveMessageResult;
+import com.google.common.util.concurrent.Uninterruptibles;
+import rx.Observable;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class SQSObservableQueueTest {
+
+ @Test
+ public void test() {
+
+ List
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.config;
-
-import com.netflix.conductor.azureblob.storage.AzureBlobPayloadStorage;
-import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-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;
-
-@Configuration(proxyBeanMethods = false)
-@EnableConfigurationProperties(AzureBlobProperties.class)
-@ConditionalOnProperty(name = "conductor.external-payload-storage.type", havingValue = "azureblob")
-public class AzureBlobConfiguration {
-
- @Bean
- public ExternalPayloadStorage azureBlobExternalPayloadStorage(AzureBlobProperties properties) {
- return new AzureBlobPayloadStorage(properties);
- }
-}
diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java
deleted file mode 100644
index 4682d86e84..0000000000
--- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/config/AzureBlobProperties.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.config;
-
-import java.time.Duration;
-import java.time.temporal.ChronoUnit;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.boot.convert.DurationUnit;
-
-@ConfigurationProperties("conductor.external-payload-storage.azureblob")
-public class AzureBlobProperties {
-
- /**
- * The connection string to be used to connect to Azure Blob storage
- */
- private String connectionString = null;
-
- /**
- * The name of the container where the payloads will be stored
- */
- private String containerName = "conductor-payloads";
-
- /**
- * The endpoint to be used to connect to Azure Blob storage
- */
- private String endpoint = null;
-
- /**
- * The sas token to be used for authenticating requests
- */
- private String sasToken = null;
-
- /**
- * The time for which the shared access signature is valid
- */
- @DurationUnit(ChronoUnit.SECONDS)
- private Duration signedUrlExpirationDuration = Duration.ofSeconds(5);
-
- /**
- * The path at which the workflow inputs will be stored
- */
- private String workflowInputPath = "workflow/input/";
-
- /**
- * The path at which the workflow outputs will be stored
- */
- private String workflowOutputPath = "workflow/output/";
-
- /**
- * The path at which the task inputs will be stored
- */
- private String taskInputPath = "task/input/";
-
- /**
- * The path at which the task outputs will be stored
- */
- private String taskOutputPath = "task/output/";
-
- public String getConnectionString() {
- return connectionString;
- }
-
- public void setConnectionString(String connectionString) {
- this.connectionString = connectionString;
- }
-
- public String getContainerName() {
- return containerName;
- }
-
- public void setContainerName(String containerName) {
- this.containerName = containerName;
- }
-
- public String getEndpoint() {
- return endpoint;
- }
-
- public void setEndpoint(String endpoint) {
- this.endpoint = endpoint;
- }
-
- public String getSasToken() {
- return sasToken;
- }
-
- public void setSasToken(String sasToken) {
- this.sasToken = sasToken;
- }
-
- public Duration getSignedUrlExpirationDuration() {
- return signedUrlExpirationDuration;
- }
-
- public void setSignedUrlExpirationDuration(Duration signedUrlExpirationDuration) {
- this.signedUrlExpirationDuration = signedUrlExpirationDuration;
- }
-
- public String getWorkflowInputPath() {
- return workflowInputPath;
- }
-
- public void setWorkflowInputPath(String workflowInputPath) {
- this.workflowInputPath = workflowInputPath;
- }
-
- public String getWorkflowOutputPath() {
- return workflowOutputPath;
- }
-
- public void setWorkflowOutputPath(String workflowOutputPath) {
- this.workflowOutputPath = workflowOutputPath;
- }
-
- public String getTaskInputPath() {
- return taskInputPath;
- }
-
- public void setTaskInputPath(String taskInputPath) {
- this.taskInputPath = taskInputPath;
- }
-
- public String getTaskOutputPath() {
- return taskOutputPath;
- }
-
- public void setTaskOutputPath(String taskOutputPath) {
- this.taskOutputPath = taskOutputPath;
- }
-}
diff --git a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java b/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java
deleted file mode 100644
index 25a17d0fc0..0000000000
--- a/azureblob-storage/src/main/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorage.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.storage;
-
-import com.azure.core.exception.UnexpectedLengthException;
-import com.azure.core.util.Context;
-import com.azure.storage.blob.BlobContainerClient;
-import com.azure.storage.blob.BlobContainerClientBuilder;
-import com.azure.storage.blob.models.BlobHttpHeaders;
-import com.azure.storage.blob.models.BlobStorageException;
-import com.azure.storage.blob.sas.BlobSasPermission;
-import com.azure.storage.blob.sas.BlobServiceSasSignatureValues;
-import com.azure.storage.blob.specialized.BlockBlobClient;
-import com.azure.storage.common.Utility;
-import com.azure.storage.common.implementation.credentials.SasTokenCredential;
-import com.netflix.conductor.azureblob.config.AzureBlobProperties;
-import com.netflix.conductor.common.run.ExternalStorageLocation;
-import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-import com.netflix.conductor.core.exception.ApplicationException;
-import com.netflix.conductor.core.utils.IDGenerator;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.UncheckedIOException;
-import java.time.OffsetDateTime;
-import java.time.ZoneOffset;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * An implementation of {@link ExternalPayloadStorage} using Azure Blob for storing large JSON payload data.
- *
- * @see Azure Java SDK
- */
-
-public class AzureBlobPayloadStorage implements ExternalPayloadStorage {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(AzureBlobPayloadStorage.class);
- private static final String CONTENT_TYPE = "application/json";
-
- private final String workflowInputPath;
- private final String workflowOutputPath;
- private final String taskInputPath;
- private final String taskOutputPath;
-
- private final BlobContainerClient blobContainerClient;
- private final long expirationSec;
- private final SasTokenCredential sasTokenCredential;
-
- public AzureBlobPayloadStorage(AzureBlobProperties properties) {
- workflowInputPath = properties.getWorkflowInputPath();
- workflowOutputPath = properties.getWorkflowOutputPath();
- taskInputPath = properties.getTaskInputPath();
- taskOutputPath = properties.getTaskOutputPath();
- expirationSec = properties.getSignedUrlExpirationDuration().getSeconds();
- String connectionString = properties.getConnectionString();
- String containerName = properties.getContainerName();
- String endpoint = properties.getEndpoint();
- String sasToken = properties.getSasToken();
-
- BlobContainerClientBuilder blobContainerClientBuilder = new BlobContainerClientBuilder();
- if (connectionString != null) {
- blobContainerClientBuilder.connectionString(connectionString);
- sasTokenCredential = null;
- } else if (endpoint != null) {
- blobContainerClientBuilder.endpoint(endpoint);
- if (sasToken != null) {
- sasTokenCredential = SasTokenCredential.fromSasTokenString(sasToken);
- blobContainerClientBuilder.sasToken(sasTokenCredential.getSasToken());
- } else {
- sasTokenCredential = null;
- }
- } else {
- String msg = "Missing property for connectionString OR endpoint";
- LOGGER.error(msg);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg);
- }
- blobContainerClient = blobContainerClientBuilder
- .containerName(containerName)
- .buildClient();
- }
-
- /**
- * @param operation the type of {@link Operation} to be performed
- * @param payloadType the {@link PayloadType} that is being accessed
- * @return a {@link ExternalStorageLocation} object which contains the pre-signed URL and the azure blob name for
- * the json payload
- */
- @Override
- public ExternalStorageLocation getLocation(Operation operation, PayloadType payloadType, String path) {
- try {
- ExternalStorageLocation externalStorageLocation = new ExternalStorageLocation();
-
- String objectKey;
- if (StringUtils.isNotBlank(path)) {
- objectKey = path;
- } else {
- objectKey = getObjectKey(payloadType);
- }
- externalStorageLocation.setPath(objectKey);
-
- BlockBlobClient blockBlobClient = blobContainerClient.getBlobClient(objectKey).getBlockBlobClient();
- String blobUrl = Utility.urlDecode(blockBlobClient.getBlobUrl());
-
- if (sasTokenCredential != null) {
- blobUrl = blobUrl + "?" + sasTokenCredential.getSasToken();
- } else {
- BlobSasPermission blobSASPermission = new BlobSasPermission();
- if (operation.equals(Operation.READ)) {
- blobSASPermission.setReadPermission(true);
- } else if (operation.equals(Operation.WRITE)) {
- blobSASPermission.setWritePermission(true);
- blobSASPermission.setCreatePermission(true);
- }
- BlobServiceSasSignatureValues blobServiceSasSignatureValues = new BlobServiceSasSignatureValues(
- OffsetDateTime.now(ZoneOffset.UTC).plusSeconds(expirationSec),
- blobSASPermission
- );
- blobUrl = blobUrl + "?" + blockBlobClient.generateSas(blobServiceSasSignatureValues);
- }
-
- externalStorageLocation.setUri(blobUrl);
- return externalStorageLocation;
- } catch (BlobStorageException e) {
- String msg = "Error communicating with Azure";
- LOGGER.error(msg, e);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
- }
- }
-
- /**
- * Uploads the payload to the given azure blob name. It is expected that the caller retrieves the blob name using
- * {@link #getLocation(Operation, PayloadType, String)} before making this call.
- *
- * @param path the name of the blob to be uploaded
- * @param payload an {@link InputStream} containing the json payload which is to be uploaded
- * @param payloadSize the size of the json payload in bytes
- */
- @Override
- public void upload(String path, InputStream payload, long payloadSize) {
- try {
- BlockBlobClient blockBlobClient = blobContainerClient.getBlobClient(path).getBlockBlobClient();
- BlobHttpHeaders blobHttpHeaders = new BlobHttpHeaders()
- .setContentType(CONTENT_TYPE);
- blockBlobClient.uploadWithResponse(payload, payloadSize, blobHttpHeaders,
- null, null, null, null, null, Context.NONE);
- } catch (BlobStorageException | UncheckedIOException | UnexpectedLengthException e) {
- String msg = "Error communicating with Azure";
- LOGGER.error(msg, e);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
- }
- }
-
- /**
- * Downloads the payload stored in an azure blob.
- *
- * @param path the path of the blob
- * @return an input stream containing the contents of the object Caller is expected to close the input stream.
- */
- @Override
- public InputStream download(String path) {
- try {
- BlockBlobClient blockBlobClient = blobContainerClient.getBlobClient(path).getBlockBlobClient();
- ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
- // Avoid another call to the api to get the blob size
- // ByteArrayOutputStream outputStream = new ByteArrayOutputStream(blockBlobClient.getProperties().value().blobSize());
- blockBlobClient.download(outputStream);
- return new ByteArrayInputStream(outputStream.toByteArray());
- } catch (BlobStorageException | UncheckedIOException | NullPointerException e) {
- String msg = "Error communicating with Azure";
- LOGGER.error(msg, e);
- throw new ApplicationException(ApplicationException.Code.BACKEND_ERROR, msg, e);
- }
- }
-
- /**
- * Build path on external storage. Copied from S3PayloadStorage.
- *
- * @param payloadType the {@link PayloadType} which will determine the base path of the object
- * @return External Storage path
- */
- private String getObjectKey(PayloadType payloadType) {
- StringBuilder stringBuilder = new StringBuilder();
- switch (payloadType) {
- case WORKFLOW_INPUT:
- stringBuilder.append(workflowInputPath);
- break;
- case WORKFLOW_OUTPUT:
- stringBuilder.append(workflowOutputPath);
- break;
- case TASK_INPUT:
- stringBuilder.append(taskInputPath);
- break;
- case TASK_OUTPUT:
- stringBuilder.append(taskOutputPath);
- break;
- }
- stringBuilder.append(IDGenerator.generate()).append(".json");
- return stringBuilder.toString();
- }
-}
diff --git a/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java b/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java
deleted file mode 100644
index bdc943645f..0000000000
--- a/azureblob-storage/src/test/java/com/netflix/conductor/azureblob/storage/AzureBlobPayloadStorageTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.azureblob.storage;
-
-import com.netflix.conductor.azureblob.config.AzureBlobProperties;
-import com.netflix.conductor.common.run.ExternalStorageLocation;
-import com.netflix.conductor.common.utils.ExternalPayloadStorage;
-import com.netflix.conductor.core.exception.ApplicationException;
-import java.time.Duration;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-public class AzureBlobPayloadStorageTest {
-
- private AzureBlobProperties properties;
-
- @Before
- public void setUp() {
- properties = mock(AzureBlobProperties.class);
- when(properties.getConnectionString()).thenReturn(null);
- when(properties.getContainerName()).thenReturn("conductor-payloads");
- when(properties.getEndpoint()).thenReturn(null);
- when(properties.getSasToken()).thenReturn(null);
- when(properties.getSignedUrlExpirationDuration()).thenReturn(Duration.ofSeconds(5));
- when(properties.getWorkflowInputPath()).thenReturn("workflow/input/");
- when(properties.getWorkflowOutputPath()).thenReturn("workflow/output/");
- when(properties.getTaskInputPath()).thenReturn("task/input");
- when(properties.getTaskOutputPath()).thenReturn("task/output/");
- }
-
- /**
- * Dummy credentials Azure SDK doesn't work with Azurite since it cleans parameters
- */
- private final String azuriteConnectionString = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;EndpointSuffix=localhost";
-
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- @Test
- public void testNoStorageAccount() {
- expectedException.expect(ApplicationException.class);
- new AzureBlobPayloadStorage(properties);
- }
-
- @Test
- public void testUseConnectionString() {
- when(properties.getConnectionString()).thenReturn(azuriteConnectionString);
- new AzureBlobPayloadStorage(properties);
- }
-
- @Test
- public void testUseEndpoint() {
- String azuriteEndpoint = "http://127.0.0.1:10000/";
- when(properties.getEndpoint()).thenReturn(azuriteEndpoint);
- new AzureBlobPayloadStorage(properties);
- }
-
- @Test
- public void testGetLocationFixedPath() {
- when(properties.getConnectionString()).thenReturn(azuriteConnectionString);
- AzureBlobPayloadStorage azureBlobPayloadStorage = new AzureBlobPayloadStorage(properties);
- String path = "somewhere";
- ExternalStorageLocation externalStorageLocation = azureBlobPayloadStorage
- .getLocation(ExternalPayloadStorage.Operation.READ, ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT,
- path);
- assertNotNull(externalStorageLocation);
- assertEquals(path, externalStorageLocation.getPath());
- assertNotNull(externalStorageLocation.getUri());
- }
-
-
- private void testGetLocation(AzureBlobPayloadStorage azureBlobPayloadStorage,
- ExternalPayloadStorage.Operation operation, ExternalPayloadStorage.PayloadType payloadType,
- String expectedPath) {
- ExternalStorageLocation externalStorageLocation = azureBlobPayloadStorage
- .getLocation(operation, payloadType, null);
- assertNotNull(externalStorageLocation);
- assertNotNull(externalStorageLocation.getPath());
- assertTrue(externalStorageLocation.getPath().startsWith(expectedPath));
- assertNotNull(externalStorageLocation.getUri());
- assertTrue(externalStorageLocation.getUri().contains(expectedPath));
- }
-
- @Test
- public void testGetAllLocations() {
- when(properties.getConnectionString()).thenReturn(azuriteConnectionString);
- AzureBlobPayloadStorage azureBlobPayloadStorage = new AzureBlobPayloadStorage(properties);
-
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT, properties.getWorkflowInputPath());
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.WORKFLOW_OUTPUT, properties.getWorkflowOutputPath());
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.TASK_INPUT, properties.getTaskInputPath());
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.READ,
- ExternalPayloadStorage.PayloadType.TASK_OUTPUT, properties.getTaskOutputPath());
-
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.WORKFLOW_INPUT, properties.getWorkflowInputPath());
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.WORKFLOW_OUTPUT, properties.getWorkflowOutputPath());
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.TASK_INPUT, properties.getTaskInputPath());
- testGetLocation(azureBlobPayloadStorage, ExternalPayloadStorage.Operation.WRITE,
- ExternalPayloadStorage.PayloadType.TASK_OUTPUT, properties.getTaskOutputPath());
- }
-}
diff --git a/build.gradle b/build.gradle
index 758007a32e..d995429493 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,3 +1,5 @@
+import org.springframework.boot.gradle.plugin.SpringBootPlugin
+
buildscript {
repositories {
mavenCentral()
@@ -6,18 +8,19 @@ buildscript {
}
}
dependencies {
- classpath 'com.netflix.nebula:gradle-extra-configurations-plugin:5.0.3'
- classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.3.12.RELEASE'
+ classpath 'com.netflix.nebula:gradle-extra-configurations-plugin:10.0.0'
+ classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.7.16'
+ classpath 'com.diffplug.spotless:spotless-plugin-gradle:6.+'
}
}
plugins {
- id 'io.spring.dependency-management' version '1.0.9.RELEASE'
+ id 'io.spring.dependency-management' version '1.1.3'
id 'java'
id 'application'
id 'jacoco'
- id 'nebula.netflixoss' version '9.2.2'
- id 'org.sonarqube' version '3.1.1'
+ id 'com.netflix.nebula.netflixoss' version '11.3.2'
+ id 'org.sonarqube' version '3.4.0.2513'
}
/*
@@ -41,18 +44,19 @@ subprojects {
}
apply from: "$rootDir/dependencies.gradle"
-
-// change the ES version used by Spring Boot Dependency Management plugin
-ext['elasticsearch.version'] = revElasticSearch6
+apply from: "$rootDir/springboot-bom-overrides.gradle"
allprojects {
- apply plugin: 'nebula.netflixoss'
+ apply plugin: 'com.netflix.nebula.netflixoss'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java-library'
apply plugin: 'project-report'
- sourceCompatibility = JavaVersion.VERSION_11
- targetCompatibility = JavaVersion.VERSION_11
+ java {
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(17)
+ }
+ }
group = 'com.netflix.conductor'
@@ -61,6 +65,10 @@ allprojects {
exclude group: 'ch.qos.logback', module: 'logback-core'
exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j'
exclude group: 'org.slf4j', module: 'slf4j-log4j12'
+ resolutionStrategy {
+ force 'org.codehaus.jettison:jettison:1.5.4'
+ force "org.apache.commons:commons-compress:${revCommonsCompress}"
+ }
}
repositories {
@@ -89,15 +97,169 @@ allprojects {
dependencyManagement {
imports {
- mavenBom("org.springframework.boot:spring-boot-dependencies:2.3.12.RELEASE")
+ // dependency versions for the BOM can be found at https://docs.spring.io/spring-boot/docs/2.7.3/reference/htmlsingle/#appendix.dependency-versions
+ mavenBom(SpringBootPlugin.BOM_COORDINATES)
}
}
dependencies {
+ implementation('org.apache.logging.log4j:log4j-core') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.17.2'
+ // the strict bounds, effectively allowing any 2.x version greater than 2.17.2
+ // could also remove the upper bound entirely if we wanted too
+ strictly '[2.17.2,3.0)'
+ }
+ }
+ implementation('org.apache.logging.log4j:log4j-api') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.17.2'
+ // the strict bounds, effectively allowing any 2.x version greater than 2.17.2
+ // could also remove the upper bound entirely if we wanted too
+ strictly '[2.17.2,3.0)'
+ }
+ }
+ implementation('org.apache.logging.log4j:log4j-slf4j-impl') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.17.2'
+ // the strict bounds, effectively allowing any 2.x version greater than 2.17.2
+ // could also remove the upper bound entirely if we wanted too
+ strictly '[2.17.2,3.0)'
+ }
+ }
+ implementation('org.apache.logging.log4j:log4j-jul') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.17.2'
+ // the strict bounds, effectively allowing any 2.x version greater than 2.17.2
+ // could also remove the upper bound entirely if we wanted too
+ strictly '[2.17.2,3.0)'
+ }
+ }
+ implementation('org.apache.logging.log4j:log4j-web') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.17.2'
+ // the strict bounds, effectively allowing any 2.x version greater than 2.17.2
+ // could also remove the upper bound entirely if we wanted too
+ strictly '[2.17.2,3.0)'
+ }
+ }
+ implementation('org.yaml:snakeyaml') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.0'
+ // the strict bounds, effectively allowing any 2.x version between 2.0 and 2.1
+ strictly '[2.0,2.1)'
+ }
+ }
+ implementation('com.fasterxml.jackson.core:jackson-core') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.core:jackson-databind') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-yaml') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.core:jackson-annotations') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-smile') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.dataformat:jackson-dataformat-cbor') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.datatype:jackson-datatype-jdk8') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.datatype:jackson-datatype-joda') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.datatype:jackson-datatype-jsr310') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('com.fasterxml.jackson.module:jackson-module-afterburner') {
+ version {
+ // this is the preferred version this library will use
+ prefer '2.15.0'
+ // the strict bounds, effectively allowing any 2.15.x version between 2.15.0 and 2.15.2
+ strictly '[2.15.0,2.15.2)'
+ }
+ }
+ implementation('org.apache.logging.log4j:log4j-core')
+ implementation('org.apache.logging.log4j:log4j-api')
+ implementation('org.apache.logging.log4j:log4j-slf4j-impl')
+ implementation('org.apache.logging.log4j:log4j-jul')
+ implementation('org.apache.logging.log4j:log4j-web')
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
- testImplementation('org.springframework.boot:spring-boot-starter-test')
+ testImplementation('org.springframework.boot:spring-boot-starter-test') {
+ exclude group: 'org.yaml', module: 'snakeyaml'
+ }
testImplementation('org.springframework.boot:spring-boot-starter-log4j2')
+ testImplementation 'junit:junit'
+ testImplementation "org.junit.vintage:junit-vintage-engine"
+
+ // Needed for build to work on m1/m2 macs
+ testImplementation 'net.java.dev.jna:jna:5.13.0'
}
// processes additional configuration metadata json file as described here
@@ -109,27 +271,26 @@ allprojects {
testLogging {
events = ["SKIPPED", "FAILED"]
exceptionFormat = "full"
+ displayGranularity = 1
showStandardStreams = false
}
}
-
-
}
-// all client and their related modules are published with Java 8 compatibility
-["common", "client", "client-spring", "grpc", "grpc-client"].each {
+// all client and their related modules are published with Java 17 compatibility
+["annotations", "common", "client", "client-spring", "grpc", "grpc-client"].each {
project(":conductor-$it") {
compileJava {
- options.release = 8
+ options.release = 17
}
}
}
jacocoTestReport {
reports {
- html.enabled = true
- xml.enabled = true
- csv.enabled = false
+ html.required = true
+ xml.required = true
+ csv.required = false
}
}
@@ -144,3 +305,27 @@ sonarqube {
property "sonar.host.url", "https://sonarcloud.io"
}
}
+
+configure(allprojects - project(':conductor-grpc')) {
+ apply plugin: 'com.diffplug.spotless'
+
+ spotless {
+ java {
+ googleJavaFormat().aosp()
+ removeUnusedImports()
+ importOrder('java', 'javax', 'org', 'com.netflix', '', '\\#com.netflix', '\\#')
+ licenseHeaderFile("$rootDir/licenseheader.txt")
+ }
+ }
+}
+
+['cassandra-persistence', 'core', 'redis-concurrency-limit', 'test-harness', 'client'].each {
+ configure(project(":conductor-$it")) {
+ spotless {
+ groovy {
+ importOrder('java', 'javax', 'org', 'com.netflix', '', '\\#com.netflix', '\\#')
+ licenseHeaderFile("$rootDir/licenseheader.txt")
+ }
+ }
+ }
+}
diff --git a/cassandra-persistence/build.gradle b/cassandra-persistence/build.gradle
index af41a79069..6fee6f8ff0 100644
--- a/cassandra-persistence/build.gradle
+++ b/cassandra-persistence/build.gradle
@@ -10,21 +10,23 @@
* 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.
*/
+apply plugin: 'groovy'
dependencies {
- implementation project(':conductor-common')
- implementation project(':conductor-core')
compileOnly 'org.springframework.boot:spring-boot-starter'
+ implementation project(':conductor-common')
+ implementation project(':conductor-core')
implementation "com.datastax.cassandra:cassandra-driver-core:${revCassandra}"
implementation "org.apache.commons:commons-lang3"
- implementation 'org.apache.logging.log4j:log4j-web'
-
- testImplementation("org.cassandraunit:cassandra-unit:${revCassandraUnit}") {
- exclude group: "com.datastax.cassandra", module: "cassandra-driver-core"
- }
-
testImplementation project(':conductor-core').sourceSets.test.output
testImplementation project(':conductor-common').sourceSets.test.output
+
+ testImplementation "org.codehaus.groovy:groovy-all:${revGroovy}"
+ testImplementation "org.spockframework:spock-core:${revSpock}"
+ testImplementation "org.spockframework:spock-spring:${revSpock}"
+ testImplementation "org.testcontainers:spock:${revTestContainer}"
+ testImplementation "org.testcontainers:cassandra:${revTestContainer}"
+ testImplementation "com.google.protobuf:protobuf-java:${revProtoBuf}"
}
diff --git a/cassandra-persistence/dependencies.lock b/cassandra-persistence/dependencies.lock
index 9d0b60541b..18ff440843 100644
--- a/cassandra-persistence/dependencies.lock
+++ b/cassandra-persistence/dependencies.lock
@@ -1,7 +1,7 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.3.12.RELEASE"
+ "locked": "2.7.16"
}
},
"compileClasspath": {
@@ -9,59 +9,37 @@
"locked": "3.10.2"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "com.github.jnr:jffi": {
- "locked": "1.2.16",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.github.jnr:jnr-constants": {
- "locked": "0.9.9",
- "transitive": [
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-ffi": {
- "locked": "2.1.7",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-posix": {
- "locked": "3.0.44",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "com.github.jnr:jnr-x86asm": {
- "locked": "1.0.2",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.google.guava:guava": {
- "locked": "19.0",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -69,198 +47,29 @@
"com.netflix.conductor:conductor-core": {
"project": true
},
- "io.dropwizard.metrics:metrics-core": {
- "locked": "4.1.22",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "io.netty:netty-buffer": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-codec": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler"
- ]
- },
- "io.netty:netty-common": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-buffer",
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-resolver",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-handler": {
- "locked": "4.1.65.Final",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "io.netty:netty-resolver": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-transport": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
"org.apache.commons:commons-lang3": {
- "locked": "3.10"
+ "locked": "3.12.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-web"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-web"
- ]
+ "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.13.3"
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "org.ow2.asm:asm-tree"
- ]
- },
- "org.ow2.asm:asm-analysis": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-commons": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-tree": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "org.ow2.asm:asm-analysis",
- "org.ow2.asm:asm-commons",
- "org.ow2.asm:asm-util"
- ]
- },
- "org.ow2.asm:asm-util": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-logging"
- ]
- },
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "io.dropwizard.metrics:metrics-core",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "locked": "2.17.2"
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
+ "locked": "2.7.16"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "locked": "2.0"
}
},
"runtimeClasspath": {
@@ -268,2075 +77,589 @@
"locked": "3.10.2"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
- },
- "com.github.jnr:jffi": {
- "locked": "1.2.16",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.github.jnr:jnr-constants": {
- "locked": "0.9.9",
- "transitive": [
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-ffi": {
- "locked": "2.1.7",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-posix": {
- "locked": "3.0.44",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "com.github.jnr:jnr-x86asm": {
- "locked": "1.0.2",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.15.0"
},
- "com.github.vmg.protogen:protogen-annotations": {
- "locked": "1.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "2.0.2",
- "transitive": [
- "com.github.rholder:guava-retrying"
- ]
- },
- "com.google.guava:guava": {
- "locked": "19.0",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "com.github.rholder:guava-retrying",
- "com.netflix.servo:servo-core"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.9.3"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.13.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "3.24.3"
},
"com.jayway.jsonpath:json-path": {
- "locked": "2.4.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "2.7.0"
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common"
+ ],
+ "project": true
},
"com.netflix.conductor:conductor-common": {
- "project": true,
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "project": true
},
"com.netflix.conductor:conductor-core": {
"project": true
},
- "com.netflix.servo:servo-core": {
- "locked": "0.13.0",
- "transitive": [
- "com.netflix.conductor:conductor-core"
- ]
- },
"com.netflix.spectator:spectator-api": {
- "locked": "0.122.0",
- "transitive": [
- "com.netflix.conductor:conductor-core",
- "com.netflix.servo:servo-core"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "0.122.0"
},
"com.spotify:completable-futures": {
- "locked": "0.3.3",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "com.sun.activation:jakarta.activation": {
- "locked": "1.2.2",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime"
- ]
- },
- "com.sun.istack:istack-commons-runtime": {
- "locked": "3.0.12",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime"
- ]
+ ],
+ "locked": "0.3.3"
},
"commons-io:commons-io": {
- "locked": "2.7",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "io.dropwizard.metrics:metrics-core": {
- "locked": "4.1.22",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "io.netty:netty-buffer": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-codec": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler"
- ]
- },
- "io.netty:netty-common": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-buffer",
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-resolver",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-handler": {
- "locked": "4.1.65.Final",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "io.netty:netty-resolver": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-transport": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler"
- ]
+ ],
+ "locked": "2.7"
},
"io.reactivex:rxjava": {
- "locked": "1.3.8",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "1.3.8"
},
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime"
- ]
- },
- "javax.activation:activation": {
- "locked": "1.1.1",
- "transitive": [
+ "jakarta.activation:jakarta.activation-api": {
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "javax.activation:javax.activation-api": {
- "locked": "1.2.0",
- "transitive": [
- "javax.xml.bind:jaxb-api"
- ]
+ ],
+ "locked": "1.2.2"
},
- "javax.xml.bind:jaxb-api": {
- "locked": "2.3.1",
- "transitive": [
+ "jakarta.xml.bind:jakarta.xml.bind-api": {
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "net.minidev:accessors-smart": {
- "locked": "2.3.1",
- "transitive": [
- "net.minidev:json-smart"
- ]
- },
- "net.minidev:json-smart": {
- "locked": "2.3.1",
- "transitive": [
- "com.jayway.jsonpath:json-path"
- ]
+ ],
+ "locked": "2.3.3"
},
"org.apache.bval:bval-jsr": {
- "locked": "2.0.5",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "2.0.6"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "3.12.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-web"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-web"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-web": {
- "locked": "2.13.3"
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
},
- "org.glassfish.jaxb:jaxb-runtime": {
- "locked": "2.3.4",
- "transitive": [
+ "org.openjdk.nashorn:nashorn-core": {
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "org.glassfish.jaxb:txw2": {
- "locked": "2.3.4",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.4",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "net.minidev:accessors-smart",
- "org.ow2.asm:asm-tree"
- ]
- },
- "org.ow2.asm:asm-analysis": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-commons": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-tree": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "org.ow2.asm:asm-analysis",
- "org.ow2.asm:asm-commons",
- "org.ow2.asm:asm-util"
- ]
- },
- "org.ow2.asm:asm-util": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "com.jayway.jsonpath:json-path",
- "com.netflix.servo:servo-core",
- "com.netflix.spectator:spectator-api",
- "io.dropwizard.metrics:metrics-core"
- ]
+ ],
+ "locked": "15.4"
+ },
+ "org.yaml:snakeyaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0"
}
},
"testCompileClasspath": {
- "com.addthis.metrics:reporter-config-base": {
- "locked": "3.0.3",
- "transitive": [
- "com.addthis.metrics:reporter-config3"
- ]
- },
- "com.addthis.metrics:reporter-config3": {
- "locked": "3.0.3",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.boundary:high-scale-lib": {
- "locked": "1.0.6",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.carrotsearch:hppc": {
- "locked": "0.5.4",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "com.clearspring.analytics:stream": {
- "locked": "2.5.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
"com.datastax.cassandra:cassandra-driver-core": {
"locked": "3.10.2"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
+ "locked": "2.15.0"
},
- "com.github.ben-manes.caffeine:caffeine": {
- "locked": "2.8.8",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.github.jbellis:jamm": {
- "locked": "0.3.0",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.github.jnr:jffi": {
- "locked": "1.2.16",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.github.jnr:jnr-constants": {
- "locked": "0.9.9",
- "transitive": [
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-ffi": {
- "locked": "2.1.7",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-posix": {
- "locked": "3.0.44",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "com.github.jnr:jnr-x86asm": {
- "locked": "1.0.2",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.github.rholder:snowball-stemmer": {
- "locked": "1.3.0.581.1",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.4.0",
- "transitive": [
- "com.github.ben-manes.caffeine:caffeine"
- ]
- },
- "com.google.guava:guava": {
- "locked": "21.0",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "io.airlift:airline",
- "org.apache.cassandra:cassandra-all",
- "org.caffinitas.ohc:ohc-core",
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "com.googlecode.concurrent-trees:concurrent-trees": {
- "locked": "2.4.0",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru": {
- "locked": "1.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.googlecode.json-simple:json-simple": {
- "locked": "1.1",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
},
- "com.jayway.jsonpath:json-path": {
- "locked": "2.4.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
},
- "com.lmax:disruptor": {
- "locked": "3.0.1",
- "transitive": [
- "com.thinkaurelius.thrift:thrift-server"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
},
- "com.netflix.conductor:conductor-common": {
- "project": true
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
},
- "com.netflix.conductor:conductor-core": {
- "project": true
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
},
- "com.ning:compress-lzf": {
- "locked": "0.8.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.thinkaurelius.thrift:thrift-server": {
- "locked": "0.3.7",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.vaadin.external.google:android-json": {
- "locked": "0.0.20131108.vaadin1",
- "transitive": [
- "org.skyscreamer:jsonassert"
- ]
- },
- "commons-cli:commons-cli": {
- "locked": "1.1",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "de.jflex:jflex": {
- "locked": "1.6.0",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "io.airlift:airline": {
- "locked": "0.6",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "io.dropwizard.metrics:metrics-core": {
- "locked": "4.1.22",
- "transitive": [
- "com.addthis.metrics:reporter-config3",
- "com.datastax.cassandra:cassandra-driver-core",
- "io.dropwizard.metrics:metrics-jvm",
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "io.dropwizard.metrics:metrics-jvm": {
- "locked": "4.1.22",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "io.netty:netty-buffer": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-codec": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler"
- ]
- },
- "io.netty:netty-common": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-buffer",
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-resolver",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-handler": {
- "locked": "4.1.65.Final",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "io.netty:netty-resolver": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-transport": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler"
- ]
- },
- "it.unimi.dsi:fastutil": {
- "locked": "6.5.7",
- "transitive": [
- "com.clearspring.analytics:stream"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
},
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
},
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
},
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "io.airlift:airline"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ "com.google.protobuf:protobuf-java": {
+ "locked": "3.24.3"
+ },
+ "com.netflix.conductor:conductor-common": {
+ "project": true
+ },
+ "com.netflix.conductor:conductor-core": {
+ "project": true
},
"junit:junit": {
- "locked": "4.13.2",
- "transitive": [
- "org.cassandraunit:cassandra-unit",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "net.bytebuddy:byte-buddy": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "net.bytebuddy:byte-buddy-agent": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
+ "locked": "4.13.2"
},
"net.java.dev.jna:jna": {
- "locked": "4.1.0",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "net.jpountz.lz4:lz4": {
- "locked": "1.3.0",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "net.minidev:accessors-smart": {
- "locked": "2.3.1",
- "transitive": [
- "net.minidev:json-smart"
- ]
- },
- "net.minidev:json-smart": {
- "locked": "2.3.1",
- "transitive": [
- "com.jayway.jsonpath:json-path"
- ]
- },
- "org.antlr:ST4": {
- "locked": "4.0.8",
- "transitive": [
- "org.antlr:antlr"
- ]
- },
- "org.antlr:antlr": {
- "locked": "3.5.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.antlr:antlr-runtime": {
- "locked": "3.5.2",
- "transitive": [
- "org.antlr:ST4",
- "org.antlr:antlr",
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.apache.ant:ant": {
- "locked": "1.7.0",
- "transitive": [
- "de.jflex:jflex"
- ]
- },
- "org.apache.ant:ant-launcher": {
- "locked": "1.7.0",
- "transitive": [
- "org.apache.ant:ant"
- ]
- },
- "org.apache.cassandra:cassandra-all": {
- "locked": "3.11.4",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.apache.cassandra:cassandra-thrift": {
- "locked": "3.11.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ "locked": "5.13.0"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
- "com.addthis.metrics:reporter-config-base",
- "com.addthis.metrics:reporter-config3",
- "org.apache.cassandra:cassandra-all",
- "org.apache.cassandra:cassandra-thrift",
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.apache.commons:commons-math3": {
- "locked": "3.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "org.apache.thrift:libthrift"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient",
- "org.apache.thrift:libthrift"
- ]
+ "locked": "3.12.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-jul",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.apache.logging.log4j:log4j-web"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-web",
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-web": {
- "locked": "2.13.3"
- },
- "org.apache.thrift:libthrift": {
- "locked": "0.9.2",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.apiguardian:apiguardian-api": {
- "locked": "1.1.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.assertj:assertj-core": {
- "locked": "3.16.1",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.caffinitas.ohc:ohc-core": {
- "locked": "0.4.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all",
- "org.caffinitas.ohc:ohc-core-j8"
- ]
- },
- "org.caffinitas.ohc:ohc-core-j8": {
- "locked": "0.4.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.cassandraunit:cassandra-unit": {
- "locked": "3.11.2.0"
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.8.0",
- "transitive": [
- "com.github.ben-manes.caffeine:caffeine"
- ]
- },
- "org.codehaus.jackson:jackson-core-asl": {
- "locked": "1.9.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all",
- "org.codehaus.jackson:jackson-mapper-asl"
- ]
- },
- "org.codehaus.jackson:jackson-mapper-asl": {
- "locked": "1.9.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.eclipse.jdt.core.compiler:ecj": {
- "locked": "4.4.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.fusesource:sigar": {
- "locked": "1.6.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.hamcrest:hamcrest": {
- "locked": "2.2",
- "transitive": [
- "org.hamcrest:hamcrest-core",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.hamcrest:hamcrest-core": {
- "locked": "2.2",
- "transitive": [
- "junit:junit",
- "org.cassandraunit:cassandra-unit",
- "org.hamcrest:hamcrest-library"
- ]
- },
- "org.hamcrest:hamcrest-library": {
- "locked": "2.2",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.jctools:jctools-core": {
- "locked": "1.2.1",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.junit.jupiter:junit-jupiter": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter-api": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-params"
- ]
- },
- "org.junit.jupiter:junit-jupiter-params": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.platform:junit-platform-commons": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.junit.platform:junit-platform-engine": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.vintage:junit-vintage-engine"
- ]
+ "locked": "2.17.2"
+ },
+ "org.codehaus.groovy:groovy-all": {
+ "locked": "3.0.19"
},
"org.junit.vintage:junit-vintage-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit:junit-bom": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.mindrot:jbcrypt": {
- "locked": "0.3m",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.mockito:mockito-core": {
- "locked": "3.3.3",
- "transitive": [
- "org.mockito:mockito-junit-jupiter",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.mockito:mockito-junit-jupiter": {
- "locked": "3.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.objenesis:objenesis": {
- "locked": "2.6",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "org.opentest4j:opentest4j": {
- "locked": "1.2.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.4",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "net.minidev:accessors-smart",
- "org.apache.cassandra:cassandra-all",
- "org.ow2.asm:asm-tree"
- ]
- },
- "org.ow2.asm:asm-analysis": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-commons": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-tree": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "org.ow2.asm:asm-analysis",
- "org.ow2.asm:asm-commons",
- "org.ow2.asm:asm-util"
- ]
- },
- "org.ow2.asm:asm-util": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.skyscreamer:jsonassert": {
- "locked": "1.5.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.slf4j:jcl-over-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.apache.cassandra:cassandra-all",
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2",
- "org.springframework.boot:spring-boot-starter-logging"
- ]
- },
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.addthis.metrics:reporter-config-base",
- "com.addthis.metrics:reporter-config3",
- "com.datastax.cassandra:cassandra-driver-core",
- "com.jayway.jsonpath:json-path",
- "com.thinkaurelius.thrift:thrift-server",
- "io.dropwizard.metrics:metrics-core",
- "io.dropwizard.metrics:metrics-jvm",
- "org.apache.cassandra:cassandra-all",
- "org.apache.cassandra:cassandra-thrift",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.apache.thrift:libthrift",
- "org.caffinitas.ohc:ohc-core",
- "org.cassandraunit:cassandra-unit",
- "org.slf4j:jcl-over-slf4j",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
+ "locked": "5.8.2"
},
- "org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "org.spockframework:spock-core": {
+ "locked": "2.3-groovy-3.0"
},
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.3.12.RELEASE"
+ "org.spockframework:spock-spring": {
+ "locked": "2.3-groovy-3.0"
},
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-test": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-test-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression",
- "org.springframework:spring-test"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
- },
- "org.springframework:spring-test": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.xerial.snappy:snappy-java": {
- "locked": "1.1.1.7",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.xmlunit:xmlunit-core": {
- "locked": "2.7.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
+ },
+ "org.testcontainers:cassandra": {
+ "locked": "1.19.1"
+ },
+ "org.testcontainers:spock": {
+ "locked": "1.19.1"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "com.addthis.metrics:reporter-config-base",
- "com.addthis.metrics:reporter-config3",
- "org.apache.cassandra:cassandra-all",
- "org.springframework.boot:spring-boot-starter"
- ]
+ "locked": "2.0"
}
},
"testRuntimeClasspath": {
- "com.addthis.metrics:reporter-config-base": {
- "locked": "3.0.3",
- "transitive": [
- "com.addthis.metrics:reporter-config3"
- ]
- },
- "com.addthis.metrics:reporter-config3": {
- "locked": "3.0.3",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.boundary:high-scale-lib": {
- "locked": "1.0.6",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.carrotsearch:hppc": {
- "locked": "0.5.4",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "com.clearspring.analytics:stream": {
- "locked": "2.5.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
"com.datastax.cassandra:cassandra-driver-core": {
"locked": "3.10.2"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "locked": "2.15.0"
},
- "com.github.ben-manes.caffeine:caffeine": {
- "locked": "2.8.8",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.github.jbellis:jamm": {
- "locked": "0.3.0",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.github.jnr:jffi": {
- "locked": "1.2.16",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.github.jnr:jnr-constants": {
- "locked": "0.9.9",
- "transitive": [
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-ffi": {
- "locked": "2.1.7",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "com.github.jnr:jnr-posix"
- ]
- },
- "com.github.jnr:jnr-posix": {
- "locked": "3.0.44",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core"
- ]
- },
- "com.github.jnr:jnr-x86asm": {
- "locked": "1.0.2",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
},
- "com.github.rholder:snowball-stemmer": {
- "locked": "1.3.0.581.1",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
},
- "com.github.vmg.protogen:protogen-annotations": {
- "locked": "1.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "2.0.2",
- "transitive": [
- "com.github.rholder:guava-retrying"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.4.0",
- "transitive": [
- "com.github.ben-manes.caffeine:caffeine"
- ]
- },
- "com.google.guava:guava": {
- "locked": "21.0",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "com.github.rholder:guava-retrying",
- "com.netflix.servo:servo-core",
- "io.airlift:airline",
- "org.apache.cassandra:cassandra-all",
- "org.caffinitas.ohc:ohc-core",
- "org.cassandraunit:cassandra-unit"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.github.ben-manes.caffeine:caffeine": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.9.3"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.13.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
- },
- "com.googlecode.concurrent-trees:concurrent-trees": {
- "locked": "2.4.0",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru": {
- "locked": "1.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.googlecode.json-simple:json-simple": {
- "locked": "1.1",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ ],
+ "locked": "3.24.3"
},
"com.jayway.jsonpath:json-path": {
- "locked": "2.4.0",
- "transitive": [
- "com.netflix.conductor:conductor-core",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "com.lmax:disruptor": {
- "locked": "3.0.1",
- "transitive": [
- "com.thinkaurelius.thrift:thrift-server"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.7.0"
+ },
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common"
+ ],
+ "project": true
},
"com.netflix.conductor:conductor-common": {
- "project": true,
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
+ ],
+ "project": true
},
"com.netflix.conductor:conductor-core": {
"project": true
},
- "com.netflix.servo:servo-core": {
- "locked": "0.13.0",
- "transitive": [
- "com.netflix.conductor:conductor-core"
- ]
- },
"com.netflix.spectator:spectator-api": {
- "locked": "0.122.0",
- "transitive": [
- "com.netflix.conductor:conductor-core",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.ning:compress-lzf": {
- "locked": "0.8.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "0.122.0"
},
"com.spotify:completable-futures": {
- "locked": "0.3.3",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "com.sun.activation:jakarta.activation": {
- "locked": "1.2.2",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime"
- ]
- },
- "com.sun.istack:istack-commons-runtime": {
- "locked": "3.0.12",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime"
- ]
- },
- "com.thinkaurelius.thrift:thrift-server": {
- "locked": "0.3.7",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "com.vaadin.external.google:android-json": {
- "locked": "0.0.20131108.vaadin1",
- "transitive": [
- "org.skyscreamer:jsonassert"
- ]
- },
- "commons-cli:commons-cli": {
- "locked": "1.1",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ ],
+ "locked": "0.3.3"
},
"commons-io:commons-io": {
- "locked": "2.7",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "de.jflex:jflex": {
- "locked": "1.6.0",
- "transitive": [
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "io.airlift:airline": {
- "locked": "0.6",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "io.dropwizard.metrics:metrics-core": {
- "locked": "4.1.22",
- "transitive": [
- "com.addthis.metrics:reporter-config3",
- "com.datastax.cassandra:cassandra-driver-core",
- "io.dropwizard.metrics:metrics-jvm",
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "io.dropwizard.metrics:metrics-jvm": {
- "locked": "4.1.22",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "io.netty:netty-buffer": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-codec": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler"
- ]
- },
- "io.netty:netty-common": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-buffer",
- "io.netty:netty-codec",
- "io.netty:netty-handler",
- "io.netty:netty-resolver",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-handler": {
- "locked": "4.1.65.Final",
- "transitive": [
- "com.datastax.cassandra:cassandra-driver-core",
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "io.netty:netty-resolver": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-handler",
- "io.netty:netty-transport"
- ]
- },
- "io.netty:netty-transport": {
- "locked": "4.1.65.Final",
- "transitive": [
- "io.netty:netty-codec",
- "io.netty:netty-handler"
- ]
+ ],
+ "locked": "2.7"
},
"io.reactivex:rxjava": {
- "locked": "1.3.8",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "it.unimi.dsi:fastutil": {
- "locked": "6.5.7",
- "transitive": [
- "com.clearspring.analytics:stream"
- ]
+ ],
+ "locked": "1.3.8"
},
"jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "1.2.2"
},
"jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "javax.activation:activation": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.conductor:conductor-core"
- ]
- },
- "javax.activation:javax.activation-api": {
- "locked": "1.2.0",
- "transitive": [
- "javax.xml.bind:jaxb-api"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "io.airlift:airline"
- ]
- },
- "javax.xml.bind:jaxb-api": {
- "locked": "2.3.1",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-core"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ ],
+ "locked": "2.3.3"
},
"junit:junit": {
- "locked": "4.13.2",
- "transitive": [
- "org.cassandraunit:cassandra-unit",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "net.bytebuddy:byte-buddy": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "net.bytebuddy:byte-buddy-agent": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
+ "locked": "4.13.2"
},
"net.java.dev.jna:jna": {
- "locked": "4.1.0",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "net.jpountz.lz4:lz4": {
- "locked": "1.3.0",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "net.minidev:accessors-smart": {
- "locked": "2.3.1",
- "transitive": [
- "net.minidev:json-smart"
- ]
- },
- "net.minidev:json-smart": {
- "locked": "2.3.1",
- "transitive": [
- "com.jayway.jsonpath:json-path"
- ]
- },
- "org.antlr:ST4": {
- "locked": "4.0.8",
- "transitive": [
- "org.antlr:antlr"
- ]
- },
- "org.antlr:antlr": {
- "locked": "3.5.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.antlr:antlr-runtime": {
- "locked": "3.5.2",
- "transitive": [
- "org.antlr:ST4",
- "org.antlr:antlr",
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.apache.ant:ant": {
- "locked": "1.7.0",
- "transitive": [
- "de.jflex:jflex"
- ]
- },
- "org.apache.ant:ant-launcher": {
- "locked": "1.7.0",
- "transitive": [
- "org.apache.ant:ant"
- ]
+ "locked": "5.13.0"
},
"org.apache.bval:bval-jsr": {
- "locked": "2.0.5",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
- },
- "org.apache.cassandra:cassandra-all": {
- "locked": "3.11.4",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.apache.cassandra:cassandra-thrift": {
- "locked": "3.11.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
+ ],
+ "locked": "2.0.6"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
- "com.addthis.metrics:reporter-config-base",
- "com.addthis.metrics:reporter-config3",
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common",
- "com.netflix.conductor:conductor-core",
- "org.apache.cassandra:cassandra-all",
- "org.apache.cassandra:cassandra-thrift",
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.apache.commons:commons-math3": {
- "locked": "3.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "org.apache.thrift:libthrift"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient",
- "org.apache.thrift:libthrift"
- ]
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "3.12.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-jul",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.apache.logging.log4j:log4j-web"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.apache.logging.log4j:log4j-web",
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-web": {
- "locked": "2.13.3"
- },
- "org.apache.thrift:libthrift": {
- "locked": "0.9.2",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.apiguardian:apiguardian-api": {
- "locked": "1.1.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.assertj:assertj-core": {
- "locked": "3.16.1",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.caffinitas.ohc:ohc-core": {
- "locked": "0.4.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all",
- "org.caffinitas.ohc:ohc-core-j8"
- ]
- },
- "org.caffinitas.ohc:ohc-core-j8": {
- "locked": "0.4.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.cassandraunit:cassandra-unit": {
- "locked": "3.11.2.0"
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.8.0",
- "transitive": [
- "com.github.ben-manes.caffeine:caffeine"
- ]
- },
- "org.codehaus.jackson:jackson-core-asl": {
- "locked": "1.9.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all",
- "org.codehaus.jackson:jackson-mapper-asl"
- ]
- },
- "org.codehaus.jackson:jackson-mapper-asl": {
- "locked": "1.9.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.eclipse.jdt.core.compiler:ecj": {
- "locked": "4.4.2",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.fusesource:sigar": {
- "locked": "1.6.4",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.glassfish.jaxb:jaxb-runtime": {
- "locked": "2.3.4",
- "transitive": [
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
"com.netflix.conductor:conductor-core"
- ]
- },
- "org.glassfish.jaxb:txw2": {
- "locked": "2.3.4",
- "transitive": [
- "org.glassfish.jaxb:jaxb-runtime"
- ]
- },
- "org.hamcrest:hamcrest": {
- "locked": "2.2",
- "transitive": [
- "org.hamcrest:hamcrest-core",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.hamcrest:hamcrest-core": {
- "locked": "2.2",
- "transitive": [
- "junit:junit",
- "org.cassandraunit:cassandra-unit",
- "org.hamcrest:hamcrest-library"
- ]
- },
- "org.hamcrest:hamcrest-library": {
- "locked": "2.2",
- "transitive": [
- "org.cassandraunit:cassandra-unit"
- ]
- },
- "org.jctools:jctools-core": {
- "locked": "1.2.1",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.junit.jupiter:junit-jupiter": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter-api": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.mockito:mockito-junit-jupiter"
- ]
- },
- "org.junit.jupiter:junit-jupiter-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.jupiter:junit-jupiter-params": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.platform:junit-platform-commons": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.junit.platform:junit-platform-engine": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
+ ],
+ "locked": "2.17.2"
+ },
+ "org.codehaus.groovy:groovy-all": {
+ "locked": "3.0.19"
},
"org.junit.vintage:junit-vintage-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit:junit-bom": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.mindrot:jbcrypt": {
- "locked": "0.3m",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.mockito:mockito-core": {
- "locked": "3.3.3",
- "transitive": [
- "org.mockito:mockito-junit-jupiter",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.mockito:mockito-junit-jupiter": {
- "locked": "3.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.objenesis:objenesis": {
- "locked": "2.6",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "org.opentest4j:opentest4j": {
- "locked": "1.2.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.4",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "net.minidev:accessors-smart",
- "org.apache.cassandra:cassandra-all",
- "org.ow2.asm:asm-tree"
- ]
- },
- "org.ow2.asm:asm-analysis": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-commons": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.ow2.asm:asm-tree": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi",
- "org.ow2.asm:asm-analysis",
- "org.ow2.asm:asm-commons",
- "org.ow2.asm:asm-util"
- ]
- },
- "org.ow2.asm:asm-util": {
- "locked": "5.0.3",
- "transitive": [
- "com.github.jnr:jnr-ffi"
- ]
- },
- "org.skyscreamer:jsonassert": {
- "locked": "1.5.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.slf4j:jcl-over-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.apache.cassandra:cassandra-all",
- "org.apache.cassandra:cassandra-thrift"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2",
- "org.springframework.boot:spring-boot-starter-logging"
- ]
- },
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.addthis.metrics:reporter-config-base",
- "com.addthis.metrics:reporter-config3",
- "com.datastax.cassandra:cassandra-driver-core",
- "com.jayway.jsonpath:json-path",
- "com.netflix.servo:servo-core",
- "com.netflix.spectator:spectator-api",
- "com.thinkaurelius.thrift:thrift-server",
- "io.dropwizard.metrics:metrics-core",
- "io.dropwizard.metrics:metrics-jvm",
- "org.apache.cassandra:cassandra-all",
- "org.apache.cassandra:cassandra-thrift",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.apache.thrift:libthrift",
- "org.caffinitas.ohc:ohc-core",
- "org.cassandraunit:cassandra-unit",
- "org.slf4j:jcl-over-slf4j",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
+ "locked": "5.8.2"
},
- "org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "org.openjdk.nashorn:nashorn-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "15.4"
},
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.3.12.RELEASE"
+ "org.spockframework:spock-core": {
+ "locked": "2.3-groovy-3.0"
+ },
+ "org.spockframework:spock-spring": {
+ "locked": "2.3-groovy-3.0"
},
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-test": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-test-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression",
- "org.springframework:spring-test"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
- },
- "org.springframework:spring-test": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.xerial.snappy:snappy-java": {
- "locked": "1.1.1.7",
- "transitive": [
- "org.apache.cassandra:cassandra-all"
- ]
- },
- "org.xmlunit:xmlunit-core": {
- "locked": "2.7.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
+ },
+ "org.testcontainers:cassandra": {
+ "locked": "1.19.1"
+ },
+ "org.testcontainers:spock": {
+ "locked": "1.19.1"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "com.addthis.metrics:reporter-config-base",
- "com.addthis.metrics:reporter-config3",
- "org.apache.cassandra:cassandra-all",
- "org.springframework.boot:spring-boot-starter"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-core"
+ ],
+ "locked": "2.0"
}
}
}
\ No newline at end of file
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraConfiguration.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraConfiguration.java
index 8087419f17..14c3c022b1 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraConfiguration.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraConfiguration.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -12,10 +12,16 @@
*/
package com.netflix.conductor.cassandra.config;
-import com.datastax.driver.core.Cluster;
-import com.datastax.driver.core.Metadata;
-import com.datastax.driver.core.Session;
-import com.fasterxml.jackson.databind.ObjectMapper;
+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.cache.CacheManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.netflix.conductor.cassandra.config.cache.CacheableEventHandlerDAO;
+import com.netflix.conductor.cassandra.config.cache.CacheableMetadataDAO;
import com.netflix.conductor.cassandra.dao.CassandraEventHandlerDAO;
import com.netflix.conductor.cassandra.dao.CassandraExecutionDAO;
import com.netflix.conductor.cassandra.dao.CassandraMetadataDAO;
@@ -24,12 +30,11 @@
import com.netflix.conductor.dao.EventHandlerDAO;
import com.netflix.conductor.dao.ExecutionDAO;
import com.netflix.conductor.dao.MetadataDAO;
-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.datastax.driver.core.Cluster;
+import com.datastax.driver.core.Metadata;
+import com.datastax.driver.core.Session;
+import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(CassandraProperties.class)
@@ -45,15 +50,18 @@ public Cluster cluster(CassandraProperties properties) {
LOGGER.info("Connecting to cassandra cluster with host:{}, port:{}", host, port);
- Cluster cluster = Cluster.builder()
- .addContactPoint(host)
- .withPort(port)
- .build();
+ Cluster cluster = Cluster.builder().addContactPoint(host).withPort(port).build();
Metadata metadata = cluster.getMetadata();
LOGGER.info("Connected to cluster: {}", metadata.getClusterName());
- metadata.getAllHosts().forEach(h -> LOGGER.info("Datacenter:{}, host:{}, rack: {}", h.getDatacenter(),
- h.getEndPoint().resolve().getHostName(), h.getRack()));
+ metadata.getAllHosts()
+ .forEach(
+ h ->
+ LOGGER.info(
+ "Datacenter:{}, host:{}, rack: {}",
+ h.getDatacenter(),
+ h.getEndPoint().resolve().getHostName(),
+ h.getRack()));
return cluster;
}
@@ -64,21 +72,36 @@ public Session session(Cluster cluster) {
}
@Bean
- public MetadataDAO cassandraMetadataDAO(Session session, ObjectMapper objectMapper, CassandraProperties properties,
- Statements statements) {
- return new CassandraMetadataDAO(session, objectMapper, properties, statements);
+ public MetadataDAO cassandraMetadataDAO(
+ Session session,
+ ObjectMapper objectMapper,
+ CassandraProperties properties,
+ Statements statements,
+ CacheManager cacheManager) {
+ CassandraMetadataDAO cassandraMetadataDAO =
+ new CassandraMetadataDAO(session, objectMapper, properties, statements);
+ return new CacheableMetadataDAO(cassandraMetadataDAO, properties, cacheManager);
}
@Bean
- public ExecutionDAO cassandraExecutionDAO(Session session, ObjectMapper objectMapper,
- CassandraProperties properties, Statements statements) {
+ public ExecutionDAO cassandraExecutionDAO(
+ Session session,
+ ObjectMapper objectMapper,
+ CassandraProperties properties,
+ Statements statements) {
return new CassandraExecutionDAO(session, objectMapper, properties, statements);
}
@Bean
- public EventHandlerDAO cassandraEventHandlerDAO(Session session, ObjectMapper objectMapper,
- CassandraProperties properties, Statements statements) {
- return new CassandraEventHandlerDAO(session, objectMapper, properties, statements);
+ public EventHandlerDAO cassandraEventHandlerDAO(
+ Session session,
+ ObjectMapper objectMapper,
+ CassandraProperties properties,
+ Statements statements,
+ CacheManager cacheManager) {
+ CassandraEventHandlerDAO cassandraEventHandlerDAO =
+ new CassandraEventHandlerDAO(session, objectMapper, properties, statements);
+ return new CacheableEventHandlerDAO(cassandraEventHandlerDAO, properties, cacheManager);
}
@Bean
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraProperties.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraProperties.java
index 559bee67df..28d3eee972 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraProperties.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/CassandraProperties.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2021 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -12,81 +12,59 @@
*/
package com.netflix.conductor.cassandra.config;
-import com.datastax.driver.core.ConsistencyLevel;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
+
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.convert.DurationUnit;
+import com.datastax.driver.core.ConsistencyLevel;
+
@ConfigurationProperties("conductor.cassandra")
public class CassandraProperties {
- /**
- * The address for the cassandra database host
- */
+ /** The address for the cassandra database host */
private String hostAddress = "127.0.0.1";
- /**
- * The port to be used to connect to the cassandra database instance
- */
+ /** The port to be used to connect to the cassandra database instance */
private int port = 9142;
- /**
- * The name of the cassandra cluster
- */
+ /** The name of the cassandra cluster */
private String cluster = "";
- /**
- * The keyspace to be used in the cassandra datastore
- */
+ /** The keyspace to be used in the cassandra datastore */
private String keyspace = "conductor";
/**
- * The number of tasks to be stored in a single partition which will be used for sharding workflows in the
- * datastore
+ * The number of tasks to be stored in a single partition which will be used for sharding
+ * workflows in the datastore
*/
private int shardSize = 100;
- /**
- * The replication strategy with which to configure the keyspace
- */
+ /** The replication strategy with which to configure the keyspace */
private String replicationStrategy = "SimpleStrategy";
- /**
- * The key to be used while configuring the replication factor
- */
+ /** The key to be used while configuring the replication factor */
private String replicationFactorKey = "replication_factor";
- /**
- * The replication factor value with which the keyspace is configured
- */
+ /** The replication factor value with which the keyspace is configured */
private int replicationFactorValue = 3;
- /**
- * The consistency level to be used for read operations
- */
+ /** The consistency level to be used for read operations */
private ConsistencyLevel readConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
- /**
- * The consistency level to be used for write operations
- */
+ /** The consistency level to be used for write operations */
private ConsistencyLevel writeConsistencyLevel = ConsistencyLevel.LOCAL_QUORUM;
- /**
- * The time in seconds after which the in-memory task definitions cache will be refreshed
- */
+ /** The time in seconds after which the in-memory task definitions cache will be refreshed */
@DurationUnit(ChronoUnit.SECONDS)
private Duration taskDefCacheRefreshInterval = Duration.ofSeconds(60);
- /**
- * The time in seconds after which the in-memory event handler cache will be refreshed
- */
+ /** The time in seconds after which the in-memory event handler cache will be refreshed */
@DurationUnit(ChronoUnit.SECONDS)
private Duration eventHandlerCacheRefreshInterval = Duration.ofSeconds(60);
- /**
- * The time to live in seconds for which the event execution will be persisted
- */
+ /** The time to live in seconds for which the event execution will be persisted */
@DurationUnit(ChronoUnit.SECONDS)
private Duration eventExecutionPersistenceTtl = Duration.ZERO;
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/cache/CacheableEventHandlerDAO.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/cache/CacheableEventHandlerDAO.java
new file mode 100644
index 0000000000..6f4b8bee1e
--- /dev/null
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/config/cache/CacheableEventHandlerDAO.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.cassandra.config.cache;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import javax.annotation.PostConstruct;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+
+import com.netflix.conductor.annotations.Trace;
+import com.netflix.conductor.cassandra.config.CassandraProperties;
+import com.netflix.conductor.cassandra.dao.CassandraEventHandlerDAO;
+import com.netflix.conductor.common.metadata.events.EventHandler;
+import com.netflix.conductor.dao.EventHandlerDAO;
+import com.netflix.conductor.metrics.Monitors;
+
+import static com.netflix.conductor.cassandra.config.cache.CachingConfig.EVENT_HANDLER_CACHE;
+
+@Trace
+public class CacheableEventHandlerDAO implements EventHandlerDAO {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CacheableEventHandlerDAO.class);
+
+ private static final String CLASS_NAME = CacheableEventHandlerDAO.class.getSimpleName();
+
+ private final CassandraEventHandlerDAO cassandraEventHandlerDAO;
+ private final CassandraProperties properties;
+
+ private final CacheManager cacheManager;
+
+ public CacheableEventHandlerDAO(
+ CassandraEventHandlerDAO cassandraEventHandlerDAO,
+ CassandraProperties properties,
+ CacheManager cacheManager) {
+ this.cassandraEventHandlerDAO = cassandraEventHandlerDAO;
+ this.properties = properties;
+ this.cacheManager = cacheManager;
+ }
+
+ @PostConstruct
+ public void scheduleEventHandlerRefresh() {
+ long cacheRefreshTime = properties.getEventHandlerCacheRefreshInterval().getSeconds();
+ Executors.newSingleThreadScheduledExecutor()
+ .scheduleWithFixedDelay(
+ this::refreshEventHandlersCache, 0, cacheRefreshTime, TimeUnit.SECONDS);
+ }
+
+ @Override
+ @CachePut(value = EVENT_HANDLER_CACHE, key = "#eventHandler.name")
+ public void addEventHandler(EventHandler eventHandler) {
+ cassandraEventHandlerDAO.addEventHandler(eventHandler);
+ }
+
+ @Override
+ @CachePut(value = EVENT_HANDLER_CACHE, key = "#eventHandler.name")
+ public void updateEventHandler(EventHandler eventHandler) {
+ cassandraEventHandlerDAO.updateEventHandler(eventHandler);
+ }
+
+ @Override
+ @CacheEvict(EVENT_HANDLER_CACHE)
+ public void removeEventHandler(String name) {
+ cassandraEventHandlerDAO.removeEventHandler(name);
+ }
+
+ @Override
+ public List
+ * 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.cassandra.config.cache;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.PostConstruct;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+
+import com.netflix.conductor.annotations.Trace;
+import com.netflix.conductor.cassandra.config.CassandraProperties;
+import com.netflix.conductor.cassandra.dao.CassandraMetadataDAO;
+import com.netflix.conductor.common.metadata.tasks.TaskDef;
+import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
+import com.netflix.conductor.dao.MetadataDAO;
+import com.netflix.conductor.metrics.Monitors;
+
+import static com.netflix.conductor.cassandra.config.cache.CachingConfig.TASK_DEF_CACHE;
+
+@Trace
+public class CacheableMetadataDAO implements MetadataDAO {
+
+ private static final String CLASS_NAME = CacheableMetadataDAO.class.getSimpleName();
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CacheableMetadataDAO.class);
+
+ private final CassandraMetadataDAO cassandraMetadataDAO;
+ private final CassandraProperties properties;
+
+ private final CacheManager cacheManager;
+
+ public CacheableMetadataDAO(
+ CassandraMetadataDAO cassandraMetadataDAO,
+ CassandraProperties properties,
+ CacheManager cacheManager) {
+ this.cassandraMetadataDAO = cassandraMetadataDAO;
+ this.properties = properties;
+ this.cacheManager = cacheManager;
+ }
+
+ @PostConstruct
+ public void scheduleCacheRefresh() {
+ long cacheRefreshTime = properties.getTaskDefCacheRefreshInterval().getSeconds();
+ Executors.newSingleThreadScheduledExecutor()
+ .scheduleWithFixedDelay(
+ this::refreshTaskDefsCache, 0, cacheRefreshTime, TimeUnit.SECONDS);
+ LOGGER.info(
+ "Scheduled cache refresh for Task Definitions, every {} seconds", cacheRefreshTime);
+ }
+
+ @Override
+ @CachePut(value = TASK_DEF_CACHE, key = "#taskDef.name")
+ public TaskDef createTaskDef(TaskDef taskDef) {
+ cassandraMetadataDAO.createTaskDef(taskDef);
+ return taskDef;
+ }
+
+ @Override
+ @CachePut(value = TASK_DEF_CACHE, key = "#taskDef.name")
+ public TaskDef updateTaskDef(TaskDef taskDef) {
+ return cassandraMetadataDAO.updateTaskDef(taskDef);
+ }
+
+ @Override
+ @Cacheable(TASK_DEF_CACHE)
+ public TaskDef getTaskDef(String name) {
+ return cassandraMetadataDAO.getTaskDef(name);
+ }
+
+ @Override
+ public List
+ * 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.cassandra.config.cache;
+
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.concurrent.ConcurrentMapCacheManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableCaching
+public class CachingConfig {
+ public static final String TASK_DEF_CACHE = "taskDefCache";
+ public static final String EVENT_HANDLER_CACHE = "eventHandlerCache";
+
+ @Bean
+ public CacheManager cacheManager() {
+ return new ConcurrentMapCacheManager(TASK_DEF_CACHE, EVENT_HANDLER_CACHE);
+ }
+}
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraBaseDAO.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraBaseDAO.java
index 60f7610802..b327c18fbb 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraBaseDAO.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/dao/CassandraBaseDAO.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -12,19 +12,22 @@
*/
package com.netflix.conductor.cassandra.dao;
+import java.io.IOException;
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.conductor.cassandra.config.CassandraProperties;
+import com.netflix.conductor.core.exception.NonTransientException;
+import com.netflix.conductor.metrics.Monitors;
+
import com.datastax.driver.core.DataType;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.schemabuilder.SchemaBuilder;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
-import com.netflix.conductor.cassandra.config.CassandraProperties;
-import com.netflix.conductor.metrics.Monitors;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
import static com.netflix.conductor.cassandra.util.Constants.DAO_NAME;
import static com.netflix.conductor.cassandra.util.Constants.ENTITY_KEY;
@@ -59,31 +62,36 @@
/**
* Creates the keyspace and tables.
- *
- * CREATE KEYSPACE IF NOT EXISTS conductor WITH replication = { 'class' : 'NetworkTopologyStrategy', 'us-east': '3'};
- *
- * CREATE TABLE IF NOT EXISTS conductor.workflows ( workflow_id uuid, shard_id int, task_id text, entity text, payload
- * text, total_tasks int STATIC, total_partitions int STATIC, PRIMARY KEY((workflow_id, shard_id), entity, task_id) );
- *
- * CREATE TABLE IF NOT EXISTS conductor.task_lookup( task_id uuid, workflow_id uuid, PRIMARY KEY (task_id) );
- *
- * CREATE TABLE IF NOT EXISTS conductor.task_def_limit( task_def_name text, task_id uuid, workflow_id uuid, PRIMARY KEY
- * ((task_def_name), task_id_key) );
- *
- * CREATE TABLE IF NOT EXISTS conductor.workflow_definitions( workflow_def_name text, version int, workflow_definition
- * text, PRIMARY KEY ((workflow_def_name), version) );
- *
- * CREATE TABLE IF NOT EXISTS conductor.workflow_defs_index( workflow_def_version_index text, workflow_def_name_version
- * text, workflow_def_index_value text,PRIMARY KEY ((workflow_def_version_index), workflow_def_name_version) );
- *
- * CREATE TABLE IF NOT EXISTS conductor.task_definitions( task_defs text, task_def_name text, task_definition text,
- * PRIMARY KEY ((task_defs), task_def_name) );
- *
- * CREATE TABLE IF NOT EXISTS conductor.event_handlers( handlers text, event_handler_name text, event_handler text,
- * PRIMARY KEY ((handlers), event_handler_name) );
- *
- * CREATE TABLE IF NOT EXISTS conductor.event_executions( message_id text, event_handler_name text, event_execution_id
- * text, payload text, PRIMARY KEY ((message_id, event_handler_name), event_execution_id) );
+ *
+ * CREATE KEYSPACE IF NOT EXISTS conductor WITH replication = { 'class' :
+ * 'NetworkTopologyStrategy', 'us-east': '3'};
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.workflows ( workflow_id uuid, shard_id int, task_id text,
+ * entity text, payload text, total_tasks int STATIC, total_partitions int STATIC, PRIMARY
+ * KEY((workflow_id, shard_id), entity, task_id) );
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.task_lookup( task_id uuid, workflow_id uuid, PRIMARY KEY
+ * (task_id) );
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.task_def_limit( task_def_name text, task_id uuid,
+ * workflow_id uuid, PRIMARY KEY ((task_def_name), task_id_key) );
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.workflow_definitions( workflow_def_name text, version
+ * int, workflow_definition text, PRIMARY KEY ((workflow_def_name), version) );
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.workflow_defs_index( workflow_def_version_index text,
+ * workflow_def_name_version text, workflow_def_index_value text,PRIMARY KEY
+ * ((workflow_def_version_index), workflow_def_name_version) );
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.task_definitions( task_defs text, task_def_name text,
+ * task_definition text, PRIMARY KEY ((task_defs), task_def_name) );
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.event_handlers( handlers text, event_handler_name text,
+ * event_handler text, PRIMARY KEY ((handlers), event_handler_name) );
+ *
+ * CREATE TABLE IF NOT EXISTS conductor.event_executions( message_id text, event_handler_name
+ * text, event_execution_id text, payload text, PRIMARY KEY ((message_id, event_handler_name),
+ * event_execution_id) );
*/
public abstract class CassandraBaseDAO {
@@ -95,7 +103,8 @@ public abstract class CassandraBaseDAO {
private boolean initialized = false;
- public CassandraBaseDAO(Session session, ObjectMapper objectMapper, CassandraProperties properties) {
+ public CassandraBaseDAO(
+ Session session, ObjectMapper objectMapper, CassandraProperties properties) {
this.session = session;
this.objectMapper = objectMapper;
this.properties = properties;
@@ -103,6 +112,14 @@ public CassandraBaseDAO(Session session, ObjectMapper objectMapper, CassandraPro
init();
}
+ protected static UUID toUUID(String uuidString, String message) {
+ try {
+ return UUID.fromString(uuidString);
+ } catch (IllegalArgumentException iae) {
+ throw new IllegalArgumentException(message + " " + uuidString, iae);
+ }
+ }
+
private void init() {
try {
if (!initialized) {
@@ -115,7 +132,8 @@ private void init() {
session.execute(getCreateTaskDefsTableStatement());
session.execute(getCreateEventHandlersTableStatement());
session.execute(getCreateEventExecutionsTableStatement());
- LOGGER.info("{} initialization complete! Tables created!", getClass().getSimpleName());
+ LOGGER.info(
+ "{} initialization complete! Tables created!", getClass().getSimpleName());
initialized = true;
}
} catch (Exception e) {
@@ -126,96 +144,99 @@ private void init() {
private String getCreateKeyspaceStatement() {
return SchemaBuilder.createKeyspace(properties.getKeyspace())
- .ifNotExists()
- .with()
- .replication(
- ImmutableMap.of("class", properties.getReplicationStrategy(), properties.getReplicationFactorKey(),
- properties.getReplicationFactorValue()))
- .durableWrites(true)
- .getQueryString();
+ .ifNotExists()
+ .with()
+ .replication(
+ ImmutableMap.of(
+ "class",
+ properties.getReplicationStrategy(),
+ properties.getReplicationFactorKey(),
+ properties.getReplicationFactorValue()))
+ .durableWrites(true)
+ .getQueryString();
}
private String getCreateWorkflowsTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_WORKFLOWS)
- .ifNotExists()
- .addPartitionKey(WORKFLOW_ID_KEY, DataType.uuid())
- .addPartitionKey(SHARD_ID_KEY, DataType.cint())
- .addClusteringColumn(ENTITY_KEY, DataType.text())
- .addClusteringColumn(TASK_ID_KEY, DataType.text())
- .addColumn(PAYLOAD_KEY, DataType.text())
- .addStaticColumn(TOTAL_TASKS_KEY, DataType.cint())
- .addStaticColumn(TOTAL_PARTITIONS_KEY, DataType.cint())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(WORKFLOW_ID_KEY, DataType.uuid())
+ .addPartitionKey(SHARD_ID_KEY, DataType.cint())
+ .addClusteringColumn(ENTITY_KEY, DataType.text())
+ .addClusteringColumn(TASK_ID_KEY, DataType.text())
+ .addColumn(PAYLOAD_KEY, DataType.text())
+ .addStaticColumn(TOTAL_TASKS_KEY, DataType.cint())
+ .addStaticColumn(TOTAL_PARTITIONS_KEY, DataType.cint())
+ .getQueryString();
}
private String getCreateTaskLookupTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_TASK_LOOKUP)
- .ifNotExists()
- .addPartitionKey(TASK_ID_KEY, DataType.uuid())
- .addColumn(WORKFLOW_ID_KEY, DataType.uuid())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(TASK_ID_KEY, DataType.uuid())
+ .addColumn(WORKFLOW_ID_KEY, DataType.uuid())
+ .getQueryString();
}
private String getCreateTaskDefLimitTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_TASK_DEF_LIMIT)
- .ifNotExists()
- .addPartitionKey(TASK_DEF_NAME_KEY, DataType.text())
- .addClusteringColumn(TASK_ID_KEY, DataType.uuid())
- .addColumn(WORKFLOW_ID_KEY, DataType.uuid())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(TASK_DEF_NAME_KEY, DataType.text())
+ .addClusteringColumn(TASK_ID_KEY, DataType.uuid())
+ .addColumn(WORKFLOW_ID_KEY, DataType.uuid())
+ .getQueryString();
}
private String getCreateWorkflowDefsTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_WORKFLOW_DEFS)
- .ifNotExists()
- .addPartitionKey(WORKFLOW_DEF_NAME_KEY, DataType.text())
- .addClusteringColumn(WORKFLOW_VERSION_KEY, DataType.cint())
- .addColumn(WORKFLOW_DEFINITION_KEY, DataType.text())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(WORKFLOW_DEF_NAME_KEY, DataType.text())
+ .addClusteringColumn(WORKFLOW_VERSION_KEY, DataType.cint())
+ .addColumn(WORKFLOW_DEFINITION_KEY, DataType.text())
+ .getQueryString();
}
private String getCreateWorkflowDefsIndexTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_WORKFLOW_DEFS_INDEX)
- .ifNotExists()
- .addPartitionKey(WORKFLOW_DEF_INDEX_KEY, DataType.text())
- .addClusteringColumn(WORKFLOW_DEF_NAME_VERSION_KEY, DataType.text())
- .addColumn(WORKFLOW_DEF_INDEX_VALUE, DataType.text())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(WORKFLOW_DEF_INDEX_KEY, DataType.text())
+ .addClusteringColumn(WORKFLOW_DEF_NAME_VERSION_KEY, DataType.text())
+ .addColumn(WORKFLOW_DEF_INDEX_VALUE, DataType.text())
+ .getQueryString();
}
private String getCreateTaskDefsTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_TASK_DEFS)
- .ifNotExists()
- .addPartitionKey(TASK_DEFS_KEY, DataType.text())
- .addClusteringColumn(TASK_DEF_NAME_KEY, DataType.text())
- .addColumn(TASK_DEFINITION_KEY, DataType.text())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(TASK_DEFS_KEY, DataType.text())
+ .addClusteringColumn(TASK_DEF_NAME_KEY, DataType.text())
+ .addColumn(TASK_DEFINITION_KEY, DataType.text())
+ .getQueryString();
}
private String getCreateEventHandlersTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_EVENT_HANDLERS)
- .ifNotExists()
- .addPartitionKey(HANDLERS_KEY, DataType.text())
- .addClusteringColumn(EVENT_HANDLER_NAME_KEY, DataType.text())
- .addColumn(EVENT_HANDLER_KEY, DataType.text())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(HANDLERS_KEY, DataType.text())
+ .addClusteringColumn(EVENT_HANDLER_NAME_KEY, DataType.text())
+ .addColumn(EVENT_HANDLER_KEY, DataType.text())
+ .getQueryString();
}
private String getCreateEventExecutionsTableStatement() {
return SchemaBuilder.createTable(properties.getKeyspace(), TABLE_EVENT_EXECUTIONS)
- .ifNotExists()
- .addPartitionKey(MESSAGE_ID_KEY, DataType.text())
- .addPartitionKey(EVENT_HANDLER_NAME_KEY, DataType.text())
- .addClusteringColumn(EVENT_EXECUTION_ID_KEY, DataType.text())
- .addColumn(PAYLOAD_KEY, DataType.text())
- .getQueryString();
+ .ifNotExists()
+ .addPartitionKey(MESSAGE_ID_KEY, DataType.text())
+ .addPartitionKey(EVENT_HANDLER_NAME_KEY, DataType.text())
+ .addClusteringColumn(EVENT_EXECUTION_ID_KEY, DataType.text())
+ .addColumn(PAYLOAD_KEY, DataType.text())
+ .getQueryString();
}
String toJson(Object value) {
try {
return objectMapper.writeValueAsString(value);
} catch (JsonProcessingException e) {
- throw new RuntimeException(e);
+ throw new NonTransientException("Error serializing to json", e);
}
}
@@ -223,7 +244,7 @@
* 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
@@ -12,30 +12,27 @@
*/
package com.netflix.conductor.cassandra.dao;
-import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.core.Session;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.netflix.conductor.annotations.Trace;
import com.netflix.conductor.cassandra.config.CassandraProperties;
import com.netflix.conductor.cassandra.util.Statements;
import com.netflix.conductor.common.metadata.events.EventHandler;
-import com.netflix.conductor.core.exception.ApplicationException;
-import com.netflix.conductor.core.exception.ApplicationException.Code;
+import com.netflix.conductor.core.exception.TransientException;
import com.netflix.conductor.dao.EventHandlerDAO;
import com.netflix.conductor.metrics.Monitors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.exceptions.DriverException;
+import com.fasterxml.jackson.databind.ObjectMapper;
import static com.netflix.conductor.cassandra.util.Constants.EVENT_HANDLER_KEY;
import static com.netflix.conductor.cassandra.util.Constants.HANDLERS_KEY;
@@ -46,26 +43,26 @@ public class CassandraEventHandlerDAO extends CassandraBaseDAO implements EventH
private static final Logger LOGGER = LoggerFactory.getLogger(CassandraEventHandlerDAO.class);
private static final String CLASS_NAME = CassandraEventHandlerDAO.class.getSimpleName();
- private volatile Map
* 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
@@ -12,237 +12,274 @@
*/
package com.netflix.conductor.cassandra.dao;
-import com.datastax.driver.core.BatchStatement;
-import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.core.Session;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.netflix.conductor.annotations.Trace;
import com.netflix.conductor.cassandra.config.CassandraProperties;
import com.netflix.conductor.cassandra.util.Statements;
import com.netflix.conductor.common.metadata.events.EventExecution;
-import com.netflix.conductor.common.metadata.tasks.Task;
import com.netflix.conductor.common.metadata.tasks.TaskDef;
-import com.netflix.conductor.common.run.Workflow;
-import com.netflix.conductor.common.utils.RetryUtil;
-import com.netflix.conductor.core.exception.ApplicationException;
-import com.netflix.conductor.core.exception.ApplicationException.Code;
+import com.netflix.conductor.core.exception.NonTransientException;
+import com.netflix.conductor.core.exception.NotFoundException;
+import com.netflix.conductor.core.exception.TransientException;
+import com.netflix.conductor.dao.ConcurrentExecutionLimitDAO;
import com.netflix.conductor.dao.ExecutionDAO;
import com.netflix.conductor.metrics.Monitors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import com.netflix.conductor.model.TaskModel;
+import com.netflix.conductor.model.WorkflowModel;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.stream.Collectors;
+import com.datastax.driver.core.*;
+import com.datastax.driver.core.exceptions.DriverException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
-import static com.netflix.conductor.cassandra.util.Constants.DEFAULT_SHARD_ID;
-import static com.netflix.conductor.cassandra.util.Constants.DEFAULT_TOTAL_PARTITIONS;
-import static com.netflix.conductor.cassandra.util.Constants.ENTITY_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_TASK;
-import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_WORKFLOW;
-import static com.netflix.conductor.cassandra.util.Constants.PAYLOAD_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.TASK_ID_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.TOTAL_PARTITIONS_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.TOTAL_TASKS_KEY;
-import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_ID_KEY;
-import static com.netflix.conductor.common.metadata.tasks.Task.Status.IN_PROGRESS;
+import static com.netflix.conductor.cassandra.util.Constants.*;
@Trace
-public class CassandraExecutionDAO extends CassandraBaseDAO implements ExecutionDAO {
+public class CassandraExecutionDAO extends CassandraBaseDAO
+ implements ExecutionDAO, ConcurrentExecutionLimitDAO {
private static final Logger LOGGER = LoggerFactory.getLogger(CassandraExecutionDAO.class);
private static final String CLASS_NAME = CassandraExecutionDAO.class.getSimpleName();
- private final PreparedStatement insertWorkflowStatement;
- private final PreparedStatement insertTaskStatement;
- private final PreparedStatement insertEventExecutionStatement;
-
- private final PreparedStatement selectTotalStatement;
- private final PreparedStatement selectTaskStatement;
- private final PreparedStatement selectWorkflowStatement;
- private final PreparedStatement selectWorkflowWithTasksStatement;
- private final PreparedStatement selectTaskLookupStatement;
- private final PreparedStatement selectTasksFromTaskDefLimitStatement;
- private final PreparedStatement selectEventExecutionsStatement;
-
- private final PreparedStatement updateWorkflowStatement;
- private final PreparedStatement updateTotalTasksStatement;
- private final PreparedStatement updateTotalPartitionsStatement;
- private final PreparedStatement updateTaskLookupStatement;
- private final PreparedStatement updateTaskDefLimitStatement;
- private final PreparedStatement updateEventExecutionStatement;
-
- private final PreparedStatement deleteWorkflowStatement;
- private final PreparedStatement deleteTaskStatement;
- private final PreparedStatement deleteTaskLookupStatement;
- private final PreparedStatement deleteTaskDefLimitStatement;
- private final PreparedStatement deleteEventExecutionStatement;
-
- private final int eventExecutionsTTL;
-
- public CassandraExecutionDAO(Session session, ObjectMapper objectMapper, CassandraProperties properties,
- Statements statements) {
+ protected final PreparedStatement insertWorkflowStatement;
+ protected final PreparedStatement insertTaskStatement;
+ protected final PreparedStatement insertEventExecutionStatement;
+
+ protected final PreparedStatement selectTotalStatement;
+ protected final PreparedStatement selectTaskStatement;
+ protected final PreparedStatement selectWorkflowStatement;
+ protected final PreparedStatement selectWorkflowWithTasksStatement;
+ protected final PreparedStatement selectTaskLookupStatement;
+ protected final PreparedStatement selectTasksFromTaskDefLimitStatement;
+ protected final PreparedStatement selectEventExecutionsStatement;
+
+ protected final PreparedStatement updateWorkflowStatement;
+ protected final PreparedStatement updateTotalTasksStatement;
+ protected final PreparedStatement updateTotalPartitionsStatement;
+ protected final PreparedStatement updateTaskLookupStatement;
+ protected final PreparedStatement updateTaskDefLimitStatement;
+ protected final PreparedStatement updateEventExecutionStatement;
+
+ protected final PreparedStatement deleteWorkflowStatement;
+ protected final PreparedStatement deleteTaskStatement;
+ protected final PreparedStatement deleteTaskLookupStatement;
+ protected final PreparedStatement deleteTaskDefLimitStatement;
+ protected final PreparedStatement deleteEventExecutionStatement;
+
+ protected final int eventExecutionsTTL;
+
+ public CassandraExecutionDAO(
+ Session session,
+ ObjectMapper objectMapper,
+ CassandraProperties properties,
+ Statements statements) {
super(session, objectMapper, properties);
eventExecutionsTTL = (int) properties.getEventExecutionPersistenceTtl().getSeconds();
- this.insertWorkflowStatement = session.prepare(statements.getInsertWorkflowStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.insertTaskStatement = session.prepare(statements.getInsertTaskStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.insertEventExecutionStatement = session.prepare(statements.getInsertEventExecutionStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
-
- this.selectTotalStatement = session.prepare(statements.getSelectTotalStatement())
- .setConsistencyLevel(properties.getReadConsistencyLevel());
- this.selectTaskStatement = session.prepare(statements.getSelectTaskStatement())
- .setConsistencyLevel(properties.getReadConsistencyLevel());
- this.selectWorkflowStatement = session.prepare(statements.getSelectWorkflowStatement())
- .setConsistencyLevel(properties.getReadConsistencyLevel());
- this.selectWorkflowWithTasksStatement = session.prepare(statements.getSelectWorkflowWithTasksStatement())
- .setConsistencyLevel(properties.getReadConsistencyLevel());
- this.selectTaskLookupStatement = session.prepare(statements.getSelectTaskFromLookupTableStatement())
- .setConsistencyLevel(properties.getReadConsistencyLevel());
- this.selectTasksFromTaskDefLimitStatement = session
- .prepare(statements.getSelectTasksFromTaskDefLimitStatement())
- .setConsistencyLevel(properties.getReadConsistencyLevel());
- this.selectEventExecutionsStatement = session
- .prepare(statements.getSelectAllEventExecutionsForMessageFromEventExecutionsStatement())
- .setConsistencyLevel(properties.getReadConsistencyLevel());
-
- this.updateWorkflowStatement = session.prepare(statements.getUpdateWorkflowStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.updateTotalTasksStatement = session.prepare(statements.getUpdateTotalTasksStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.updateTotalPartitionsStatement = session.prepare(statements.getUpdateTotalPartitionsStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.updateTaskLookupStatement = session.prepare(statements.getUpdateTaskLookupStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.updateTaskDefLimitStatement = session.prepare(statements.getUpdateTaskDefLimitStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.updateEventExecutionStatement = session.prepare(statements.getUpdateEventExecutionStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
-
- this.deleteWorkflowStatement = session.prepare(statements.getDeleteWorkflowStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.deleteTaskStatement = session.prepare(statements.getDeleteTaskStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.deleteTaskLookupStatement = session.prepare(statements.getDeleteTaskLookupStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.deleteTaskDefLimitStatement = session.prepare(statements.getDeleteTaskDefLimitStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
- this.deleteEventExecutionStatement = session.prepare(statements.getDeleteEventExecutionsStatement())
- .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.insertWorkflowStatement =
+ session.prepare(statements.getInsertWorkflowStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.insertTaskStatement =
+ session.prepare(statements.getInsertTaskStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.insertEventExecutionStatement =
+ session.prepare(statements.getInsertEventExecutionStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+
+ this.selectTotalStatement =
+ session.prepare(statements.getSelectTotalStatement())
+ .setConsistencyLevel(properties.getReadConsistencyLevel());
+ this.selectTaskStatement =
+ session.prepare(statements.getSelectTaskStatement())
+ .setConsistencyLevel(properties.getReadConsistencyLevel());
+ this.selectWorkflowStatement =
+ session.prepare(statements.getSelectWorkflowStatement())
+ .setConsistencyLevel(properties.getReadConsistencyLevel());
+ this.selectWorkflowWithTasksStatement =
+ session.prepare(statements.getSelectWorkflowWithTasksStatement())
+ .setConsistencyLevel(properties.getReadConsistencyLevel());
+ this.selectTaskLookupStatement =
+ session.prepare(statements.getSelectTaskFromLookupTableStatement())
+ .setConsistencyLevel(properties.getReadConsistencyLevel());
+ this.selectTasksFromTaskDefLimitStatement =
+ session.prepare(statements.getSelectTasksFromTaskDefLimitStatement())
+ .setConsistencyLevel(properties.getReadConsistencyLevel());
+ this.selectEventExecutionsStatement =
+ session.prepare(
+ statements
+ .getSelectAllEventExecutionsForMessageFromEventExecutionsStatement())
+ .setConsistencyLevel(properties.getReadConsistencyLevel());
+
+ this.updateWorkflowStatement =
+ session.prepare(statements.getUpdateWorkflowStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.updateTotalTasksStatement =
+ session.prepare(statements.getUpdateTotalTasksStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.updateTotalPartitionsStatement =
+ session.prepare(statements.getUpdateTotalPartitionsStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.updateTaskLookupStatement =
+ session.prepare(statements.getUpdateTaskLookupStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.updateTaskDefLimitStatement =
+ session.prepare(statements.getUpdateTaskDefLimitStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.updateEventExecutionStatement =
+ session.prepare(statements.getUpdateEventExecutionStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+
+ this.deleteWorkflowStatement =
+ session.prepare(statements.getDeleteWorkflowStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.deleteTaskStatement =
+ session.prepare(statements.getDeleteTaskStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.deleteTaskLookupStatement =
+ session.prepare(statements.getDeleteTaskLookupStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.deleteTaskDefLimitStatement =
+ session.prepare(statements.getDeleteTaskDefLimitStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
+ this.deleteEventExecutionStatement =
+ session.prepare(statements.getDeleteEventExecutionsStatement())
+ .setConsistencyLevel(properties.getWriteConsistencyLevel());
}
@Override
- public List
* 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
@@ -12,25 +12,6 @@
*/
package com.netflix.conductor.cassandra.dao;
-import com.datastax.driver.core.PreparedStatement;
-import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.Row;
-import com.datastax.driver.core.Session;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.common.annotations.VisibleForTesting;
-import com.netflix.conductor.annotations.Trace;
-import com.netflix.conductor.cassandra.config.CassandraProperties;
-import com.netflix.conductor.cassandra.util.Statements;
-import com.netflix.conductor.common.metadata.tasks.TaskDef;
-import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
-import com.netflix.conductor.core.exception.ApplicationException;
-import com.netflix.conductor.core.exception.ApplicationException.Code;
-import com.netflix.conductor.dao.MetadataDAO;
-import com.netflix.conductor.metrics.Monitors;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -38,15 +19,37 @@
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
+import java.util.PriorityQueue;
import java.util.stream.Collectors;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.netflix.conductor.annotations.Trace;
+import com.netflix.conductor.annotations.VisibleForTesting;
+import com.netflix.conductor.cassandra.config.CassandraProperties;
+import com.netflix.conductor.cassandra.util.Statements;
+import com.netflix.conductor.common.metadata.tasks.TaskDef;
+import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
+import com.netflix.conductor.core.exception.ConflictException;
+import com.netflix.conductor.core.exception.TransientException;
+import com.netflix.conductor.dao.MetadataDAO;
+import com.netflix.conductor.metrics.Monitors;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.exceptions.DriverException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
import static com.netflix.conductor.cassandra.util.Constants.TASK_DEFINITION_KEY;
import static com.netflix.conductor.cassandra.util.Constants.TASK_DEFS_KEY;
import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_DEFINITION_KEY;
import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_DEF_INDEX_KEY;
import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_DEF_NAME_VERSION_KEY;
+import static com.netflix.conductor.common.metadata.tasks.TaskDef.ONE_HOUR;
@Trace
public class CassandraMetadataDAO extends CassandraBaseDAO implements MetadataDAO {
@@ -55,15 +58,15 @@ public class CassandraMetadataDAO extends CassandraBaseDAO implements MetadataDA
private static final String CLASS_NAME = CassandraMetadataDAO.class.getSimpleName();
private static final String INDEX_DELIMITER = "/";
- private Map
+ * 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.cassandra.dao;
+import java.util.List;
+
import com.netflix.conductor.common.metadata.tasks.PollData;
import com.netflix.conductor.dao.PollDataDAO;
-import java.util.List;
-
/**
- * This is a dummy implementation and this feature is not implemented for Cassandra backed Conductor.
+ * This is a dummy implementation and this feature is not implemented for Cassandra backed
+ * Conductor.
*/
public class CassandraPollDataDAO implements PollDataDAO {
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Constants.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Constants.java
index f5eb9f7dfe..473c23132c 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Constants.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Constants.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
diff --git a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java
index 060c80410f..68fe3b2427 100644
--- a/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java
+++ b/cassandra-persistence/src/main/java/com/netflix/conductor/cassandra/util/Statements.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 Netflix, Inc.
+ * Copyright 2022 Netflix, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
@@ -14,9 +14,6 @@
import com.datastax.driver.core.querybuilder.QueryBuilder;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
-import static com.datastax.driver.core.querybuilder.QueryBuilder.set;
import static com.netflix.conductor.cassandra.util.Constants.ENTITY_KEY;
import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_TASK;
import static com.netflix.conductor.cassandra.util.Constants.ENTITY_TYPE_WORKFLOW;
@@ -49,64 +46,85 @@
import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_ID_KEY;
import static com.netflix.conductor.cassandra.util.Constants.WORKFLOW_VERSION_KEY;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.bindMarker;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.eq;
+import static com.datastax.driver.core.querybuilder.QueryBuilder.set;
+
/**
* DML statements
*
- * MetadataDAO
- * MetadataDAO
*
- *
+ * 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.cassandra.dao
+
+import com.netflix.conductor.common.metadata.events.EventExecution
+import com.netflix.conductor.common.metadata.events.EventHandler
+
+import spock.lang.Subject
+
+class CassandraEventHandlerDAOSpec extends CassandraSpec {
+
+ @Subject
+ CassandraEventHandlerDAO eventHandlerDAO
+
+ CassandraExecutionDAO executionDAO
+
+ def setup() {
+ eventHandlerDAO = new CassandraEventHandlerDAO(session, objectMapper, cassandraProperties, statements)
+ executionDAO = new CassandraExecutionDAO(session, objectMapper, cassandraProperties, statements)
+ }
+
+ def testEventHandlerCRUD() {
+ given:
+ String event = "event"
+ String eventHandlerName1 = "event_handler1"
+ String eventHandlerName2 = "event_handler2"
+
+ EventHandler eventHandler = new EventHandler()
+ eventHandler.setName(eventHandlerName1)
+ eventHandler.setEvent(event)
+
+ when: // create event handler
+ eventHandlerDAO.addEventHandler(eventHandler)
+ List
+ * 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.cassandra.dao
+
+import com.netflix.conductor.common.metadata.events.EventExecution
+import com.netflix.conductor.common.metadata.tasks.TaskDef
+import com.netflix.conductor.common.metadata.workflow.WorkflowDef
+import com.netflix.conductor.common.metadata.workflow.WorkflowTask
+import com.netflix.conductor.core.exception.NonTransientException
+import com.netflix.conductor.core.utils.IDGenerator
+import com.netflix.conductor.model.TaskModel
+import com.netflix.conductor.model.WorkflowModel
+
+import spock.lang.Subject
+
+import static com.netflix.conductor.common.metadata.events.EventExecution.Status.COMPLETED
+import static com.netflix.conductor.common.metadata.events.EventExecution.Status.IN_PROGRESS
+
+class CassandraExecutionDAOSpec extends CassandraSpec {
+
+ @Subject
+ CassandraExecutionDAO executionDAO
+
+ def setup() {
+ executionDAO = new CassandraExecutionDAO(session, objectMapper, cassandraProperties, statements)
+ }
+
+ def "verify if tasks are validated"() {
+ given:
+ def tasks = []
+
+ // create tasks for a workflow and add to list
+ TaskModel task1 = new TaskModel(workflowInstanceId: 'uuid', taskId: 'task1id', referenceTaskName: 'task1')
+ TaskModel task2 = new TaskModel(workflowInstanceId: 'uuid', taskId: 'task2id', referenceTaskName: 'task2')
+ tasks << task1 << task2
+
+ when:
+ executionDAO.validateTasks(tasks)
+
+ then:
+ noExceptionThrown()
+
+ and:
+ // add a task from a different workflow to the list
+ TaskModel task3 = new TaskModel(workflowInstanceId: 'other-uuid', taskId: 'task3id', referenceTaskName: 'task3')
+ tasks << task3
+
+ when:
+ executionDAO.validateTasks(tasks)
+
+ then:
+ def ex = thrown(NonTransientException.class)
+ ex.message == "Tasks of multiple workflows cannot be created/updated simultaneously"
+ }
+
+ def "workflow CRUD"() {
+ given:
+ String workflowId = new IDGenerator().generate()
+ WorkflowDef workflowDef = new WorkflowDef()
+ workflowDef.name = "def1"
+ workflowDef.setVersion(1)
+ WorkflowModel workflow = new WorkflowModel()
+ workflow.setWorkflowDefinition(workflowDef)
+ workflow.setWorkflowId(workflowId)
+ workflow.setInput(new HashMap<>())
+ workflow.setStatus(WorkflowModel.Status.RUNNING)
+ workflow.setCreateTime(System.currentTimeMillis())
+
+ when:
+ // create a new workflow in the datastore
+ String id = executionDAO.createWorkflow(workflow)
+
+ then:
+ workflowId == id
+
+ when:
+ // read the workflow from the datastore
+ WorkflowModel found = executionDAO.getWorkflow(workflowId)
+
+ then:
+ workflow == found
+
+ and:
+ // update the workflow
+ workflow.setStatus(WorkflowModel.Status.COMPLETED)
+ executionDAO.updateWorkflow(workflow)
+
+ when:
+ found = executionDAO.getWorkflow(workflowId)
+
+ then:
+ workflow == found
+
+ when:
+ // remove the workflow from datastore
+ boolean removed = executionDAO.removeWorkflow(workflowId)
+
+ then:
+ removed
+
+ when:
+ // read workflow again
+ workflow = executionDAO.getWorkflow(workflowId, true)
+
+ then:
+ workflow == null
+ }
+
+ def "create tasks and verify methods that read tasks and workflow"() {
+ given: 'we create a workflow'
+ String workflowId = new IDGenerator().generate()
+ WorkflowDef workflowDef = new WorkflowDef(name: 'def1', version: 1)
+ WorkflowModel workflow = new WorkflowModel(workflowDefinition: workflowDef, workflowId: workflowId, input: new HashMap(), status: WorkflowModel.Status.RUNNING, createTime: System.currentTimeMillis())
+ executionDAO.createWorkflow(workflow)
+
+ and: 'create tasks for this workflow'
+ TaskModel task1 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task1', referenceTaskName: 'task1', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task2 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task2', referenceTaskName: 'task2', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+ TaskModel task3 = new TaskModel(workflowInstanceId: workflowId, taskType: 'task3', referenceTaskName: 'task3', status: TaskModel.Status.SCHEDULED, taskId: new IDGenerator().generate())
+
+ def taskList = [task1, task2, task3]
+
+ when: 'add the tasks to the datastore'
+ List
+ * 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.cassandra.dao
+
+import com.netflix.conductor.common.metadata.tasks.TaskDef
+import com.netflix.conductor.common.metadata.workflow.WorkflowDef
+
+import spock.lang.Subject
+
+class CassandraMetadataDAOSpec extends CassandraSpec {
+
+ @Subject
+ CassandraMetadataDAO metadataDAO
+
+ def setup() {
+ metadataDAO = new CassandraMetadataDAO(session, objectMapper, cassandraProperties, statements)
+ }
+
+ def cleanup() {
+
+ }
+
+ def "CRUD on WorkflowDef"() throws Exception {
+ given:
+ String name = "workflow_def_1"
+ int version = 1
+
+ WorkflowDef workflowDef = new WorkflowDef()
+ workflowDef.setName(name)
+ workflowDef.setVersion(version)
+ workflowDef.setOwnerEmail("test@junit.com")
+
+ when: 'create workflow definition'
+ metadataDAO.createWorkflowDef(workflowDef)
+
+ then: // fetch the workflow definition
+ def defOptional = metadataDAO.getWorkflowDef(name, version)
+ defOptional.present
+ defOptional.get() == workflowDef
+
+ and: // register a higher version
+ int higherVersion = 2
+ workflowDef.setVersion(higherVersion)
+ workflowDef.setDescription("higher version")
+
+ when: // register the higher version definition
+ metadataDAO.createWorkflowDef(workflowDef)
+ defOptional = metadataDAO.getWorkflowDef(name, higherVersion)
+
+ then: // fetch the higher version
+ defOptional.present
+ defOptional.get() == workflowDef
+
+ when: // fetch latest version
+ defOptional = metadataDAO.getLatestWorkflowDef(name)
+
+ then:
+ defOptional && defOptional.present
+ defOptional.get() == workflowDef
+
+ when: // modify the definition
+ workflowDef.setOwnerEmail("test@junit.com")
+ metadataDAO.updateWorkflowDef(workflowDef)
+ defOptional = metadataDAO.getWorkflowDef(name, higherVersion)
+
+ then: // fetch the workflow definition
+ defOptional.present
+ defOptional.get() == workflowDef
+
+ when: // delete workflow def
+ metadataDAO.removeWorkflowDef(name, higherVersion)
+ defOptional = metadataDAO.getWorkflowDef(name, higherVersion)
+
+ then:
+ defOptional.empty
+ }
+
+ def "CRUD on TaskDef"() {
+ given:
+ String task1Name = "task1"
+ String task2Name = "task2"
+
+ when: // fetch all task defs
+ def taskDefList = metadataDAO.getAllTaskDefs()
+
+ then:
+ taskDefList.empty
+
+ when: // register a task definition
+ TaskDef taskDef = new TaskDef()
+ taskDef.setName(task1Name)
+ metadataDAO.createTaskDef(taskDef)
+ taskDefList = metadataDAO.getAllTaskDefs()
+
+ then: // fetch all task defs
+ taskDefList && taskDefList.size() == 1
+
+ when: // fetch the task def
+ def returnTaskDef = metadataDAO.getTaskDef(task1Name)
+
+ then:
+ returnTaskDef == taskDef
+
+ when: // register another task definition
+ TaskDef taskDef1 = new TaskDef()
+ taskDef1.setName(task2Name)
+ metadataDAO.createTaskDef(taskDef1)
+ // fetch all task defs
+ taskDefList = metadataDAO.getAllTaskDefs()
+
+ then:
+ taskDefList && taskDefList.size() == 2
+
+ when: // update task def
+ taskDef.setOwnerEmail("juni@test.com")
+ metadataDAO.updateTaskDef(taskDef)
+ returnTaskDef = metadataDAO.getTaskDef(task1Name)
+
+ then:
+ returnTaskDef == taskDef
+
+ when: // delete task def
+ metadataDAO.removeTaskDef(task2Name)
+ taskDefList = metadataDAO.getAllTaskDefs()
+
+ then:
+ taskDefList && taskDefList.size() == 1
+ // fetch deleted task def
+ metadataDAO.getTaskDef(task2Name) == null
+ }
+
+ def "set default response timeout when not set"() {
+ given:
+ String task1Name = "task1"
+
+ when: // register a task definition
+ TaskDef taskDef = new TaskDef()
+ taskDef.setName(task1Name)
+ taskDef.setResponseTimeoutSeconds(0)
+ metadataDAO.createTaskDef(taskDef)
+ def returnTaskDef = metadataDAO.getTaskDef(task1Name)
+
+ then:
+ returnTaskDef.getResponseTimeoutSeconds() == 3600
+
+ when: // register another task definition
+ taskDef.setTimeoutSeconds(200)
+ taskDef.setResponseTimeoutSeconds(0)
+ metadataDAO.updateTaskDef(taskDef)
+ // fetch all task defs
+ def taskDefList = metadataDAO.getAllTaskDefs()
+
+ then:
+ taskDefList && taskDefList.size() == 1
+ taskDefList.get(0).getResponseTimeoutSeconds() == 199
+
+ }
+
+ def "Get All WorkflowDef"() {
+ when:
+ metadataDAO.removeWorkflowDef("workflow_def_1", 1)
+ WorkflowDef workflowDef = new WorkflowDef()
+ workflowDef.setName("workflow_def_1")
+ workflowDef.setVersion(1)
+ workflowDef.setOwnerEmail("test@junit.com")
+ metadataDAO.createWorkflowDef(workflowDef)
+
+ workflowDef.setName("workflow_def_2")
+ metadataDAO.createWorkflowDef(workflowDef)
+ workflowDef.setVersion(2)
+ metadataDAO.createWorkflowDef(workflowDef)
+
+ workflowDef.setName("workflow_def_3")
+ workflowDef.setVersion(1)
+ metadataDAO.createWorkflowDef(workflowDef)
+ workflowDef.setVersion(2)
+ metadataDAO.createWorkflowDef(workflowDef)
+ workflowDef.setVersion(3)
+ metadataDAO.createWorkflowDef(workflowDef)
+
+ then: // fetch the workflow definition
+ def allDefsLatestVersions = metadataDAO.getAllWorkflowDefsLatestVersions()
+ Map
+ * 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.cassandra.dao
+
+import java.time.Duration
+
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.test.context.ContextConfiguration
+import org.testcontainers.containers.CassandraContainer
+import org.testcontainers.spock.Testcontainers
+
+import com.netflix.conductor.cassandra.config.CassandraProperties
+import com.netflix.conductor.cassandra.util.Statements
+import com.netflix.conductor.common.config.TestObjectMapperConfiguration
+
+import com.datastax.driver.core.ConsistencyLevel
+import com.datastax.driver.core.Session
+import com.fasterxml.jackson.databind.ObjectMapper
+import groovy.transform.PackageScope
+import spock.lang.Shared
+import spock.lang.Specification
+
+@ContextConfiguration(classes = [TestObjectMapperConfiguration.class])
+@Testcontainers
+@PackageScope
+abstract class CassandraSpec extends Specification {
+
+ @Shared
+ CassandraContainer cassandra = new CassandraContainer()
+
+ @Shared
+ Session session
+
+ @Autowired
+ ObjectMapper objectMapper
+
+ CassandraProperties cassandraProperties
+ Statements statements
+
+ def setupSpec() {
+ session = cassandra.cluster.newSession()
+ }
+
+ def setup() {
+ String keyspaceName = "junit"
+ cassandraProperties = Mock(CassandraProperties.class) {
+ getKeyspace() >> keyspaceName
+ getReplicationStrategy() >> "SimpleStrategy"
+ getReplicationFactorKey() >> "replication_factor"
+ getReplicationFactorValue() >> 1
+ getReadConsistencyLevel() >> ConsistencyLevel.LOCAL_ONE
+ getWriteConsistencyLevel() >> ConsistencyLevel.LOCAL_ONE
+ getTaskDefCacheRefreshInterval() >> Duration.ofSeconds(60)
+ getEventHandlerCacheRefreshInterval() >> Duration.ofSeconds(60)
+ getEventExecutionPersistenceTtl() >> Duration.ofSeconds(5)
+ }
+
+ statements = new Statements(keyspaceName)
+ }
+}
diff --git a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/util/StatementsSpec.groovy b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/util/StatementsSpec.groovy
new file mode 100644
index 0000000000..f826a36208
--- /dev/null
+++ b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/util/StatementsSpec.groovy
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.cassandra.util
+
+import spock.lang.Specification
+import spock.lang.Subject
+
+class StatementsSpec extends Specification {
+
+ @Subject
+ Statements subject
+
+ def setup() {
+ subject = new Statements('test')
+ }
+
+ def "verify statements"() {
+ when:
+ subject
+
+ then:
+ with(subject) {
+ insertWorkflowDefStatement == "INSERT INTO test.workflow_definitions (workflow_def_name,version,workflow_definition) VALUES (?,?,?) IF NOT EXISTS;"
+ insertTaskDefStatement == "INSERT INTO test.task_definitions (task_defs,task_def_name,task_definition) VALUES ('task_defs',?,?);"
+ selectWorkflowDefStatement == "SELECT workflow_definition FROM test.workflow_definitions WHERE workflow_def_name=? AND version=?;"
+ selectAllWorkflowDefVersionsByNameStatement == "SELECT * FROM test.workflow_definitions WHERE workflow_def_name=?;"
+ selectAllWorkflowDefsStatement == "SELECT * FROM test.workflow_defs_index WHERE workflow_def_version_index=?;"
+ selectTaskDefStatement == "SELECT task_definition FROM test.task_definitions WHERE task_defs='task_defs' AND task_def_name=?;"
+ selectAllTaskDefsStatement == "SELECT * FROM test.task_definitions WHERE task_defs=?;"
+ updateWorkflowDefStatement == "UPDATE test.workflow_definitions SET workflow_definition=? WHERE workflow_def_name=? AND version=?;"
+ deleteWorkflowDefStatement == "DELETE FROM test.workflow_definitions WHERE workflow_def_name=? AND version=?;"
+ deleteWorkflowDefIndexStatement == "DELETE FROM test.workflow_defs_index WHERE workflow_def_version_index=? AND workflow_def_name_version=?;"
+ deleteTaskDefStatement == "DELETE FROM test.task_definitions WHERE task_defs='task_defs' AND task_def_name=?;"
+ insertWorkflowStatement == "INSERT INTO test.workflows (workflow_id,shard_id,task_id,entity,payload,total_tasks,total_partitions) VALUES (?,?,?,'workflow',?,?,?);"
+ insertTaskStatement == "INSERT INTO test.workflows (workflow_id,shard_id,task_id,entity,payload) VALUES (?,?,?,'task',?);"
+ insertEventExecutionStatement == "INSERT INTO test.event_executions (message_id,event_handler_name,event_execution_id,payload) VALUES (?,?,?,?) IF NOT EXISTS;"
+ selectTotalStatement == "SELECT total_tasks,total_partitions FROM test.workflows WHERE workflow_id=? AND shard_id=1;"
+ selectTaskStatement == "SELECT payload FROM test.workflows WHERE workflow_id=? AND shard_id=? AND entity='task' AND task_id=?;"
+ selectWorkflowStatement == "SELECT payload FROM test.workflows WHERE workflow_id=? AND shard_id=1 AND entity='workflow';"
+ selectWorkflowWithTasksStatement == "SELECT * FROM test.workflows WHERE workflow_id=? AND shard_id=?;"
+ selectTaskFromLookupTableStatement == "SELECT workflow_id FROM test.task_lookup WHERE task_id=?;"
+ selectTasksFromTaskDefLimitStatement == "SELECT * FROM test.task_def_limit WHERE task_def_name=?;"
+ selectAllEventExecutionsForMessageFromEventExecutionsStatement == "SELECT * FROM test.event_executions WHERE message_id=? AND event_handler_name=?;"
+ updateWorkflowStatement == "UPDATE test.workflows SET payload=? WHERE workflow_id=? AND shard_id=1 AND entity='workflow' AND task_id='';"
+ updateTotalTasksStatement == "UPDATE test.workflows SET total_tasks=? WHERE workflow_id=? AND shard_id=?;"
+ updateTotalPartitionsStatement == "UPDATE test.workflows SET total_partitions=?,total_tasks=? WHERE workflow_id=? AND shard_id=1;"
+ updateTaskLookupStatement == "UPDATE test.task_lookup SET workflow_id=? WHERE task_id=?;"
+ updateTaskDefLimitStatement == "UPDATE test.task_def_limit SET workflow_id=? WHERE task_def_name=? AND task_id=?;"
+ updateEventExecutionStatement == "UPDATE test.event_executions USING TTL ? SET payload=? WHERE message_id=? AND event_handler_name=? AND event_execution_id=?;"
+ deleteWorkflowStatement == "DELETE FROM test.workflows WHERE workflow_id=? AND shard_id=?;"
+ deleteTaskLookupStatement == "DELETE FROM test.task_lookup WHERE task_id=?;"
+ deleteTaskStatement == "DELETE FROM test.workflows WHERE workflow_id=? AND shard_id=? AND entity='task' AND task_id=?;"
+ deleteTaskDefLimitStatement == "DELETE FROM test.task_def_limit WHERE task_def_name=? AND task_id=?;"
+ deleteEventExecutionsStatement == "DELETE FROM test.event_executions WHERE message_id=? AND event_handler_name=? AND event_execution_id=?;"
+ insertEventHandlerStatement == "INSERT INTO test.event_handlers (handlers,event_handler_name,event_handler) VALUES ('handlers',?,?);"
+ selectAllEventHandlersStatement == "SELECT * FROM test.event_handlers WHERE handlers=?;"
+ deleteEventHandlerStatement == "DELETE FROM test.event_handlers WHERE handlers='handlers' AND event_handler_name=?;"
+ }
+ }
+}
diff --git a/cassandra-persistence/src/test/java/com/netflix/conductor/cassandra/dao/CassandraDAOTest.java b/cassandra-persistence/src/test/java/com/netflix/conductor/cassandra/dao/CassandraDAOTest.java
deleted file mode 100644
index 86e55af37c..0000000000
--- a/cassandra-persistence/src/test/java/com/netflix/conductor/cassandra/dao/CassandraDAOTest.java
+++ /dev/null
@@ -1,654 +0,0 @@
-/*
- * Copyright 2021 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.cassandra.dao;
-
-import com.datastax.driver.core.ConsistencyLevel;
-import com.datastax.driver.core.Session;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.netflix.conductor.cassandra.config.CassandraProperties;
-import com.netflix.conductor.cassandra.dao.CassandraBaseDAO.WorkflowMetadata;
-import com.netflix.conductor.cassandra.util.EmbeddedCassandra;
-import com.netflix.conductor.cassandra.util.Statements;
-import com.netflix.conductor.common.config.TestObjectMapperConfiguration;
-import com.netflix.conductor.common.metadata.events.EventExecution;
-import com.netflix.conductor.common.metadata.events.EventHandler;
-import com.netflix.conductor.common.metadata.tasks.Task;
-import com.netflix.conductor.common.metadata.tasks.Task.Status;
-import com.netflix.conductor.common.metadata.tasks.TaskDef;
-import com.netflix.conductor.common.metadata.workflow.WorkflowDef;
-import com.netflix.conductor.common.metadata.workflow.WorkflowTask;
-import com.netflix.conductor.common.run.Workflow;
-import com.netflix.conductor.core.exception.ApplicationException;
-import com.netflix.conductor.core.utils.IDGenerator;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Optional;
-
-import static com.netflix.conductor.cassandra.util.Constants.TABLE_EVENT_EXECUTIONS;
-import static com.netflix.conductor.cassandra.util.Constants.TABLE_WORKFLOW_DEFS;
-import static com.netflix.conductor.common.metadata.events.EventExecution.Status.COMPLETED;
-import static com.netflix.conductor.core.exception.ApplicationException.Code.INVALID_INPUT;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@ContextConfiguration(classes = {TestObjectMapperConfiguration.class})
-@RunWith(SpringRunner.class)
-public class CassandraDAOTest {
-
- private CassandraProperties properties;
-
- @Autowired
- private ObjectMapper objectMapper;
-
- private static EmbeddedCassandra embeddedCassandra;
- private static Session session;
-
- private CassandraMetadataDAO metadataDAO;
- private CassandraExecutionDAO executionDAO;
- private CassandraEventHandlerDAO eventHandlerDAO;
-
- @Rule
- public ExpectedException expectedException = ExpectedException.none();
-
- @BeforeClass
- public static void init() throws Exception {
- embeddedCassandra = new EmbeddedCassandra();
- session = embeddedCassandra.getSession();
- }
-
- @Before
- public void setUp() {
- String keyspaceName = "junit";
- properties = mock(CassandraProperties.class);
- when(properties.getHostAddress()).thenReturn("127.0.0.1");
- when(properties.getPort()).thenReturn(9142);
- when(properties.getKeyspace()).thenReturn(keyspaceName);
- when(properties.getShardSize()).thenReturn(100);
- when(properties.getReplicationStrategy()).thenReturn("SimpleStrategy");
- when(properties.getReplicationFactorKey()).thenReturn("replication_factor");
- when(properties.getReplicationFactorValue()).thenReturn(1);
- when(properties.getReadConsistencyLevel()).thenReturn(ConsistencyLevel.LOCAL_ONE);
- when(properties.getWriteConsistencyLevel()).thenReturn(ConsistencyLevel.LOCAL_ONE);
- when(properties.getTaskDefCacheRefreshInterval()).thenReturn(Duration.ofSeconds(60));
- when(properties.getEventHandlerCacheRefreshInterval()).thenReturn(Duration.ofSeconds(60));
- when(properties.getEventExecutionPersistenceTtl()).thenReturn(Duration.ofSeconds(5));
- Statements statements = new Statements(keyspaceName);
- metadataDAO = new CassandraMetadataDAO(session, objectMapper, properties, statements);
- executionDAO = new CassandraExecutionDAO(session, objectMapper, properties, statements);
- eventHandlerDAO = new CassandraEventHandlerDAO(session, objectMapper, properties, statements);
- }
-
- @AfterClass
- public static void teardown() {
- embeddedCassandra.cleanupData();
- session.close();
- }
-
- @Test
- public void testWorkflowDefCRUD() throws Exception {
- String name = "workflow_def_1";
- int version = 1;
-
- WorkflowDef workflowDef = new WorkflowDef();
- workflowDef.setName(name);
- workflowDef.setVersion(version);
- workflowDef.setOwnerEmail("test@junit.com");
-
- // create workflow definition explicitly in test
- // since, embedded Cassandra server does not support LWT required for this API.
- addWorkflowDefinition(workflowDef);
-
- // fetch the workflow definition
- Optional
- * 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.cassandra.util;
-
-import com.datastax.driver.core.Session;
-import org.cassandraunit.utils.EmbeddedCassandraServerHelper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class EmbeddedCassandra {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(EmbeddedCassandra.class);
-
- public EmbeddedCassandra() throws Exception {
- LOGGER.info("Starting embedded cassandra");
- startEmbeddedCassandra();
- }
-
- private void startEmbeddedCassandra() throws Exception {
- try {
- EmbeddedCassandraServerHelper.startEmbeddedCassandra();
- } catch (Exception e) {
- LOGGER.error("Error starting embedded cassandra server", e);
- throw e;
- }
- }
-
- public Session getSession() {
- return EmbeddedCassandraServerHelper.getSession();
- }
-
- public void cleanupData() {
- EmbeddedCassandraServerHelper.cleanEmbeddedCassandra();
- }
-}
diff --git a/cassandra-persistence/src/test/java/com/netflix/conductor/cassandra/util/StatementsTest.java b/cassandra-persistence/src/test/java/com/netflix/conductor/cassandra/util/StatementsTest.java
deleted file mode 100644
index 094390cbaf..0000000000
--- a/cassandra-persistence/src/test/java/com/netflix/conductor/cassandra/util/StatementsTest.java
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Copyright 2020 Netflix, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
- * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations under the License.
- */
-package com.netflix.conductor.cassandra.util;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class StatementsTest {
-
- private Statements statements;
-
- @Before
- public void setUp() {
- statements = new Statements("junit");
- }
-
- @Test
- public void testGetInsertWorkflowDefStatement() {
- String statement = "INSERT INTO junit.workflow_definitions (workflow_def_name,version,workflow_definition) VALUES (?,?,?) IF NOT EXISTS;";
- assertEquals(statement, statements.getInsertWorkflowDefStatement());
- }
-
- @Test
- public void testGetInsertWorkflowDefVersionStatement() {
- String statement = "INSERT INTO junit.workflow_defs_index (workflow_def_version_index,workflow_def_name_version,workflow_def_index_value) VALUES ('workflow_def_version_index',?,?);";
- assertEquals(statement, statements.getInsertWorkflowDefVersionIndexStatement());
- }
-
- @Test
- public void testGetInsertTaskDefStatement() {
- String statement = "INSERT INTO junit.task_definitions (task_defs,task_def_name,task_definition) VALUES ('task_defs',?,?);";
- assertEquals(statement, statements.getInsertTaskDefStatement());
- }
-
- @Test
- public void testGetSelectWorkflowDefStatement() {
- String statement = "SELECT workflow_definition FROM junit.workflow_definitions WHERE workflow_def_name=? AND version=?;";
- assertEquals(statement, statements.getSelectWorkflowDefStatement());
- }
-
- @Test
- public void testGetSelectAllWorkflowDefVersionsByNameStatement() {
- String statement = "SELECT * FROM junit.workflow_definitions WHERE workflow_def_name=?;";
- assertEquals(statement, statements.getSelectAllWorkflowDefVersionsByNameStatement());
- }
-
- @Test
- public void testGetSelectAllWorkflowDefsStatement() {
- String statement = "SELECT * FROM junit.workflow_defs_index WHERE workflow_def_version_index=?;";
- assertEquals(statement, statements.getSelectAllWorkflowDefsStatement());
- }
-
- @Test
- public void testGetSelectTaskDefStatement() {
- String statement = "SELECT task_definition FROM junit.task_definitions WHERE task_defs='task_defs' AND task_def_name=?;";
- assertEquals(statement, statements.getSelectTaskDefStatement());
- }
-
- @Test
- public void testGetSelectAllTaskDefsStatement() {
- String statement = "SELECT * FROM junit.task_definitions WHERE task_defs=?;";
- assertEquals(statement, statements.getSelectAllTaskDefsStatement());
- }
-
- @Test
- public void testGetUpdateWorkflowDefStatement() {
- String statement = "UPDATE junit.workflow_definitions SET workflow_definition=? WHERE workflow_def_name=? AND version=?;";
- assertEquals(statement, statements.getUpdateWorkflowDefStatement());
- }
-
- @Test
- public void testGetDeleteWorkflowDefStatement() {
- String statement = "DELETE FROM junit.workflow_definitions WHERE workflow_def_name=? AND version=?;";
- assertEquals(statement, statements.getDeleteWorkflowDefStatement());
- }
-
- @Test
- public void testGetDeleteWorkflowDefIndexStatement() {
- String statement = "DELETE FROM junit.workflow_defs_index WHERE workflow_def_version_index=? AND workflow_def_name_version=?;";
- assertEquals(statement, statements.getDeleteWorkflowDefIndexStatement());
- }
-
- @Test
- public void testGetDeleteTaskDefStatement() {
- String statement = "DELETE FROM junit.task_definitions WHERE task_defs='task_defs' AND task_def_name=?;";
- assertEquals(statement, statements.getDeleteTaskDefStatement());
- }
-
- @Test
- public void testGetInsertWorkflowStatement() {
- String statement = "INSERT INTO junit.workflows (workflow_id,shard_id,task_id,entity,payload,total_tasks,total_partitions) VALUES (?,?,?,'workflow',?,?,?);";
- assertEquals(statement, statements.getInsertWorkflowStatement());
- }
-
- @Test
- public void testGetInsertTaskStatement() {
- String statement = "INSERT INTO junit.workflows (workflow_id,shard_id,task_id,entity,payload) VALUES (?,?,?,'task',?);";
- assertEquals(statement, statements.getInsertTaskStatement());
- }
-
- @Test
- public void testGetInsertEventExecutionStatement() {
- String statement = "INSERT INTO junit.event_executions (message_id,event_handler_name,event_execution_id,payload) VALUES (?,?,?,?) IF NOT EXISTS;";
- assertEquals(statement, statements.getInsertEventExecutionStatement());
- }
-
- @Test
- public void testGetSelectTotalStatement() {
- String statement = "SELECT total_tasks,total_partitions FROM junit.workflows WHERE workflow_id=? AND shard_id=1;";
- assertEquals(statement, statements.getSelectTotalStatement());
- }
-
- @Test
- public void testGetSelectTaskStatement() {
- String statement = "SELECT payload FROM junit.workflows WHERE workflow_id=? AND shard_id=? AND entity='task' AND task_id=?;";
- assertEquals(statement, statements.getSelectTaskStatement());
- }
-
- @Test
- public void testGetSelectWorkflowStatement() {
- String statement = "SELECT payload FROM junit.workflows WHERE workflow_id=? AND shard_id=1 AND entity='workflow';";
- assertEquals(statement, statements.getSelectWorkflowStatement());
- }
-
- @Test
- public void testGetSelectWorkflowWithTasksStatement() {
- String statement = "SELECT * FROM junit.workflows WHERE workflow_id=? AND shard_id=?;";
- assertEquals(statement, statements.getSelectWorkflowWithTasksStatement());
- }
-
- @Test
- public void testGetSelectTaskFromLookupTableStatement() {
- String statement = "SELECT workflow_id FROM junit.task_lookup WHERE task_id=?;";
- assertEquals(statement, statements.getSelectTaskFromLookupTableStatement());
- }
-
- @Test
- public void testGetSelectTasksFromTaskDefLimitStatement() {
- String statement = "SELECT * FROM junit.task_def_limit WHERE task_def_name=?;";
- assertEquals(statement, statements.getSelectTasksFromTaskDefLimitStatement());
- }
-
- @Test
- public void testGetSelectAllEventExecutionsForMessageFromEventExecutionsStatement() {
- String statement = "SELECT * FROM junit.event_executions WHERE message_id=? AND event_handler_name=?;";
- assertEquals(statement, statements.getSelectAllEventExecutionsForMessageFromEventExecutionsStatement());
- }
-
- @Test
- public void testGetUpdateWorkflowStatement() {
- String statement = "UPDATE junit.workflows SET payload=? WHERE workflow_id=? AND shard_id=1 AND entity='workflow' AND task_id='';";
- assertEquals(statement, statements.getUpdateWorkflowStatement());
- }
-
- @Test
- public void testGetUpdateTotalTasksStatement() {
- String statement = "UPDATE junit.workflows SET total_tasks=? WHERE workflow_id=? AND shard_id=?;";
- assertEquals(statement, statements.getUpdateTotalTasksStatement());
- }
-
- @Test
- public void testGetUpdateTotalPartitionsStatement() {
- String statement = "UPDATE junit.workflows SET total_partitions=?,total_tasks=? WHERE workflow_id=? AND shard_id=1;";
- assertEquals(statement, statements.getUpdateTotalPartitionsStatement());
- }
-
- @Test
- public void testGetUpdateTaskLookupStatement() {
- String statement = "UPDATE junit.task_lookup SET workflow_id=? WHERE task_id=?;";
- assertEquals(statement, statements.getUpdateTaskLookupStatement());
- }
-
- @Test
- public void testGetUpdateTaskDefLimitStatement() {
- String statement = "UPDATE junit.task_def_limit SET workflow_id=? WHERE task_def_name=? AND task_id=?;";
- assertEquals(statement, statements.getUpdateTaskDefLimitStatement());
- }
-
- @Test
- public void testGetUpdateEventExecutionStatement() {
- String statement = "UPDATE junit.event_executions USING TTL ? SET payload=? WHERE message_id=? AND event_handler_name=? AND event_execution_id=?;";
- assertEquals(statement, statements.getUpdateEventExecutionStatement());
- }
-
- @Test
- public void testGetDeleteWorkflowStatement() {
- String statement = "DELETE FROM junit.workflows WHERE workflow_id=? AND shard_id=?;";
- assertEquals(statement, statements.getDeleteWorkflowStatement());
- }
-
- @Test
- public void testGetDeleteTaskLookupStatement() {
- String statement = "DELETE FROM junit.task_lookup WHERE task_id=?;";
- assertEquals(statement, statements.getDeleteTaskLookupStatement());
- }
-
- @Test
- public void testGetDeleteTaskStatement() {
- String statement = "DELETE FROM junit.workflows WHERE workflow_id=? AND shard_id=? AND entity='task' AND task_id=?;";
- assertEquals(statement, statements.getDeleteTaskStatement());
- }
-
- @Test
- public void testGetDeleteTaskDefLimitStatement() {
- String statement = "DELETE FROM junit.task_def_limit WHERE task_def_name=? AND task_id=?;";
- assertEquals(statement, statements.getDeleteTaskDefLimitStatement());
- }
-
- @Test
- public void testGetDeleteEventExecutionStatement() {
- String statement = "DELETE FROM junit.event_executions WHERE message_id=? AND event_handler_name=? AND event_execution_id=?;";
- assertEquals(statement, statements.getDeleteEventExecutionsStatement());
- }
-
- @Test
- public void testGetInsertEventHandlerStatement() {
- String statement = "INSERT INTO junit.event_handlers (handlers,event_handler_name,event_handler) VALUES ('handlers',?,?);";
- assertEquals(statement, statements.getInsertEventHandlerStatement());
- }
-
- @Test
- public void testGetSelectAllEventHandlersStatement() {
- String statement = "SELECT * FROM junit.event_handlers WHERE handlers=?;";
- assertEquals(statement, statements.getSelectAllEventHandlersStatement());
- }
-
- @Test
- public void testDeleteEventHandlerStatement() {
- String statement = "DELETE FROM junit.event_handlers WHERE handlers='handlers' AND event_handler_name=?;";
- assertEquals(statement, statements.getDeleteEventHandlerStatement());
- }
-}
diff --git a/client-spring/build.gradle b/client-spring/build.gradle
index f975f701cf..d1adb8ce87 100644
--- a/client-spring/build.gradle
+++ b/client-spring/build.gradle
@@ -3,6 +3,7 @@ dependencies {
implementation project(':conductor-common')
api project(':conductor-client')
+ api project(':conductor-java-sdk')
implementation "com.netflix.eureka:eureka-client:${revEurekaClient}"
implementation 'org.springframework.boot:spring-boot-starter'
diff --git a/client-spring/dependencies.lock b/client-spring/dependencies.lock
index ce0e5be025..9602d62466 100644
--- a/client-spring/dependencies.lock
+++ b/client-spring/dependencies.lock
@@ -1,72 +1,42 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.3.12.RELEASE"
+ "locked": "2.7.16"
}
},
"compileClasspath": {
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
- "com.google.guava:guava": {
- "locked": "19.0",
- "transitive": [
- "com.google.inject:guice",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
},
"com.netflix.conductor:conductor-client": {
"project": true
@@ -74,764 +44,335 @@
"com.netflix.conductor:conductor-common": {
"project": true
},
+ "com.netflix.conductor:conductor-java-sdk": {
+ "project": true
+ },
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.2"
},
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.2"
},
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "org.apache.logging.log4j:log4j-jul": {
+ "locked": "2.17.2"
},
- "com.sun.jersey:jersey-client": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-logging"
- ]
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "locked": "2.17.2"
},
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.netflix.servo:servo-core",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.2"
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
+ "locked": "2.7.16"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
+ "locked": "2.0"
}
},
"runtimeClasspath": {
- "antlr:antlr": {
- "locked": "2.7.7",
- "transitive": [
- "org.antlr:antlr-runtime",
- "org.antlr:stringtemplate"
- ]
- },
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
+ "cglib:cglib": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "3.3.0"
},
"com.amazonaws:aws-java-sdk-core": {
- "locked": "1.11.86",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
+ ],
+ "locked": "1.12.535"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-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.15.0"
},
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.11.4",
- "transitive": [
- "com.netflix.conductor:conductor-client"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.11.4",
- "transitive": [
- "com.netflix.conductor:conductor-client"
- ]
- },
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.github.vmg.protogen:protogen-annotations": {
- "locked": "1.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.guava:guava",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.code.gson:gson": {
- "locked": "2.8.7",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.3.4",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:failureaccess": {
- "locked": "1.0.1",
- "transitive": [
- "com.google.guava:guava"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.google.guava:guava": {
- "locked": "30.0-jre",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.inject:guice",
- "com.netflix.archaius:archaius-core",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.guava:listenablefuture": {
- "locked": "9999.0-empty-to-avoid-conflict-with-guava",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.j2objc:j2objc-annotations": {
- "locked": "1.3",
- "transitive": [
- "com.google.guava:guava"
- ]
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.google.guava:guava": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "32.1.2-jre"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.13.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "3.24.3"
},
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "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": {
- "project": true,
- "transitive": [
- "com.netflix.conductor:conductor-client"
- ]
+ "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": {
- "locked": "1.10.10",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
- },
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.netflix-commons:netflix-infix": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
+ ],
+ "locked": "1.10.10"
},
"com.netflix.spectator:spectator-api": {
- "locked": "0.122.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
- },
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ ],
+ "locked": "0.122.0"
},
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "1.19.4"
},
"commons-io:commons-io": {
- "locked": "2.7",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
- },
- "commons-jxpath:commons-jxpath": {
- "locked": "1.3",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.servlet:servlet-api": {
- "locked": "2.5",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.8.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "org.antlr:antlr-runtime": {
- "locked": "3.4",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "org.antlr:stringtemplate": {
- "locked": "3.2.1",
- "transitive": [
- "org.antlr:antlr-runtime"
- ]
+ ],
+ "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": {
- "locked": "2.0.5",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.0.6"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ]
- },
- "org.apache.commons:commons-math": {
- "locked": "2.2",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.5.0",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "org.codehaus.jettison:jettison": {
- "locked": "1.4.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-logging"
- ]
+ ],
+ "locked": "3.12.0"
},
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.netflix.archaius:archaius-core",
+ "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.17.2"
+ },
+ "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.17.2"
+ },
+ "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.17.2"
+ },
+ "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.17.2"
+ },
+ "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.17.2"
+ },
+ "org.glassfish.jersey.core:jersey-common": {
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client",
- "com.netflix.netflix-commons:netflix-eventbus",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core",
- "com.netflix.spectator:spectator-api",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.35"
+ },
+ "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": "1.7.36"
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
+ "locked": "2.7.16"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "software.amazon.ion:ion-java": {
- "locked": "1.0.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.0"
}
},
"testCompileClasspath": {
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
- "com.google.guava:guava": {
- "locked": "19.0",
- "transitive": [
- "com.google.inject:guice",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.jayway.jsonpath:json-path": {
- "locked": "2.4.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
},
"com.netflix.conductor:conductor-client": {
"project": true
@@ -839,1150 +380,330 @@
"com.netflix.conductor:conductor-common": {
"project": true
},
+ "com.netflix.conductor:conductor-java-sdk": {
+ "project": true
+ },
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.sun.jersey:jersey-client": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.vaadin.external.google:android-json": {
- "locked": "0.0.20131108.vaadin1",
- "transitive": [
- "org.skyscreamer:jsonassert"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
"junit:junit": {
- "locked": "4.13.2",
- "transitive": [
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "net.bytebuddy:byte-buddy": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "net.bytebuddy:byte-buddy-agent": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "net.minidev:accessors-smart": {
- "locked": "2.3.1",
- "transitive": [
- "net.minidev:json-smart"
- ]
- },
- "net.minidev:json-smart": {
- "locked": "2.3.1",
- "transitive": [
- "com.jayway.jsonpath:json-path"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
+ "locked": "4.13.2"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-jul",
- "org.apache.logging.log4j:log4j-slf4j-impl"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
- },
- "org.apiguardian:apiguardian-api": {
- "locked": "1.1.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.assertj:assertj-core": {
- "locked": "3.16.1",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.hamcrest:hamcrest": {
- "locked": "2.2",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter-api": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-params"
- ]
- },
- "org.junit.jupiter:junit-jupiter-params": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.platform:junit-platform-commons": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.junit.platform:junit-platform-engine": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.vintage:junit-vintage-engine"
- ]
+ "locked": "2.17.2"
},
- "org.junit.vintage:junit-vintage-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit:junit-bom": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.mockito:mockito-core": {
- "locked": "3.3.3",
- "transitive": [
- "org.mockito:mockito-junit-jupiter",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.mockito:mockito-junit-jupiter": {
- "locked": "3.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.objenesis:objenesis": {
- "locked": "2.6",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "org.opentest4j:opentest4j": {
- "locked": "1.2.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.4",
- "transitive": [
- "net.minidev:accessors-smart"
- ]
- },
- "org.skyscreamer:jsonassert": {
- "locked": "1.5.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2",
- "org.springframework.boot:spring-boot-starter-logging"
- ]
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.2"
},
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.jayway.jsonpath:json-path",
- "com.netflix.servo:servo-core",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
+ "org.junit.vintage:junit-vintage-engine": {
+ "locked": "5.8.2"
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-test": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-test-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression",
- "org.springframework:spring-test"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
- },
- "org.springframework:spring-test": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.xmlunit:xmlunit-core": {
- "locked": "2.7.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
+ "locked": "2.0"
}
},
"testRuntimeClasspath": {
- "antlr:antlr": {
- "locked": "2.7.7",
- "transitive": [
- "org.antlr:antlr-runtime",
- "org.antlr:stringtemplate"
- ]
- },
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
+ "cglib:cglib": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "3.3.0"
},
"com.amazonaws:aws-java-sdk-core": {
- "locked": "1.11.86",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
+ ],
+ "locked": "1.12.535"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-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.15.0"
},
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.11.4",
- "transitive": [
- "com.netflix.conductor:conductor-client"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.11.4",
- "transitive": [
- "com.netflix.conductor:conductor-client"
- ]
- },
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.github.vmg.protogen:protogen-annotations": {
- "locked": "1.0.0",
- "transitive": [
- "com.netflix.conductor:conductor-common"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.guava:guava",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.code.gson:gson": {
- "locked": "2.8.7",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.3.4",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:failureaccess": {
- "locked": "1.0.1",
- "transitive": [
- "com.google.guava:guava"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
},
- "com.google.guava:guava": {
- "locked": "30.0-jre",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.inject:guice",
- "com.netflix.archaius:archaius-core",
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-client",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.guava:listenablefuture": {
- "locked": "9999.0-empty-to-avoid-conflict-with-guava",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.j2objc:j2objc-annotations": {
- "locked": "1.3",
- "transitive": [
- "com.google.guava:guava"
- ]
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.google.guava:guava": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "32.1.2-jre"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.13.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "3.24.3"
},
- "com.jayway.jsonpath:json-path": {
- "locked": "2.4.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "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": {
- "project": true,
- "transitive": [
- "com.netflix.conductor:conductor-client"
- ]
+ "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": {
- "locked": "1.10.10",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
- },
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.netflix-commons:netflix-infix": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
+ ],
+ "locked": "1.10.10"
},
"com.netflix.spectator:spectator-api": {
- "locked": "0.122.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
- },
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ ],
+ "locked": "0.122.0"
},
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.vaadin.external.google:android-json": {
- "locked": "0.0.20131108.vaadin1",
- "transitive": [
- "org.skyscreamer:jsonassert"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "1.19.4"
},
"commons-io:commons-io": {
- "locked": "2.7",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client"
- ]
- },
- "commons-jxpath:commons-jxpath": {
- "locked": "1.3",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.servlet:servlet-api": {
- "locked": "2.5",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.8.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.netflix-commons:netflix-infix"
- ]
+ ],
+ "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",
- "transitive": [
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "net.bytebuddy:byte-buddy": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "net.bytebuddy:byte-buddy-agent": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "net.minidev:accessors-smart": {
- "locked": "2.3.1",
- "transitive": [
- "net.minidev:json-smart"
- ]
- },
- "net.minidev:json-smart": {
- "locked": "2.3.1",
- "transitive": [
- "com.jayway.jsonpath:json-path"
- ]
- },
- "org.antlr:antlr-runtime": {
- "locked": "3.4",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "org.antlr:stringtemplate": {
- "locked": "3.2.1",
- "transitive": [
- "org.antlr:antlr-runtime"
- ]
+ "locked": "4.13.2"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.0"
},
"org.apache.bval:bval-jsr": {
- "locked": "2.0.5",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.0.6"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-client",
"com.netflix.conductor:conductor-common"
- ]
- },
- "org.apache.commons:commons-math": {
- "locked": "2.2",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
+ ],
+ "locked": "3.12.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-jul",
- "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.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
- },
- "org.apiguardian:apiguardian-api": {
- "locked": "1.1.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.assertj:assertj-core": {
- "locked": "3.16.1",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.5.0",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "org.codehaus.jettison:jettison": {
- "locked": "1.4.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "org.hamcrest:hamcrest": {
- "locked": "2.2",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter-api": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.mockito:mockito-junit-jupiter"
- ]
- },
- "org.junit.jupiter:junit-jupiter-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.jupiter:junit-jupiter-params": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.platform:junit-platform-commons": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.junit.platform:junit-platform-engine": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.17.2"
+ },
+ "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.17.2"
+ },
+ "org.glassfish.jersey.core:jersey-common": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.35"
},
"org.junit.vintage:junit-vintage-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit:junit-bom": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.mockito:mockito-core": {
- "locked": "3.3.3",
- "transitive": [
- "org.mockito:mockito-junit-jupiter",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.mockito:mockito-junit-jupiter": {
- "locked": "3.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.objenesis:objenesis": {
- "locked": "2.6",
- "transitive": [
- "org.mockito:mockito-core"
- ]
- },
- "org.opentest4j:opentest4j": {
- "locked": "1.2.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.4",
- "transitive": [
- "net.minidev:accessors-smart"
- ]
- },
- "org.skyscreamer:jsonassert": {
- "locked": "1.5.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2",
- "org.springframework.boot:spring-boot-starter-logging"
- ]
+ "locked": "5.8.2"
+ },
+ "org.openjdk.nashorn:nashorn-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "15.4"
},
"org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.jayway.jsonpath:json-path",
- "com.netflix.archaius:archaius-core",
- "com.netflix.conductor:conductor-client",
- "com.netflix.netflix-commons:netflix-eventbus",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core",
- "com.netflix.spectator:spectator-api",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-client"
+ ],
+ "locked": "1.7.36"
},
"org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-test": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-test-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression",
- "org.springframework:spring-test"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
- },
- "org.springframework:spring-test": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.xmlunit:xmlunit-core": {
- "locked": "2.7.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "software.amazon.ion:ion-java": {
- "locked": "1.0.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-client",
+ "com.netflix.conductor:conductor-common",
+ "com.netflix.conductor:conductor-java-sdk"
+ ],
+ "locked": "2.0"
}
}
}
\ No newline at end of file
diff --git a/client-spring/src/main/java/com/netflix/conductor/client/spring/ClientProperties.java b/client-spring/src/main/java/com/netflix/conductor/client/spring/ClientProperties.java
index 5ca9fbdf0d..55c82e5766 100644
--- a/client-spring/src/main/java/com/netflix/conductor/client/spring/ClientProperties.java
+++ b/client-spring/src/main/java/com/netflix/conductor/client/spring/ClientProperties.java
@@ -12,12 +12,12 @@
*/
package com.netflix.conductor.client.spring;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
@ConfigurationProperties("conductor.client")
public class ClientProperties {
@@ -33,6 +33,10 @@ public class ClientProperties {
private Map
+ * 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.client.spring;
+
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+import com.netflix.conductor.client.http.TaskClient;
+import com.netflix.conductor.sdk.workflow.executor.task.AnnotatedWorkerExecutor;
+import com.netflix.conductor.sdk.workflow.executor.task.WorkerConfiguration;
+
+@Component
+public class ConductorWorkerAutoConfiguration
+ implements ApplicationListener
+ * 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.client.spring;
+
+import org.springframework.core.env.Environment;
+
+import com.netflix.conductor.sdk.workflow.executor.task.WorkerConfiguration;
+
+public class SpringWorkerConfiguration extends WorkerConfiguration {
+
+ private final Environment environment;
+
+ public SpringWorkerConfiguration(Environment environment) {
+ this.environment = environment;
+ }
+
+ @Override
+ public int getPollingInterval(String taskName) {
+ String key = "conductor.worker." + taskName + ".pollingInterval";
+ return environment.getProperty(key, Integer.class, 0);
+ }
+
+ @Override
+ public int getThreadCount(String taskName) {
+ String key = "conductor.worker." + taskName + ".threadCount";
+ return environment.getProperty(key, Integer.class, 0);
+ }
+
+ @Override
+ public String getDomain(String taskName) {
+ String key = "conductor.worker." + taskName + ".domain";
+ return environment.getProperty(key, String.class, null);
+ }
+}
diff --git a/client-spring/src/test/java/com/netflix/conductor/client/spring/ExampleClient.java b/client-spring/src/test/java/com/netflix/conductor/client/spring/ExampleClient.java
index 0a5d71c0e4..772c04dc02 100644
--- a/client-spring/src/test/java/com/netflix/conductor/client/spring/ExampleClient.java
+++ b/client-spring/src/test/java/com/netflix/conductor/client/spring/ExampleClient.java
@@ -12,13 +12,14 @@
*/
package com.netflix.conductor.client.spring;
-import com.netflix.conductor.client.worker.Worker;
-import com.netflix.conductor.common.metadata.tasks.Task;
-import com.netflix.conductor.common.metadata.tasks.TaskResult;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
+import com.netflix.conductor.client.worker.Worker;
+import com.netflix.conductor.common.metadata.tasks.Task;
+import com.netflix.conductor.common.metadata.tasks.TaskResult;
+
@SpringBootApplication
public class ExampleClient {
diff --git a/client-spring/src/test/java/com/netflix/conductor/client/spring/Workers.java b/client-spring/src/test/java/com/netflix/conductor/client/spring/Workers.java
new file mode 100644
index 0000000000..d28bf0c8d9
--- /dev/null
+++ b/client-spring/src/test/java/com/netflix/conductor/client/spring/Workers.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2023 Netflix, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+ * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package com.netflix.conductor.client.spring;
+
+import java.util.Date;
+
+import org.springframework.stereotype.Component;
+
+import com.netflix.conductor.sdk.workflow.executor.task.TaskContext;
+import com.netflix.conductor.sdk.workflow.task.InputParam;
+import com.netflix.conductor.sdk.workflow.task.WorkerTask;
+
+@Component
+public class Workers {
+
+ @WorkerTask(value = "hello", threadCount = 3)
+ public String helloWorld(@InputParam("name") String name) {
+ TaskContext context = TaskContext.get();
+ System.out.println(new Date() + ":: Poll count: " + context.getPollCount());
+ if (context.getPollCount() < 5) {
+ context.addLog("Not ready yet, poll count is only " + context.getPollCount());
+ context.setCallbackAfter(1);
+ }
+
+ return "Hello, " + name;
+ }
+
+ @WorkerTask(value = "hello_again", pollingInterval = 333)
+ public String helloAgain(@InputParam("name") String name) {
+ TaskContext context = TaskContext.get();
+ System.out.println(new Date() + ":: Poll count: " + context.getPollCount());
+ if (context.getPollCount() < 5) {
+ context.addLog("Not ready yet, poll count is only " + context.getPollCount());
+ context.setCallbackAfter(1);
+ }
+
+ return "Hello (again), " + name;
+ }
+}
diff --git a/client-spring/src/test/resources/application.properties b/client-spring/src/test/resources/application.properties
new file mode 100644
index 0000000000..65c47dde42
--- /dev/null
+++ b/client-spring/src/test/resources/application.properties
@@ -0,0 +1,3 @@
+conductor.client.rootUri=http://localhost:8080/api/
+conductor.worker.hello.threadCount=100
+conductor.worker.hello_again.domain=test
\ No newline at end of file
diff --git a/client/build.gradle b/client/build.gradle
index b121b65c1d..b16dd4e183 100644
--- a/client/build.gradle
+++ b/client/build.gradle
@@ -5,26 +5,28 @@ buildscript {
}
}
dependencies {
- classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.6.2"
+ classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.7.5"
}
}
-apply plugin: 'com.github.spotbugs'
-apply plugin: 'pmd'
+apply plugin: 'groovy'
configurations.all {
exclude group: 'amazon', module: 'aws-java-sdk'
}
dependencies {
- implementation project(':conductor-common')
- // SBMTODO: remove guava dep
- implementation "com.google.guava:guava:${revGuava}"
+ compileOnly 'org.jetbrains:annotations:23.0.0'
+ implementation project(':conductor-common')
implementation "com.sun.jersey:jersey-client:${revJersey}"
+ implementation "javax.ws.rs:javax.ws.rs-api:${revJAXRS}"
+ implementation "org.glassfish.jersey.core:jersey-common:${revJerseyCommon}"
implementation "com.netflix.spectator:spectator-api:${revSpectator}"
- implementation "com.netflix.eureka:eureka-client:${revEurekaClient}"
+ implementation ("com.netflix.eureka:eureka-client:${revEurekaClient}") {
+ exclude group: 'com.google.guava', module: 'guava'
+ }
implementation "com.amazonaws:aws-java-sdk-core:${revAwsSdk}"
implementation "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
@@ -37,19 +39,8 @@ dependencies {
testImplementation "org.powermock:powermock-module-junit4:${revPowerMock}"
testImplementation "org.powermock:powermock-api-mockito2:${revPowerMock}"
-}
-spotbugsMain {
- reports {
- xml {
- enabled = false
- }
- html {
- enabled = true
- }
- }
+ testImplementation "org.codehaus.groovy:groovy-all:${revGroovy}"
+ testImplementation "org.spockframework:spock-core:${revSpock}"
+ testImplementation "org.spockframework:spock-spring:${revSpock}"
}
-
-pmd {
- ignoreFailures = true
-}
\ No newline at end of file
diff --git a/client/dependencies.lock b/client/dependencies.lock
index c48deb8c31..26b7763be8 100644
--- a/client/dependencies.lock
+++ b/client/dependencies.lock
@@ -1,135 +1,45 @@
{
"annotationProcessor": {
"org.springframework.boot:spring-boot-configuration-processor": {
- "locked": "2.3.12.RELEASE"
+ "locked": "2.7.16"
}
},
"compileClasspath": {
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
"com.amazonaws:aws-java-sdk-core": {
- "locked": "1.11.86"
+ "locked": "1.12.535"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.11.4"
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.11.4"
- },
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.google.guava:guava",
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.3.4",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:failureaccess": {
- "locked": "1.0.1",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:guava": {
- "locked": "30.0-jre",
- "transitive": [
- "com.google.inject:guice",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.guava:listenablefuture": {
- "locked": "9999.0-empty-to-avoid-conflict-with-guava",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.j2objc:j2objc-annotations": {
- "locked": "1.3",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -137,389 +47,141 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "1.19.4"
},
"commons-io:commons-io": {
"locked": "2.7"
},
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.8.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
+ "javax.ws.rs:javax.ws.rs-api": {
+ "locked": "2.1.1"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10"
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.5.0",
- "transitive": [
- "com.google.guava:guava"
- ]
+ "locked": "3.12.0"
},
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.netflix.servo:servo-core"
- ]
- },
- "software.amazon.ion:ion-java": {
- "locked": "1.0.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- }
- },
- "pmd": {
- "com.beust:jcommander": {
- "locked": "1.72",
- "transitive": [
- "net.sourceforge.pmd:pmd-core"
- ]
- },
- "com.google.code.gson:gson": {
- "locked": "2.8.7",
- "transitive": [
- "net.sourceforge.pmd:pmd-core"
- ]
+ "org.apache.logging.log4j:log4j-api": {
+ "locked": "2.17.2"
},
- "commons-io:commons-io": {
- "locked": "2.6",
- "transitive": [
- "net.sourceforge.pmd:pmd-core",
- "net.sourceforge.pmd:pmd-java"
- ]
- },
- "net.sourceforge.pmd:pmd-core": {
- "locked": "6.26.0",
- "transitive": [
- "net.sourceforge.pmd:pmd-java"
- ]
- },
- "net.sourceforge.pmd:pmd-java": {
- "locked": "6.26.0"
- },
- "net.sourceforge.saxon:saxon": {
- "locked": "9.1.0.8",
- "transitive": [
- "net.sourceforge.pmd:pmd-core",
- "net.sourceforge.pmd:pmd-java"
- ]
- },
- "org.antlr:antlr4-runtime": {
- "locked": "4.7",
- "transitive": [
- "net.sourceforge.pmd:pmd-core"
- ]
+ "org.apache.logging.log4j:log4j-core": {
+ "locked": "2.17.2"
},
- "org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
- "net.sourceforge.pmd:pmd-core",
- "net.sourceforge.pmd:pmd-java",
- "org.apache.commons:commons-text"
- ]
- },
- "org.apache.commons:commons-text": {
- "locked": "1.6",
- "transitive": [
- "net.sourceforge.pmd:pmd-core"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "7.3.1",
- "transitive": [
- "net.sourceforge.pmd:pmd-core",
- "net.sourceforge.pmd:pmd-java"
- ]
+ "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.glassfish.jersey.core:jersey-common": {
+ "locked": "2.22.2"
+ },
+ "org.jetbrains:annotations": {
+ "locked": "23.0.0"
+ },
+ "org.slf4j:slf4j-api": {
+ "locked": "1.7.36"
+ },
+ "org.yaml:snakeyaml": {
+ "locked": "2.0"
}
},
"runtimeClasspath": {
- "antlr:antlr": {
- "locked": "2.7.7",
- "transitive": [
- "org.antlr:antlr-runtime",
- "org.antlr:stringtemplate"
- ]
- },
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
"com.amazonaws:aws-java-sdk-core": {
- "locked": "1.11.86"
+ "locked": "1.12.535"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.11.4"
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.11.4"
- },
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0",
- "transitive": [
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.15.0"
},
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.github.vmg.protogen:protogen-annotations": {
- "locked": "1.0.0",
- "transitive": [
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.guava:guava",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.code.gson:gson": {
- "locked": "2.8.7",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.3.4",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:failureaccess": {
- "locked": "1.0.1",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:guava": {
- "locked": "30.0-jre",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.inject:guice",
- "com.netflix.archaius:archaius-core",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.guava:listenablefuture": {
- "locked": "9999.0-empty-to-avoid-conflict-with-guava",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.j2objc:j2objc-annotations": {
- "locked": "1.3",
- "transitive": [
- "com.google.guava:guava"
- ]
+ ],
+ "locked": "2.15.0"
},
"com.google.protobuf:protobuf-java": {
- "locked": "3.13.0",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "3.24.3"
},
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common"
+ ],
+ "project": true
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -527,467 +189,115 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.netflix-commons:netflix-infix": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "1.19.4"
},
"commons-io:commons-io": {
"locked": "2.7"
},
- "commons-jxpath:commons-jxpath": {
- "locked": "1.3",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.servlet:servlet-api": {
- "locked": "2.5",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.8.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "org.antlr:antlr-runtime": {
- "locked": "3.4",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "org.antlr:stringtemplate": {
- "locked": "3.2.1",
- "transitive": [
- "org.antlr:antlr-runtime"
- ]
+ "javax.ws.rs:javax.ws.rs-api": {
+ "locked": "2.1.1"
},
"org.apache.bval:bval-jsr": {
- "locked": "2.0.5",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.0.6"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
- },
- "org.apache.commons:commons-math": {
- "locked": "2.2",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.5.0",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "org.codehaus.jettison:jettison": {
- "locked": "1.4.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ ],
+ "locked": "3.12.0"
},
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.netflix.archaius:archaius-core",
- "com.netflix.netflix-commons:netflix-eventbus",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core",
- "com.netflix.spectator:spectator-api"
- ]
- },
- "software.amazon.ion:ion-java": {
- "locked": "1.0.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- }
- },
- "spotbugs": {
- "com.github.spotbugs:spotbugs": {
- "locked": "4.2.1"
- },
- "com.github.spotbugs:spotbugs-annotations": {
- "locked": "4.2.1",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.github.spotbugs:spotbugs-annotations"
- ]
- },
- "jaxen:jaxen": {
- "locked": "1.2.0",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "net.jcip:jcip-annotations": {
- "locked": "1.0",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "net.sf.saxon:Saxon-HE": {
- "locked": "10.3",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "org.apache.bcel:bcel": {
- "locked": "6.5.0",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
+ "org.apache.logging.log4j:log4j-api": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
},
- "org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
- "com.github.spotbugs:spotbugs",
- "org.apache.commons:commons-text"
- ]
- },
- "org.apache.commons:commons-text": {
- "locked": "1.9",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "org.dom4j:dom4j": {
- "locked": "2.1.3",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "org.json:json": {
- "locked": "20201115",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "9.0",
- "transitive": [
- "com.github.spotbugs:spotbugs",
- "org.ow2.asm:asm-commons",
- "org.ow2.asm:asm-tree",
- "org.ow2.asm:asm-util"
- ]
- },
- "org.ow2.asm:asm-analysis": {
- "locked": "9.0",
- "transitive": [
- "com.github.spotbugs:spotbugs",
- "org.ow2.asm:asm-commons",
- "org.ow2.asm:asm-util"
- ]
- },
- "org.ow2.asm:asm-commons": {
- "locked": "9.0",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- },
- "org.ow2.asm:asm-tree": {
- "locked": "9.0",
- "transitive": [
- "com.github.spotbugs:spotbugs",
- "org.ow2.asm:asm-analysis",
- "org.ow2.asm:asm-commons",
- "org.ow2.asm:asm-util"
- ]
- },
- "org.ow2.asm:asm-util": {
- "locked": "9.0",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
+ "org.apache.logging.log4j:log4j-core": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-jul": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-slf4j-impl": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.glassfish.jersey.core:jersey-common": {
+ "locked": "2.22.2"
},
"org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.github.spotbugs:spotbugs"
- ]
- }
- },
- "spotbugsSlf4j": {
- "org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "org.slf4j:slf4j-simple"
- ]
+ "locked": "1.7.36"
},
- "org.slf4j:slf4j-simple": {
- "locked": "1.8.0-beta4"
+ "org.yaml:snakeyaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.0"
}
},
"testCompileClasspath": {
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
"com.amazonaws:aws-java-sdk-core": {
- "locked": "1.11.86"
+ "locked": "1.12.535"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.11.4"
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.11.4"
- },
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.google.guava:guava",
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.3.4",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:failureaccess": {
- "locked": "1.0.1",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:guava": {
- "locked": "30.0-jre",
- "transitive": [
- "com.google.inject:guice",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.guava:listenablefuture": {
- "locked": "9999.0-empty-to-avoid-conflict-with-guava",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.j2objc:j2objc-annotations": {
- "locked": "1.3",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.jayway.jsonpath:json-path": {
- "locked": "2.4.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "locked": "2.15.0"
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -995,683 +305,168 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.vaadin.external.google:android-json": {
- "locked": "0.0.20131108.vaadin1",
- "transitive": [
- "org.skyscreamer:jsonassert"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "1.19.4"
},
"commons-io:commons-io": {
"locked": "2.7"
},
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.8.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
+ "javax.ws.rs:javax.ws.rs-api": {
+ "locked": "2.1.1"
},
"junit:junit": {
- "locked": "4.13.2",
- "transitive": [
- "org.junit.vintage:junit-vintage-engine",
- "org.powermock:powermock-module-junit4",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
- "net.bytebuddy:byte-buddy": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core",
- "org.powermock:powermock-core",
- "org.powermock:powermock-reflect"
- ]
- },
- "net.bytebuddy:byte-buddy-agent": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core",
- "org.powermock:powermock-core",
- "org.powermock:powermock-reflect"
- ]
- },
- "net.minidev:accessors-smart": {
- "locked": "2.3.1",
- "transitive": [
- "net.minidev:json-smart"
- ]
- },
- "net.minidev:json-smart": {
- "locked": "2.3.1",
- "transitive": [
- "com.jayway.jsonpath:json-path"
- ]
+ "locked": "4.13.2"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.0"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10"
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
+ "locked": "3.12.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-jul",
- "org.apache.logging.log4j:log4j-slf4j-impl"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
- },
- "org.apiguardian:apiguardian-api": {
- "locked": "1.1.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.assertj:assertj-core": {
- "locked": "3.16.1",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.5.0",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "org.hamcrest:hamcrest": {
- "locked": "2.2",
- "transitive": [
- "org.hamcrest:hamcrest-core",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.hamcrest:hamcrest-core": {
- "locked": "2.2",
- "transitive": [
- "org.powermock:powermock-module-junit4",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
- "org.javassist:javassist": {
- "locked": "3.27.0-GA",
- "transitive": [
- "org.powermock:powermock-core"
- ]
- },
- "org.junit.jupiter:junit-jupiter": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter-api": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-params"
- ]
- },
- "org.junit.jupiter:junit-jupiter-params": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.platform:junit-platform-commons": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.junit.platform:junit-platform-engine": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.vintage:junit-vintage-engine"
- ]
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "locked": "2.17.2"
+ },
+ "org.codehaus.groovy:groovy-all": {
+ "locked": "3.0.19"
+ },
+ "org.glassfish.jersey.core:jersey-common": {
+ "locked": "2.22.2"
},
"org.junit.vintage:junit-vintage-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit:junit-bom": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.mockito:mockito-core": {
- "locked": "3.3.3",
- "transitive": [
- "org.mockito:mockito-junit-jupiter",
- "org.powermock:powermock-api-mockito2",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.mockito:mockito-junit-jupiter": {
- "locked": "3.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.objenesis:objenesis": {
- "locked": "3.0.1",
- "transitive": [
- "org.mockito:mockito-core",
- "org.powermock:powermock-reflect"
- ]
- },
- "org.opentest4j:opentest4j": {
- "locked": "1.2.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.4",
- "transitive": [
- "net.minidev:accessors-smart"
- ]
+ "locked": "5.8.2"
},
"org.powermock:powermock-api-mockito2": {
"locked": "2.0.9"
},
- "org.powermock:powermock-api-support": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-api-mockito2"
- ]
- },
- "org.powermock:powermock-core": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-api-support",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
"org.powermock:powermock-module-junit4": {
"locked": "2.0.9"
},
- "org.powermock:powermock-module-junit4-common": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-module-junit4"
- ]
- },
- "org.powermock:powermock-reflect": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-api-support",
- "org.powermock:powermock-core",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
- "org.skyscreamer:jsonassert": {
- "locked": "1.5.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2",
- "org.springframework.boot:spring-boot-starter-logging"
- ]
- },
"org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.jayway.jsonpath:json-path",
- "com.netflix.servo:servo-core",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "1.7.36"
},
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.3.12.RELEASE"
+ "org.spockframework:spock-core": {
+ "locked": "2.3-groovy-3.0"
},
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "org.spockframework:spock-spring": {
+ "locked": "2.3-groovy-3.0"
+ },
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-test": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-test-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression",
- "org.springframework:spring-test"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
- },
- "org.springframework:spring-test": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.xmlunit:xmlunit-core": {
- "locked": "2.7.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "software.amazon.ion:ion-java": {
- "locked": "1.0.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
+ "locked": "2.0"
}
},
"testRuntimeClasspath": {
- "antlr:antlr": {
- "locked": "2.7.7",
- "transitive": [
- "org.antlr:antlr-runtime",
- "org.antlr:stringtemplate"
- ]
- },
- "aopalliance:aopalliance": {
- "locked": "1.0",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
"com.amazonaws:aws-java-sdk-core": {
- "locked": "1.11.86"
+ "locked": "1.12.535"
},
"com.fasterxml.jackson.core:jackson-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-core": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.core:jackson-databind",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.core:jackson-databind": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.fasterxml.jackson.dataformat:jackson-dataformat-cbor",
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310",
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base",
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "com.netflix.archaius:archaius-core",
- "com.netflix.conductor:conductor-common",
- "com.netflix.eureka:eureka-client"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor": {
- "locked": "2.11.4",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
- "locked": "2.11.4"
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-smile": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-base": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
+ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
- "locked": "2.11.4"
- },
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations": {
- "locked": "2.11.4",
- "transitive": [
- "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider"
- ]
- },
- "com.github.andrewoma.dexx:dexx-collections": {
- "locked": "0.2",
- "transitive": [
- "com.github.vlsi.compactmap:compactmap"
- ]
- },
- "com.github.rholder:guava-retrying": {
- "locked": "2.0.0",
- "transitive": [
+ "com.fasterxml.jackson.datatype:jackson-datatype-jdk8": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.15.0"
},
- "com.github.vlsi.compactmap:compactmap": {
- "locked": "2.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
+ "com.fasterxml.jackson.datatype:jackson-datatype-joda": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
},
- "com.github.vmg.protogen:protogen-annotations": {
- "locked": "1.0.0",
- "transitive": [
+ "com.fasterxml.jackson.datatype:jackson-datatype-jsr310": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ]
- },
- "com.google.code.findbugs:jsr305": {
- "locked": "3.0.2",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.guava:guava",
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.code.gson:gson": {
- "locked": "2.8.7",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "com.google.errorprone:error_prone_annotations": {
- "locked": "2.3.4",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:failureaccess": {
- "locked": "1.0.1",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.guava:guava": {
- "locked": "30.0-jre",
- "transitive": [
- "com.github.rholder:guava-retrying",
- "com.google.inject:guice",
- "com.netflix.archaius:archaius-core",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core"
- ]
- },
- "com.google.guava:listenablefuture": {
- "locked": "9999.0-empty-to-avoid-conflict-with-guava",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "com.google.inject:guice": {
- "locked": "4.1.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.google.j2objc:j2objc-annotations": {
- "locked": "1.3",
- "transitive": [
- "com.google.guava:guava"
- ]
+ ],
+ "locked": "2.15.0"
},
- "com.google.protobuf:protobuf-java": {
- "locked": "3.13.0",
- "transitive": [
+ "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.15.0"
+ },
+ "com.fasterxml.jackson.module:jackson-module-afterburner": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.15.0"
},
- "com.jayway.jsonpath:json-path": {
- "locked": "2.4.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "com.google.protobuf:protobuf-java": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "3.24.3"
},
- "com.netflix.archaius:archaius-core": {
- "locked": "0.7.6",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
+ "com.netflix.conductor:conductor-annotations": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-common"
+ ],
+ "project": true
},
"com.netflix.conductor:conductor-common": {
"project": true
@@ -1679,576 +474,107 @@
"com.netflix.eureka:eureka-client": {
"locked": "1.10.10"
},
- "com.netflix.netflix-commons:netflix-eventbus": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.netflix.netflix-commons:netflix-infix": {
- "locked": "0.3.0",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "com.netflix.servo:servo-core": {
- "locked": "0.12.21",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
"com.netflix.spectator:spectator-api": {
"locked": "0.122.0"
},
- "com.sun.jersey.contribs:jersey-apache-client4": {
- "locked": "1.19.1",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
"com.sun.jersey:jersey-client": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "com.sun.jersey:jersey-core": {
- "locked": "1.19.4",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-client"
- ]
- },
- "com.thoughtworks.xstream:xstream": {
- "locked": "1.4.13",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "com.vaadin.external.google:android-json": {
- "locked": "0.0.20131108.vaadin1",
- "transitive": [
- "org.skyscreamer:jsonassert"
- ]
- },
- "commons-codec:commons-codec": {
- "locked": "1.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "commons-configuration:commons-configuration": {
- "locked": "1.10",
- "transitive": [
- "com.netflix.archaius:archaius-core",
- "com.netflix.eureka:eureka-client"
- ]
+ "locked": "1.19.4"
},
"commons-io:commons-io": {
"locked": "2.7"
},
- "commons-jxpath:commons-jxpath": {
- "locked": "1.3",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "commons-lang:commons-lang": {
- "locked": "2.6",
- "transitive": [
- "commons-configuration:commons-configuration"
- ]
- },
- "commons-logging:commons-logging": {
- "locked": "1.2",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "commons-configuration:commons-configuration",
- "org.apache.httpcomponents:httpclient"
- ]
- },
- "jakarta.activation:jakarta.activation-api": {
- "locked": "1.2.2",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "jakarta.xml.bind:jakarta.xml.bind-api"
- ]
- },
- "jakarta.annotation:jakarta.annotation-api": {
- "locked": "1.3.5",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "jakarta.xml.bind:jakarta.xml.bind-api": {
- "locked": "2.3.3",
- "transitive": [
- "com.fasterxml.jackson.module:jackson-module-jaxb-annotations",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "javax.inject:javax.inject": {
- "locked": "1",
- "transitive": [
- "com.google.inject:guice"
- ]
- },
- "javax.servlet:servlet-api": {
- "locked": "2.5",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "javax.ws.rs:jsr311-api": {
- "locked": "1.1.1",
- "transitive": [
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey:jersey-core"
- ]
- },
- "joda-time:joda-time": {
- "locked": "2.8.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.netflix-commons:netflix-infix"
- ]
+ "javax.ws.rs:javax.ws.rs-api": {
+ "locked": "2.1.1"
},
"junit:junit": {
- "locked": "4.13.2",
- "transitive": [
- "org.junit.vintage:junit-vintage-engine",
- "org.powermock:powermock-module-junit4",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
- "net.bytebuddy:byte-buddy": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core",
- "org.powermock:powermock-core",
- "org.powermock:powermock-reflect"
- ]
- },
- "net.bytebuddy:byte-buddy-agent": {
- "locked": "1.10.22",
- "transitive": [
- "org.mockito:mockito-core",
- "org.powermock:powermock-core",
- "org.powermock:powermock-reflect"
- ]
- },
- "net.minidev:accessors-smart": {
- "locked": "2.3.1",
- "transitive": [
- "net.minidev:json-smart"
- ]
- },
- "net.minidev:json-smart": {
- "locked": "2.3.1",
- "transitive": [
- "com.jayway.jsonpath:json-path"
- ]
- },
- "org.antlr:antlr-runtime": {
- "locked": "3.4",
- "transitive": [
- "com.netflix.netflix-commons:netflix-infix"
- ]
- },
- "org.antlr:stringtemplate": {
- "locked": "3.2.1",
- "transitive": [
- "org.antlr:antlr-runtime"
- ]
+ "locked": "4.13.2"
+ },
+ "net.java.dev.jna:jna": {
+ "locked": "5.13.0"
},
"org.apache.bval:bval-jsr": {
- "locked": "2.0.5",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
+ ],
+ "locked": "2.0.6"
},
"org.apache.commons:commons-lang3": {
- "locked": "3.10",
- "transitive": [
+ "firstLevelTransitive": [
"com.netflix.conductor:conductor-common"
- ]
- },
- "org.apache.commons:commons-math": {
- "locked": "2.2",
- "transitive": [
- "com.netflix.netflix-commons:netflix-eventbus"
- ]
- },
- "org.apache.httpcomponents:httpclient": {
- "locked": "4.5.13",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core",
- "com.netflix.eureka:eureka-client",
- "com.sun.jersey.contribs:jersey-apache-client4"
- ]
- },
- "org.apache.httpcomponents:httpcore": {
- "locked": "4.4.14",
- "transitive": [
- "org.apache.httpcomponents:httpclient"
- ]
+ ],
+ "locked": "3.12.0"
},
"org.apache.logging.log4j:log4j-api": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-core",
- "org.apache.logging.log4j:log4j-jul",
- "org.apache.logging.log4j:log4j-slf4j-impl"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-core": {
- "locked": "2.13.3",
- "transitive": [
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-jul": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
},
"org.apache.logging.log4j:log4j-slf4j-impl": {
- "locked": "2.13.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2"
- ]
- },
- "org.apiguardian:apiguardian-api": {
- "locked": "1.1.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.assertj:assertj-core": {
- "locked": "3.16.1",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.checkerframework:checker-qual": {
- "locked": "3.5.0",
- "transitive": [
- "com.google.guava:guava"
- ]
- },
- "org.codehaus.jettison:jettison": {
- "locked": "1.4.0",
- "transitive": [
- "com.netflix.eureka:eureka-client"
- ]
- },
- "org.hamcrest:hamcrest": {
- "locked": "2.2",
- "transitive": [
- "org.hamcrest:hamcrest-core",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.hamcrest:hamcrest-core": {
- "locked": "2.2",
- "transitive": [
- "org.powermock:powermock-module-junit4",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
- "org.javassist:javassist": {
- "locked": "3.27.0-GA",
- "transitive": [
- "org.powermock:powermock-core"
- ]
- },
- "org.junit.jupiter:junit-jupiter": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit.jupiter:junit-jupiter-api": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.mockito:mockito-junit-jupiter"
- ]
- },
- "org.junit.jupiter:junit-jupiter-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.jupiter:junit-jupiter-params": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter"
- ]
- },
- "org.junit.platform:junit-platform-commons": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.junit.platform:junit-platform-engine": {
- "locked": "1.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.apache.logging.log4j:log4j-web": {
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.17.2"
+ },
+ "org.codehaus.groovy:groovy-all": {
+ "locked": "3.0.19"
+ },
+ "org.glassfish.jersey.core:jersey-common": {
+ "locked": "2.22.2"
},
"org.junit.vintage:junit-vintage-engine": {
- "locked": "5.6.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.junit:junit-bom": {
- "locked": "5.6.3",
- "transitive": [
- "org.junit.jupiter:junit-jupiter",
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.jupiter:junit-jupiter-engine",
- "org.junit.jupiter:junit-jupiter-params",
- "org.junit.platform:junit-platform-commons",
- "org.junit.platform:junit-platform-engine",
- "org.junit.vintage:junit-vintage-engine"
- ]
- },
- "org.mockito:mockito-core": {
- "locked": "3.3.3",
- "transitive": [
- "org.mockito:mockito-junit-jupiter",
- "org.powermock:powermock-api-mockito2",
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.mockito:mockito-junit-jupiter": {
- "locked": "3.3.3",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.objenesis:objenesis": {
- "locked": "3.0.1",
- "transitive": [
- "org.mockito:mockito-core",
- "org.powermock:powermock-reflect"
- ]
- },
- "org.opentest4j:opentest4j": {
- "locked": "1.2.0",
- "transitive": [
- "org.junit.jupiter:junit-jupiter-api",
- "org.junit.platform:junit-platform-engine"
- ]
- },
- "org.ow2.asm:asm": {
- "locked": "5.0.4",
- "transitive": [
- "net.minidev:accessors-smart"
- ]
+ "locked": "5.8.2"
},
"org.powermock:powermock-api-mockito2": {
"locked": "2.0.9"
},
- "org.powermock:powermock-api-support": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-api-mockito2"
- ]
- },
- "org.powermock:powermock-core": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-api-support",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
"org.powermock:powermock-module-junit4": {
"locked": "2.0.9"
},
- "org.powermock:powermock-module-junit4-common": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-module-junit4"
- ]
- },
- "org.powermock:powermock-reflect": {
- "locked": "2.0.9",
- "transitive": [
- "org.powermock:powermock-api-support",
- "org.powermock:powermock-core",
- "org.powermock:powermock-module-junit4-common"
- ]
- },
- "org.skyscreamer:jsonassert": {
- "locked": "1.5.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.slf4j:jul-to-slf4j": {
- "locked": "1.7.30",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-log4j2",
- "org.springframework.boot:spring-boot-starter-logging"
- ]
- },
"org.slf4j:slf4j-api": {
- "locked": "1.7.30",
- "transitive": [
- "com.jayway.jsonpath:json-path",
- "com.netflix.archaius:archaius-core",
- "com.netflix.netflix-commons:netflix-eventbus",
- "com.netflix.netflix-commons:netflix-infix",
- "com.netflix.servo:servo-core",
- "com.netflix.spectator:spectator-api",
- "org.apache.logging.log4j:log4j-slf4j-impl",
- "org.slf4j:jul-to-slf4j"
- ]
- },
- "org.springframework.boot:spring-boot": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-autoconfigure",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-starter": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "1.7.36"
},
- "org.springframework.boot:spring-boot-starter-log4j2": {
- "locked": "2.3.12.RELEASE"
+ "org.spockframework:spock-core": {
+ "locked": "2.3-groovy-3.0"
},
- "org.springframework.boot:spring-boot-starter-logging": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
+ "org.spockframework:spock-spring": {
+ "locked": "2.3-groovy-3.0"
+ },
+ "org.springframework.boot:spring-boot-starter-log4j2": {
+ "locked": "2.7.16"
},
"org.springframework.boot:spring-boot-starter-test": {
- "locked": "2.3.12.RELEASE"
- },
- "org.springframework.boot:spring-boot-test": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework.boot:spring-boot-test-autoconfigure"
- ]
- },
- "org.springframework.boot:spring-boot-test-autoconfigure": {
- "locked": "2.3.12.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.springframework:spring-aop": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-beans": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-aop",
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-context": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot"
- ]
- },
- "org.springframework:spring-core": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot",
- "org.springframework.boot:spring-boot-starter",
- "org.springframework.boot:spring-boot-starter-test",
- "org.springframework:spring-aop",
- "org.springframework:spring-beans",
- "org.springframework:spring-context",
- "org.springframework:spring-expression",
- "org.springframework:spring-test"
- ]
- },
- "org.springframework:spring-expression": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-context"
- ]
- },
- "org.springframework:spring-jcl": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework:spring-core"
- ]
- },
- "org.springframework:spring-test": {
- "locked": "5.2.15.RELEASE",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
- },
- "org.xmlunit:xmlunit-core": {
- "locked": "2.7.0",
- "transitive": [
- "org.springframework.boot:spring-boot-starter-test"
- ]
+ "locked": "2.7.16"
},
"org.yaml:snakeyaml": {
- "locked": "1.26",
- "transitive": [
- "org.springframework.boot:spring-boot-starter"
- ]
- },
- "software.amazon.ion:ion-java": {
- "locked": "1.0.1",
- "transitive": [
- "com.amazonaws:aws-java-sdk-core"
- ]
- },
- "xmlpull:xmlpull": {
- "locked": "1.1.3.1",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
- },
- "xpp3:xpp3_min": {
- "locked": "1.1.4c",
- "transitive": [
- "com.thoughtworks.xstream:xstream"
- ]
+ "firstLevelTransitive": [
+ "com.netflix.conductor:conductor-annotations",
+ "com.netflix.conductor:conductor-common"
+ ],
+ "locked": "2.0"
}
}
}
\ No newline at end of file
diff --git a/client/spotbugsExclude.xml b/client/spotbugsExclude.xml
new file mode 100644
index 0000000000..29b642ca70
--- /dev/null
+++ b/client/spotbugsExclude.xml
@@ -0,0 +1,9 @@
+
+
* 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
@@ -12,7 +12,22 @@
*/
package com.netflix.conductor.client.automator;
-import com.google.common.base.Stopwatch;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.*;
+import java.util.function.Function;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
+import org.apache.commons.lang3.time.StopWatch;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.netflix.appinfo.InstanceInfo.InstanceStatus;
import com.netflix.conductor.client.config.PropertyFactory;
import com.netflix.conductor.client.http.TaskClient;
@@ -20,60 +35,91 @@
import com.netflix.conductor.client.worker.Worker;
import com.netflix.conductor.common.metadata.tasks.Task;
import com.netflix.conductor.common.metadata.tasks.TaskResult;
-import com.netflix.conductor.common.utils.RetryUtil;
import com.netflix.discovery.EurekaClient;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.concurrent.BasicThreadFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
+import com.netflix.spectator.api.Registry;
+import com.netflix.spectator.api.Spectator;
+import com.netflix.spectator.api.patterns.ThreadPoolMonitor;
/**
- * Manages the threadpool used by the workers for execution and server communication (polling and task update).
+ * Manages the threadpool used by the workers for execution and server communication (polling and
+ * task update).
*/
class TaskPollExecutor {
private static final Logger LOGGER = LoggerFactory.getLogger(TaskPollExecutor.class);
+ private static final Registry REGISTRY = Spectator.globalRegistry();
+
private final EurekaClient eurekaClient;
private final TaskClient taskClient;
private final int updateRetryCount;
private final ExecutorService executorService;
- private final PollingSemaphore pollingSemaphore;
- private final Map
- * Please see {@link TaskRunnerConfigurer#init()} method. The method must be called after this constructor for
- * the polling to start.
- * Please see {@link TaskRunnerConfigurer#init()} method. The method must be called after
+ * this constructor for the polling to start.
*/
public TaskRunnerConfigurer build() {
return new TaskRunnerConfigurer(this);
@@ -150,21 +210,38 @@ public TaskRunnerConfigurer build() {
}
/**
- * @return Thread Count for the executor pool
+ * @return Thread Count for the shared executor pool
*/
+ @Deprecated
public int getThreadCount() {
return threadCount;
}
/**
- * @return sleep time in millisecond before task update retry is done when receiving error from the Conductor server
+ * @return Thread Count for individual task type
+ */
+ public Map
- * 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
+ * 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.
+ * 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.client.config;
public interface ConductorClientConfiguration {
/**
- * @return the workflow input payload size threshold in KB, beyond which the payload will be processed based on
- * {@link ConductorClientConfiguration#isExternalPayloadStorageEnabled()}.
+ * @return the workflow input payload size threshold in KB, beyond which the payload will be
+ * processed based on {@link
+ * ConductorClientConfiguration#isExternalPayloadStorageEnabled()}.
*/
int getWorkflowInputPayloadThresholdKB();
/**
- * @return the max value of workflow input payload size threshold in KB, beyond which the payload will be rejected
- * regardless external payload storage is enabled.
+ * @return the max value of workflow input payload size threshold in KB, beyond which the
+ * payload will be rejected regardless external payload storage is enabled.
*/
int getWorkflowInputMaxPayloadThresholdKB();
/**
- * @return the task output payload size threshold in KB, beyond which the payload will be processed based on {@link
- * ConductorClientConfiguration#isExternalPayloadStorageEnabled()}.
+ * @return the task output payload size threshold in KB, beyond which the payload will be
+ * processed based on {@link
+ * ConductorClientConfiguration#isExternalPayloadStorageEnabled()}.
*/
int getTaskOutputPayloadThresholdKB();
/**
- * @return the max value of task output payload size threshold in KB, beyond which the payload will be rejected
- * regardless external payload storage is enabled.
+ * @return the max value of task output payload size threshold in KB, beyond which the payload
+ * will be rejected regardless external payload storage is enabled.
*/
int getTaskOutputMaxPayloadThresholdKB();
/**
- * @return the flag which controls the use of external storage for storing workflow/task input and output JSON
- * payloads with size greater than threshold. If it is set to true, the payload is stored in external location. If
- * it is set to false, the payload is rejected and the task/workflow execution fails.
+ * @return the flag which controls the use of external storage for storing workflow/task input
+ * and output JSON payloads with size greater than threshold. If it is set to true, the
+ * payload is stored in external location. If it is set to false, the payload is rejected
+ * and the task/workflow execution fails.
*/
boolean isExternalPayloadStorageEnabled();
}
diff --git a/client/src/main/java/com/netflix/conductor/client/config/DefaultConductorClientConfiguration.java b/client/src/main/java/com/netflix/conductor/client/config/DefaultConductorClientConfiguration.java
index 145d90396d..f15cf3bab0 100644
--- a/client/src/main/java/com/netflix/conductor/client/config/DefaultConductorClientConfiguration.java
+++ b/client/src/main/java/com/netflix/conductor/client/config/DefaultConductorClientConfiguration.java
@@ -13,7 +13,8 @@
package com.netflix.conductor.client.config;
/**
- * A default implementation of {@link ConductorClientConfiguration} where external payload storage is disabled.
+ * A default implementation of {@link ConductorClientConfiguration} where external payload storage
+ * is disabled.
*/
public class DefaultConductorClientConfiguration implements ConductorClientConfiguration {
diff --git a/client/src/main/java/com/netflix/conductor/client/config/PropertyFactory.java b/client/src/main/java/com/netflix/conductor/client/config/PropertyFactory.java
index a2650f4ac9..443b854817 100644
--- a/client/src/main/java/com/netflix/conductor/client/config/PropertyFactory.java
+++ b/client/src/main/java/com/netflix/conductor/client/config/PropertyFactory.java
@@ -12,13 +12,11 @@
*/
package com.netflix.conductor.client.config;
-import com.netflix.config.DynamicProperty;
-
import java.util.concurrent.ConcurrentHashMap;
-/**
- * Used to configure the Conductor workers using properties.
- */
+import com.netflix.config.DynamicProperty;
+
+/** Used to configure the Conductor workers using properties. */
public class PropertyFactory {
private final DynamicProperty global;
@@ -26,7 +24,8 @@ public class PropertyFactory {
private static final String PROPERTY_PREFIX = "conductor.worker";
- private static final ConcurrentHashMap>)
+ invocation -> {
+ List
>) invocation -> Collections.emptyList();
+ when(queue.receiveMessages()).thenReturn(messages).thenAnswer(answer);
+ when(queue.isRunning()).thenReturn(true);
+ when(queue.getOnSubscribe()).thenCallRealMethod();
+ when(queue.observe()).thenCallRealMethod();
+
+ List
- *
+ *
*
* ExecutionDAO
- *
- *
+ *
*
* EventHandlerDAO
+ *
*
- *
*/
-
public class Statements {
private final String keyspace;
@@ -119,26 +137,28 @@ public Statements(String keyspace) {
// Insert Statements
/**
- * @return cql query statement to insert a new workflow definition into the "workflow_definitions" table
+ * @return cql query statement to insert a new workflow definition into the
+ * "workflow_definitions" table
*/
public String getInsertWorkflowDefStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOW_DEFS)
- .value(WORKFLOW_DEF_NAME_KEY, bindMarker())
- .value(WORKFLOW_VERSION_KEY, bindMarker())
- .value(WORKFLOW_DEFINITION_KEY, bindMarker())
- .ifNotExists()
- .getQueryString();
+ .value(WORKFLOW_DEF_NAME_KEY, bindMarker())
+ .value(WORKFLOW_VERSION_KEY, bindMarker())
+ .value(WORKFLOW_DEFINITION_KEY, bindMarker())
+ .ifNotExists()
+ .getQueryString();
}
/**
- * @return cql query statement to insert a workflow def name version index into the "workflow_defs_index" table
+ * @return cql query statement to insert a workflow def name version index into the
+ * "workflow_defs_index" table
*/
public String getInsertWorkflowDefVersionIndexStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOW_DEFS_INDEX)
- .value(WORKFLOW_DEF_INDEX_KEY, WORKFLOW_DEF_INDEX_KEY)
- .value(WORKFLOW_DEF_NAME_VERSION_KEY, bindMarker())
- .value(WORKFLOW_DEF_INDEX_VALUE, bindMarker())
- .getQueryString();
+ .value(WORKFLOW_DEF_INDEX_KEY, WORKFLOW_DEF_INDEX_KEY)
+ .value(WORKFLOW_DEF_NAME_VERSION_KEY, bindMarker())
+ .value(WORKFLOW_DEF_INDEX_VALUE, bindMarker())
+ .getQueryString();
}
/**
@@ -146,118 +166,132 @@ public String getInsertWorkflowDefVersionIndexStatement() {
*/
public String getInsertTaskDefStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_TASK_DEFS)
- .value(TASK_DEFS_KEY, TASK_DEFS_KEY)
- .value(TASK_DEF_NAME_KEY, bindMarker())
- .value(TASK_DEFINITION_KEY, bindMarker())
- .getQueryString();
+ .value(TASK_DEFS_KEY, TASK_DEFS_KEY)
+ .value(TASK_DEF_NAME_KEY, bindMarker())
+ .value(TASK_DEFINITION_KEY, bindMarker())
+ .getQueryString();
}
// Select Statements
/**
- * @return cql query statement to fetch a workflow definition by name and version from the "workflow_definitions"
- * table
+ * @return cql query statement to fetch a workflow definition by name and version from the
+ * "workflow_definitions" table
*/
public String getSelectWorkflowDefStatement() {
return QueryBuilder.select(WORKFLOW_DEFINITION_KEY)
- .from(keyspace, TABLE_WORKFLOW_DEFS)
- .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
- .and(eq(WORKFLOW_VERSION_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOW_DEFS)
+ .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
+ .and(eq(WORKFLOW_VERSION_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to retrieve all versions of a workflow definition by name from the
- * "workflow_definitions" table
+ * @return cql query statement to retrieve all versions of a workflow definition by name from
+ * the "workflow_definitions" table
*/
public String getSelectAllWorkflowDefVersionsByNameStatement() {
return QueryBuilder.select()
- .all()
- .from(keyspace, TABLE_WORKFLOW_DEFS)
- .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
- .getQueryString();
+ .all()
+ .from(keyspace, TABLE_WORKFLOW_DEFS)
+ .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to fetch all workflow def names and version from the "workflow_defs_index" table
+ * @return cql query statement to fetch all workflow def names and version from the
+ * "workflow_defs_index" table
*/
public String getSelectAllWorkflowDefsStatement() {
return QueryBuilder.select()
- .all()
- .from(keyspace, TABLE_WORKFLOW_DEFS_INDEX)
- .where(eq(WORKFLOW_DEF_INDEX_KEY, bindMarker()))
- .getQueryString();
+ .all()
+ .from(keyspace, TABLE_WORKFLOW_DEFS_INDEX)
+ .where(eq(WORKFLOW_DEF_INDEX_KEY, bindMarker()))
+ .getQueryString();
+ }
+
+ public String getSelectAllWorkflowDefsLatestVersionsStatement() {
+ return QueryBuilder.select()
+ .all()
+ .from(keyspace, TABLE_WORKFLOW_DEFS_INDEX)
+ .where(eq(WORKFLOW_DEF_INDEX_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to fetch a task definition by name from the "task_definitions" table
+ * @return cql query statement to fetch a task definition by name from the "task_definitions"
+ * table
*/
public String getSelectTaskDefStatement() {
return QueryBuilder.select(TASK_DEFINITION_KEY)
- .from(keyspace, TABLE_TASK_DEFS)
- .where(eq(TASK_DEFS_KEY, TASK_DEFS_KEY))
- .and(eq(TASK_DEF_NAME_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_TASK_DEFS)
+ .where(eq(TASK_DEFS_KEY, TASK_DEFS_KEY))
+ .and(eq(TASK_DEF_NAME_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to retrieve all task definitions from the "task_definitions" table
+ * @return cql query statement to retrieve all task definitions from the "task_definitions"
+ * table
*/
public String getSelectAllTaskDefsStatement() {
return QueryBuilder.select()
- .all()
- .from(keyspace, TABLE_TASK_DEFS)
- .where(eq(TASK_DEFS_KEY, bindMarker()))
- .getQueryString();
+ .all()
+ .from(keyspace, TABLE_TASK_DEFS)
+ .where(eq(TASK_DEFS_KEY, bindMarker()))
+ .getQueryString();
}
// Update Statement
/**
- * @return cql query statement to update a workflow definitinos in the "workflow_definitions" table
+ * @return cql query statement to update a workflow definitinos in the "workflow_definitions"
+ * table
*/
public String getUpdateWorkflowDefStatement() {
return QueryBuilder.update(keyspace, TABLE_WORKFLOW_DEFS)
- .with(set(WORKFLOW_DEFINITION_KEY, bindMarker()))
- .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
- .and(eq(WORKFLOW_VERSION_KEY, bindMarker()))
- .getQueryString();
+ .with(set(WORKFLOW_DEFINITION_KEY, bindMarker()))
+ .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
+ .and(eq(WORKFLOW_VERSION_KEY, bindMarker()))
+ .getQueryString();
}
// Delete Statements
/**
- * @return cql query statement to delete a workflow definition by name and version from the "workflow_definitions"
- * table
+ * @return cql query statement to delete a workflow definition by name and version from the
+ * "workflow_definitions" table
*/
public String getDeleteWorkflowDefStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_WORKFLOW_DEFS)
- .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
- .and(eq(WORKFLOW_VERSION_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOW_DEFS)
+ .where(eq(WORKFLOW_DEF_NAME_KEY, bindMarker()))
+ .and(eq(WORKFLOW_VERSION_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to delete a workflow def name/version from the "workflow_defs_index" table
+ * @return cql query statement to delete a workflow def name/version from the
+ * "workflow_defs_index" table
*/
public String getDeleteWorkflowDefIndexStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_WORKFLOW_DEFS_INDEX)
- .where(eq(WORKFLOW_DEF_INDEX_KEY, bindMarker()))
- .and(eq(WORKFLOW_DEF_NAME_VERSION_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOW_DEFS_INDEX)
+ .where(eq(WORKFLOW_DEF_INDEX_KEY, bindMarker()))
+ .and(eq(WORKFLOW_DEF_NAME_VERSION_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to delete a task definition by name from the "task_definitions" table
+ * @return cql query statement to delete a task definition by name from the "task_definitions"
+ * table
*/
public String getDeleteTaskDefStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_TASK_DEFS)
- .where(eq(TASK_DEFS_KEY, TASK_DEFS_KEY))
- .and(eq(TASK_DEF_NAME_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_TASK_DEFS)
+ .where(eq(TASK_DEFS_KEY, TASK_DEFS_KEY))
+ .and(eq(TASK_DEF_NAME_KEY, bindMarker()))
+ .getQueryString();
}
// ExecutionDAO
@@ -268,14 +302,14 @@ public String getDeleteTaskDefStatement() {
*/
public String getInsertWorkflowStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOWS)
- .value(WORKFLOW_ID_KEY, bindMarker())
- .value(SHARD_ID_KEY, bindMarker())
- .value(TASK_ID_KEY, bindMarker())
- .value(ENTITY_KEY, ENTITY_TYPE_WORKFLOW)
- .value(PAYLOAD_KEY, bindMarker())
- .value(TOTAL_TASKS_KEY, bindMarker())
- .value(TOTAL_PARTITIONS_KEY, bindMarker())
- .getQueryString();
+ .value(WORKFLOW_ID_KEY, bindMarker())
+ .value(SHARD_ID_KEY, bindMarker())
+ .value(TASK_ID_KEY, bindMarker())
+ .value(ENTITY_KEY, ENTITY_TYPE_WORKFLOW)
+ .value(PAYLOAD_KEY, bindMarker())
+ .value(TOTAL_TASKS_KEY, bindMarker())
+ .value(TOTAL_PARTITIONS_KEY, bindMarker())
+ .getQueryString();
}
/**
@@ -283,12 +317,12 @@ public String getInsertWorkflowStatement() {
*/
public String getInsertTaskStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_WORKFLOWS)
- .value(WORKFLOW_ID_KEY, bindMarker())
- .value(SHARD_ID_KEY, bindMarker())
- .value(TASK_ID_KEY, bindMarker())
- .value(ENTITY_KEY, ENTITY_TYPE_TASK)
- .value(PAYLOAD_KEY, bindMarker())
- .getQueryString();
+ .value(WORKFLOW_ID_KEY, bindMarker())
+ .value(SHARD_ID_KEY, bindMarker())
+ .value(TASK_ID_KEY, bindMarker())
+ .value(ENTITY_KEY, ENTITY_TYPE_TASK)
+ .value(PAYLOAD_KEY, bindMarker())
+ .getQueryString();
}
/**
@@ -296,26 +330,26 @@ public String getInsertTaskStatement() {
*/
public String getInsertEventExecutionStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_EVENT_EXECUTIONS)
- .value(MESSAGE_ID_KEY, bindMarker())
- .value(EVENT_HANDLER_NAME_KEY, bindMarker())
- .value(EVENT_EXECUTION_ID_KEY, bindMarker())
- .value(PAYLOAD_KEY, bindMarker())
- .ifNotExists()
- .getQueryString();
+ .value(MESSAGE_ID_KEY, bindMarker())
+ .value(EVENT_HANDLER_NAME_KEY, bindMarker())
+ .value(EVENT_EXECUTION_ID_KEY, bindMarker())
+ .value(PAYLOAD_KEY, bindMarker())
+ .ifNotExists()
+ .getQueryString();
}
// Select Statements
/**
- * @return cql query statement to retrieve the total_tasks and total_partitions for a workflow from the "workflows"
- * table
+ * @return cql query statement to retrieve the total_tasks and total_partitions for a workflow
+ * from the "workflows" table
*/
public String getSelectTotalStatement() {
return QueryBuilder.select(TOTAL_TASKS_KEY, TOTAL_PARTITIONS_KEY)
- .from(keyspace, TABLE_WORKFLOWS)
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, 1))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOWS)
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, 1))
+ .getQueryString();
}
/**
@@ -323,24 +357,25 @@ public String getSelectTotalStatement() {
*/
public String getSelectTaskStatement() {
return QueryBuilder.select(PAYLOAD_KEY)
- .from(keyspace, TABLE_WORKFLOWS)
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, bindMarker()))
- .and(eq(ENTITY_KEY, ENTITY_TYPE_TASK))
- .and(eq(TASK_ID_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOWS)
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, bindMarker()))
+ .and(eq(ENTITY_KEY, ENTITY_TYPE_TASK))
+ .and(eq(TASK_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to retrieve a workflow (without its tasks) from the "workflows" table
+ * @return cql query statement to retrieve a workflow (without its tasks) from the "workflows"
+ * table
*/
public String getSelectWorkflowStatement() {
return QueryBuilder.select(PAYLOAD_KEY)
- .from(keyspace, TABLE_WORKFLOWS)
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, 1))
- .and(eq(ENTITY_KEY, ENTITY_TYPE_WORKFLOW))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOWS)
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, 1))
+ .and(eq(ENTITY_KEY, ENTITY_TYPE_WORKFLOW))
+ .getQueryString();
}
/**
@@ -348,46 +383,47 @@ public String getSelectWorkflowStatement() {
*/
public String getSelectWorkflowWithTasksStatement() {
return QueryBuilder.select()
- .all()
- .from(keyspace, TABLE_WORKFLOWS)
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, bindMarker()))
- .getQueryString();
+ .all()
+ .from(keyspace, TABLE_WORKFLOWS)
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to retrieve the workflow_id for a particular task_id from the "task_lookup" table
+ * @return cql query statement to retrieve the workflow_id for a particular task_id from the
+ * "task_lookup" table
*/
public String getSelectTaskFromLookupTableStatement() {
return QueryBuilder.select(WORKFLOW_ID_KEY)
- .from(keyspace, TABLE_TASK_LOOKUP)
- .where(eq(TASK_ID_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_TASK_LOOKUP)
+ .where(eq(TASK_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to retrieve all task ids for a given taskDefName with concurrent execution limit
- * configured from the "task_def_limit" table
+ * @return cql query statement to retrieve all task ids for a given taskDefName with concurrent
+ * execution limit configured from the "task_def_limit" table
*/
public String getSelectTasksFromTaskDefLimitStatement() {
return QueryBuilder.select()
- .all()
- .from(keyspace, TABLE_TASK_DEF_LIMIT)
- .where(eq(TASK_DEF_NAME_KEY, bindMarker()))
- .getQueryString();
+ .all()
+ .from(keyspace, TABLE_TASK_DEF_LIMIT)
+ .where(eq(TASK_DEF_NAME_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to retrieve all event executions for a given message and event handler from the
- * "event_executions" table
+ * @return cql query statement to retrieve all event executions for a given message and event
+ * handler from the "event_executions" table
*/
public String getSelectAllEventExecutionsForMessageFromEventExecutionsStatement() {
return QueryBuilder.select()
- .all()
- .from(keyspace, TABLE_EVENT_EXECUTIONS)
- .where(eq(MESSAGE_ID_KEY, bindMarker()))
- .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
- .getQueryString();
+ .all()
+ .from(keyspace, TABLE_EVENT_EXECUTIONS)
+ .where(eq(MESSAGE_ID_KEY, bindMarker()))
+ .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
+ .getQueryString();
}
// Update Statements
@@ -397,45 +433,48 @@ public String getSelectAllEventExecutionsForMessageFromEventExecutionsStatement(
*/
public String getUpdateWorkflowStatement() {
return QueryBuilder.update(keyspace, TABLE_WORKFLOWS)
- .with(set(PAYLOAD_KEY, bindMarker()))
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, 1))
- .and(eq(ENTITY_KEY, ENTITY_TYPE_WORKFLOW))
- .and(eq(TASK_ID_KEY, ""))
- .getQueryString();
+ .with(set(PAYLOAD_KEY, bindMarker()))
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, 1))
+ .and(eq(ENTITY_KEY, ENTITY_TYPE_WORKFLOW))
+ .and(eq(TASK_ID_KEY, ""))
+ .getQueryString();
}
/**
- * @return cql query statement to update the total_tasks in a shard for a workflow in the "workflows" table
+ * @return cql query statement to update the total_tasks in a shard for a workflow in the
+ * "workflows" table
*/
public String getUpdateTotalTasksStatement() {
return QueryBuilder.update(keyspace, TABLE_WORKFLOWS)
- .with(set(TOTAL_TASKS_KEY, bindMarker()))
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, bindMarker()))
- .getQueryString();
+ .with(set(TOTAL_TASKS_KEY, bindMarker()))
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to update the total_partitions for a workflow in the "workflows" table
+ * @return cql query statement to update the total_partitions for a workflow in the "workflows"
+ * table
*/
public String getUpdateTotalPartitionsStatement() {
return QueryBuilder.update(keyspace, TABLE_WORKFLOWS)
- .with(set(TOTAL_PARTITIONS_KEY, bindMarker()))
- .and(set(TOTAL_TASKS_KEY, bindMarker()))
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, 1))
- .getQueryString();
+ .with(set(TOTAL_PARTITIONS_KEY, bindMarker()))
+ .and(set(TOTAL_TASKS_KEY, bindMarker()))
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, 1))
+ .getQueryString();
}
/**
- * @return cql query statement to add a new task_id to workflow_id mapping to the "task_lookup" table
+ * @return cql query statement to add a new task_id to workflow_id mapping to the "task_lookup"
+ * table
*/
public String getUpdateTaskLookupStatement() {
return QueryBuilder.update(keyspace, TABLE_TASK_LOOKUP)
- .with(set(WORKFLOW_ID_KEY, bindMarker()))
- .where(eq(TASK_ID_KEY, bindMarker()))
- .getQueryString();
+ .with(set(WORKFLOW_ID_KEY, bindMarker()))
+ .where(eq(TASK_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
@@ -443,10 +482,10 @@ public String getUpdateTaskLookupStatement() {
*/
public String getUpdateTaskDefLimitStatement() {
return QueryBuilder.update(keyspace, TABLE_TASK_DEF_LIMIT)
- .with(set(WORKFLOW_ID_KEY, bindMarker()))
- .where(eq(TASK_DEF_NAME_KEY, bindMarker()))
- .and(eq(TASK_ID_KEY, bindMarker()))
- .getQueryString();
+ .with(set(WORKFLOW_ID_KEY, bindMarker()))
+ .where(eq(TASK_DEF_NAME_KEY, bindMarker()))
+ .and(eq(TASK_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
@@ -454,12 +493,12 @@ public String getUpdateTaskDefLimitStatement() {
*/
public String getUpdateEventExecutionStatement() {
return QueryBuilder.update(keyspace, TABLE_EVENT_EXECUTIONS)
- .using(QueryBuilder.ttl(bindMarker()))
- .with(set(PAYLOAD_KEY, bindMarker()))
- .where(eq(MESSAGE_ID_KEY, bindMarker()))
- .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
- .and(eq(EVENT_EXECUTION_ID_KEY, bindMarker()))
- .getQueryString();
+ .using(QueryBuilder.ttl(bindMarker()))
+ .with(set(PAYLOAD_KEY, bindMarker()))
+ .where(eq(MESSAGE_ID_KEY, bindMarker()))
+ .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
+ .and(eq(EVENT_EXECUTION_ID_KEY, bindMarker()))
+ .getQueryString();
}
// Delete statements
@@ -469,20 +508,21 @@ public String getUpdateEventExecutionStatement() {
*/
public String getDeleteWorkflowStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_WORKFLOWS)
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOWS)
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
- * @return cql query statement to delete a task_id to workflow_id mapping from the "task_lookup" table
+ * @return cql query statement to delete a task_id to workflow_id mapping from the "task_lookup"
+ * table
*/
public String getDeleteTaskLookupStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_TASK_LOOKUP)
- .where(eq(TASK_ID_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_TASK_LOOKUP)
+ .where(eq(TASK_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
@@ -490,12 +530,12 @@ public String getDeleteTaskLookupStatement() {
*/
public String getDeleteTaskStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_WORKFLOWS)
- .where(eq(WORKFLOW_ID_KEY, bindMarker()))
- .and(eq(SHARD_ID_KEY, bindMarker()))
- .and(eq(ENTITY_KEY, ENTITY_TYPE_TASK))
- .and(eq(TASK_ID_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_WORKFLOWS)
+ .where(eq(WORKFLOW_ID_KEY, bindMarker()))
+ .and(eq(SHARD_ID_KEY, bindMarker()))
+ .and(eq(ENTITY_KEY, ENTITY_TYPE_TASK))
+ .and(eq(TASK_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
@@ -503,10 +543,10 @@ public String getDeleteTaskStatement() {
*/
public String getDeleteTaskDefLimitStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_TASK_DEF_LIMIT)
- .where(eq(TASK_DEF_NAME_KEY, bindMarker()))
- .and(eq(TASK_ID_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_TASK_DEF_LIMIT)
+ .where(eq(TASK_DEF_NAME_KEY, bindMarker()))
+ .and(eq(TASK_ID_KEY, bindMarker()))
+ .getQueryString();
}
/**
@@ -514,11 +554,11 @@ public String getDeleteTaskDefLimitStatement() {
*/
public String getDeleteEventExecutionsStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_EVENT_EXECUTIONS)
- .where(eq(MESSAGE_ID_KEY, bindMarker()))
- .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
- .and(eq(EVENT_EXECUTION_ID_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_EVENT_EXECUTIONS)
+ .where(eq(MESSAGE_ID_KEY, bindMarker()))
+ .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
+ .and(eq(EVENT_EXECUTION_ID_KEY, bindMarker()))
+ .getQueryString();
}
// EventHandlerDAO
@@ -529,10 +569,10 @@ public String getDeleteEventExecutionsStatement() {
*/
public String getInsertEventHandlerStatement() {
return QueryBuilder.insertInto(keyspace, TABLE_EVENT_HANDLERS)
- .value(HANDLERS_KEY, HANDLERS_KEY)
- .value(EVENT_HANDLER_NAME_KEY, bindMarker())
- .value(EVENT_HANDLER_KEY, bindMarker())
- .getQueryString();
+ .value(HANDLERS_KEY, HANDLERS_KEY)
+ .value(EVENT_HANDLER_NAME_KEY, bindMarker())
+ .value(EVENT_HANDLER_KEY, bindMarker())
+ .getQueryString();
}
// Select Statements
@@ -542,22 +582,23 @@ public String getInsertEventHandlerStatement() {
*/
public String getSelectAllEventHandlersStatement() {
return QueryBuilder.select()
- .all()
- .from(keyspace, TABLE_EVENT_HANDLERS)
- .where(eq(HANDLERS_KEY, bindMarker()))
- .getQueryString();
+ .all()
+ .from(keyspace, TABLE_EVENT_HANDLERS)
+ .where(eq(HANDLERS_KEY, bindMarker()))
+ .getQueryString();
}
// Delete Statements
/**
- * @return cql query statement to delete an event handler by name from the "event_handlers" table
+ * @return cql query statement to delete an event handler by name from the "event_handlers"
+ * table
*/
public String getDeleteEventHandlerStatement() {
return QueryBuilder.delete()
- .from(keyspace, TABLE_EVENT_HANDLERS)
- .where(eq(HANDLERS_KEY, HANDLERS_KEY))
- .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
- .getQueryString();
+ .from(keyspace, TABLE_EVENT_HANDLERS)
+ .where(eq(HANDLERS_KEY, HANDLERS_KEY))
+ .and(eq(EVENT_HANDLER_NAME_KEY, bindMarker()))
+ .getQueryString();
}
}
diff --git a/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraEventHandlerDAOSpec.groovy b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraEventHandlerDAOSpec.groovy
new file mode 100644
index 0000000000..214f3722de
--- /dev/null
+++ b/cassandra-persistence/src/test/groovy/com/netflix/conductor/cassandra/dao/CassandraEventHandlerDAOSpec.groovy
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2022 Netflix, Inc.
+ *