orchestrator-core 4.1.0rc1__tar.gz → 4.1.0rc2__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 (678) hide show
  1. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.bumpversion.cfg +1 -1
  2. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/PKG-INFO +1 -1
  3. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/auth-backend-and-frontend.md +317 -0
  4. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/__init__.py +1 -1
  5. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/processes.py +61 -11
  6. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/celery.py +7 -2
  7. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/processes.py +1 -10
  8. orchestrator_core-4.1.0rc2/orchestrator/utils/auth.py +9 -0
  9. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflow.py +45 -7
  10. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/utils.py +10 -4
  11. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_processes.py +162 -1
  12. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.coveragerc +0 -0
  13. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  14. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  15. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/dependabot.yml +0 -0
  16. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/README.md +0 -0
  17. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/build-push-container.yml +0 -0
  18. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/changelog.yml +0 -0
  19. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/codeql-analysis.yml +0 -0
  20. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/gh-pages.yml +0 -0
  21. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/issues.yml +0 -0
  22. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/publish-package.yml +0 -0
  23. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/run-codspeed-tests.yml +0 -0
  24. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/run-linting-tests.yml +0 -0
  25. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/run-unit-tests.yml +0 -0
  26. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.github/workflows/scheduled-build.yml +0 -0
  27. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.gitignore +0 -0
  28. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.pre-commit-config.yaml +0 -0
  29. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/.stignore +0 -0
  30. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/CHANGELOG.md +0 -0
  31. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/Dockerfile +0 -0
  32. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/LICENSE +0 -0
  33. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/NOTICE +0 -0
  34. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/README.md +0 -0
  35. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/codecov.yml +0 -0
  36. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/application/domainmodels.md +0 -0
  37. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/application/forms-frontend.md +0 -0
  38. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/application/tasks.md +0 -0
  39. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/application/workflow.md +0 -0
  40. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/framework.md +0 -0
  41. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/img/base-orchestrator-setup.png +0 -0
  42. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/img/custom-orchestrator-setup.png +0 -0
  43. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/orchestration/img/Custom-orchestrator-ui-using-override.png +0 -0
  44. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/orchestration/img/Standard-orchestrator-ui.png +0 -0
  45. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/orchestration/orchestrator-ui.md +0 -0
  46. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/orchestration/philosophy.md +0 -0
  47. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/backfilling.md +0 -0
  48. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/context.md +0 -0
  49. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/imports.md +0 -0
  50. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/introduction.md +0 -0
  51. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/ip_static.md +0 -0
  52. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/ip_static.png +0 -0
  53. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/l2_point_to_point.md +0 -0
  54. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/l2_point_to_point.png +0 -0
  55. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/l2_vpn.md +0 -0
  56. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/l2_vpn.png +0 -0
  57. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/modelling.md +0 -0
  58. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/node.md +0 -0
  59. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/node.png +0 -0
  60. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/port.md +0 -0
  61. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/port.png +0 -0
  62. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/product_block_graph.md +0 -0
  63. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/product_block_graph.png +0 -0
  64. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/standards.md +0 -0
  65. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/product_modelling/terminology.md +0 -0
  66. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/architecture/tldr.md +0 -0
  67. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/contributing/development.md +0 -0
  68. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/contributing/guidelines.md +0 -0
  69. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/contributing/testing.md +0 -0
  70. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/css/custom.css +0 -0
  71. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/css/style.css +0 -0
  72. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/css/termynal.css +0 -0
  73. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/getting-started/base.md +0 -0
  74. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/getting-started/docker.md +0 -0
  75. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/getting-started/orchestration-ui.md +0 -0
  76. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/getting-started/prepare-source-folder.md +0 -0
  77. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/getting-started/versions.md +0 -0
  78. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/img/WFO-Emblem-White.png +0 -0
  79. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/img/favicon.ico +0 -0
  80. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/index.md +0 -0
  81. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/js/custom.js +0 -0
  82. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/js/termynal.js +0 -0
  83. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/migration-guide/2.0.md +0 -0
  84. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/migration-guide/3.0.md +0 -0
  85. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/migration-guide/4.0.md +0 -0
  86. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/api.md +0 -0
  87. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/app/app.md +0 -0
  88. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/app/scaling.md +0 -0
  89. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/app/settings_overview.md +0 -0
  90. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/cli.md +0 -0
  91. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/database.md +0 -0
  92. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/generator.md +0 -0
  93. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/instantiating.md +0 -0
  94. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/model_attributes.md +0 -0
  95. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/overview.md +0 -0
  96. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/product_blocks.md +0 -0
  97. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/product_types.md +0 -0
  98. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/properties.md +0 -0
  99. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/pydantic_hooks.md +0 -0
  100. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/type_casting.md +0 -0
  101. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/union_types.md +0 -0
  102. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/domain_models/validation.md +0 -0
  103. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/forms.md +0 -0
  104. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/graphql.md +0 -0
  105. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/metrics.md +0 -0
  106. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/python.md +0 -0
  107. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/search.md +0 -0
  108. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/search_overview.png +0 -0
  109. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/serialization.md +0 -0
  110. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/tasks.md +0 -0
  111. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/tests.md +0 -0
  112. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/tldr.md +0 -0
  113. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/websockets.md +0 -0
  114. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/workflows/callbacks.md +0 -0
  115. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/workflows/workflow-lifecycles.md +0 -0
  116. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/reference-docs/workflows/workflow-steps.md +0 -0
  117. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/bootstrap.md +0 -0
  118. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/create-your-own.md +0 -0
  119. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/docker-installation.md +0 -0
  120. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/domain-models.md +0 -0
  121. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/execute-workflows.md +0 -0
  122. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/generator.md +0 -0
  123. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/l2_point_to_point.png +0 -0
  124. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/node-create.md +0 -0
  125. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/node-modify.md +0 -0
  126. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/node-terminate.md +0 -0
  127. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/node-validate.md +0 -0
  128. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/overview.md +0 -0
  129. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/scenario.md +0 -0
  130. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/workflow-basics.md +0 -0
  131. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/advanced/workflow-introduction.md +0 -0
  132. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/create-user-group.md +0 -0
  133. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/create-user.md +0 -0
  134. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/database-migration.md +0 -0
  135. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/debian.md +0 -0
  136. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/docker.md +0 -0
  137. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/domain-models.md +0 -0
  138. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/explore.md +0 -0
  139. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/input-forms.md +0 -0
  140. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/macos.md +0 -0
  141. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/modify-user-group.md +0 -0
  142. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/modify-user.md +0 -0
  143. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/register-workflows.md +0 -0
  144. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/start-applications.md +0 -0
  145. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/terminate-user-group.md +0 -0
  146. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/terminate-user.md +0 -0
  147. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/workflow-introduction.md +0 -0
  148. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/beginner/workshop-overview.md +0 -0
  149. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/images/Software-topology.drawio.png +0 -0
  150. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/images/clab_topology.png +0 -0
  151. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/images/metadata_products.png +0 -0
  152. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/images/netbox_devices_active.png +0 -0
  153. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/images/subscriptions.png +0 -0
  154. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/docs/workshops/images/topology.drawio.png +0 -0
  155. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/includes/abbreviations.md +0 -0
  156. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/mkdocs.yml +0 -0
  157. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/nitpick-style.toml +0 -0
  158. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/__init__.py +0 -0
  159. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/__init__.py +0 -0
  160. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/api.py +0 -0
  161. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/__init__.py +0 -0
  162. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/health.py +0 -0
  163. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/product_blocks.py +0 -0
  164. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/products.py +0 -0
  165. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/resource_types.py +0 -0
  166. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/settings.py +0 -0
  167. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py +0 -0
  168. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/subscriptions.py +0 -0
  169. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/translations.py +0 -0
  170. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/user.py +0 -0
  171. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/workflows.py +0 -0
  172. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/api_v1/endpoints/ws.py +0 -0
  173. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/error_handling.py +0 -0
  174. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/helpers.py +0 -0
  175. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/api/models.py +0 -0
  176. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/app.py +0 -0
  177. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/__init__.py +0 -0
  178. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/database.py +0 -0
  179. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/domain_gen_helpers/__init__.py +0 -0
  180. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py +0 -0
  181. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/domain_gen_helpers/helpers.py +0 -0
  182. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/domain_gen_helpers/product_block_helpers.py +0 -0
  183. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/domain_gen_helpers/product_helpers.py +0 -0
  184. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/domain_gen_helpers/resource_type_helpers.py +0 -0
  185. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/domain_gen_helpers/types.py +0 -0
  186. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generate.py +0 -0
  187. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/__init__.py +0 -0
  188. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/README +0 -0
  189. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_create_imports.j2 +0 -0
  190. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_create_input_fields.j2 +0 -0
  191. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_create_steps.j2 +0 -0
  192. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_modify_imports.j2 +0 -0
  193. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_modify_input_fields.j2 +0 -0
  194. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_modify_steps.j2 +0 -0
  195. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_imports.j2 +0 -0
  196. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_input_fields.j2 +0 -0
  197. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_steps.j2 +0 -0
  198. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/__init__.py +0 -0
  199. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/enums.py +0 -0
  200. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/helpers.py +0 -0
  201. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/migration.py +0 -0
  202. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/product.py +0 -0
  203. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/product_block.py +0 -0
  204. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/settings.py +0 -0
  205. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/translations.py +0 -0
  206. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/unittest.py +0 -0
  207. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/validations.py +0 -0
  208. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/generator/workflow.py +0 -0
  209. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/products/workshop/circuit.yaml +0 -0
  210. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/products/workshop/node.yaml +0 -0
  211. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/products/workshop/user.yaml +0 -0
  212. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/products/workshop/user_group.yaml +0 -0
  213. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/additional_create_imports.j2 +0 -0
  214. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/additional_create_steps.j2 +0 -0
  215. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/additional_modify_imports.j2 +0 -0
  216. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/additional_modify_steps.j2 +0 -0
  217. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/additional_terminate_steps.j2 +0 -0
  218. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/constrained_int_definitions.j2 +0 -0
  219. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/create_data_head.j2 +0 -0
  220. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/create_product.j2 +0 -0
  221. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/enums.j2 +0 -0
  222. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/lazy_workflow_instance.j2 +0 -0
  223. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/list_definitions.j2 +0 -0
  224. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/macros.j2 +0 -0
  225. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/modify_product.j2 +0 -0
  226. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/new_product_migration.j2 +0 -0
  227. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/product.j2 +0 -0
  228. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/product_block.j2 +0 -0
  229. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/shared_forms.j2 +0 -0
  230. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/shared_workflows.j2 +0 -0
  231. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/subscription_model_registry.j2 +0 -0
  232. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/terminate_product.j2 +0 -0
  233. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -0
  234. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/test_modify_workflow.j2 +0 -0
  235. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/test_product_type.j2 +0 -0
  236. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/test_terminate_workflow.j2 +0 -0
  237. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/test_validate_workflow.j2 +0 -0
  238. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/generator/templates/validate_product.j2 +0 -0
  239. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/helpers/__init__.py +0 -0
  240. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/helpers/input_helpers.py +0 -0
  241. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/helpers/print_helpers.py +0 -0
  242. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/main.py +0 -0
  243. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/migrate_domain_models.py +0 -0
  244. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/migrate_tasks.py +0 -0
  245. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/migrate_workflows.py +0 -0
  246. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/migration_helpers.py +0 -0
  247. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/cli/scheduler.py +0 -0
  248. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/config/__init__.py +0 -0
  249. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/config/assignee.py +0 -0
  250. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/__init__.py +0 -0
  251. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/database.py +0 -0
  252. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/__init__.py +0 -0
  253. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/filters.py +0 -0
  254. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/process.py +0 -0
  255. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/product.py +0 -0
  256. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/product_block.py +0 -0
  257. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/resource_type.py +0 -0
  258. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/search_filters/__init__.py +0 -0
  259. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/search_filters/inferred_filter.py +0 -0
  260. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/subscription.py +0 -0
  261. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/filters/workflow.py +0 -0
  262. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/helpers.py +0 -0
  263. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/listeners.py +0 -0
  264. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/loaders.py +0 -0
  265. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/models.py +0 -0
  266. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/queries/__init__.py +0 -0
  267. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/queries/subscription.py +0 -0
  268. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/queries/subscription_instance.py +0 -0
  269. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/range/__init__.py +0 -0
  270. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/range/range.py +0 -0
  271. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/__init__.py +0 -0
  272. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/process.py +0 -0
  273. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/product.py +0 -0
  274. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/product_block.py +0 -0
  275. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/resource_type.py +0 -0
  276. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/sorting.py +0 -0
  277. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/subscription.py +0 -0
  278. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/db/sorting/workflow.py +0 -0
  279. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/devtools/__init__.py +0 -0
  280. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/devtools/populator.py +0 -0
  281. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/devtools/scripts/__init__.py +0 -0
  282. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/devtools/scripts/migrate_20.py +0 -0
  283. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/devtools/scripts/migrate_30.py +0 -0
  284. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/devtools/scripts/shared.py +0 -0
  285. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/distlock/__init__.py +0 -0
  286. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/distlock/distlock_manager.py +0 -0
  287. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/distlock/managers/__init__.py +0 -0
  288. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/distlock/managers/memory_distlock_manager.py +0 -0
  289. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/distlock/managers/redis_distlock_manager.py +0 -0
  290. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/domain/__init__.py +0 -0
  291. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/domain/base.py +0 -0
  292. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/domain/context_cache.py +0 -0
  293. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/domain/customer_description.py +0 -0
  294. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/domain/helpers.py +0 -0
  295. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/domain/lifecycle.py +0 -0
  296. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/domain/subscription_instance_transform.py +0 -0
  297. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/exception_handlers.py +0 -0
  298. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/forms/__init__.py +0 -0
  299. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/forms/validators/__init__.py +0 -0
  300. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/forms/validators/customer_contact_list.py +0 -0
  301. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/forms/validators/customer_id.py +0 -0
  302. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/forms/validators/display_subscription.py +0 -0
  303. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/forms/validators/network_type_validators.py +0 -0
  304. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/forms/validators/product_id.py +0 -0
  305. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/__init__.py +0 -0
  306. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/autoregistration.py +0 -0
  307. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/extensions/__init__.py +0 -0
  308. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/extensions/model_cache.py +0 -0
  309. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/extensions/stats.py +0 -0
  310. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/loaders/__init__.py +0 -0
  311. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/loaders/subscriptions.py +0 -0
  312. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/mutations/customer_description.py +0 -0
  313. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/mutations/start_process.py +0 -0
  314. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/pagination.py +0 -0
  315. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/__init__.py +0 -0
  316. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/customer.py +0 -0
  317. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/helpers.py +0 -0
  318. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/process.py +0 -0
  319. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/product.py +0 -0
  320. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/product_block.py +0 -0
  321. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/resource_type.py +0 -0
  322. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/settings.py +0 -0
  323. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/subscription.py +0 -0
  324. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/version.py +0 -0
  325. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/resolvers/workflow.py +0 -0
  326. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schema.py +0 -0
  327. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/__init__.py +0 -0
  328. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/customer.py +0 -0
  329. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/customer_description.py +0 -0
  330. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/errors.py +0 -0
  331. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/fixed_input.py +0 -0
  332. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/helpers.py +0 -0
  333. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/process.py +0 -0
  334. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/product.py +0 -0
  335. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/product_block.py +0 -0
  336. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/resource_type.py +0 -0
  337. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/settings.py +0 -0
  338. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/strawberry_pydantic_patch.py +0 -0
  339. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/subscription.py +0 -0
  340. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/version.py +0 -0
  341. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/schemas/workflow.py +0 -0
  342. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/types.py +0 -0
  343. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/__init__.py +0 -0
  344. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/create_resolver_error_handler.py +0 -0
  345. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/get_query_loaders.py +0 -0
  346. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/get_selected_fields.py +0 -0
  347. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/get_selected_paths.py +0 -0
  348. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/get_subscription_product_blocks.py +0 -0
  349. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/is_query_detailed.py +0 -0
  350. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/override_class.py +0 -0
  351. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/graphql/utils/to_graphql_result_page.py +0 -0
  352. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/log_config.py +0 -0
  353. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/metrics/__init__.py +0 -0
  354. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/metrics/engine.py +0 -0
  355. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/metrics/init.py +0 -0
  356. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/metrics/processes.py +0 -0
  357. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/metrics/subscriptions.py +0 -0
  358. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/README +0 -0
  359. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/alembic.ini +0 -0
  360. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/env.py +0 -0
  361. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/helpers.py +0 -0
  362. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/script.py.mako +0 -0
  363. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/templates/alembic.ini.j2 +0 -0
  364. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/templates/env.py.j2 +0 -0
  365. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/templates/helpers.py.j2 +0 -0
  366. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2020-10-19_3323bcb934e7_fix_tsv_triggers.py +0 -0
  367. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2020-10-19_a76b9185b334_add_generic_workflows_to_core.py +0 -0
  368. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2020-10-19_c112305b07d3_initial_schema_migration.py +0 -0
  369. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2021-04-06_3c8b9185c221_add_validate_products_task.py +0 -0
  370. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2021-07-01_6896a54e9483_add_product_block_relations.py +0 -0
  371. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2021-11-17_19cdd3ab86f6_fix_parse_websearch.py +0 -0
  372. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2022-02-16_bed6bc0b197a_rename_parent_and_child_block_relations.py +0 -0
  373. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-03-06_e05bb1967eff_add_subscriptions_search_view.py +0 -0
  374. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-05-25_b1970225392d_add_subscription_metadata_workflow.py +0 -0
  375. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.py +0 -0
  376. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.sql +0 -0
  377. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.py +0 -0
  378. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.sql +0 -0
  379. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.py +0 -0
  380. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.sql +0 -0
  381. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2023-12-06_048219045729_add_workflow_id_to_processes_table.py +0 -0
  382. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.py +0 -0
  383. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.sql +0 -0
  384. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py +0 -0
  385. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-01-19_4fjdn13f83ga_add_validate_product_type_task.py +0 -0
  386. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-02-12_bac6be6f2b4f_added_input_state_table.py +0 -0
  387. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-02-20_68d14db1b8da_make_workflow_description_mandatory.py +0 -0
  388. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.py +0 -0
  389. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-03-06_42b3d076a85b_subscription_instance_as_json_function.sql +0 -0
  390. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-04-09_fc5c993a4b4a_add_cascade_constraint_on_processes_.py +0 -0
  391. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/migrations/versions/schema/2025-05-08_161918133bec_add_is_task_to_workflow.py +0 -0
  392. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/py.typed +0 -0
  393. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schedules/__init__.py +0 -0
  394. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schedules/resume_workflows.py +0 -0
  395. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schedules/scheduling.py +0 -0
  396. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schedules/task_vacuum.py +0 -0
  397. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schedules/validate_products.py +0 -0
  398. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schedules/validate_subscriptions.py +0 -0
  399. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/__init__.py +0 -0
  400. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/base.py +0 -0
  401. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/engine_settings.py +0 -0
  402. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/fixed_input.py +0 -0
  403. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/problem_detail.py +0 -0
  404. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/process.py +0 -0
  405. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/product.py +0 -0
  406. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/product_block.py +0 -0
  407. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/resource_type.py +0 -0
  408. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/subscription.py +0 -0
  409. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/subscription_descriptions.py +0 -0
  410. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/schemas/workflow.py +0 -0
  411. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/security.py +0 -0
  412. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/__init__.py +0 -0
  413. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/fixed_inputs.py +0 -0
  414. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/input_state.py +0 -0
  415. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/process_broadcast_thread.py +0 -0
  416. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/products.py +0 -0
  417. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/resource_types.py +0 -0
  418. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/settings.py +0 -0
  419. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/settings_env_variables.py +0 -0
  420. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/subscription_relations.py +0 -0
  421. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/subscriptions.py +0 -0
  422. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/tasks.py +0 -0
  423. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/translations.py +0 -0
  424. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/services/workflows.py +0 -0
  425. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/settings.py +0 -0
  426. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/targets.py +0 -0
  427. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/types.py +0 -0
  428. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/__init__.py +0 -0
  429. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/crypt.py +0 -0
  430. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/datetime.py +0 -0
  431. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/deprecation_logger.py +0 -0
  432. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/docs.py +0 -0
  433. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/enrich_process.py +0 -0
  434. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/errors.py +0 -0
  435. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/expose_settings.py +0 -0
  436. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/fixed_inputs.py +0 -0
  437. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/functional.py +0 -0
  438. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/get_subscription_dict.py +0 -0
  439. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/get_updated_properties.py +0 -0
  440. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/helpers.py +0 -0
  441. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/json.py +0 -0
  442. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/redis.py +0 -0
  443. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/redis_client.py +0 -0
  444. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/search_query.py +0 -0
  445. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/state.py +0 -0
  446. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/strings.py +0 -0
  447. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/utils/validate_data_version.py +0 -0
  448. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/version.py +0 -0
  449. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/websocket/__init__.py +0 -0
  450. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/websocket/managers/broadcast_websocket_manager.py +0 -0
  451. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/websocket/managers/memory_websocket_manager.py +0 -0
  452. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/websocket/websocket_manager.py +0 -0
  453. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/__init__.py +0 -0
  454. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/modify_note.py +0 -0
  455. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/removed_workflow.py +0 -0
  456. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/steps.py +0 -0
  457. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/tasks/__init__.py +0 -0
  458. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/tasks/cleanup_tasks_log.py +0 -0
  459. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/tasks/resume_workflows.py +0 -0
  460. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/tasks/validate_product_type.py +0 -0
  461. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/tasks/validate_products.py +0 -0
  462. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/orchestrator/workflows/translations/en-GB.json +0 -0
  463. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/pyproject.toml +0 -0
  464. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/setup.cfg +0 -0
  465. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/setup.py +0 -0
  466. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/__init__.py +0 -0
  467. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/__init__.py +0 -0
  468. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/conftest.py +0 -0
  469. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/__init__.py +0 -0
  470. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/__init__.py +0 -0
  471. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/test_product_populator.py +0 -0
  472. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/main.py +0 -0
  473. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/__init__.py +0 -0
  474. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/test_product_blocks.py +0 -0
  475. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/products/__init__.py +0 -0
  476. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/products/test_product.py +0 -0
  477. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/workflows/__init__.py +0 -0
  478. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/fixtures/test_orchestrator/workflows/create_test_product.py +0 -0
  479. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/acceptance_tests/test_test_product.py +0 -0
  480. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/__init__.py +0 -0
  481. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/__init__.py +0 -0
  482. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_health.py +0 -0
  483. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_helpers.py +0 -0
  484. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_models.py +0 -0
  485. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_processes_ws.py +0 -0
  486. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_product_blocks.py +0 -0
  487. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_products.py +0 -0
  488. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_resource_types.py +0 -0
  489. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_settings.py +0 -0
  490. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_subscription_customer_descriptions.py +0 -0
  491. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_subscriptions.py +0 -0
  492. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_workflows.py +0 -0
  493. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/api/test_ws.py +0 -0
  494. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/__init__.py +0 -0
  495. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/conftest.py +0 -0
  496. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/alembic.ini +0 -0
  497. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/main.py +0 -0
  498. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/migrations/env.py +0 -0
  499. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/migrations/helpers.py +0 -0
  500. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/migrations/script.py.mako +0 -0
  501. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_59e1199aff7f_create_data_head.py +0 -0
  502. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_85be1c80731c_add_example2.py +0 -0
  503. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_ea9e6c9de75c_add_example1.py +0 -0
  504. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-06-07_380a5b0c928c_add_example4.py +0 -0
  505. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/__init__.py +0 -0
  506. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_blocks/__init__.py +0 -0
  507. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example1.py +0 -0
  508. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example2.py +0 -0
  509. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example4.py +0 -0
  510. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example4sub.py +0 -0
  511. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_types/__init__.py +0 -0
  512. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_types/example1.py +0 -0
  513. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_types/example2.py +0 -0
  514. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/products/product_types/example4.py +0 -0
  515. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example1.py +0 -0
  516. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example2.py +0 -0
  517. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example4.py +0 -0
  518. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_create_example1.py +0 -0
  519. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_modify_example1.py +0 -0
  520. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_terminate_example1.py +0 -0
  521. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_validate_example1.py +0 -0
  522. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_create_example2.py +0 -0
  523. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_modify_example2.py +0 -0
  524. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_terminate_example2.py +0 -0
  525. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_validate_example2.py +0 -0
  526. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_create_example4.py +0 -0
  527. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_modify_example4.py +0 -0
  528. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_terminate_example4.py +0 -0
  529. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_validate_example4.py +0 -0
  530. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/translations/en-GB.json +0 -0
  531. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/__init__.py +0 -0
  532. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example1/create_example1.py +0 -0
  533. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example1/modify_example1.py +0 -0
  534. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example1/shared/forms.py +0 -0
  535. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example1/terminate_example1.py +0 -0
  536. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example1/validate_example1.py +0 -0
  537. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example2/create_example2.py +0 -0
  538. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example2/modify_example2.py +0 -0
  539. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example2/shared/forms.py +0 -0
  540. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example2/terminate_example2.py +0 -0
  541. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example4/create_example4.py +0 -0
  542. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example4/modify_example4.py +0 -0
  543. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example4/shared/forms.py +0 -0
  544. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/example4/terminate_example4.py +0 -0
  545. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate/workflows/shared.py +0 -0
  546. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/generate.sh +0 -0
  547. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/invalid_product_config1.yaml +0 -0
  548. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/invalid_product_config2.yaml +0 -0
  549. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/product_config1.yaml +0 -0
  550. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/product_config2.yaml +0 -0
  551. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/product_config3.yaml +0 -0
  552. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/data/product_config4.yaml +0 -0
  553. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/generator/__init__.py +0 -0
  554. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/generator/test_enums.py +0 -0
  555. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/helpers.py +0 -0
  556. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/test_cli_generate.py +0 -0
  557. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/test_config_validation.py +0 -0
  558. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/test_generate_code.py +0 -0
  559. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/test_migrate_domain_models_with_instances.py +0 -0
  560. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/cli/test_migrate_domain_models_without_instances.py +0 -0
  561. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/config.py +0 -0
  562. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/conftest.py +0 -0
  563. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/db/__init__.py +0 -0
  564. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/db/test_listeners.py +0 -0
  565. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/db/test_migration_does_column_exist.py +0 -0
  566. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/__init__.py +0 -0
  567. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/test_base.py +0 -0
  568. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/test_base_multiple.py +0 -0
  569. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/test_base_performance.py +0 -0
  570. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/test_base_serializable_property.py +0 -0
  571. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/test_base_with_list_union.py +0 -0
  572. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/test_base_with_union.py +0 -0
  573. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/domain/test_lifecycle.py +0 -0
  574. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/__init__.py +0 -0
  575. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/processes.py +0 -0
  576. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/__init__.py +0 -0
  577. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/__init__.py +0 -0
  578. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_list_nested.py +0 -0
  579. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_one.py +0 -0
  580. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_one_nested.py +0 -0
  581. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_with_list_union.py +0 -0
  582. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_with_union.py +0 -0
  583. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_one.py +0 -0
  584. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_two.py +0 -0
  585. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/__init__.py +0 -0
  586. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_list_nested.py +0 -0
  587. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_list_union.py +0 -0
  588. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_list_union_overlap.py +0 -0
  589. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_one.py +0 -0
  590. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_one_nested.py +0 -0
  591. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_list_union.py +0 -0
  592. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_one.py +0 -0
  593. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_two.py +0 -0
  594. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_union.py +0 -0
  595. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/product_type_union.py +0 -0
  596. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/product_types/subscription_relations.py +0 -0
  597. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/products/resource_types.py +0 -0
  598. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/fixtures/workflows.py +0 -0
  599. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/forms/__init__.py +0 -0
  600. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/forms/test_customer_contact_list.py +0 -0
  601. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/forms/test_customer_id.py +0 -0
  602. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/forms/test_display_subscription.py +0 -0
  603. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/forms/test_generic_validators.py +0 -0
  604. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/__init__.py +0 -0
  605. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/conftest.py +0 -0
  606. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/extensions/__init__.py +0 -0
  607. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/extensions/test_stats.py +0 -0
  608. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/mutations/helpers.py +0 -0
  609. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/mutations/test_customer_description.py +0 -0
  610. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/mutations/test_start_process.py +0 -0
  611. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_customer.py +0 -0
  612. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_process.py +0 -0
  613. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_processes.py +0 -0
  614. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_product.py +0 -0
  615. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_product_blocks.py +0 -0
  616. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_resource_types.py +0 -0
  617. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_settings.py +0 -0
  618. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_sort_and_filter_fields.py +0 -0
  619. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_subscription.py +0 -0
  620. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_subscription_relations.py +0 -0
  621. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_subscriptions.py +0 -0
  622. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_version.py +0 -0
  623. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/test_workflows.py +0 -0
  624. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/__init__.py +0 -0
  625. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/fixtures.py +0 -0
  626. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/test_autoregistration.py +0 -0
  627. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/test_get_query_loaders.py +0 -0
  628. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/test_get_selected_paths.py +0 -0
  629. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/test_is_query_detailed.py +0 -0
  630. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/test_is_querying_page_data.py +0 -0
  631. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/graphql/utils/test_override_class.py +0 -0
  632. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/helpers.py +0 -0
  633. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/metrics/__init__.py +0 -0
  634. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/metrics/conftest.py +0 -0
  635. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/metrics/test_engine_metrics.py +0 -0
  636. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/metrics/test_process_metrics.py +0 -0
  637. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/metrics/test_subscription_metrics.py +0 -0
  638. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/migrations/__init__.py +0 -0
  639. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/migrations/test_cascade_constraint.py +0 -0
  640. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/schedules/__init__.py +0 -0
  641. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/schedules/test_scheduling.py +0 -0
  642. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/__init__.py +0 -0
  643. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/test_expose_settings.py +0 -0
  644. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/test_input_state.py +0 -0
  645. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/test_processes.py +0 -0
  646. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/test_products.py +0 -0
  647. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/test_subscription_relations.py +0 -0
  648. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/test_subscriptions.py +0 -0
  649. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/services/test_translations.py +0 -0
  650. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/test_db.py +0 -0
  651. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/test_types.py +0 -0
  652. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/test_workflow.py +0 -0
  653. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/__init__.py +0 -0
  654. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/get_subscription_dict.py +0 -0
  655. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_datetime.py +0 -0
  656. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_errors.py +0 -0
  657. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_functional.py +0 -0
  658. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_get_updated_properties.py +0 -0
  659. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_json.py +0 -0
  660. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_search_query.py +0 -0
  661. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_state.py +0 -0
  662. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/utils/test_strings.py +0 -0
  663. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/websocket/__init__.py +0 -0
  664. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/websocket/test_broadcast.py +0 -0
  665. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/__init__.py +0 -0
  666. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/conftest.py +0 -0
  667. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/shared/__init__.py +0 -0
  668. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/shared/test_validate_subscriptions.py +0 -0
  669. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/tasks/__init__.py +0 -0
  670. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/tasks/test_clean_up_task_log.py +0 -0
  671. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/tasks/test_resume_workflows.py +0 -0
  672. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/tasks/test_validate_product_type.py +0 -0
  673. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/tasks/test_validate_products.py +0 -0
  674. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/test_async_workflow.py +0 -0
  675. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/test_config_db_code.py +0 -0
  676. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/test_generic_workflow_steps.py +0 -0
  677. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/test_lifecycle_status_manager.py +0 -0
  678. {orchestrator_core-4.1.0rc1 → orchestrator_core-4.1.0rc2}/test/unit_tests/workflows/test_modify_note.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 4.1.0rc1
