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.
Files changed (672) hide show
  1. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.bumpversion.cfg +1 -1
  2. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/NOTICE +2 -1
  3. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/PKG-INFO +2 -1
  4. orchestrator_core-4.0.0rc4/docs/reference-docs/metrics.md +45 -0
  5. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/__init__.py +1 -1
  6. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/settings.py +3 -13
  7. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/app.py +10 -1
  8. orchestrator_core-4.0.0rc4/orchestrator/metrics/__init__.py +3 -0
  9. orchestrator_core-4.0.0rc4/orchestrator/metrics/engine.py +49 -0
  10. orchestrator_core-4.0.0rc4/orchestrator/metrics/init.py +14 -0
  11. orchestrator_core-4.0.0rc4/orchestrator/metrics/processes.py +147 -0
  12. orchestrator_core-4.0.0rc4/orchestrator/metrics/subscriptions.py +93 -0
  13. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/settings.py +10 -1
  14. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/settings.py +1 -0
  15. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/pyproject.toml +1 -0
  16. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/conftest.py +1 -0
  17. orchestrator_core-4.0.0rc4/test/unit_tests/metrics/conftest.py +27 -0
  18. orchestrator_core-4.0.0rc4/test/unit_tests/metrics/test_engine_metrics.py +18 -0
  19. orchestrator_core-4.0.0rc4/test/unit_tests/metrics/test_process_metrics.py +27 -0
  20. orchestrator_core-4.0.0rc4/test/unit_tests/metrics/test_subscription_metrics.py +60 -0
  21. orchestrator_core-4.0.0rc4/test/unit_tests/workflows/tasks/__init__.py +0 -0
  22. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.coveragerc +0 -0
  23. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  24. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  25. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/dependabot.yml +0 -0
  26. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/README.md +0 -0
  27. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/build-push-container.yml +0 -0
  28. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/changelog.yml +0 -0
  29. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/codeql-analysis.yml +0 -0
  30. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/gh-pages.yml +0 -0
  31. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/issues.yml +0 -0
  32. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/publish-package.yml +0 -0
  33. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/run-codspeed-tests.yml +0 -0
  34. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/run-linting-tests.yml +0 -0
  35. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/run-unit-tests.yml +0 -0
  36. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.github/workflows/scheduled-build.yml +0 -0
  37. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.gitignore +0 -0
  38. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.pre-commit-config.yaml +0 -0
  39. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/.stignore +0 -0
  40. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/CHANGELOG.md +0 -0
  41. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/Dockerfile +0 -0
  42. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/LICENSE +0 -0
  43. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/README.md +0 -0
  44. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/codecov.yml +0 -0
  45. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/domainmodels.md +0 -0
  46. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/forms-frontend.md +0 -0
  47. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/tasks.md +0 -0
  48. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/application/workflow.md +0 -0
  49. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/framework.md +0 -0
  50. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/img/base-orchestrator-setup.png +0 -0
  51. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/img/custom-orchestrator-setup.png +0 -0
  52. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/img/Custom-orchestrator-ui-using-override.png +0 -0
  53. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/img/Standard-orchestrator-ui.png +0 -0
  54. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/orchestrator-ui.md +0 -0
  55. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/orchestration/philosophy.md +0 -0
  56. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/backfilling.md +0 -0
  57. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/context.md +0 -0
  58. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/imports.md +0 -0
  59. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/introduction.md +0 -0
  60. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/ip_static.md +0 -0
  61. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/ip_static.png +0 -0
  62. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_point_to_point.md +0 -0
  63. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_point_to_point.png +0 -0
  64. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_vpn.md +0 -0
  65. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/l2_vpn.png +0 -0
  66. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/modelling.md +0 -0
  67. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/node.md +0 -0
  68. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/node.png +0 -0
  69. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/port.md +0 -0
  70. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/port.png +0 -0
  71. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/product_block_graph.md +0 -0
  72. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/product_block_graph.png +0 -0
  73. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/standards.md +0 -0
  74. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/product_modelling/terminology.md +0 -0
  75. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/architecture/tldr.md +0 -0
  76. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/contributing/development.md +0 -0
  77. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/contributing/guidelines.md +0 -0
  78. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/contributing/testing.md +0 -0
  79. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/css/custom.css +0 -0
  80. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/css/style.css +0 -0
  81. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/css/termynal.css +0 -0
  82. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/base.md +0 -0
  83. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/docker.md +0 -0
  84. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/orchestration-ui.md +0 -0
  85. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/prepare-source-folder.md +0 -0
  86. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/getting-started/versions.md +0 -0
  87. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/img/WFO-Emblem-White.png +0 -0
  88. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/img/favicon.ico +0 -0
  89. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/index.md +0 -0
  90. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/js/custom.js +0 -0
  91. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/js/termynal.js +0 -0
  92. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/migration-guide/2.0.md +0 -0
  93. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/migration-guide/3.0.md +0 -0
  94. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/migration-guide/4.0.md +0 -0
  95. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/api.md +0 -0
  96. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/app/app.md +0 -0
  97. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/app/scaling.md +0 -0
  98. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/auth-backend-and-frontend.md +0 -0
  99. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/cli.md +0 -0
  100. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/database.md +0 -0
  101. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/generator.md +0 -0
  102. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/instantiating.md +0 -0
  103. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/model_attributes.md +0 -0
  104. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/overview.md +0 -0
  105. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/product_blocks.md +0 -0
  106. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/product_types.md +0 -0
  107. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/properties.md +0 -0
  108. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/pydantic_hooks.md +0 -0
  109. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/type_casting.md +0 -0
  110. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/union_types.md +0 -0
  111. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/domain_models/validation.md +0 -0
  112. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/forms.md +0 -0
  113. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/graphql.md +0 -0
  114. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/python.md +0 -0
  115. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/search.md +0 -0
  116. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/search_overview.png +0 -0
  117. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/serialization.md +0 -0
  118. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/tasks.md +0 -0
  119. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/tests.md +0 -0
  120. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/tldr.md +0 -0
  121. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/websockets.md +0 -0
  122. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/workflows/callbacks.md +0 -0
  123. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/workflows/workflow-lifecycles.md +0 -0
  124. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/reference-docs/workflows/workflow-steps.md +0 -0
  125. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/bootstrap.md +0 -0
  126. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/create-your-own.md +0 -0
  127. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/docker-installation.md +0 -0
  128. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/domain-models.md +0 -0
  129. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/execute-workflows.md +0 -0
  130. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/generator.md +0 -0
  131. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/l2_point_to_point.png +0 -0
  132. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-create.md +0 -0
  133. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-modify.md +0 -0
  134. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-terminate.md +0 -0
  135. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/node-validate.md +0 -0
  136. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/overview.md +0 -0
  137. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/scenario.md +0 -0
  138. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/workflow-basics.md +0 -0
  139. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/advanced/workflow-introduction.md +0 -0
  140. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/create-user-group.md +0 -0
  141. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/create-user.md +0 -0
  142. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/database-migration.md +0 -0
  143. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/debian.md +0 -0
  144. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/docker.md +0 -0
  145. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/domain-models.md +0 -0
  146. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/explore.md +0 -0
  147. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/input-forms.md +0 -0
  148. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/macos.md +0 -0
  149. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/modify-user-group.md +0 -0
  150. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/modify-user.md +0 -0
  151. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/register-workflows.md +0 -0
  152. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/start-applications.md +0 -0
  153. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/terminate-user-group.md +0 -0
  154. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/terminate-user.md +0 -0
  155. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/workflow-introduction.md +0 -0
  156. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/beginner/workshop-overview.md +0 -0
  157. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/Software-topology.drawio.png +0 -0
  158. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/clab_topology.png +0 -0
  159. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/metadata_products.png +0 -0
  160. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/netbox_devices_active.png +0 -0
  161. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/subscriptions.png +0 -0
  162. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/docs/workshops/images/topology.drawio.png +0 -0
  163. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/includes/abbreviations.md +0 -0
  164. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/mkdocs.yml +0 -0
  165. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/nitpick-style.toml +0 -0
  166. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/__init__.py +0 -0
  167. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/__init__.py +0 -0
  168. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/api.py +0 -0
  169. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/__init__.py +0 -0
  170. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/health.py +0 -0
  171. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/processes.py +0 -0
  172. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/product_blocks.py +0 -0
  173. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/products.py +0 -0
  174. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/resource_types.py +0 -0
  175. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py +0 -0
  176. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/subscriptions.py +0 -0
  177. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/translations.py +0 -0
  178. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/user.py +0 -0
  179. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/workflows.py +0 -0
  180. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/api_v1/endpoints/ws.py +0 -0
  181. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/error_handling.py +0 -0
  182. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/helpers.py +0 -0
  183. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/api/models.py +0 -0
  184. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/__init__.py +0 -0
  185. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/database.py +0 -0
  186. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/__init__.py +0 -0
  187. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py +0 -0
  188. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/helpers.py +0 -0
  189. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/product_block_helpers.py +0 -0
  190. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/product_helpers.py +0 -0
  191. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/resource_type_helpers.py +0 -0
  192. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/domain_gen_helpers/types.py +0 -0
  193. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generate.py +0 -0
  194. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/__init__.py +0 -0
  195. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/README +0 -0
  196. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_create_imports.j2 +0 -0
  197. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_create_input_fields.j2 +0 -0
  198. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_create_steps.j2 +0 -0
  199. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_modify_imports.j2 +0 -0
  200. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_modify_input_fields.j2 +0 -0
  201. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_modify_steps.j2 +0 -0
  202. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_terminate_imports.j2 +0 -0
  203. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_terminate_input_fields.j2 +0 -0
  204. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/custom_templates/additional_terminate_steps.j2 +0 -0
  205. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/__init__.py +0 -0
  206. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/enums.py +0 -0
  207. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/helpers.py +0 -0
  208. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/migration.py +0 -0
  209. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/product.py +0 -0
  210. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/product_block.py +0 -0
  211. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/settings.py +0 -0
  212. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/translations.py +0 -0
  213. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/unittest.py +0 -0
  214. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/validations.py +0 -0
  215. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/generator/workflow.py +0 -0
  216. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/circuit.yaml +0 -0
  217. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/node.yaml +0 -0
  218. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/user.yaml +0 -0
  219. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/products/workshop/user_group.yaml +0 -0
  220. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_create_imports.j2 +0 -0
  221. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_create_steps.j2 +0 -0
  222. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_modify_imports.j2 +0 -0
  223. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_modify_steps.j2 +0 -0
  224. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/additional_terminate_steps.j2 +0 -0
  225. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/constrained_int_definitions.j2 +0 -0
  226. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/create_data_head.j2 +0 -0
  227. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/create_product.j2 +0 -0
  228. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/enums.j2 +0 -0
  229. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/lazy_workflow_instance.j2 +0 -0
  230. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/list_definitions.j2 +0 -0
  231. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/macros.j2 +0 -0
  232. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/modify_product.j2 +0 -0
  233. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/new_product_migration.j2 +0 -0
  234. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/product.j2 +0 -0
  235. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/product_block.j2 +0 -0
  236. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/shared_forms.j2 +0 -0
  237. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/shared_workflows.j2 +0 -0
  238. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/subscription_model_registry.j2 +0 -0
  239. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/terminate_product.j2 +0 -0
  240. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -0
  241. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_modify_workflow.j2 +0 -0
  242. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_product_type.j2 +0 -0
  243. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_terminate_workflow.j2 +0 -0
  244. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/test_validate_workflow.j2 +0 -0
  245. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/generator/templates/validate_product.j2 +0 -0
  246. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/helpers/__init__.py +0 -0
  247. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/helpers/input_helpers.py +0 -0
  248. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/helpers/print_helpers.py +0 -0
  249. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/main.py +0 -0
  250. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migrate_domain_models.py +0 -0
  251. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migrate_tasks.py +0 -0
  252. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migrate_workflows.py +0 -0
  253. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/migration_helpers.py +0 -0
  254. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/cli/scheduler.py +0 -0
  255. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/config/__init__.py +0 -0
  256. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/config/assignee.py +0 -0
  257. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/__init__.py +0 -0
  258. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/database.py +0 -0
  259. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/__init__.py +0 -0
  260. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/filters.py +0 -0
  261. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/process.py +0 -0
  262. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/product.py +0 -0
  263. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/product_block.py +0 -0
  264. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/resource_type.py +0 -0
  265. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/search_filters/__init__.py +0 -0
  266. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/search_filters/inferred_filter.py +0 -0
  267. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/subscription.py +0 -0
  268. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/filters/workflow.py +0 -0
  269. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/helpers.py +0 -0
  270. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/listeners.py +0 -0
  271. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/loaders.py +0 -0
  272. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/models.py +0 -0
  273. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/queries/__init__.py +0 -0
  274. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/queries/subscription.py +0 -0
  275. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/queries/subscription_instance.py +0 -0
  276. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/range/__init__.py +0 -0
  277. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/range/range.py +0 -0
  278. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/__init__.py +0 -0
  279. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/process.py +0 -0
  280. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/product.py +0 -0
  281. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/product_block.py +0 -0
  282. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/resource_type.py +0 -0
  283. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/sorting.py +0 -0
  284. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/subscription.py +0 -0
  285. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/db/sorting/workflow.py +0 -0
  286. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/__init__.py +0 -0
  287. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/populator.py +0 -0
  288. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/__init__.py +0 -0
  289. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/migrate_20.py +0 -0
  290. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/migrate_30.py +0 -0
  291. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/devtools/scripts/shared.py +0 -0
  292. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/__init__.py +0 -0
  293. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/distlock_manager.py +0 -0
  294. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/managers/__init__.py +0 -0
  295. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/managers/memory_distlock_manager.py +0 -0
  296. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/distlock/managers/redis_distlock_manager.py +0 -0
  297. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/__init__.py +0 -0
  298. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/base.py +0 -0
  299. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/context_cache.py +0 -0
  300. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/customer_description.py +0 -0
  301. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/helpers.py +0 -0
  302. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/lifecycle.py +0 -0
  303. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/domain/subscription_instance_transform.py +0 -0
  304. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/exception_handlers.py +0 -0
  305. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/__init__.py +0 -0
  306. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/__init__.py +0 -0
  307. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/customer_contact_list.py +0 -0
  308. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/customer_id.py +0 -0
  309. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/display_subscription.py +0 -0
  310. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/network_type_validators.py +0 -0
  311. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/forms/validators/product_id.py +0 -0
  312. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/__init__.py +0 -0
  313. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/autoregistration.py +0 -0
  314. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/extensions/__init__.py +0 -0
  315. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/extensions/model_cache.py +0 -0
  316. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/extensions/stats.py +0 -0
  317. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/loaders/__init__.py +0 -0
  318. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/loaders/subscriptions.py +0 -0
  319. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/mutations/customer_description.py +0 -0
  320. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/mutations/start_process.py +0 -0
  321. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/pagination.py +0 -0
  322. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/__init__.py +0 -0
  323. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/customer.py +0 -0
  324. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/helpers.py +0 -0
  325. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/process.py +0 -0
  326. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/product.py +0 -0
  327. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/product_block.py +0 -0
  328. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/resource_type.py +0 -0
  329. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/settings.py +0 -0
  330. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/subscription.py +0 -0
  331. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/version.py +0 -0
  332. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/resolvers/workflow.py +0 -0
  333. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schema.py +0 -0
  334. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/__init__.py +0 -0
  335. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/customer.py +0 -0
  336. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/customer_description.py +0 -0
  337. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/errors.py +0 -0
  338. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/fixed_input.py +0 -0
  339. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/helpers.py +0 -0
  340. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/process.py +0 -0
  341. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/product.py +0 -0
  342. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/product_block.py +0 -0
  343. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/resource_type.py +0 -0
  344. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/settings.py +0 -0
  345. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/strawberry_pydantic_patch.py +0 -0
  346. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/subscription.py +0 -0
  347. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/version.py +0 -0
  348. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/schemas/workflow.py +0 -0
  349. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/types.py +0 -0
  350. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/__init__.py +0 -0
  351. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/create_resolver_error_handler.py +0 -0
  352. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_query_loaders.py +0 -0
  353. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_selected_fields.py +0 -0
  354. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_selected_paths.py +0 -0
  355. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/get_subscription_product_blocks.py +0 -0
  356. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/is_query_detailed.py +0 -0
  357. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/override_class.py +0 -0
  358. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/graphql/utils/to_graphql_result_page.py +0 -0
  359. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/log_config.py +0 -0
  360. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/README +0 -0
  361. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/alembic.ini +0 -0
  362. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/env.py +0 -0
  363. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/helpers.py +0 -0
  364. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/script.py.mako +0 -0
  365. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/templates/alembic.ini.j2 +0 -0
  366. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/templates/env.py.j2 +0 -0
  367. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/templates/helpers.py.j2 +0 -0
  368. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2020-10-19_3323bcb934e7_fix_tsv_triggers.py +0 -0
  369. {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
  370. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2020-10-19_c112305b07d3_initial_schema_migration.py +0 -0
  371. {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
  372. {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
  373. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/migrations/versions/schema/2021-11-17_19cdd3ab86f6_fix_parse_websearch.py +0 -0
  374. {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
  375. {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
  376. {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
  377. {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
  378. {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
  379. {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
  380. {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
  381. {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
  382. {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
  383. {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
  384. {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
  385. {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
  386. {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
  387. {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
  388. {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
  389. {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
  390. {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
  391. {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
  392. {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
  393. {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
  394. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/py.typed +0 -0
  395. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/__init__.py +0 -0
  396. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/resume_workflows.py +0 -0
  397. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/scheduling.py +0 -0
  398. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/task_vacuum.py +0 -0
  399. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/validate_products.py +0 -0
  400. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schedules/validate_subscriptions.py +0 -0
  401. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/__init__.py +0 -0
  402. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/base.py +0 -0
  403. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/engine_settings.py +0 -0
  404. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/fixed_input.py +0 -0
  405. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/problem_detail.py +0 -0
  406. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/process.py +0 -0
  407. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/product.py +0 -0
  408. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/product_block.py +0 -0
  409. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/resource_type.py +0 -0
  410. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/subscription.py +0 -0
  411. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/subscription_descriptions.py +0 -0
  412. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/schemas/workflow.py +0 -0
  413. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/security.py +0 -0
  414. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/__init__.py +0 -0
  415. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/celery.py +0 -0
  416. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/fixed_inputs.py +0 -0
  417. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/input_state.py +0 -0
  418. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/process_broadcast_thread.py +0 -0
  419. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/processes.py +0 -0
  420. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/products.py +0 -0
  421. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/resource_types.py +0 -0
  422. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/subscription_relations.py +0 -0
  423. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/subscriptions.py +0 -0
  424. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/tasks.py +0 -0
  425. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/translations.py +0 -0
  426. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/services/workflows.py +0 -0
  427. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/targets.py +0 -0
  428. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/types.py +0 -0
  429. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/__init__.py +0 -0
  430. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/crypt.py +0 -0
  431. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/datetime.py +0 -0
  432. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/deprecation_logger.py +0 -0
  433. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/docs.py +0 -0
  434. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/enrich_process.py +0 -0
  435. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/errors.py +0 -0
  436. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/fixed_inputs.py +0 -0
  437. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/functional.py +0 -0
  438. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/get_subscription_dict.py +0 -0
  439. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/get_updated_properties.py +0 -0
  440. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/helpers.py +0 -0
  441. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/json.py +0 -0
  442. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/redis.py +0 -0
  443. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/redis_client.py +0 -0
  444. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/search_query.py +0 -0
  445. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/state.py +0 -0
  446. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/strings.py +0 -0
  447. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/utils/validate_data_version.py +0 -0
  448. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/version.py +0 -0
  449. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/__init__.py +0 -0
  450. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/managers/broadcast_websocket_manager.py +0 -0
  451. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/managers/memory_websocket_manager.py +0 -0
  452. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/websocket/websocket_manager.py +0 -0
  453. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflow.py +0 -0
  454. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/__init__.py +0 -0
  455. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/modify_note.py +0 -0
  456. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/removed_workflow.py +0 -0
  457. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/steps.py +0 -0
  458. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/__init__.py +0 -0
  459. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/cleanup_tasks_log.py +0 -0
  460. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/resume_workflows.py +0 -0
  461. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/validate_product_type.py +0 -0
  462. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/tasks/validate_products.py +0 -0
  463. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/translations/en-GB.json +0 -0
  464. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/orchestrator/workflows/utils.py +0 -0
  465. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/setup.cfg +0 -0
  466. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/setup.py +0 -0
  467. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/__init__.py +0 -0
  468. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/__init__.py +0 -0
  469. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/conftest.py +0 -0
  470. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/__init__.py +0 -0
  471. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/__init__.py +0 -0
  472. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/test_product_populator.py +0 -0
  473. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/main.py +0 -0
  474. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/__init__.py +0 -0
  475. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/test_product_blocks.py +0 -0
  476. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/products/__init__.py +0 -0
  477. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/products/test_product.py +0 -0
  478. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/workflows/__init__.py +0 -0
  479. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/fixtures/test_orchestrator/workflows/create_test_product.py +0 -0
  480. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/acceptance_tests/test_test_product.py +0 -0
  481. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/__init__.py +0 -0
  482. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/__init__.py +0 -0
  483. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_health.py +0 -0
  484. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_helpers.py +0 -0
  485. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_models.py +0 -0
  486. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_processes.py +0 -0
  487. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_processes_ws.py +0 -0
  488. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_product_blocks.py +0 -0
  489. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_products.py +0 -0
  490. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_resource_types.py +0 -0
  491. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_settings.py +0 -0
  492. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_subscription_customer_descriptions.py +0 -0
  493. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_subscriptions.py +0 -0
  494. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_workflows.py +0 -0
  495. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/api/test_ws.py +0 -0
  496. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/__init__.py +0 -0
  497. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/conftest.py +0 -0
  498. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/alembic.ini +0 -0
  499. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/main.py +0 -0
  500. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/env.py +0 -0
  501. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/helpers.py +0 -0
  502. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/migrations/script.py.mako +0 -0
  503. {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
  504. {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
  505. {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
  506. {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
  507. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/__init__.py +0 -0
  508. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/__init__.py +0 -0
  509. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example1.py +0 -0
  510. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example2.py +0 -0
  511. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example4.py +0 -0
  512. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_blocks/example4sub.py +0 -0
  513. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/__init__.py +0 -0
  514. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/example1.py +0 -0
  515. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/example2.py +0 -0
  516. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/products/product_types/example4.py +0 -0
  517. {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
  518. {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
  519. {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
  520. {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
  521. {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
  522. {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
  523. {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
  524. {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
  525. {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
  526. {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
  527. {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
  528. {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
  529. {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
  530. {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
  531. {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
  532. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/translations/en-GB.json +0 -0
  533. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/__init__.py +0 -0
  534. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/create_example1.py +0 -0
  535. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/modify_example1.py +0 -0
  536. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/shared/forms.py +0 -0
  537. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/terminate_example1.py +0 -0
  538. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example1/validate_example1.py +0 -0
  539. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/create_example2.py +0 -0
  540. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/modify_example2.py +0 -0
  541. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/shared/forms.py +0 -0
  542. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example2/terminate_example2.py +0 -0
  543. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/create_example4.py +0 -0
  544. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/modify_example4.py +0 -0
  545. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/shared/forms.py +0 -0
  546. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/example4/terminate_example4.py +0 -0
  547. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate/workflows/shared.py +0 -0
  548. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/generate.sh +0 -0
  549. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/invalid_product_config1.yaml +0 -0
  550. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/invalid_product_config2.yaml +0 -0
  551. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config1.yaml +0 -0
  552. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config2.yaml +0 -0
  553. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config3.yaml +0 -0
  554. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/data/product_config4.yaml +0 -0
  555. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/generator/__init__.py +0 -0
  556. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/generator/test_enums.py +0 -0
  557. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/helpers.py +0 -0
  558. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_cli_generate.py +0 -0
  559. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_config_validation.py +0 -0
  560. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_generate_code.py +0 -0
  561. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_migrate_domain_models_with_instances.py +0 -0
  562. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/cli/test_migrate_domain_models_without_instances.py +0 -0
  563. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/config.py +0 -0
  564. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/db/__init__.py +0 -0
  565. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/db/test_listeners.py +0 -0
  566. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/__init__.py +0 -0
  567. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base.py +0 -0
  568. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_multiple.py +0 -0
  569. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_performance.py +0 -0
  570. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_serializable_property.py +0 -0
  571. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_with_list_union.py +0 -0
  572. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_base_with_union.py +0 -0
  573. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/domain/test_lifecycle.py +0 -0
  574. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/__init__.py +0 -0
  575. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/processes.py +0 -0
  576. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/__init__.py +0 -0
  577. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/__init__.py +0 -0
  578. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_list_nested.py +0 -0
  579. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_one.py +0 -0
  580. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_one_nested.py +0 -0
  581. {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
  582. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_block_with_union.py +0 -0
  583. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_one.py +0 -0
  584. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_two.py +0 -0
  585. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/__init__.py +0 -0
  586. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_list_nested.py +0 -0
  587. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_list_union.py +0 -0
  588. {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
  589. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_one.py +0 -0
  590. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_one_nested.py +0 -0
  591. {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
  592. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_sub_one.py +0 -0
  593. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_sub_two.py +0 -0
  594. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_sub_union.py +0 -0
  595. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/product_type_union.py +0 -0
  596. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/product_types/subscription_relations.py +0 -0
  597. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/products/resource_types.py +0 -0
  598. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/fixtures/workflows.py +0 -0
  599. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/__init__.py +0 -0
  600. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_customer_contact_list.py +0 -0
  601. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_customer_id.py +0 -0
  602. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_display_subscription.py +0 -0
  603. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/forms/test_generic_validators.py +0 -0
  604. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/__init__.py +0 -0
  605. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/conftest.py +0 -0
  606. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/extensions/__init__.py +0 -0
  607. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/extensions/test_stats.py +0 -0
  608. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/mutations/helpers.py +0 -0
  609. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/mutations/test_customer_description.py +0 -0
  610. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/mutations/test_start_process.py +0 -0
  611. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_customer.py +0 -0
  612. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_process.py +0 -0
  613. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_processes.py +0 -0
  614. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_product.py +0 -0
  615. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_product_blocks.py +0 -0
  616. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_resource_types.py +0 -0
  617. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_settings.py +0 -0
  618. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_sort_and_filter_fields.py +0 -0
  619. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_subscription.py +0 -0
  620. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_subscription_relations.py +0 -0
  621. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_subscriptions.py +0 -0
  622. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_version.py +0 -0
  623. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/test_workflows.py +0 -0
  624. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/__init__.py +0 -0
  625. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/fixtures.py +0 -0
  626. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_autoregistration.py +0 -0
  627. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_get_query_loaders.py +0 -0
  628. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_get_selected_paths.py +0 -0
  629. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_is_query_detailed.py +0 -0
  630. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_is_querying_page_data.py +0 -0
  631. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/graphql/utils/test_override_class.py +0 -0
  632. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/helpers.py +0 -0
  633. {orchestrator_core-4.0.0rc2/test/unit_tests/migrations → orchestrator_core-4.0.0rc4/test/unit_tests/metrics}/__init__.py +0 -0
  634. {orchestrator_core-4.0.0rc2/test/unit_tests/schedules → orchestrator_core-4.0.0rc4/test/unit_tests/migrations}/__init__.py +0 -0
  635. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/migrations/test_cascade_constraint.py +0 -0
  636. {orchestrator_core-4.0.0rc2/test/unit_tests/services → orchestrator_core-4.0.0rc4/test/unit_tests/schedules}/__init__.py +0 -0
  637. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/schedules/test_scheduling.py +0 -0
  638. {orchestrator_core-4.0.0rc2/test/unit_tests/utils → orchestrator_core-4.0.0rc4/test/unit_tests/services}/__init__.py +0 -0
  639. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_input_state.py +0 -0
  640. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_processes.py +0 -0
  641. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_products.py +0 -0
  642. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_subscription_relations.py +0 -0
  643. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_subscriptions.py +0 -0
  644. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/services/test_translations.py +0 -0
  645. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/test_db.py +0 -0
  646. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/test_types.py +0 -0
  647. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/test_workflow.py +0 -0
  648. {orchestrator_core-4.0.0rc2/test/unit_tests/websocket → orchestrator_core-4.0.0rc4/test/unit_tests/utils}/__init__.py +0 -0
  649. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/get_subscription_dict.py +0 -0
  650. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_datetime.py +0 -0
  651. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_errors.py +0 -0
  652. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_functional.py +0 -0
  653. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_get_updated_properties.py +0 -0
  654. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_json.py +0 -0
  655. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_search_query.py +0 -0
  656. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_state.py +0 -0
  657. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/utils/test_strings.py +0 -0
  658. {orchestrator_core-4.0.0rc2/test/unit_tests/workflows/shared → orchestrator_core-4.0.0rc4/test/unit_tests/websocket}/__init__.py +0 -0
  659. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/websocket/test_broadcast.py +0 -0
  660. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/__init__.py +0 -0
  661. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/conftest.py +0 -0
  662. {orchestrator_core-4.0.0rc2/test/unit_tests/workflows/tasks → orchestrator_core-4.0.0rc4/test/unit_tests/workflows/shared}/__init__.py +0 -0
  663. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/shared/test_validate_subscriptions.py +0 -0
  664. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_clean_up_task_log.py +0 -0
  665. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_resume_workflows.py +0 -0
  666. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_validate_product_type.py +0 -0
  667. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/tasks/test_validate_products.py +0 -0
  668. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_async_workflow.py +0 -0
  669. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_config_db_code.py +0 -0
  670. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_generic_workflow_steps.py +0 -0
  671. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_lifecycle_status_manager.py +0 -0
  672. {orchestrator_core-4.0.0rc2 → orchestrator_core-4.0.0rc4}/test/unit_tests/workflows/test_modify_note.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 4.0.0rc2
2
+ current_version = 4.0.0rc4
3
3
  commit = False
4
4
  tag = False
5
5
  parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(rc(?P<build>\d+))?
@@ -1,6 +1,7 @@
1
1
  The Orchestrator-Core
2
- Copyright [2018-2022] SURF, ESnet
2
+ Copyright [2018-2025] SURF, ESnet, GÉANT
3
3
 
4
4
  This product includes software developed at
5
5
  SURF NL (https://surf.nl)
6
6
  ESnet (https://es.net)
7
+ GÉANT Vereniging (https://geant.org)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.0.0rc2
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())``.
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.0.0rc2"
16
+ __version__ = "4.0.0rc4"
17
17
 
18
18
  from orchestrator.app import OrchestratorCore
19
19
  from orchestrator.settings import app_settings
@@ -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, GlobalStatusEnum, WorkerStatus
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 = GlobalStatusEnum.RUNNING
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 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,3 @@
1
+ from orchestrator.metrics.init import ORCHESTRATOR_METRICS_REGISTRY, initialize_default_metrics
2
+
3
+ __all__ = ["initialize_default_metrics", "ORCHESTRATOR_METRICS_REGISTRY"]
@@ -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
 
@@ -47,6 +47,7 @@ dependencies = [
47
47
  "itsdangerous",
48
48
  "Jinja2==3.1.6",
49
49
  "orjson==3.10.18",
50
+ "prometheus-client==0.21.1",
50
51
  "psycopg2-binary==2.9.10",
51
52
  "pydantic[email]~=2.8.2",
52
53
  "pydantic-settings~=2.9.1",
@@ -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)