orchestrator-core 4.0.0rc2__tar.gz → 4.0.0rc4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.bumpversion.cfg +1 -1
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/NOTICE +2 -1
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/PKG-INFO +2 -1
- orchestrator_core-4.0.0rc4/docs/reference-docs/metrics.md +45 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/__init__.py +1 -1
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/settings.py +3 -13
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/app.py +10 -1
- orchestrator_core-4.0.0rc4/orchestrator/metrics/__init__.py +3 -0
- orchestrator_core-4.0.0rc4/orchestrator/metrics/engine.py +49 -0
- orchestrator_core-4.0.0rc4/orchestrator/metrics/init.py +14 -0
- orchestrator_core-4.0.0rc4/orchestrator/metrics/processes.py +147 -0
- orchestrator_core-4.0.0rc4/orchestrator/metrics/subscriptions.py +93 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/settings.py +10 -1
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/settings.py +1 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/pyproject.toml +1 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/conftest.py +1 -0
- orchestrator_core-4.0.0rc4/test/unit_tests/metrics/conftest.py +27 -0
- orchestrator_core-4.0.0rc4/test/unit_tests/metrics/test_engine_metrics.py +18 -0
- orchestrator_core-4.0.0rc4/test/unit_tests/metrics/test_process_metrics.py +27 -0
- orchestrator_core-4.0.0rc4/test/unit_tests/metrics/test_subscription_metrics.py +60 -0
- orchestrator_core-4.0.0rc4/test/unit_tests/workflows/tasks/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.coveragerc +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/dependabot.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/README.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/build-push-container.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/changelog.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/codeql-analysis.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/gh-pages.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/issues.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/publish-package.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/run-codspeed-tests.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/run-linting-tests.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/run-unit-tests.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/scheduled-build.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.gitignore +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.pre-commit-config.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.stignore +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/CHANGELOG.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/Dockerfile +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/LICENSE +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/README.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/codecov.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/domainmodels.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/forms-frontend.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/tasks.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/workflow.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/framework.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/img/base-orchestrator-setup.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/img/custom-orchestrator-setup.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/img/Custom-orchestrator-ui-using-override.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/img/Standard-orchestrator-ui.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/orchestrator-ui.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/philosophy.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/backfilling.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/context.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/imports.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/introduction.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/ip_static.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/ip_static.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_point_to_point.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_point_to_point.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_vpn.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_vpn.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/modelling.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/node.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/node.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/port.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/port.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/product_block_graph.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/product_block_graph.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/standards.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/terminology.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/tldr.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/contributing/development.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/contributing/guidelines.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/contributing/testing.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/css/custom.css +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/css/style.css +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/css/termynal.css +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/base.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/docker.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/orchestration-ui.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/prepare-source-folder.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/versions.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/img/WFO-Emblem-White.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/img/favicon.ico +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/index.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/js/custom.js +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/js/termynal.js +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/migration-guide/2.0.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/migration-guide/3.0.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/migration-guide/4.0.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/api.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/app/app.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/app/scaling.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/auth-backend-and-frontend.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/cli.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/database.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/generator.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/instantiating.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/model_attributes.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/overview.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/product_blocks.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/product_types.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/properties.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/pydantic_hooks.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/type_casting.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/union_types.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/validation.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/forms.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/graphql.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/python.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/search.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/search_overview.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/serialization.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/tasks.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/tests.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/tldr.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/websockets.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/workflows/callbacks.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/workflows/workflow-lifecycles.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/workflows/workflow-steps.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/bootstrap.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/create-your-own.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/docker-installation.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/domain-models.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/execute-workflows.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/generator.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/l2_point_to_point.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-create.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-modify.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-terminate.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-validate.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/overview.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/scenario.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/workflow-basics.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/workflow-introduction.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/create-user-group.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/create-user.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/database-migration.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/debian.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/docker.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/domain-models.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/explore.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/input-forms.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/macos.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/modify-user-group.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/modify-user.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/register-workflows.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/start-applications.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/terminate-user-group.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/terminate-user.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/workflow-introduction.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/workshop-overview.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/Software-topology.drawio.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/clab_topology.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/metadata_products.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/netbox_devices_active.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/subscriptions.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/topology.drawio.png +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/includes/abbreviations.md +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/mkdocs.yml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/nitpick-style.toml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/api.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/health.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/processes.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/product_blocks.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/products.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/resource_types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/translations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/user.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/ws.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/error_handling.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/models.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/database.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/product_block_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/product_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/resource_type_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generate.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/README +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_create_imports.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_create_input_fields.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_create_steps.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_modify_imports.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_modify_input_fields.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_modify_steps.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_terminate_imports.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_terminate_input_fields.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_terminate_steps.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/enums.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/migration.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/product_block.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/settings.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/translations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/unittest.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/validations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/circuit.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/node.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/user.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/user_group.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_create_imports.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_create_steps.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_modify_imports.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_modify_steps.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_terminate_steps.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/constrained_int_definitions.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/create_data_head.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/create_product.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/enums.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/lazy_workflow_instance.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/list_definitions.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/macros.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/modify_product.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/new_product_migration.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/product.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/product_block.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/shared_forms.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/shared_workflows.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/subscription_model_registry.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/terminate_product.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_modify_workflow.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_product_type.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_terminate_workflow.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_validate_workflow.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/validate_product.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/helpers/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/helpers/input_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/helpers/print_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/main.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migrate_domain_models.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migrate_tasks.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migrate_workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migration_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/scheduler.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/config/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/config/assignee.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/database.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/filters.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/product_block.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/resource_type.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/search_filters/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/search_filters/inferred_filter.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/listeners.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/loaders.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/models.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/queries/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/queries/subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/queries/subscription_instance.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/range/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/range/range.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/product_block.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/resource_type.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/sorting.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/populator.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/migrate_20.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/migrate_30.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/shared.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/distlock_manager.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/managers/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/managers/memory_distlock_manager.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/managers/redis_distlock_manager.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/base.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/context_cache.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/customer_description.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/lifecycle.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/subscription_instance_transform.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/exception_handlers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/customer_contact_list.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/customer_id.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/display_subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/network_type_validators.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/product_id.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/autoregistration.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/extensions/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/extensions/model_cache.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/extensions/stats.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/loaders/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/loaders/subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/mutations/customer_description.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/mutations/start_process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/pagination.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/customer.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/product_block.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/resource_type.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/settings.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/version.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schema.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/customer.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/customer_description.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/errors.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/fixed_input.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/product_block.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/resource_type.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/settings.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/strawberry_pydantic_patch.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/version.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/create_resolver_error_handler.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_query_loaders.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_selected_fields.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_selected_paths.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_subscription_product_blocks.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/is_query_detailed.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/override_class.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/to_graphql_result_page.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/log_config.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/README +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/alembic.ini +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/env.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/script.py.mako +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/templates/alembic.ini.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/templates/env.py.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/templates/helpers.py.j2 +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2020-10-19_3323bcb934e7_fix_tsv_triggers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2020-10-19_a76b9185b334_add_generic_workflows_to_core.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2020-10-19_c112305b07d3_initial_schema_migration.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2021-04-06_3c8b9185c221_add_validate_products_task.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2021-07-01_6896a54e9483_add_product_block_relations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2021-11-17_19cdd3ab86f6_fix_parse_websearch.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2022-02-16_bed6bc0b197a_rename_parent_and_child_block_relations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-03-06_e05bb1967eff_add_subscriptions_search_view.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-05-25_b1970225392d_add_subscription_metadata_workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.sql +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.sql +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.sql +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2023-12-06_048219045729_add_workflow_id_to_processes_table.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.sql +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-01-19_4fjdn13f83ga_add_validate_product_type_task.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-02-20_68d14db1b8da_make_workflow_description_mandatory.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/py.typed +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/resume_workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/scheduling.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/task_vacuum.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/validate_products.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/validate_subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/base.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/engine_settings.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/fixed_input.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/problem_detail.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/product_block.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/resource_type.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/subscription_descriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/security.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/celery.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/fixed_inputs.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/input_state.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/process_broadcast_thread.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/processes.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/products.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/resource_types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/subscription_relations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/tasks.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/translations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/targets.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/crypt.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/datetime.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/deprecation_logger.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/docs.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/enrich_process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/errors.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/fixed_inputs.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/functional.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/get_subscription_dict.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/get_updated_properties.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/json.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/redis.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/redis_client.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/search_query.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/state.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/strings.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/validate_data_version.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/version.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/managers/broadcast_websocket_manager.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/managers/memory_websocket_manager.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/websocket_manager.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/modify_note.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/removed_workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/steps.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/cleanup_tasks_log.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/resume_workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/validate_product_type.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/validate_products.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/translations/en-GB.json +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/utils.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/setup.cfg +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/setup.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/conftest.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/test_product_populator.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/main.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/test_product_blocks.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/products/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/products/test_product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/workflows/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/workflows/create_test_product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/test_test_product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_health.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_models.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_processes.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_processes_ws.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_product_blocks.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_products.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_resource_types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_settings.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_subscription_customer_descriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_ws.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/conftest.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/alembic.ini +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/main.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/env.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/script.py.mako +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_59e1199aff7f_create_data_head.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_85be1c80731c_add_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_ea9e6c9de75c_add_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-06-07_380a5b0c928c_add_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example4sub.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_create_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_modify_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_terminate_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_validate_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_create_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_modify_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_terminate_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_validate_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_create_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_modify_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_terminate_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_validate_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/translations/en-GB.json +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/create_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/modify_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/shared/forms.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/terminate_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/validate_example1.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/create_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/modify_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/shared/forms.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/terminate_example2.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/create_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/modify_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/shared/forms.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/terminate_example4.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/shared.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate.sh +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/invalid_product_config1.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/invalid_product_config2.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config1.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config2.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config3.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config4.yaml +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/generator/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/generator/test_enums.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_cli_generate.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_config_validation.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_generate_code.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_migrate_domain_models_with_instances.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_migrate_domain_models_without_instances.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/config.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/db/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/db/test_listeners.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_multiple.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_performance.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_serializable_property.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_with_list_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_with_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_lifecycle.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/processes.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_list_nested.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_one.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_one_nested.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_with_list_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_with_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_one.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_two.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_list_nested.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_list_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_list_union_overlap.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_one.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_one_nested.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_sub_list_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_sub_one.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_sub_two.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_sub_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_union.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/subscription_relations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/resource_types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_customer_contact_list.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_customer_id.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_display_subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_generic_validators.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/conftest.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/extensions/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/extensions/test_stats.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/mutations/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/mutations/test_customer_description.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/mutations/test_start_process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_customer.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_process.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_processes.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_product.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_product_blocks.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_resource_types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_settings.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_sort_and_filter_fields.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_subscription.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_subscription_relations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_version.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/fixtures.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_autoregistration.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_get_query_loaders.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_get_selected_paths.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_is_query_detailed.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_is_querying_page_data.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_override_class.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/helpers.py +0 -0
- {orchestrator_core-4.0.0rc2/test/unit_tests/migrations → orchestrator_core-4.0.0rc4/test/unit_tests/metrics}/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2/test/unit_tests/schedules → orchestrator_core-4.0.0rc4/test/unit_tests/migrations}/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/migrations/test_cascade_constraint.py +0 -0
- {orchestrator_core-4.0.0rc2/test/unit_tests/services → orchestrator_core-4.0.0rc4/test/unit_tests/schedules}/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/schedules/test_scheduling.py +0 -0
- {orchestrator_core-4.0.0rc2/test/unit_tests/utils → orchestrator_core-4.0.0rc4/test/unit_tests/services}/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_input_state.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_processes.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_products.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_subscription_relations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_translations.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/test_db.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/test_types.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/test_workflow.py +0 -0
- {orchestrator_core-4.0.0rc2/test/unit_tests/websocket → orchestrator_core-4.0.0rc4/test/unit_tests/utils}/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/get_subscription_dict.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_datetime.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_errors.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_functional.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_get_updated_properties.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_json.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_search_query.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_state.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_strings.py +0 -0
- {orchestrator_core-4.0.0rc2/test/unit_tests/workflows/shared → orchestrator_core-4.0.0rc4/test/unit_tests/websocket}/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/websocket/test_broadcast.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/conftest.py +0 -0
- {orchestrator_core-4.0.0rc2/test/unit_tests/workflows/tasks → orchestrator_core-4.0.0rc4/test/unit_tests/workflows/shared}/__init__.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/shared/test_validate_subscriptions.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_clean_up_task_log.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_resume_workflows.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_validate_product_type.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_validate_products.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_async_workflow.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_config_db_code.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_generic_workflow_steps.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_lifecycle_status_manager.py +0 -0
- {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_modify_note.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: orchestrator-core
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.0rc4
|
|
4
4
|
Summary: This is the orchestrator workflow engine.
|
|
5
5
|
Requires-Python: >=3.11,<3.14
|
|
6
6
|
Classifier: Intended Audience :: Information Technology
|
|
@@ -39,6 +39,7 @@ Requires-Dist: more-itertools~=10.7.0
|
|
|
39
39
|
Requires-Dist: itsdangerous
|
|
40
40
|
Requires-Dist: Jinja2==3.1.6
|
|
41
41
|
Requires-Dist: orjson==3.10.18
|
|
42
|
+
Requires-Dist: prometheus-client==0.21.1
|
|
42
43
|
Requires-Dist: psycopg2-binary==2.9.10
|
|
43
44
|
Requires-Dist: pydantic[email]~=2.8.2
|
|
44
45
|
Requires-Dist: pydantic-settings~=2.9.1
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Collecting Metrics
|
|
2
|
+
|
|
3
|
+
The ``orchestrator-core`` is capable of exporting metrics on an API endpoint that is compatible with
|
|
4
|
+
[Prometheus](https://prometheus.io). Prometheus is a time-series database that can be used to collect metrics over time,
|
|
5
|
+
to give insight in the usage and performance of your orchestrator, the running processes, and its subscriptions.
|
|
6
|
+
|
|
7
|
+
By default, ``orchestrator-core`` exports metrics for: subscriptions, processes, and the workflow engine. These can be
|
|
8
|
+
enabled by enabling the corresponding app setting ``ENABLE_PROMETHEUS_METRICS_ENDPOINT``. An API response on
|
|
9
|
+
``/api/metrics`` with the default metrics enabled looks as follows:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
# HELP wfo_subscriptions_count Number of subscriptions per product, lifecycle state, customer, and in sync state.
|
|
13
|
+
# TYPE wfo_subscriptions_count gauge
|
|
14
|
+
wfo_subscriptions_count{customer_id="00000000-0000-0000-0000-000000000000",insync="True",lifecycle_state="active",product_name="Router"} 53.0
|
|
15
|
+
wfo_subscriptions_count{customer_id="00000000-0000-0000-0000-000000000000",insync="True",lifecycle_state="active",product_name="IP trunk"} 52.0
|
|
16
|
+
wfo_subscriptions_count{customer_id="00000000-0000-0000-0000-000000000000",insync="True",lifecycle_state="active",product_name="Site"} 36.0
|
|
17
|
+
wfo_subscriptions_count{customer_id="00000000-0000-0000-0000-000000000000",insync="True",lifecycle_state="terminated",product_name="Router"} 22.0
|
|
18
|
+
# HELP wfo_process_count Number of processes per status, creator, task, product, workflow, customer, and target.
|
|
19
|
+
# TYPE wfo_process_count gauge
|
|
20
|
+
wfo_process_count{created_by="SYSTEM",customer_id="00000000-0000-0000-0000-000000000000",is_task="True",last_status="completed",product_name="IP trunk",workflow_name="validate_iptrunk",workflow_target="SYSTEM"} 5755.0
|
|
21
|
+
wfo_process_count{created_by="SYSTEM",customer_id="00000000-0000-0000-0000-000000000000",is_task="True",last_status="completed",product_name="Router",workflow_name="validate_router",workflow_target="SYSTEM"} 4066.0
|
|
22
|
+
wfo_process_count{created_by="SYSTEM",customer_id="12345678-1234-abcd-deff-123456789012",is_task="True",last_status="completed",product_name="Edge Port",workflow_name="validate_edge_port",workflow_target="SYSTEM"} 133.0
|
|
23
|
+
# HELP wfo_process_seconds_total_count Total time spent on processes in seconds.
|
|
24
|
+
# TYPE wfo_process_seconds_total_count gauge
|
|
25
|
+
wfo_process_seconds_total_count{created_by="SYSTEM",customer_id="00000000-0000-0000-0000-000000000000",is_task="True",last_status="completed",product_name="IP trunk",workflow_name="validate_iptrunk",workflow_target="SYSTEM"} 3.11e+06
|
|
26
|
+
wfo_process_seconds_total_count{created_by="SYSTEM",customer_id="00000000-0000-0000-0000-000000000000",is_task="True",last_status="completed",product_name="Router",workflow_name="validate_router",workflow_target="SYSTEM"} 6.72e+06
|
|
27
|
+
wfo_process_seconds_total_count{created_by="SYSTEM",customer_id="12345678-1234-abcd-deff-123456789012",is_task="True",last_status="completed",product_name="Edge Port",workflow_name="validate_edge_port",workflow_target="SYSTEM"} 6514.921
|
|
28
|
+
# HELP wfo_engine_status Current workflow engine status.
|
|
29
|
+
# TYPE wfo_engine_status gauge
|
|
30
|
+
wfo_engine_status{wfo_engine_status="PAUSED"} 0.0
|
|
31
|
+
wfo_engine_status{wfo_engine_status="PAUSING"} 0.0
|
|
32
|
+
wfo_engine_status{wfo_engine_status="RUNNING"} 1.0
|
|
33
|
+
# HELP wfo_active_process_count Number of currently running processes in the workflow engine.
|
|
34
|
+
# TYPE wfo_active_process_count gauge
|
|
35
|
+
wfo_active_process_count 5.0
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Adding custom metrics
|
|
39
|
+
|
|
40
|
+
It's possible to add more metric collectors to your orchestrator, if there are organisation-specific metrics you want
|
|
41
|
+
to keep track of. This is done by implementing extra metrics from the ``prometheus_client`` library, documentation on
|
|
42
|
+
how to achieve this is available [here](https://prometheus.github.io/client_python/).
|
|
43
|
+
|
|
44
|
+
When your new collector is implemented, register it in the orchestrator metrics registry when initialising your
|
|
45
|
+
orchestrator with ``ORCHESTRATOR_METRICS_REGISTRY.register(MyNewCollector())``.
|
|
@@ -22,9 +22,10 @@ from sqlalchemy.exc import SQLAlchemyError
|
|
|
22
22
|
from oauth2_lib.fastapi import OIDCUserModel
|
|
23
23
|
from orchestrator.api.error_handling import raise_status
|
|
24
24
|
from orchestrator.db import EngineSettingsTable
|
|
25
|
-
from orchestrator.schemas import EngineSettingsBaseSchema, EngineSettingsSchema,
|
|
25
|
+
from orchestrator.schemas import EngineSettingsBaseSchema, EngineSettingsSchema, WorkerStatus
|
|
26
26
|
from orchestrator.security import authenticate
|
|
27
27
|
from orchestrator.services import processes, settings
|
|
28
|
+
from orchestrator.services.settings import generate_engine_global_status
|
|
28
29
|
from orchestrator.settings import ExecutorType, app_settings
|
|
29
30
|
from orchestrator.utils.json import json_dumps
|
|
30
31
|
from orchestrator.utils.redis import delete_keys_matching_pattern
|
|
@@ -165,17 +166,6 @@ def generate_engine_status_response(
|
|
|
165
166
|
Engine StatusEnum
|
|
166
167
|
|
|
167
168
|
"""
|
|
168
|
-
|
|
169
|
-
if engine_settings.global_lock and engine_settings.running_processes > 0:
|
|
170
|
-
result = EngineSettingsSchema.model_validate(engine_settings)
|
|
171
|
-
result.global_status = GlobalStatusEnum.PAUSING
|
|
172
|
-
return result
|
|
173
|
-
|
|
174
|
-
if engine_settings.global_lock and engine_settings.running_processes == 0:
|
|
175
|
-
result = EngineSettingsSchema.model_validate(engine_settings)
|
|
176
|
-
result.global_status = GlobalStatusEnum.PAUSED
|
|
177
|
-
return result
|
|
178
|
-
|
|
179
169
|
result = EngineSettingsSchema.model_validate(engine_settings)
|
|
180
|
-
result.global_status =
|
|
170
|
+
result.global_status = generate_engine_global_status(engine_settings)
|
|
181
171
|
return result
|
|
@@ -25,6 +25,7 @@ import structlog
|
|
|
25
25
|
import typer
|
|
26
26
|
from fastapi.applications import FastAPI
|
|
27
27
|
from fastapi_etag.dependency import add_exception_handler
|
|
28
|
+
from prometheus_client import make_asgi_app
|
|
28
29
|
from sentry_sdk.integrations import Integration
|
|
29
30
|
from sentry_sdk.integrations.asyncio import AsyncioIntegration
|
|
30
31
|
from sentry_sdk.integrations.fastapi import FastApiIntegration
|
|
@@ -54,6 +55,7 @@ from orchestrator.graphql.schema import ContextGetterFactory
|
|
|
54
55
|
from orchestrator.graphql.schemas.subscription import SubscriptionInterface
|
|
55
56
|
from orchestrator.graphql.types import ScalarOverrideType, StrawberryModelType
|
|
56
57
|
from orchestrator.log_config import LOGGER_OVERRIDES
|
|
58
|
+
from orchestrator.metrics import ORCHESTRATOR_METRICS_REGISTRY, initialize_default_metrics
|
|
57
59
|
from orchestrator.services.process_broadcast_thread import ProcessDataBroadcastThread
|
|
58
60
|
from orchestrator.settings import AppSettings, ExecutorType, app_settings
|
|
59
61
|
from orchestrator.version import GIT_COMMIT_HASH
|
|
@@ -143,9 +145,14 @@ class OrchestratorCore(FastAPI):
|
|
|
143
145
|
self.add_exception_handler(ProblemDetailException, problem_detail_handler) # type: ignore[arg-type]
|
|
144
146
|
add_exception_handler(self)
|
|
145
147
|
|
|
148
|
+
if base_settings.ENABLE_PROMETHEUS_METRICS_ENDPOINT:
|
|
149
|
+
initialize_default_metrics()
|
|
150
|
+
metrics_app = make_asgi_app(registry=ORCHESTRATOR_METRICS_REGISTRY)
|
|
151
|
+
self.mount("/api/metrics", metrics_app)
|
|
152
|
+
|
|
146
153
|
@self.router.get("/", response_model=str, response_class=JSONResponse, include_in_schema=False)
|
|
147
154
|
def _index() -> str:
|
|
148
|
-
return "Orchestrator
|
|
155
|
+
return "Orchestrator Core"
|
|
149
156
|
|
|
150
157
|
def add_sentry(
|
|
151
158
|
self,
|
|
@@ -154,6 +161,7 @@ class OrchestratorCore(FastAPI):
|
|
|
154
161
|
server_name: str,
|
|
155
162
|
environment: str,
|
|
156
163
|
release: str | None = GIT_COMMIT_HASH,
|
|
164
|
+
**sentry_kwargs: Any,
|
|
157
165
|
) -> None:
|
|
158
166
|
logger.info("Adding Sentry middleware to app", app=self.title)
|
|
159
167
|
if self.base_settings.EXECUTOR == ExecutorType.WORKER:
|
|
@@ -173,6 +181,7 @@ class OrchestratorCore(FastAPI):
|
|
|
173
181
|
integrations=sentry_integrations,
|
|
174
182
|
propagate_traces=True,
|
|
175
183
|
profiles_sample_rate=trace_sample_rate,
|
|
184
|
+
**sentry_kwargs,
|
|
176
185
|
)
|
|
177
186
|
|
|
178
187
|
@staticmethod
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from typing import Iterable
|
|
2
|
+
|
|
3
|
+
from prometheus_client import Metric
|
|
4
|
+
from prometheus_client.metrics_core import GaugeMetricFamily, StateSetMetricFamily
|
|
5
|
+
from prometheus_client.registry import Collector
|
|
6
|
+
|
|
7
|
+
from orchestrator.schemas.engine_settings import GlobalStatusEnum
|
|
8
|
+
from orchestrator.services import settings
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _get_engine_status() -> tuple[GlobalStatusEnum, int]:
|
|
12
|
+
"""Query for getting the current status of the workflow engine.
|
|
13
|
+
|
|
14
|
+
This includes the engine status, and the amount of currently running processes.
|
|
15
|
+
"""
|
|
16
|
+
engine_settings = settings.get_engine_settings()
|
|
17
|
+
engine_status = settings.generate_engine_global_status(engine_settings)
|
|
18
|
+
|
|
19
|
+
return engine_status, int(engine_settings.running_processes)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class WorkflowEngineCollector(Collector):
|
|
23
|
+
"""Initialize a Prometheus enum and a gauge.
|
|
24
|
+
|
|
25
|
+
The enum of the current workflow engine status takes three values:
|
|
26
|
+
- RUNNING
|
|
27
|
+
- PAUSING
|
|
28
|
+
- PAUSED
|
|
29
|
+
|
|
30
|
+
This metric also exports the amount of currently running processes.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def collect(self) -> Iterable[Metric]:
|
|
34
|
+
current_engine_status, running_process_count = _get_engine_status()
|
|
35
|
+
|
|
36
|
+
engine_status = StateSetMetricFamily(
|
|
37
|
+
"wfo_engine_status",
|
|
38
|
+
documentation="Current workflow engine status.",
|
|
39
|
+
value={status: status == current_engine_status for status in GlobalStatusEnum.values()},
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
engine_process_count = GaugeMetricFamily(
|
|
43
|
+
"wfo_active_process_count",
|
|
44
|
+
unit="count",
|
|
45
|
+
value=running_process_count,
|
|
46
|
+
documentation="Number of currently running processes in the workflow engine.",
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
return [engine_status, engine_process_count]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from prometheus_client import CollectorRegistry
|
|
2
|
+
|
|
3
|
+
from orchestrator.metrics.engine import WorkflowEngineCollector
|
|
4
|
+
from orchestrator.metrics.processes import ProcessCollector
|
|
5
|
+
from orchestrator.metrics.subscriptions import SubscriptionCollector
|
|
6
|
+
|
|
7
|
+
ORCHESTRATOR_METRICS_REGISTRY = CollectorRegistry(auto_describe=True)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def initialize_default_metrics() -> None:
|
|
11
|
+
"""Register default Prometheus collectors."""
|
|
12
|
+
ORCHESTRATOR_METRICS_REGISTRY.register(SubscriptionCollector())
|
|
13
|
+
ORCHESTRATOR_METRICS_REGISTRY.register(ProcessCollector())
|
|
14
|
+
ORCHESTRATOR_METRICS_REGISTRY.register(WorkflowEngineCollector())
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
from typing import Iterable
|
|
2
|
+
|
|
3
|
+
from prometheus_client.metrics_core import GaugeMetricFamily, Metric
|
|
4
|
+
from prometheus_client.registry import Collector
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
from sqlalchemy import desc, func
|
|
7
|
+
|
|
8
|
+
from orchestrator.db import ProcessTable, ProductTable, SubscriptionTable, WorkflowTable, db
|
|
9
|
+
from orchestrator.db.models import ProcessSubscriptionTable
|
|
10
|
+
from orchestrator.targets import Target
|
|
11
|
+
from orchestrator.workflow import ProcessStatus
|
|
12
|
+
from pydantic_forms.types import UUIDstr
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ProcessTableQueryResult(BaseModel):
|
|
16
|
+
workflow_name: str
|
|
17
|
+
customer_id: UUIDstr
|
|
18
|
+
workflow_target: Target
|
|
19
|
+
last_status: ProcessStatus
|
|
20
|
+
created_by: str
|
|
21
|
+
is_task: bool
|
|
22
|
+
product_name: str
|
|
23
|
+
total_runtime: float
|
|
24
|
+
process_count: int
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _get_processes() -> list[ProcessTableQueryResult]:
|
|
28
|
+
"""Query for getting all processes.
|
|
29
|
+
|
|
30
|
+
Equivalent to the following SQL statement:
|
|
31
|
+
```sql
|
|
32
|
+
SELECT
|
|
33
|
+
workflows."name" AS workflow_name
|
|
34
|
+
, subscriptions.customer_id
|
|
35
|
+
, workflows.target AS workflow_target
|
|
36
|
+
, processes.last_status
|
|
37
|
+
, processes.created_by
|
|
38
|
+
, processes.is_task
|
|
39
|
+
, products."name" AS product_name
|
|
40
|
+
, Coalesce(Sum(Extract(EPOCH FROM processes.last_modified_at - processes.started_at)), 0) AS total_runtime
|
|
41
|
+
, Count(workflows."name") AS process_count
|
|
42
|
+
FROM
|
|
43
|
+
processes
|
|
44
|
+
JOIN workflows
|
|
45
|
+
ON processes.workflow_id = workflows.workflow_id
|
|
46
|
+
JOIN processes_subscriptions
|
|
47
|
+
ON processes.pid = processes_subscriptions.pid
|
|
48
|
+
JOIN subscriptions
|
|
49
|
+
ON processes_subscriptions.subscription_id = subscriptions.subscription_id
|
|
50
|
+
JOIN products
|
|
51
|
+
ON subscriptions.product_id = products.product_id
|
|
52
|
+
GROUP BY
|
|
53
|
+
workflows."name"
|
|
54
|
+
, subscriptions.customer_id
|
|
55
|
+
, workflows.target
|
|
56
|
+
, processes.last_status
|
|
57
|
+
, processes.created_by
|
|
58
|
+
, processes.is_task
|
|
59
|
+
, products."name"
|
|
60
|
+
;
|
|
61
|
+
```
|
|
62
|
+
"""
|
|
63
|
+
process_count = func.count(WorkflowTable.name).label("process_count")
|
|
64
|
+
total_process_time = func.coalesce(
|
|
65
|
+
func.sum(func.extract("epoch", (ProcessTable.last_modified_at - ProcessTable.started_at))), 0
|
|
66
|
+
).label("total_runtime")
|
|
67
|
+
return (
|
|
68
|
+
db.session.query(
|
|
69
|
+
ProcessTable.last_status,
|
|
70
|
+
ProcessTable.created_by,
|
|
71
|
+
ProcessTable.is_task,
|
|
72
|
+
ProductTable.name.label("product_name"),
|
|
73
|
+
WorkflowTable.name.label("workflow_name"),
|
|
74
|
+
SubscriptionTable.customer_id,
|
|
75
|
+
WorkflowTable.target.label("workflow_target"),
|
|
76
|
+
process_count,
|
|
77
|
+
total_process_time,
|
|
78
|
+
)
|
|
79
|
+
.join(WorkflowTable, WorkflowTable.workflow_id == ProcessTable.workflow_id)
|
|
80
|
+
.join(ProcessSubscriptionTable, ProcessSubscriptionTable.process_id == ProcessTable.process_id)
|
|
81
|
+
.join(SubscriptionTable, SubscriptionTable.subscription_id == ProcessSubscriptionTable.subscription_id)
|
|
82
|
+
.join(ProductTable, ProductTable.product_id == SubscriptionTable.product_id)
|
|
83
|
+
.group_by(
|
|
84
|
+
ProcessTable.last_status,
|
|
85
|
+
ProcessTable.created_by,
|
|
86
|
+
ProcessTable.is_task,
|
|
87
|
+
ProductTable.name,
|
|
88
|
+
WorkflowTable.name,
|
|
89
|
+
SubscriptionTable.customer_id,
|
|
90
|
+
WorkflowTable.target,
|
|
91
|
+
)
|
|
92
|
+
.order_by(desc(process_count))
|
|
93
|
+
).all()
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class ProcessCollector(Collector):
|
|
97
|
+
"""Collector that contains two Prometheus gauges with process counts and total runtime.
|
|
98
|
+
|
|
99
|
+
These gauges contain the amount of processes, and the total runtime in seconds, per every combination of the labels
|
|
100
|
+
that are defined:
|
|
101
|
+
- Process last status
|
|
102
|
+
- Process created by
|
|
103
|
+
- Process is task
|
|
104
|
+
- Product name
|
|
105
|
+
- Workflow name
|
|
106
|
+
- Customer ID
|
|
107
|
+
- Workflow target
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
def collect(self) -> Iterable[Metric]:
|
|
111
|
+
label_names = [
|
|
112
|
+
"last_status",
|
|
113
|
+
"created_by",
|
|
114
|
+
"is_task",
|
|
115
|
+
"product_name",
|
|
116
|
+
"workflow_name",
|
|
117
|
+
"customer_id",
|
|
118
|
+
"workflow_target",
|
|
119
|
+
]
|
|
120
|
+
process_counts = GaugeMetricFamily(
|
|
121
|
+
"wfo_process_count",
|
|
122
|
+
labels=label_names,
|
|
123
|
+
unit="count",
|
|
124
|
+
documentation="Number of processes per status, creator, task, product, workflow, customer, and target.",
|
|
125
|
+
)
|
|
126
|
+
process_seconds_total = GaugeMetricFamily(
|
|
127
|
+
"wfo_process_seconds_total",
|
|
128
|
+
labels=label_names,
|
|
129
|
+
unit="count",
|
|
130
|
+
documentation="Total time spent on processes in seconds.",
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
for row in _get_processes():
|
|
134
|
+
label_values = [
|
|
135
|
+
row.last_status,
|
|
136
|
+
str(row.created_by),
|
|
137
|
+
str(row.is_task),
|
|
138
|
+
row.product_name,
|
|
139
|
+
row.workflow_name,
|
|
140
|
+
row.customer_id,
|
|
141
|
+
row.workflow_target,
|
|
142
|
+
]
|
|
143
|
+
|
|
144
|
+
process_counts.add_metric(label_values, row.process_count)
|
|
145
|
+
process_seconds_total.add_metric(label_values, row.total_runtime)
|
|
146
|
+
|
|
147
|
+
return [process_counts, process_seconds_total]
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from typing import Iterable
|
|
2
|
+
|
|
3
|
+
from prometheus_client import Metric
|
|
4
|
+
from prometheus_client.metrics_core import GaugeMetricFamily
|
|
5
|
+
from prometheus_client.registry import Collector
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
from sqlalchemy import desc, func
|
|
8
|
+
|
|
9
|
+
from orchestrator.db import ProductTable, SubscriptionTable, db
|
|
10
|
+
from orchestrator.types import SubscriptionLifecycle
|
|
11
|
+
from pydantic_forms.types import UUIDstr
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SubscriptionTableQueryResult(BaseModel):
|
|
15
|
+
lifecycle_state: SubscriptionLifecycle
|
|
16
|
+
customer_id: UUIDstr
|
|
17
|
+
insync: bool
|
|
18
|
+
product_name: str
|
|
19
|
+
subscription_count: int
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _get_subscriptions() -> list[SubscriptionTableQueryResult]:
|
|
23
|
+
"""Query for getting all subscriptions.
|
|
24
|
+
|
|
25
|
+
Equivalent to the following SQL statement:
|
|
26
|
+
```sql
|
|
27
|
+
SELECT
|
|
28
|
+
subscriptions.status AS lifecycle_state
|
|
29
|
+
, subscriptions.customer_id
|
|
30
|
+
, subscriptions.insync
|
|
31
|
+
, products."name" AS product_name
|
|
32
|
+
, Count(subscriptions.subscription_id) AS subscription_count
|
|
33
|
+
FROM
|
|
34
|
+
subscriptions
|
|
35
|
+
JOIN products
|
|
36
|
+
ON subscriptions.product_id = products.product_id
|
|
37
|
+
GROUP BY subscriptions.status
|
|
38
|
+
, subscriptions.customer_id
|
|
39
|
+
, insync
|
|
40
|
+
, products."name"
|
|
41
|
+
;
|
|
42
|
+
```
|
|
43
|
+
"""
|
|
44
|
+
subscription_count = func.count(SubscriptionTable.subscription_id).label("subscription_count")
|
|
45
|
+
return (
|
|
46
|
+
db.session.query(
|
|
47
|
+
SubscriptionTable.status.label("lifecycle_state"),
|
|
48
|
+
SubscriptionTable.customer_id,
|
|
49
|
+
SubscriptionTable.insync,
|
|
50
|
+
ProductTable.name.label("product_name"),
|
|
51
|
+
subscription_count,
|
|
52
|
+
)
|
|
53
|
+
.outerjoin(ProductTable, ProductTable.product_id == SubscriptionTable.product_id)
|
|
54
|
+
.group_by(
|
|
55
|
+
SubscriptionTable.status,
|
|
56
|
+
SubscriptionTable.customer_id,
|
|
57
|
+
SubscriptionTable.insync,
|
|
58
|
+
ProductTable.name,
|
|
59
|
+
)
|
|
60
|
+
.order_by(desc(subscription_count))
|
|
61
|
+
).all()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class SubscriptionCollector(Collector):
|
|
65
|
+
"""Collector for Subscriptions stored in the subscription database.
|
|
66
|
+
|
|
67
|
+
This collector contains one gauge that contains the amount of subscriptions, per every combination of the labels
|
|
68
|
+
that are defined:
|
|
69
|
+
- Product name
|
|
70
|
+
- Subscription lifecycle
|
|
71
|
+
- Customer ID
|
|
72
|
+
- `insync` state
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
def collect(self) -> Iterable[Metric]:
|
|
76
|
+
subscriptions = GaugeMetricFamily(
|
|
77
|
+
name="wfo_subscriptions_count",
|
|
78
|
+
labels=[
|
|
79
|
+
"product_name",
|
|
80
|
+
"lifecycle_state",
|
|
81
|
+
"customer_id",
|
|
82
|
+
"insync",
|
|
83
|
+
],
|
|
84
|
+
unit="count",
|
|
85
|
+
documentation="Number of subscriptions per product, lifecycle state, customer, and in sync state.",
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
for row in _get_subscriptions():
|
|
89
|
+
subscriptions.add_metric(
|
|
90
|
+
[row.product_name, row.lifecycle_state, row.customer_id, str(row.insync)], row.subscription_count
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
return [subscriptions]
|
|
@@ -19,7 +19,7 @@ from sqlalchemy import select, text
|
|
|
19
19
|
from sqlalchemy.exc import SQLAlchemyError
|
|
20
20
|
|
|
21
21
|
from orchestrator.db import EngineSettingsTable, db
|
|
22
|
-
from orchestrator.schemas.engine_settings import EngineSettingsSchema
|
|
22
|
+
from orchestrator.schemas.engine_settings import EngineSettingsSchema, GlobalStatusEnum
|
|
23
23
|
from orchestrator.settings import app_settings
|
|
24
24
|
|
|
25
25
|
logger = structlog.get_logger(__name__)
|
|
@@ -35,6 +35,15 @@ def get_engine_settings_for_update() -> EngineSettingsTable:
|
|
|
35
35
|
return db.session.execute(select(EngineSettingsTable).with_for_update()).scalar_one()
|
|
36
36
|
|
|
37
37
|
|
|
38
|
+
def generate_engine_global_status(engine_settings: EngineSettingsTable) -> GlobalStatusEnum:
|
|
39
|
+
"""Returns the global status of the engine."""
|
|
40
|
+
if engine_settings.global_lock and engine_settings.running_processes > 0:
|
|
41
|
+
return GlobalStatusEnum.PAUSING
|
|
42
|
+
if engine_settings.global_lock and engine_settings.running_processes == 0:
|
|
43
|
+
return GlobalStatusEnum.PAUSED
|
|
44
|
+
return GlobalStatusEnum.RUNNING
|
|
45
|
+
|
|
46
|
+
|
|
38
47
|
def post_update_to_slack(engine_status: EngineSettingsSchema, user: str) -> None:
|
|
39
48
|
"""Post engine settings update to slack.
|
|
40
49
|
|
|
@@ -84,6 +84,7 @@ class AppSettings(BaseSettings):
|
|
|
84
84
|
ENABLE_GRAPHQL_DEPRECATION_CHECKER: bool = True
|
|
85
85
|
ENABLE_GRAPHQL_PROFILING_EXTENSION: bool = False
|
|
86
86
|
ENABLE_GRAPHQL_STATS_EXTENSION: bool = False
|
|
87
|
+
ENABLE_PROMETHEUS_METRICS_ENDPOINT: bool = False
|
|
87
88
|
VALIDATE_OUT_OF_SYNC_SUBSCRIPTIONS: bool = False
|
|
88
89
|
FILTER_BY_MODE: Literal["partial", "exact"] = "exact"
|
|
89
90
|
|
|
@@ -274,6 +274,7 @@ def fastapi_app(database, db_uri):
|
|
|
274
274
|
oauth2lib_settings.OAUTH2_ACTIVE = False
|
|
275
275
|
oauth2lib_settings.ENVIRONMENT_IGNORE_MUTATION_DISABLED = ["local", "TESTING"]
|
|
276
276
|
app_settings.DATABASE_URI = db_uri
|
|
277
|
+
app_settings.ENABLE_PROMETHEUS_METRICS_ENDPOINT = True
|
|
277
278
|
app = OrchestratorCore(base_settings=app_settings)
|
|
278
279
|
# Start ProcessDataBroadcastThread to test websocket_manager with memory backend
|
|
279
280
|
app.broadcast_thread.start()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
EMPTY_METRICS = """# HELP wfo_subscriptions_count Number of subscriptions per product, lifecycle state, customer, and in sync state.
|
|
6
|
+
# TYPE wfo_subscriptions_count gauge
|
|
7
|
+
# HELP wfo_process_count Number of processes per status, creator, task, product, workflow, customer, and target.
|
|
8
|
+
# TYPE wfo_process_count gauge
|
|
9
|
+
# HELP wfo_process_seconds_total_count Total time spent on processes in seconds.
|
|
10
|
+
# TYPE wfo_process_seconds_total_count gauge
|
|
11
|
+
# HELP wfo_engine_status Current workflow engine status.
|
|
12
|
+
# TYPE wfo_engine_status gauge
|
|
13
|
+
wfo_engine_status{wfo_engine_status="PAUSED"} 0.0
|
|
14
|
+
wfo_engine_status{wfo_engine_status="PAUSING"} 0.0
|
|
15
|
+
wfo_engine_status{wfo_engine_status="RUNNING"} 1.0
|
|
16
|
+
# HELP wfo_active_process_count Number of currently running processes in the workflow engine.
|
|
17
|
+
# TYPE wfo_active_process_count gauge
|
|
18
|
+
wfo_active_process_count 0.0
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@pytest.fixture(autouse=True, scope="function")
|
|
23
|
+
def assume_empty_metrics_at_start(test_client) -> None:
|
|
24
|
+
"""Assert that at the start of every unit test in this module, the metrics endpoint only contains empty data."""
|
|
25
|
+
response = test_client.get("/api/metrics")
|
|
26
|
+
assert HTTPStatus.OK == response.status_code
|
|
27
|
+
assert response.text == EMPTY_METRICS
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from test.unit_tests.metrics.conftest import EMPTY_METRICS
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def test_engine_metrics_success(test_client) -> None:
|
|
5
|
+
test_client.put("/api/settings/status", json={"global_lock": True})
|
|
6
|
+
response = test_client.get("api/metrics")
|
|
7
|
+
expected_metric_lines = [
|
|
8
|
+
"# HELP wfo_engine_status Current workflow engine status.",
|
|
9
|
+
"# TYPE wfo_engine_status gauge",
|
|
10
|
+
'wfo_engine_status{wfo_engine_status="PAUSED"} 1.0',
|
|
11
|
+
'wfo_engine_status{wfo_engine_status="PAUSING"} 0.0',
|
|
12
|
+
'wfo_engine_status{wfo_engine_status="RUNNING"} 0.0',
|
|
13
|
+
]
|
|
14
|
+
assert all(line in response.text for line in expected_metric_lines)
|
|
15
|
+
|
|
16
|
+
test_client.put("/api/settings/status", json={"global_lock": False})
|
|
17
|
+
response = test_client.get("/api/metrics")
|
|
18
|
+
assert response.text == EMPTY_METRICS
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from test.unit_tests.conftest import CUSTOMER_ID
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def test_process_metrics_success(test_client, mocked_processes) -> None:
|
|
5
|
+
response = test_client.get("api/metrics")
|
|
6
|
+
expected_metric_lines = [
|
|
7
|
+
"# HELP wfo_process_count Number of processes per status, creator, task, product, workflow, customer, and target.",
|
|
8
|
+
"# TYPE wfo_process_count gauge",
|
|
9
|
+
f'wfo_process_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="failed",product_name="Product 2",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 1.0',
|
|
10
|
+
f'wfo_process_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="resumed",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 1.0',
|
|
11
|
+
f'wfo_process_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="completed",product_name="Product 2",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 1.0',
|
|
12
|
+
f'wfo_process_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="suspended",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 1.0',
|
|
13
|
+
f'wfo_process_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="completed",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 1.0',
|
|
14
|
+
f'wfo_process_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="True",last_status="suspended",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 1.0',
|
|
15
|
+
f'wfo_process_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="True",last_status="completed",product_name="Product 2",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 1.0',
|
|
16
|
+
"# HELP wfo_process_seconds_total_count Total time spent on processes in seconds.",
|
|
17
|
+
"# TYPE wfo_process_seconds_total_count gauge",
|
|
18
|
+
f'wfo_process_seconds_total_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="failed",product_name="Product 2",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 600.0',
|
|
19
|
+
f'wfo_process_seconds_total_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="resumed",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 600.0',
|
|
20
|
+
f'wfo_process_seconds_total_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="completed",product_name="Product 2",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 600.0',
|
|
21
|
+
f'wfo_process_seconds_total_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="suspended",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 600.0',
|
|
22
|
+
f'wfo_process_seconds_total_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="False",last_status="completed",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 600.0',
|
|
23
|
+
f'wfo_process_seconds_total_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="True",last_status="suspended",product_name="Product 1",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 600.0',
|
|
24
|
+
f'wfo_process_seconds_total_count{{created_by="None",customer_id="{CUSTOMER_ID}",is_task="True",last_status="completed",product_name="Product 2",workflow_name="workflow_for_testing_processes_py",workflow_target="SYSTEM"}} 600.0',
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
assert all(line in response.text for line in expected_metric_lines)
|