2
+ current_version = 4.1.0rc2
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,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: orchestrator-core
3
- Version: 4.1.0rc1
3
+ Version: 4.1.0rc2
4
4
  Summary: This is the orchestrator workflow engine.
5
5
  Requires-Python: >=3.11,<3.14
6
6
  Classifier: Intended Audience :: Information Technology
@@ -269,6 +269,323 @@ app.register_authorization(authorization_instance)
269
269
  app.register_graphql_authorization(graphql_authorization_instance)
270
270
  ```
271
271
 
272
+ ## Authorization and Workflows
273
+
274
+ !!! Warning
275
+ Role-based access control for workflows is currently in beta.
276
+ Initial support has been added to the backend, but the feature is not fully communicated through the UI yet.
277
+
278
+ Certain `orchestrator-core` decorators accept authorization callbacks of type `type Authorizer = Callable[OIDCUserModel, bool]`, which return True when the input user is authorized, otherwise False.
279
+
280
+ A table (below) is available for comparing possible configuration states with the policy that will be enforced.
281
+
282
+ ### `@workflow`
283
+ The `@workflow` decorator accepts the optional parameters `auth: Authorizer` and `retry_auth: Authorizer`.
284
+
285
+ `auth` will be used to determine the authorization of a user to start the workflow.
286
+ If `auth` is omitted, the workflow is authorized for any logged in user.
287
+
288
+ `retry_auth` will be used to determine the authorization of a user to start, resume, or retry the workflow from a failed step.
289
+ If `retry_auth` is omitted, then `auth` is used to authorize.
290
+
291
+ (This does not percolate past an `@inputstep` that specifies `resume_auth` or `retry_auth`.)
292
+
293
+ Examples:
294
+
295
+ * `auth=None, retry_auth=None`: any user may run the workflow.
296
+ * `auth=A, retry_auth=B`: users authorized by A may start the workflow. Users authorized by B may retry on failure.
297
+ * Example: starting the workflow is a decision that must be made by a product owner. Retrying can be made by an on-call member of the operations team.
298
+ * `auth=None, retry_auth=B`: any user can start the workflow, but only users authorized by B may retry on failure.
299
+
300
+ ### `@inputstep`
301
+ The `@inputstep` decorator accepts the optional parameters `resume_auth: Authorizer` and `retry_auth: Authorizer`.
302
+
303
+ `resume_auth` will be used to determine the authorization of a user to resume the workflow when suspended at this inputstep.
304
+ If `resume_auth` is omitted, then the workflow's `auth` will be used.
305
+
306
+ `retry_auth` will be used to determine the authorization of a user to retry the workflow from a failed step following the inputstep.
307
+ If `retry_auth` is omitted, then `resume_auth` is used to authorize retries.
308
+ If `resume_auth` is also omitted, then the workflow’s `retry_auth` is checked, and then the workflow’s `auth`.
309
+
310
+ In summary:
311
+
312
+ * A workflow establishes `auth` for starting, resuming, or retrying.
313
+ * The workflow can also establish `retry_auth`, which will override `auth` for retries.
314
+ * An inputstep can override the existing `auth` with `resume_auth` and the existing `retry_auth` with its own `retry_auth`.
315
+ * Subsequent inputsteps can do the same, but any None will not overwrite a previous not-None.
316
+
317
+ ### Policy resolutions
318
+ Below is an exhaustive table of how policies (implemented as callbacks `A`, `B`, `C`, and `D`)
319
+ are prioritized in different workflow and inputstep configurations.
320
+
321
+ <table>
322
+ <thead>
323
+ <tr>
324
+ <th colspan=4>Configuration</th>
325
+ <th colspan=4>Enforcement</th>
326
+ <th>Notes</th>
327
+ </tr>
328
+ <tr>
329
+ <th colspan=2>@workflow</th>
330
+ <th colspan=2>@inputstep</th>
331
+ <th colspan=2>before @inputstep</th>
332
+ <th colspan=2>@inputstep and after</th>
333
+ <th></th>
334
+ </tr>
335
+ <tr>
336
+ <th>auth</th>
337
+ <th>retry_auth</th>
338
+ <th>resume_auth</th>
339
+ <th>retry_auth</th>
340
+ <th>start</th>
341
+ <th>retry</th>
342
+ <th>resume</th>
343
+ <th>retry</th>
344
+ <th></th>
345
+ </tr>
346
+ </thead>
347
+ <tbody>
348
+ <tr>
349
+ <td>None</td>
350
+ <td>None</td>
351
+ <td>None</td>
352
+ <td>None</td>
353
+ <td>Anyone</td>
354
+ <td>Anyone</td>
355
+ <td>Anyone</td>
356
+ <td>Anyone</td>
357
+ <td>Default</td>
358
+ </tr>
359
+ <tr>
360
+ <td>A</td>
361
+ <td>None</td>
362
+ <td>None</td>
363
+ <td>None</td>
364
+ <td>A</td>
365
+ <td>A</td>
366
+ <td>A</td>
367
+ <td>A</td>
368
+ <td>Broadly restrict the workflow to a specific authorizer.</td>
369
+ </tr>
370
+ <tr>
371
+ <td>None</td>
372
+ <td>B</td>
373
+ <td>None</td>
374
+ <td>None</td>
375
+ <td>Anyone</td>
376
+ <td>B</td>
377
+ <td>Anyone</td>
378
+ <td>B</td>
379
+ <td>original retry_auth is maintained if nothing supercedes it. Weird choice, but this provides a "we specifically want to limit retries" route.</td>
380
+ </tr>
381
+ <tr>
382
+ <td>A</td>
383
+ <td>B</td>
384
+ <td>None</td>
385
+ <td>None</td>
386
+ <td>A</td>
387
+ <td>B</td>
388
+ <td>A</td>
389
+ <td>B</td>
390
+ <td>Workflow-level auth and retry. Allows A or B to be tighter or distinct, as needed.</td>
391
+ </tr>
392
+ <tr>
393
+ <td>None</td>
394
+ <td>None</td>
395
+ <td>C</td>
396
+ <td>None</td>
397
+ <td>Anyone</td>
398
+ <td>Anyone</td>
399
+ <td>C</td>
400
+ <td>C</td>
401
+ <td>Anyone can start this workflow, but only C can continue it.</td>
402
+ </tr>
403
+ <tr>
404
+ <td>A</td>
405
+ <td>None</td>
406
+ <td>C</td>
407
+ <td>None</td>
408
+ <td>A</td>
409
+ <td>A</td>
410
+ <td>C</td>
411
+ <td>C</td>
412
+ <td>Subsequent retries use C, not A! Override with retry_auth=A if desired.</td>
413
+ </tr>
414
+ <tr>
415
+ <td>None</td>
416
+ <td>B</td>
417
+ <td>C</td>
418
+ <td>None</td>
419
+ <td>Anyone</td>
420
+ <td>B</td>
421
+ <td>C</td>
422
+ <td>C</td>
423
+ <td>Subsequent retries use C, not B! Override with retry_auth=B if desired.</td>
424
+ </tr>
425
+ <tr>
426
+ <td>A</td>
427
+ <td>B</td>
428
+ <td>C</td>
429
+ <td>None</td>
430
+ <td>A</td>
431
+ <td>B</td>
432
+ <td>C</td>
433
+ <td>C</td>
434
+ <td>Simple override initial settings with inputstep resume_auth.</td>
435
+ </tr>
436
+ <tr>
437
+ <td>None</td>
438
+ <td>None</td>
439
+ <td>None</td>
440
+ <td>D</td>
441
+ <td>Anyone</td>
442
+ <td>Anyone</td>
443
+ <td>Anyone</td>
444
+ <td>D</td>
445
+ <td>Anyone can start or retry or resume, but limit retries to D once inputstep is reached.</td>
446
+ </tr>
447
+ <tr>
448
+ <td>A</td>
449
+ <td>None</td>
450
+ <td>None</td>
451
+ <td>D</td>
452
+ <td>A</td>
453
+ <td>A</td>
454
+ <td>A</td>
455
+ <td>D</td>
456
+ <td>A can start or retry or resume, but limit retries to D once inputstep is reached.</td>
457
+ </tr>
458
+ <tr>
459
+ <td>None</td>
460
+ <td>B</td>
461
+ <td>None</td>
462
+ <td>D</td>
463
+ <td>Anyone</td>
464
+ <td>B</td>
465
+ <td>Anyone</td>
466
+ <td>D</td>
467
+ <td>Anyone can start or resume, but only B can retry. After inputstep, only D can retry.</td>
468
+ </tr>
469
+ <tr>
470
+ <td>A</td>
471
+ <td>B</td>
472
+ <td>None</td>
473
+ <td>D</td>
474
+ <td>A</td>
475
+ <td>B</td>
476
+ <td>A</td>
477
+ <td>D</td>
478
+ <td>A can start or resume, but only B can retry. After inputstep, only D can retry.</td>
479
+ </tr>
480
+ <tr>
481
+ <td>None</td>
482
+ <td>None</td>
483
+ <td>C</td>
484
+ <td>D</td>
485
+ <td>Anyone</td>
486
+ <td>Anyone</td>
487
+ <td>C</td>
488
+ <td>D</td>
489
+ <td>Anyone can start, but only C can resume and only D can retry after the resume.</td>
490
+ </tr>
491
+ <tr>
492
+ <td>A</td>
493
+ <td>None</td>
494
+ <td>C</td>
495
+ <td>D</td>
496
+ <td>A</td>
497
+ <td>A</td>
498
+ <td>C</td>
499
+ <td>D</td>
500
+ <td></td>
501
+ </tr>
502
+ <tr>
503
+ <td>None</td>
504
+ <td>B</td>
505
+ <td>C</td>
506
+ <td>D</td>
507
+ <td>Anyone</td>
508
+ <td>B</td>
509
+ <td>C</td>
510
+ <td>D</td>
511
+ <td></td>
512
+ </tr>
513
+ <tr>
514
+ <td>A</td>
515
+ <td>B</td>
516
+ <td>C</td>
517
+ <td>D</td>
518
+ <td>A</td>
519
+ <td>B</td>
520
+ <td>C</td>
521
+ <td>D</td>
522
+ <td></td>
523
+ </tr>
524
+ </tbody>
525
+ </table>
526
+
527
+ ### Examples
528
+ Assume we have the following function that can be used to create callbacks:
529
+
530
+ ```python
531
+ def allow_roles(*roles) -> Callable[OIDCUserModel|None, bool]:
532
+ def f(user: OIDCUserModel) -> bool:
533
+ if is_admin(user): # Relative to your authorization provider
534
+ return True
535
+ for role in roles:
536
+ if has_role(user, role): # Relative to your authorization provider
537
+ return True
538
+ return False
539
+
540
+ return f
541
+ ```
542
+
543
+ We can now construct a variety of authorization policies.
544
+
545
+ #### Rubber Stamp Model
546
+ !!!example
547
+ Suppose we have a workflow W that needs to pause on inputstep `approval` for approval from finance. Ops (and only ops) should be able to start the workflow and retry any failed steps. Finance (and only finance) should be able to resume at the input step.
548
+
549
+ ```python
550
+ @workflow("An expensive workflow", auth=allow_roles("ops"))
551
+ def W(...):
552
+ return begin >> A >> ... >> notify_finance >> approval >> ... >> Z
553
+
554
+ @inputstep("Approval", resume_auth=allow_roles("finance"), retry_auth=allow_roles("ops"))
555
+ def approval(...):
556
+ ...
557
+ ```
558
+
559
+
560
+ #### Hand-off Model
561
+ !!!example
562
+ Suppose we have two teams, Dev and Platform, and a long workflow W that should be handed off to Platform at step `approval`.
563
+
564
+ Dev can start the workflow and retry steps prior to S. Once step S is reached, Platform (and only Platform) can resume the workflow and retry later failed steps.
565
+
566
+ ```python
567
+ @workflow("An expensive workflow", auth=allow_roles("dev"))
568
+ def W(...):
569
+ return begin >> A >> ... >> notify_platform >> handoff >> ... >> Z
570
+
571
+ @inputstep("Hand-off", resume_auth=allow_roles("platform"))
572
+ def handoff(...):
573
+ ...
574
+ ```
575
+ Notice that default behaviors let us ignore `retry_auth` arguments in both decorators.
576
+
577
+ #### Restricted Retries Model
578
+ !!!example
579
+ Suppose we have a workflow that anyone can run, but with steps that should only be retried by users with certain backend access.
580
+
581
+ ```python
582
+ @workflow("A workflow for any user", retry_auth=allow_roles("admin"))
583
+ def W(...):
584
+ return begin >> A >> ... >> S >> ... >> Z
585
+ ```
586
+
587
+ Note that we could specify `auth=allow_roles("user")` if helpful, or we can omit `auth` to fail open to any logged in user.
588
+
272
589
  [1]: https://github.com/workfloworchestrator/example-orchestrator-ui
273
590
  [2]: https://github.com/workfloworchestrator/example-orchestrator
274
591
  [3]: https://next-auth.js.org/
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "4.1.0rc1"
16
+ __version__ = "4.1.0rc2"
17
17
 
18
18
  from orchestrator.app import OrchestratorCore
19
19
  from orchestrator.settings import app_settings
@@ -25,7 +25,7 @@ from fastapi.param_functions import Body, Depends, Header
25
25
  from fastapi.routing import APIRouter
26
26
  from fastapi.websockets import WebSocket
27
27
  from fastapi_etag.dependency import CacheHit
28
- from more_itertools import chunked
28
+ from more_itertools import chunked, last
29
29
  from sentry_sdk.tracing import trace
30
30
  from sqlalchemy import CompoundSelect, Select, select
31
31
  from sqlalchemy.orm import defer, joinedload
@@ -56,6 +56,7 @@ from orchestrator.services.processes import (
56
56
  )
57
57
  from orchestrator.services.settings import get_engine_settings
58
58
  from orchestrator.settings import app_settings
59
+ from orchestrator.utils.auth import Authorizer
59
60
  from orchestrator.utils.enrich_process import enrich_process
60
61
  from orchestrator.websocket import (
61
62
  WS_CHANNELS,
@@ -63,7 +64,7 @@ from orchestrator.websocket import (
63
64
  broadcast_process_update_to_websocket,
64
65
  websocket_manager,
65
66
  )
66
- from orchestrator.workflow import ProcessStatus
67
+ from orchestrator.workflow import ProcessStat, ProcessStatus, StepList, Workflow
67
68
  from pydantic_forms.types import JSON, State
68
69
 
69
70
  router = APIRouter()
@@ -86,6 +87,48 @@ def check_global_lock() -> None:
86
87
  )
87
88
 
88
89
 
90
+ def get_current_steps(pstat: ProcessStat) -> StepList:
91
+ """Extract past and current steps from the ProcessStat."""
92
+ remaining_steps = pstat.log
93
+ past_steps = pstat.workflow.steps[: -len(remaining_steps)]
94
+ return StepList(past_steps + [pstat.log[0]])
95
+
96
+
97
+ def get_auth_callbacks(steps: StepList, workflow: Workflow) -> tuple[Authorizer | None, Authorizer | None]:
98
+ """Iterate over workflow and prior steps to determine correct authorization callbacks for the current step.
99
+
100
+ It's safest to always iterate through the steps. We could track these callbacks statefully
101
+ as we progress through the workflow, but if we fail a step and the system restarts, the previous
102
+ callbacks will be lost if they're only available in the process state.
103
+
104
+ Priority:
105
+ - RESUME callback is explicit RESUME callback, else previous START/RESUME callback
106
+ - RETRY callback is explicit RETRY, else explicit RESUME, else previous RETRY
107
+ """
108
+ # Default to workflow start callbacks
109
+ auth_resume = workflow.authorize_callback
110
+ # auth_retry defaults to the workflow start callback if not otherwise specified.
111
+ # A workflow SHOULD have both callbacks set to not-None. This enforces the correct default regardless.
112
+ auth_retry = workflow.retry_auth_callback or auth_resume # type: ignore[unreachable, truthy-function]
113
+
114
+ # Choose the most recently established value for resume.
115
+ auth_resume = last(filter(None, (step.resume_auth_callback for step in steps)), auth_resume)
116
+ # Choose the most recently established value for retry, unless there is a more recent value for resume.
117
+ auth_retry = last(
118
+ filter(None, (step.retry_auth_callback or step.resume_auth_callback for step in steps)), auth_retry
119
+ )
120
+ return auth_resume, auth_retry
121
+
122
+
123
+ def can_be_resumed(status: ProcessStatus) -> bool:
124
+ return status in (
125
+ ProcessStatus.SUSPENDED, # Can be resumed
126
+ ProcessStatus.FAILED, # Can be retried
127
+ ProcessStatus.API_UNAVAILABLE, # subtype of FAILED
128
+ ProcessStatus.INCONSISTENT_DATA, # subtype of FAILED
129
+ )
130
+
131
+
89
132
  def resolve_user_name(
90
133
  *,
91
134
  reporter: Reporter | None,
@@ -150,18 +193,25 @@ def new_process(
150
193
  dependencies=[Depends(check_global_lock, use_cache=False)],
151
194
  )
152
195
  def resume_process_endpoint(
153
- process_id: UUID, request: Request, json_data: JSON = Body(...), user: str = Depends(user_name)
196
+ process_id: UUID,
197
+ request: Request,
198
+ json_data: JSON = Body(...),
199
+ user: str = Depends(user_name),
200
+ user_model: OIDCUserModel | None = Depends(authenticate),
154
201
  ) -> None:
155
202
  process = _get_process(process_id)
156
203
 
157
- if process.last_status == ProcessStatus.COMPLETED:
158
- raise_status(HTTPStatus.CONFLICT, "Resuming a completed workflow is not possible")
159
-
160
- if process.last_status == ProcessStatus.RUNNING:
161
- raise_status(HTTPStatus.CONFLICT, "Resuming a running workflow is not possible")
162
-
163
- if process.last_status == ProcessStatus.RESUMED:
164
- raise_status(HTTPStatus.CONFLICT, "Resuming a resumed workflow is not possible")
204
+ if not can_be_resumed(process.last_status):
205
+ raise_status(HTTPStatus.CONFLICT, f"Resuming a {process.last_status.lower()} workflow is not possible")
206
+
207
+ pstat = load_process(process)
208
+ auth_resume, auth_retry = get_auth_callbacks(get_current_steps(pstat), pstat.workflow)
209
+ if process.last_status == ProcessStatus.SUSPENDED:
210
+ if auth_resume is not None and not auth_resume(user_model):
211
+ raise_status(HTTPStatus.FORBIDDEN, "User is not authorized to resume step")
212
+ elif process.last_status == ProcessStatus.FAILED:
213
+ if auth_retry is not None and not auth_retry(user_model):
214
+ raise_status(HTTPStatus.FORBIDDEN, "User is not authorized to retry step")
165
215
 
166
216
  broadcast_invalidate_status_counts()
167
217
  broadcast_func = api_broadcast_process_data(request)
@@ -19,6 +19,7 @@ import structlog
19
19
  from celery.result import AsyncResult
20
20
  from kombu.exceptions import ConnectionError, OperationalError
21
21
 
22
+ from oauth2_lib.fastapi import OIDCUserModel
22
23
  from orchestrator import app_settings
23
24
  from orchestrator.api.error_handling import raise_status
24
25
  from orchestrator.db import ProcessTable, db
@@ -42,7 +43,11 @@ def _block_when_testing(task_result: AsyncResult) -> None:
42
43
 
43
44
 
44
45
  def _celery_start_process(
45
- workflow_key: str, user_inputs: list[State] | None, user: str = SYSTEM_USER, **kwargs: Any
46
+ workflow_key: str,
47
+ user_inputs: list[State] | None,
48
+ user: str = SYSTEM_USER,
49
+ user_model: OIDCUserModel | None = None,
50
+ **kwargs: Any,
46
51
  ) -> UUID:
47
52
  """Client side call of Celery."""
48
53
  from orchestrator.services.tasks import NEW_TASK, NEW_WORKFLOW, get_celery_task
@@ -57,7 +62,7 @@ def _celery_start_process(
57
62
 
58
63
  task_name = NEW_TASK if wf_table.is_task else NEW_WORKFLOW
59
64
  trigger_task = get_celery_task(task_name)
60
- pstat = create_process(workflow_key, user_inputs, user)
65
+ pstat = create_process(workflow_key, user_inputs=user_inputs, user=user, user_model=user_model)
61
66
  try:
62
67
  result = trigger_task.delay(pstat.process_id, workflow_key, user)
63
68
  _block_when_testing(result)
@@ -467,9 +467,7 @@ def thread_start_process(
467
467
  user_model: OIDCUserModel | None = None,
468
468
  broadcast_func: BroadcastFunc | None = None,
469
469
  ) -> UUID:
470
- pstat = create_process(workflow_key, user_inputs=user_inputs, user=user)
471
- if not pstat.workflow.authorize_callback(user_model):
472
- raise_status(HTTPStatus.FORBIDDEN, error_message_unauthorized(workflow_key))
470
+ pstat = create_process(workflow_key, user_inputs=user_inputs, user=user, user_model=user_model)
473
471
 
474
472
  _safe_logstep_with_func = partial(safe_logstep, broadcast_func=broadcast_func)
475
473
  return _run_process_async(pstat.process_id, lambda: runwf(pstat, _safe_logstep_with_func))
@@ -506,7 +504,6 @@ def thread_resume_process(
506
504
  *,
507
505
  user_inputs: list[State] | None = None,
508
506
  user: str | None = None,
509
- user_model: OIDCUserModel | None = None,
510
507
  broadcast_func: BroadcastFunc | None = None,
511
508
  ) -> UUID:
512
509
  # ATTENTION!! When modifying this function make sure you make similar changes to `resume_workflow` in the test code
@@ -515,8 +512,6 @@ def thread_resume_process(
515
512
  user_inputs = [{}]
516
513
 
517
514
  pstat = load_process(process)
518
- if not pstat.workflow.authorize_callback(user_model):
519
- raise_status(HTTPStatus.FORBIDDEN, error_message_unauthorized(str(process.workflow_name)))
520
515
 
521
516
  if pstat.workflow == removed_workflow:
522
517
  raise ValueError("This workflow cannot be resumed")
@@ -556,7 +551,6 @@ def resume_process(
556
551
  *,
557
552
  user_inputs: list[State] | None = None,
558
553
  user: str | None = None,
559
- user_model: OIDCUserModel | None = None,
560
554
  broadcast_func: BroadcastFunc | None = None,
561
555
  ) -> UUID:
562
556
  """Resume a failed or suspended process.
@@ -565,7 +559,6 @@ def resume_process(
565
559
  process: Process from database
566
560
  user_inputs: Optional user input from forms
567
561
  user: user who resumed this process
568
- user_model: OIDCUserModel of user who resumed this process
569
562
  broadcast_func: Optional function to broadcast process data
570
563
 
571
564
  Returns:
@@ -573,8 +566,6 @@ def resume_process(
573
566
 
574
567
  """
575
568
  pstat = load_process(process)
576
- if not pstat.workflow.authorize_callback(user_model):
577
- raise_status(HTTPStatus.FORBIDDEN, error_message_unauthorized(str(process.workflow_name)))
578
569
 
579
570
  try:
580
571
  post_form(pstat.log[0].form, pstat.state.unwrap(), user_inputs=user_inputs or [])
@@ -0,0 +1,9 @@
1
+ from collections.abc import Callable
2
+ from typing import TypeAlias
3
+
4
+ from oauth2_lib.fastapi import OIDCUserModel
5
+
6
+ # This file is broken out separately to avoid circular imports.
7
+
8
+ # Can instead use "type Authorizer = ..." in later Python versions.
9
+ Authorizer: TypeAlias = Callable[[OIDCUserModel | None], bool]
@@ -45,6 +45,7 @@ from orchestrator.db import db, transactional
45
45
  from orchestrator.services.settings import get_engine_settings
46
46
  from orchestrator.targets import Target
47
47
  from orchestrator.types import ErrorDict, StepFunc
48
+ from orchestrator.utils.auth import Authorizer
48
49
  from orchestrator.utils.docs import make_workflow_doc
49
50
  from orchestrator.utils.errors import error_state_to_dict
50
51
  from orchestrator.utils.state import form_inject_args, inject_args
@@ -80,6 +81,8 @@ class Step(Protocol):
80
81
  name: str
81
82
  form: InputFormGenerator | None
82
83
  assignee: Assignee | None
84
+ resume_auth_callback: Authorizer | None = None
85
+ retry_auth_callback: Authorizer | None = None
83
86
 
84
87
  def __call__(self, state: State) -> Process: ...
85
88
 
@@ -90,7 +93,8 @@ class Workflow(Protocol):
90
93
  __qualname__: str
91
94
  name: str
92
95
  description: str
93
- authorize_callback: Callable[[OIDCUserModel | None], bool]
96
+ authorize_callback: Authorizer
97
+ retry_auth_callback: Authorizer
94
98
  initial_input_form: InputFormGenerator | None = None
95
99
  target: Target
96
100
  steps: StepList
@@ -99,13 +103,20 @@ class Workflow(Protocol):
99
103
 
100
104
 
101
105
  def make_step_function(
102
- f: Callable, name: str, form: InputFormGenerator | None = None, assignee: Assignee | None = Assignee.SYSTEM
106
+ f: Callable,
107
+ name: str,
108
+ form: InputFormGenerator | None = None,
109
+ assignee: Assignee | None = Assignee.SYSTEM,
110
+ resume_auth_callback: Authorizer | None = None,
111
+ retry_auth_callback: Authorizer | None = None,
103
112
  ) -> Step:
104
113
  step_func = cast(Step, f)
105
114
 
106
115
  step_func.name = name
107
116
  step_func.form = form
108
117
  step_func.assignee = assignee
118
+ step_func.resume_auth_callback = resume_auth_callback
119
+ step_func.retry_auth_callback = retry_auth_callback
109
120
  return step_func
110
121
 
111
122
 
@@ -167,6 +178,7 @@ class StepList(list[Step]):
167
178
 
168
179
 
169
180
  def _handle_simple_input_form_generator(f: StateInputStepFunc) -> StateInputFormGenerator:
181
+ """Processes f into a form generator and injects a pre-hook for user authorization."""
170
182
  if inspect.isgeneratorfunction(f):
171
183
  return cast(StateInputFormGenerator, f)
172
184
  if inspect.isgenerator(f):
@@ -191,7 +203,8 @@ def make_workflow(
191
203
  initial_input_form: InputStepFunc | None,
192
204
  target: Target,
193
205
  steps: StepList,
194
- authorize_callback: Callable[[OIDCUserModel | None], bool] | None = None,
206
+ authorize_callback: Authorizer | None = None,
207
+ retry_auth_callback: Authorizer | None = None,
195
208
  ) -> Workflow:
196
209
  @functools.wraps(f)
197
210
  def wrapping_function() -> NoReturn:
@@ -202,6 +215,10 @@ def make_workflow(
202
215
  wrapping_function.name = f.__name__ # default, will be changed by LazyWorkflowInstance
203
216
  wrapping_function.description = description
204
217
  wrapping_function.authorize_callback = allow if authorize_callback is None else authorize_callback
218
+ # If no retry auth policy is given, defer to policy for process creation.
219
+ wrapping_function.retry_auth_callback = (
220
+ wrapping_function.authorize_callback if retry_auth_callback is None else retry_auth_callback
221
+ )
205
222
 
206
223
  if initial_input_form is None:
207
224
  # We always need a form to prevent starting a workflow when no input is needed.
@@ -270,9 +287,16 @@ def retrystep(name: str) -> Callable[[StepFunc], Step]:
270
287
  return decorator
271
288
 
272
289
 
273
- def inputstep(name: str, assignee: Assignee) -> Callable[[InputStepFunc], Step]:
290
+ def inputstep(
291
+ name: str,
292
+ assignee: Assignee,
293
+ resume_auth_callback: Authorizer | None = None,
294
+ retry_auth_callback: Authorizer | None = None,
295
+ ) -> Callable[[InputStepFunc], Step]:
274
296
  """Add user input step to workflow.
275
297
 
298
+ Any authorization callbacks will be attached to the resulting Step.
299
+
276
300
  IMPORTANT: In contrast to other workflow steps, the `@inputstep` wrapped function will not run in the
277
301
  workflow engine! This means that it must be free of side effects!
278
302
 
@@ -299,7 +323,14 @@ def inputstep(name: str, assignee: Assignee) -> Callable[[InputStepFunc], Step]:
299
323
  def suspend(state: State) -> Process:
300
324
  return Suspend(state)
301
325
 
302
- return make_step_function(suspend, name, wrapper, assignee)
326
+ return make_step_function(
327
+ suspend,
328
+ name,
329
+ wrapper,
330
+ assignee,
331
+ resume_auth_callback=resume_auth_callback,
332
+ retry_auth_callback=retry_auth_callback,
333
+ )
303
334
 
304
335
  return decorator
305
336
 
@@ -479,7 +510,8 @@ def workflow(
479
510
  description: str,
480
511
  initial_input_form: InputStepFunc | None = None,
481
512
  target: Target = Target.SYSTEM,
482
- authorize_callback: Callable[[OIDCUserModel | None], bool] | None = None,
513
+ authorize_callback: Authorizer | None = None,
514
+ retry_auth_callback: Authorizer | None = None,
483
515
  ) -> Callable[[Callable[[], StepList]], Workflow]:
484
516
  """Transform an initial_input_form and a step list into a workflow.
485
517
 
@@ -500,7 +532,13 @@ def workflow(
500
532
 
501
533
  def _workflow(f: Callable[[], StepList]) -> Workflow:
502
534
  return make_workflow(
503
- f, description, initial_input_form_in_form_inject_args, target, f(), authorize_callback=authorize_callback
535
+ f,
536
+ description,
537
+ initial_input_form_in_form_inject_args,
538
+ target,
539
+ f(),
540
+ authorize_callback=authorize_callback,
541
+ retry_auth_callback=retry_auth_callback,
504
542
  )
505
543
 
506
544
  return _workflow