orchestrator-core 2.9.1rc1__tar.gz → 2.9.2rc2__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 (629) hide show
  1. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.bumpversion.cfg +1 -1
  2. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/run-unit-tests.yml +1 -1
  3. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/PKG-INFO +1 -1
  4. orchestrator_core-2.9.2rc2/docs/architecture/product_modelling/backfilling.md +77 -0
  5. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/mkdocs.yml +1 -0
  6. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/__init__.py +1 -1
  7. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/processes.py +1 -1
  8. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/subscription_customer_descriptions.py +9 -2
  9. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/subscription.py +1 -0
  10. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/models.py +2 -0
  11. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/devtools/populator.py +18 -5
  12. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/domain/base.py +6 -0
  13. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/domain/customer_description.py +9 -1
  14. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/mutations/customer_description.py +7 -4
  15. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/subscription.py +1 -0
  16. orchestrator_core-2.9.2rc2/orchestrator/migrations/versions/schema/2025-01-08_4c5859620539_add_version_column_to_subscription.py +64 -0
  17. orchestrator_core-2.9.2rc2/orchestrator/migrations/versions/schema/2025-10-19_4fjdn13f83ga_add_validate_product_type_task.py +41 -0
  18. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schedules/validate_subscriptions.py +16 -23
  19. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/subscription.py +1 -0
  20. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/subscription_descriptions.py +8 -0
  21. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/subscriptions.py +10 -0
  22. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/workflows.py +47 -1
  23. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/enrich_process.py +1 -0
  24. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/errors.py +8 -0
  25. orchestrator_core-2.9.2rc2/orchestrator/utils/validate_data_version.py +2 -0
  26. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/__init__.py +1 -0
  27. orchestrator_core-2.9.2rc2/orchestrator/workflows/tasks/validate_product_type.py +92 -0
  28. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/translations/en-GB.json +4 -1
  29. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/utils.py +15 -3
  30. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_processes.py +48 -0
  31. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_subscription_customer_descriptions.py +55 -0
  32. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_subscriptions.py +2 -0
  33. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/domain/test_base.py +2 -1
  34. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/mutations/test_customer_description.py +85 -2
  35. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_subscriptions.py +36 -2
  36. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_workflows.py +22 -10
  37. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/services/test_subscriptions.py +1 -0
  38. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/test_db.py +1 -1
  39. orchestrator_core-2.9.2rc2/test/unit_tests/workflows/tasks/test_validate_product_type.py +39 -0
  40. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.coveragerc +0 -0
  41. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  42. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  43. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/dependabot.yml +0 -0
  44. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/README.md +0 -0
  45. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/build-push-container.yml +0 -0
  46. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/changelog.yml +0 -0
  47. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/codeql-analysis.yml +0 -0
  48. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/gh-pages.yml +0 -0
  49. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/issues.yml +0 -0
  50. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/publish-package.yml +0 -0
  51. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/run-linting-tests.yml +0 -0
  52. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.github/workflows/scheduled-build.yml +0 -0
  53. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.gitignore +0 -0
  54. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.pre-commit-config.yaml +0 -0
  55. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/.stignore +0 -0
  56. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/CHANGELOG.md +0 -0
  57. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/Dockerfile +0 -0
  58. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/LICENSE +0 -0
  59. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/NOTICE +0 -0
  60. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/README.md +0 -0
  61. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/codecov.yml +0 -0
  62. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/application/domainmodels.md +0 -0
  63. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/application/forms-frontend.md +0 -0
  64. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/application/tasks.md +0 -0
  65. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/application/workflow.md +0 -0
  66. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/framework.md +0 -0
  67. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/img/base-orchestrator-setup.png +0 -0
  68. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/img/custom-orchestrator-setup.png +0 -0
  69. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/orchestration/img/Custom-orchestrator-ui-using-override.png +0 -0
  70. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/orchestration/img/Standard-orchestrator-ui.png +0 -0
  71. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/orchestration/orchestrator-ui.md +0 -0
  72. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/orchestration/philosophy.md +0 -0
  73. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/context.md +0 -0
  74. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/imports.md +0 -0
  75. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/introduction.md +0 -0
  76. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/ip_static.md +0 -0
  77. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/ip_static.png +0 -0
  78. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/l2_point_to_point.md +0 -0
  79. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/l2_point_to_point.png +0 -0
  80. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/l2_vpn.md +0 -0
  81. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/l2_vpn.png +0 -0
  82. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/modelling.md +0 -0
  83. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/node.md +0 -0
  84. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/node.png +0 -0
  85. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/port.md +0 -0
  86. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/port.png +0 -0
  87. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/product_block_graph.md +0 -0
  88. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/product_block_graph.png +0 -0
  89. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/standards.md +0 -0
  90. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/product_modelling/terminology.md +0 -0
  91. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/architecture/tldr.md +0 -0
  92. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/contributing/development.md +0 -0
  93. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/contributing/guidelines.md +0 -0
  94. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/contributing/testing.md +0 -0
  95. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/css/custom.css +0 -0
  96. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/css/style.css +0 -0
  97. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/css/termynal.css +0 -0
  98. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/getting-started/base.md +0 -0
  99. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/getting-started/docker.md +0 -0
  100. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/getting-started/orchestration-ui.md +0 -0
  101. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/getting-started/prepare-source-folder.md +0 -0
  102. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/getting-started/versions.md +0 -0
  103. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/img/WFO-Emblem-White.png +0 -0
  104. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/img/favicon.ico +0 -0
  105. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/index.md +0 -0
  106. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/js/custom.js +0 -0
  107. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/js/termynal.js +0 -0
  108. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/migration-guide/2.0.md +0 -0
  109. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/api.md +0 -0
  110. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/app/app.md +0 -0
  111. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/app/scaling.md +0 -0
  112. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/auth-backend-and-frontend.md +0 -0
  113. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/cli.md +0 -0
  114. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/database.md +0 -0
  115. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/generator.md +0 -0
  116. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/instantiating.md +0 -0
  117. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/model_attributes.md +0 -0
  118. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/overview.md +0 -0
  119. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/product_blocks.md +0 -0
  120. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/product_types.md +0 -0
  121. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/properties.md +0 -0
  122. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/pydantic_hooks.md +0 -0
  123. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/type_casting.md +0 -0
  124. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/union_types.md +0 -0
  125. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/domain_models/validation.md +0 -0
  126. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/forms.md +0 -0
  127. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/graphql.md +0 -0
  128. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/python.md +0 -0
  129. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/search.md +0 -0
  130. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/search_overview.png +0 -0
  131. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/serialization.md +0 -0
  132. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/tasks.md +0 -0
  133. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/tests.md +0 -0
  134. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/tldr.md +0 -0
  135. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/websockets.md +0 -0
  136. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/workflows/callbacks.md +0 -0
  137. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/workflows/workflow-lifecycles.md +0 -0
  138. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/reference-docs/workflows/workflow-steps.md +0 -0
  139. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/bootstrap.md +0 -0
  140. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/create-your-own.md +0 -0
  141. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/docker-installation.md +0 -0
  142. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/domain-models.md +0 -0
  143. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/execute-workflows.md +0 -0
  144. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/generator.md +0 -0
  145. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/l2_point_to_point.png +0 -0
  146. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/node-create.md +0 -0
  147. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/node-modify.md +0 -0
  148. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/node-terminate.md +0 -0
  149. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/node-validate.md +0 -0
  150. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/overview.md +0 -0
  151. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/scenario.md +0 -0
  152. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/workflow-basics.md +0 -0
  153. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/advanced/workflow-introduction.md +0 -0
  154. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/create-user-group.md +0 -0
  155. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/create-user.md +0 -0
  156. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/database-migration.md +0 -0
  157. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/debian.md +0 -0
  158. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/docker.md +0 -0
  159. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/domain-models.md +0 -0
  160. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/explore.md +0 -0
  161. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/input-forms.md +0 -0
  162. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/macos.md +0 -0
  163. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/modify-user-group.md +0 -0
  164. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/modify-user.md +0 -0
  165. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/register-workflows.md +0 -0
  166. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/start-applications.md +0 -0
  167. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/terminate-user-group.md +0 -0
  168. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/terminate-user.md +0 -0
  169. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/workflow-introduction.md +0 -0
  170. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/beginner/workshop-overview.md +0 -0
  171. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/images/Software-topology.drawio.png +0 -0
  172. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/images/clab_topology.png +0 -0
  173. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/images/metadata_products.png +0 -0
  174. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/images/netbox_devices_active.png +0 -0
  175. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/images/subscriptions.png +0 -0
  176. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/docs/workshops/images/topology.drawio.png +0 -0
  177. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/includes/abbreviations.md +0 -0
  178. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/mutmut_config.py +0 -0
  179. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/nitpick-style.toml +0 -0
  180. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/__init__.py +0 -0
  181. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/__init__.py +0 -0
  182. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/api.py +0 -0
  183. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/__init__.py +0 -0
  184. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/health.py +0 -0
  185. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/products.py +0 -0
  186. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/settings.py +0 -0
  187. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/subscriptions.py +0 -0
  188. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/translations.py +0 -0
  189. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/user.py +0 -0
  190. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/api_v1/endpoints/ws.py +0 -0
  191. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/error_handling.py +0 -0
  192. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/helpers.py +0 -0
  193. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/api/models.py +0 -0
  194. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/app.py +0 -0
  195. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/__init__.py +0 -0
  196. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/database.py +0 -0
  197. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/domain_gen_helpers/__init__.py +0 -0
  198. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/domain_gen_helpers/fixed_input_helpers.py +0 -0
  199. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/domain_gen_helpers/helpers.py +0 -0
  200. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/domain_gen_helpers/product_block_helpers.py +0 -0
  201. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/domain_gen_helpers/product_helpers.py +0 -0
  202. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/domain_gen_helpers/resource_type_helpers.py +0 -0
  203. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/domain_gen_helpers/types.py +0 -0
  204. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generate.py +0 -0
  205. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/__init__.py +0 -0
  206. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/README +0 -0
  207. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_create_imports.j2 +0 -0
  208. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_create_input_fields.j2 +0 -0
  209. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_create_steps.j2 +0 -0
  210. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_modify_imports.j2 +0 -0
  211. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_modify_input_fields.j2 +0 -0
  212. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_modify_steps.j2 +0 -0
  213. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_imports.j2 +0 -0
  214. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_input_fields.j2 +0 -0
  215. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/custom_templates/additional_terminate_steps.j2 +0 -0
  216. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/__init__.py +0 -0
  217. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/enums.py +0 -0
  218. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/helpers.py +0 -0
  219. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/migration.py +0 -0
  220. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/product.py +0 -0
  221. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/product_block.py +0 -0
  222. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/settings.py +0 -0
  223. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/translations.py +0 -0
  224. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/unittest.py +0 -0
  225. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/validations.py +0 -0
  226. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/generator/workflow.py +0 -0
  227. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/products/workshop/circuit.yaml +0 -0
  228. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/products/workshop/node.yaml +0 -0
  229. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/products/workshop/user.yaml +0 -0
  230. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/products/workshop/user_group.yaml +0 -0
  231. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/additional_create_imports.j2 +0 -0
  232. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/additional_create_steps.j2 +0 -0
  233. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/additional_modify_imports.j2 +0 -0
  234. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/additional_modify_steps.j2 +0 -0
  235. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/additional_terminate_steps.j2 +0 -0
  236. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/constrained_int_definitions.j2 +0 -0
  237. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/create_data_head.j2 +0 -0
  238. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/create_product.j2 +0 -0
  239. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/enums.j2 +0 -0
  240. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/lazy_workflow_instance.j2 +0 -0
  241. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/list_definitions.j2 +0 -0
  242. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/macros.j2 +0 -0
  243. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/modify_product.j2 +0 -0
  244. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/new_product_migration.j2 +0 -0
  245. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/product.j2 +0 -0
  246. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/product_block.j2 +0 -0
  247. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/shared_forms.j2 +0 -0
  248. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/shared_workflows.j2 +0 -0
  249. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/subscription_model_registry.j2 +0 -0
  250. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/terminate_product.j2 +0 -0
  251. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/test_create_workflow.j2 +0 -0
  252. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/test_modify_workflow.j2 +0 -0
  253. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/test_product_type.j2 +0 -0
  254. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/test_terminate_workflow.j2 +0 -0
  255. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/test_validate_workflow.j2 +0 -0
  256. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/generator/templates/validate_product.j2 +0 -0
  257. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/helpers/__init__.py +0 -0
  258. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/helpers/input_helpers.py +0 -0
  259. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/helpers/print_helpers.py +0 -0
  260. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/main.py +0 -0
  261. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/migrate_domain_models.py +0 -0
  262. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/migrate_workflows.py +0 -0
  263. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/migration_helpers.py +0 -0
  264. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/cli/scheduler.py +0 -0
  265. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/config/__init__.py +0 -0
  266. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/config/assignee.py +0 -0
  267. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/__init__.py +0 -0
  268. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/database.py +0 -0
  269. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/__init__.py +0 -0
  270. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/filters.py +0 -0
  271. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/process.py +0 -0
  272. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/product.py +0 -0
  273. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/product_block.py +0 -0
  274. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/resource_type.py +0 -0
  275. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/search_filters/__init__.py +0 -0
  276. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/search_filters/inferred_filter.py +0 -0
  277. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/filters/workflow.py +0 -0
  278. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/helpers.py +0 -0
  279. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/listeners.py +0 -0
  280. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/loaders.py +0 -0
  281. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/range/__init__.py +0 -0
  282. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/range/range.py +0 -0
  283. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/__init__.py +0 -0
  284. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/process.py +0 -0
  285. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/product.py +0 -0
  286. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/product_block.py +0 -0
  287. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/resource_type.py +0 -0
  288. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/sorting.py +0 -0
  289. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/subscription.py +0 -0
  290. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/db/sorting/workflow.py +0 -0
  291. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/devtools/__init__.py +0 -0
  292. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/devtools/scripts/__init__.py +0 -0
  293. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/devtools/scripts/migrate_20.py +0 -0
  294. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/distlock/__init__.py +0 -0
  295. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/distlock/distlock_manager.py +0 -0
  296. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/distlock/managers/__init__.py +0 -0
  297. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/distlock/managers/memory_distlock_manager.py +0 -0
  298. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/distlock/managers/redis_distlock_manager.py +0 -0
  299. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/domain/__init__.py +0 -0
  300. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/domain/helpers.py +0 -0
  301. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/domain/lifecycle.py +0 -0
  302. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/exception_handlers.py +0 -0
  303. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/forms/__init__.py +0 -0
  304. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/forms/validators/__init__.py +0 -0
  305. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/forms/validators/customer_contact_list.py +0 -0
  306. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/forms/validators/customer_id.py +0 -0
  307. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/forms/validators/display_subscription.py +0 -0
  308. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/forms/validators/network_type_validators.py +0 -0
  309. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/forms/validators/product_id.py +0 -0
  310. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/__init__.py +0 -0
  311. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/autoregistration.py +0 -0
  312. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/extensions/__init__.py +0 -0
  313. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/extensions/stats.py +0 -0
  314. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/loaders/__init__.py +0 -0
  315. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/loaders/subscriptions.py +0 -0
  316. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/mutations/start_process.py +0 -0
  317. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/pagination.py +0 -0
  318. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/__init__.py +0 -0
  319. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/customer.py +0 -0
  320. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/helpers.py +0 -0
  321. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/process.py +0 -0
  322. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/product.py +0 -0
  323. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/product_block.py +0 -0
  324. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/resource_type.py +0 -0
  325. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/settings.py +0 -0
  326. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/subscription.py +0 -0
  327. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/resolvers/workflow.py +0 -0
  328. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schema.py +0 -0
  329. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/__init__.py +0 -0
  330. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/customer.py +0 -0
  331. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/customer_description.py +0 -0
  332. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/errors.py +0 -0
  333. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/fixed_input.py +0 -0
  334. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/helpers.py +0 -0
  335. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/process.py +0 -0
  336. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/product.py +0 -0
  337. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/product_block.py +0 -0
  338. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/resource_type.py +0 -0
  339. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/settings.py +0 -0
  340. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/strawberry_pydantic_patch.py +0 -0
  341. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/schemas/workflow.py +0 -0
  342. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/types.py +0 -0
  343. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/__init__.py +0 -0
  344. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/create_resolver_error_handler.py +0 -0
  345. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/get_query_loaders.py +0 -0
  346. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/get_selected_fields.py +0 -0
  347. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/get_selected_paths.py +0 -0
  348. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/get_subscription_product_blocks.py +0 -0
  349. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/is_query_detailed.py +0 -0
  350. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/override_class.py +0 -0
  351. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/graphql/utils/to_graphql_result_page.py +0 -0
  352. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/log_config.py +0 -0
  353. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/README +0 -0
  354. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/alembic.ini +0 -0
  355. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/env.py +0 -0
  356. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/helpers.py +0 -0
  357. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/script.py.mako +0 -0
  358. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/templates/alembic.ini.j2 +0 -0
  359. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/templates/env.py.j2 +0 -0
  360. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/templates/helpers.py.j2 +0 -0
  361. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2020-10-19_3323bcb934e7_fix_tsv_triggers.py +0 -0
  362. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2020-10-19_a76b9185b334_add_generic_workflows_to_core.py +0 -0
  363. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2020-10-19_c112305b07d3_initial_schema_migration.py +0 -0
  364. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2021-04-06_3c8b9185c221_add_validate_products_task.py +0 -0
  365. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2021-07-01_6896a54e9483_add_product_block_relations.py +0 -0
  366. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2021-11-17_19cdd3ab86f6_fix_parse_websearch.py +0 -0
  367. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2022-02-16_bed6bc0b197a_rename_parent_and_child_block_relations.py +0 -0
  368. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-03-06_e05bb1967eff_add_subscriptions_search_view.py +0 -0
  369. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-05-25_b1970225392d_add_subscription_metadata_workflow.py +0 -0
  370. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.py +0 -0
  371. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-06-28_a09ac125ea73_add_throttling_to_refresh_subscriptions.sql +0 -0
  372. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.py +0 -0
  373. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-07-17_165303a20fb1_customer_id_to_varchar.sql +0 -0
  374. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.py +0 -0
  375. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-09-25_da5c9f4cce1c_add_subscription_metadata_to_fulltext_.sql +0 -0
  376. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2023-12-06_048219045729_add_workflow_id_to_processes_table.py +0 -0
  377. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.py +0 -0
  378. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/migrations/versions/schema/2024-09-27_460ec6748e37_add_uuid_search_workaround.sql +0 -0
  379. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/py.typed +0 -0
  380. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schedules/__init__.py +0 -0
  381. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schedules/resume_workflows.py +0 -0
  382. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schedules/scheduling.py +0 -0
  383. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schedules/task_vacuum.py +0 -0
  384. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schedules/validate_products.py +0 -0
  385. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/__init__.py +0 -0
  386. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/base.py +0 -0
  387. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/engine_settings.py +0 -0
  388. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/fixed_input.py +0 -0
  389. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/problem_detail.py +0 -0
  390. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/process.py +0 -0
  391. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/product.py +0 -0
  392. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/product_block.py +0 -0
  393. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/resource_type.py +0 -0
  394. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/schemas/workflow.py +0 -0
  395. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/security.py +0 -0
  396. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/__init__.py +0 -0
  397. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/celery.py +0 -0
  398. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/fixed_inputs.py +0 -0
  399. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/process_broadcast_thread.py +0 -0
  400. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/processes.py +0 -0
  401. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/products.py +0 -0
  402. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/resource_types.py +0 -0
  403. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/settings.py +0 -0
  404. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/subscription_relations.py +0 -0
  405. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/tasks.py +0 -0
  406. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/services/translations.py +0 -0
  407. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/settings.py +0 -0
  408. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/targets.py +0 -0
  409. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/types.py +0 -0
  410. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/__init__.py +0 -0
  411. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/crypt.py +0 -0
  412. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/datetime.py +0 -0
  413. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/deprecation_logger.py +0 -0
  414. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/docs.py +0 -0
  415. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/fixed_inputs.py +0 -0
  416. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/functional.py +0 -0
  417. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/get_subscription_dict.py +0 -0
  418. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/get_updated_properties.py +0 -0
  419. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/helpers.py +0 -0
  420. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/json.py +0 -0
  421. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/redis.py +0 -0
  422. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/search_query.py +0 -0
  423. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/state.py +0 -0
  424. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/utils/strings.py +0 -0
  425. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/version.py +0 -0
  426. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/websocket/__init__.py +0 -0
  427. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/websocket/managers/broadcast_websocket_manager.py +0 -0
  428. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/websocket/managers/memory_websocket_manager.py +0 -0
  429. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/websocket/websocket_manager.py +0 -0
  430. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflow.py +0 -0
  431. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/modify_note.py +0 -0
  432. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/removed_workflow.py +0 -0
  433. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/steps.py +0 -0
  434. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/tasks/__init__.py +0 -0
  435. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/tasks/cleanup_tasks_log.py +0 -0
  436. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/tasks/resume_workflows.py +0 -0
  437. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/orchestrator/workflows/tasks/validate_products.py +0 -0
  438. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/pyproject.toml +0 -0
  439. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/setup.cfg +0 -0
  440. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/setup.py +0 -0
  441. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/__init__.py +0 -0
  442. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/__init__.py +0 -0
  443. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/conftest.py +0 -0
  444. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/__init__.py +0 -0
  445. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/__init__.py +0 -0
  446. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/devtools/populator/test_product_populator.py +0 -0
  447. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/main.py +0 -0
  448. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/__init__.py +0 -0
  449. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/product_blocks/test_product_blocks.py +0 -0
  450. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/products/__init__.py +0 -0
  451. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/products/test_product.py +0 -0
  452. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/workflows/__init__.py +0 -0
  453. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/fixtures/test_orchestrator/workflows/create_test_product.py +0 -0
  454. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/acceptance_tests/test_test_product.py +0 -0
  455. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/__init__.py +0 -0
  456. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/__init__.py +0 -0
  457. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_caching.py +0 -0
  458. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_health.py +0 -0
  459. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_helpers.py +0 -0
  460. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_models.py +0 -0
  461. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_processes_ws.py +0 -0
  462. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_product_blocks.py +0 -0
  463. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_products.py +0 -0
  464. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_settings.py +0 -0
  465. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/api/test_ws.py +0 -0
  466. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/__init__.py +0 -0
  467. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/conftest.py +0 -0
  468. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/alembic.ini +0 -0
  469. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/main.py +0 -0
  470. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/migrations/env.py +0 -0
  471. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/migrations/helpers.py +0 -0
  472. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/migrations/script.py.mako +0 -0
  473. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_59e1199aff7f_create_data_head.py +0 -0
  474. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_85be1c80731c_add_example2.py +0 -0
  475. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-02-20_ea9e6c9de75c_add_example1.py +0 -0
  476. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/migrations/versions/schema/2024-06-07_380a5b0c928c_add_example4.py +0 -0
  477. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/__init__.py +0 -0
  478. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_blocks/__init__.py +0 -0
  479. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example1.py +0 -0
  480. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example2.py +0 -0
  481. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example4.py +0 -0
  482. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_blocks/example4sub.py +0 -0
  483. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_types/__init__.py +0 -0
  484. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_types/example1.py +0 -0
  485. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_types/example2.py +0 -0
  486. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/products/product_types/example4.py +0 -0
  487. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example1.py +0 -0
  488. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example2.py +0 -0
  489. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/domain/product_types/test_example4.py +0 -0
  490. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_create_example1.py +0 -0
  491. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_modify_example1.py +0 -0
  492. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_terminate_example1.py +0 -0
  493. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example1/test_validate_example1.py +0 -0
  494. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_create_example2.py +0 -0
  495. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_modify_example2.py +0 -0
  496. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_terminate_example2.py +0 -0
  497. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example2/test_validate_example2.py +0 -0
  498. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_create_example4.py +0 -0
  499. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_modify_example4.py +0 -0
  500. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_terminate_example4.py +0 -0
  501. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/test/unit_tests/workflows/example4/test_validate_example4.py +0 -0
  502. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/translations/en-GB.json +0 -0
  503. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/__init__.py +0 -0
  504. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example1/create_example1.py +0 -0
  505. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example1/modify_example1.py +0 -0
  506. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example1/shared/forms.py +0 -0
  507. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example1/terminate_example1.py +0 -0
  508. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example1/validate_example1.py +0 -0
  509. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example2/create_example2.py +0 -0
  510. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example2/modify_example2.py +0 -0
  511. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example2/shared/forms.py +0 -0
  512. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example2/terminate_example2.py +0 -0
  513. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example4/create_example4.py +0 -0
  514. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example4/modify_example4.py +0 -0
  515. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example4/shared/forms.py +0 -0
  516. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/example4/terminate_example4.py +0 -0
  517. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate/workflows/shared.py +0 -0
  518. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/generate.sh +0 -0
  519. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/invalid_product_config1.yaml +0 -0
  520. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/invalid_product_config2.yaml +0 -0
  521. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/product_config1.yaml +0 -0
  522. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/product_config2.yaml +0 -0
  523. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/product_config3.yaml +0 -0
  524. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/data/product_config4.yaml +0 -0
  525. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/generator/__init__.py +0 -0
  526. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/generator/test_enums.py +0 -0
  527. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/helpers.py +0 -0
  528. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/test_cli_generate.py +0 -0
  529. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/test_config_validation.py +0 -0
  530. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/test_generate_code.py +0 -0
  531. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/test_migrate_domain_models_with_instances.py +0 -0
  532. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/cli/test_migrate_domain_models_without_instances.py +0 -0
  533. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/config.py +0 -0
  534. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/conftest.py +0 -0
  535. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/db/__init__.py +0 -0
  536. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/db/test_listeners.py +0 -0
  537. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/domain/__init__.py +0 -0
  538. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/domain/test_base_multiple.py +0 -0
  539. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/domain/test_base_with_list_union.py +0 -0
  540. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/domain/test_base_with_union.py +0 -0
  541. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/domain/test_lifecycle.py +0 -0
  542. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/__init__.py +0 -0
  543. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/processes.py +0 -0
  544. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/__init__.py +0 -0
  545. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/__init__.py +0 -0
  546. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_list_nested.py +0 -0
  547. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_one.py +0 -0
  548. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_one_nested.py +0 -0
  549. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_with_list_union.py +0 -0
  550. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/product_block_with_union.py +0 -0
  551. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_one.py +0 -0
  552. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_blocks/product_sub_block_two.py +0 -0
  553. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/__init__.py +0 -0
  554. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_list_nested.py +0 -0
  555. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_list_union.py +0 -0
  556. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_list_union_overlap.py +0 -0
  557. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_one.py +0 -0
  558. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_one_nested.py +0 -0
  559. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_list_union.py +0 -0
  560. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_one.py +0 -0
  561. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_two.py +0 -0
  562. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_sub_union.py +0 -0
  563. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/product_type_union.py +0 -0
  564. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/product_types/subscription_relations.py +0 -0
  565. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/products/resource_types.py +0 -0
  566. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/fixtures/workflows.py +0 -0
  567. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/forms/__init__.py +0 -0
  568. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/forms/test_customer_contact_list.py +0 -0
  569. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/forms/test_customer_id.py +0 -0
  570. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/forms/test_display_subscription.py +0 -0
  571. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/forms/test_generic_validators.py +0 -0
  572. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/__init__.py +0 -0
  573. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/conftest.py +0 -0
  574. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/extensions/__init__.py +0 -0
  575. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/extensions/test_stats.py +0 -0
  576. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/mutations/helpers.py +0 -0
  577. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/mutations/test_start_process.py +0 -0
  578. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_customer.py +0 -0
  579. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_process.py +0 -0
  580. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_processes.py +0 -0
  581. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_product.py +0 -0
  582. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_product_blocks.py +0 -0
  583. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_resource_types.py +0 -0
  584. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_settings.py +0 -0
  585. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_sort_and_filter_fields.py +0 -0
  586. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_subscription.py +0 -0
  587. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/test_subscription_relations.py +0 -0
  588. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/__init__.py +0 -0
  589. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/fixtures.py +0 -0
  590. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/test_autoregistration.py +0 -0
  591. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/test_get_query_loaders.py +0 -0
  592. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/test_get_selected_paths.py +0 -0
  593. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/test_is_query_detailed.py +0 -0
  594. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/test_is_querying_page_data.py +0 -0
  595. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/graphql/utils/test_override_class.py +0 -0
  596. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/helpers.py +0 -0
  597. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/schedules/__init__.py +0 -0
  598. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/schedules/test_scheduling.py +0 -0
  599. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/services/__init__.py +0 -0
  600. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/services/test_processes.py +0 -0
  601. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/services/test_products.py +0 -0
  602. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/services/test_subscription_relations.py +0 -0
  603. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/services/test_translations.py +0 -0
  604. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/test_types.py +0 -0
  605. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/test_workflow.py +0 -0
  606. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/__init__.py +0 -0
  607. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/get_subscription_dict.py +0 -0
  608. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_datetime.py +0 -0
  609. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_errors.py +0 -0
  610. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_functional.py +0 -0
  611. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_get_updated_properties.py +0 -0
  612. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_json.py +0 -0
  613. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_search_query.py +0 -0
  614. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_state.py +0 -0
  615. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/utils/test_strings.py +0 -0
  616. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/websocket/__init__.py +0 -0
  617. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/websocket/test_broadcast.py +0 -0
  618. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/__init__.py +0 -0
  619. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/conftest.py +0 -0
  620. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/shared/__init__.py +0 -0
  621. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/shared/test_validate_subscriptions.py +0 -0
  622. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/tasks/__init__.py +0 -0
  623. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/tasks/test_clean_up_task_log.py +0 -0
  624. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/tasks/test_resume_workflows.py +0 -0
  625. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/tasks/test_validate_products.py +0 -0
  626. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/test_async_workflow.py +0 -0
  627. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/test_config_db_code.py +0 -0
  628. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/test_generic_workflow_steps.py +0 -0
  629. {orchestrator_core-2.9.1rc1 → orchestrator_core-2.9.2rc2}/test/unit_tests/workflows/test_modify_note.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [bumpversion]
2
- current_version = 2.9.1rc1
2
+ current_version = 2.9.2rc2
3
3
  commit = False
4
4
  tag = False
5
5
  parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(rc(?P<build>\d+))?
@@ -62,5 +62,5 @@ jobs:
62
62
  uses: codecov/codecov-action@v3
63
63
  with:
64
64
  token: ${{ secrets.CODECOV_TOKEN }} # gives error 'Could not find a repository associated with upload token'
65
- fail_ci_if_error: true
65
+ fail_ci_if_error: false
66
66
  files: ./coverage.xml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: orchestrator-core
3
- Version: 2.9.1rc1
3
+ Version: 2.9.2rc2
4
4
  Summary: This is the orchestrator workflow engine.
5
5
  Requires-Python: >=3.11,<3.14
6
6
  Classifier: Intended Audience :: Information Technology
@@ -0,0 +1,77 @@
1
+ # Backfilling Existing Subscriptions
2
+ When updating a product block that already exists in your orchestrator, it could be the case that new attributes are
3
+ added or removed. When removing resource types from a `ProductBlock`, the `migrate-domain-models` command is able to
4
+ pick up on this change, and generates a migration that removes these resource types from your database completely.
5
+
6
+ However, when adding a new resource type to a `ProductBlock`, pre-existing product instances in the subscription
7
+ database are not backfilled. For this, another SQL transaction must be added to the generated migration file.
8
+
9
+ ## Generating a Database Migration
10
+ After the new resource type is added to the product block, the generated migration file should already contain at least the following two transactions:
11
+
12
+ ```python
13
+ conn.execute(sa.text("""
14
+ INSERT INTO resource_types (resource_type, description) VALUES ('site_contains_optical_equipment', 'Whether a site contains optical equipment') RETURNING resource_types.resource_type_id
15
+ """))
16
+
17
+ conn.execute(sa.text("""
18
+ INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SiteBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('site_contains_optical_equipment')))
19
+ """))
20
+ ```
21
+
22
+ Note that this will correctly add the new resource type to the database, but is missing a backfill for a default value.
23
+ In the case of this example, a new resource type `site_contains_optical_equipment` is added. Assume that all
24
+ subscriptions that already exist in the database already are sites that contain optical equipment. It would therefore
25
+ make sense to backfill the value `True` into all subscriptions that already exist.
26
+
27
+ ## Adapting the Generated Database Migration
28
+ To implement this backfilling mechanism, only one SQL statement needs to be added to the migration, given below.
29
+
30
+ ```python
31
+ conn.execute(sa.text("""
32
+ WITH rt_id AS (SELECT resource_type_id FROM resource_types WHERE resource_type = 'site_contains_optical_equipment') INSERT INTO subscription_instance_values (subscription_instance_id, resource_type_id, value) SELECT subscription_instance_id, rt_id.resource_type_id, 'True' FROM rt_id, subscription_instances WHERE product_block_id = (SELECT product_block_id FROM product_blocks WHERE name = 'SiteBlock');
33
+ """))
34
+ ```
35
+
36
+ Adding this statement at the end of the `upgrade()` method in the generated migration file, will set the value of
37
+ `site_contains_optical_equipment` in all existing Site subscriptions to `True`. A more formatted version of this SQL
38
+ statement is given here. To adapt this example to your needs, update the resource type name, default value, and name of
39
+ the product block where this resource type is added.
40
+
41
+ ```sql
42
+ WITH rt_id AS (
43
+ SELECT
44
+ resource_type_id
45
+ FROM
46
+ resource_types
47
+ WHERE
48
+ -- The name of your new resource type
49
+ resource_type = 'site_contains_optical_equipment'
50
+ )
51
+ INSERT INTO
52
+ subscription_instance_values (
53
+ subscription_instance_id,
54
+ resource_type_id,
55
+ value
56
+ )
57
+ SELECT
58
+ subscription_instance_id,
59
+ rt_id.resource_type_id,
60
+ 'True' -- The new value that is backfilled
61
+ FROM
62
+ rt_id,
63
+ subscription_instances
64
+ WHERE
65
+ product_block_id = (
66
+ SELECT
67
+ product_block_id
68
+ FROM
69
+ product_blocks
70
+ WHERE
71
+ -- The name of the product block where this value is backfilled
72
+ name = 'SiteBlock'
73
+ );
74
+ ```
75
+
76
+ The `downgrade()` method of the generated migration does not need any modification to work. It simply removes the
77
+ resource type from the subscription database altogether.
@@ -145,6 +145,7 @@ nav:
145
145
  - IP Static: architecture/product_modelling/ip_static.md
146
146
  - Product Block Graph: architecture/product_modelling/product_block_graph.md
147
147
  - Importing Existing Products: architecture/product_modelling/imports.md
148
+ - Backfilling Existing Subscriptions: architecture/product_modelling/backfilling.md
148
149
  - Getting Started:
149
150
  - Prerequisites: getting-started/versions.md
150
151
  - Base Application:
@@ -13,7 +13,7 @@
13
13
 
14
14
  """This is the orchestrator workflow engine."""
15
15
 
16
- __version__ = "2.9.1rc1"
16
+ __version__ = "2.9.2rc2"
17
17
 
18
18
  from orchestrator.app import OrchestratorCore
19
19
  from orchestrator.settings import app_settings
@@ -133,7 +133,7 @@ def delete(process_id: UUID) -> None:
133
133
  status_code=HTTPStatus.CREATED,
134
134
  dependencies=[Depends(check_global_lock, use_cache=False)],
135
135
  )
136
- def new_process(
136
+ async def new_process(
137
137
  workflow_key: str,
138
138
  request: Request,
139
139
  json_data: list[dict[str, Any]] | None = Body(...),
@@ -26,6 +26,8 @@ from orchestrator.domain.customer_description import (
26
26
  update_subscription_customer_description,
27
27
  )
28
28
  from orchestrator.schemas import SubscriptionDescriptionBaseSchema, SubscriptionDescriptionSchema
29
+ from orchestrator.schemas.subscription_descriptions import UpdateSubscriptionDescriptionSchema
30
+ from orchestrator.utils.errors import StaleDataError
29
31
  from orchestrator.utils.redis import delete_from_redis
30
32
 
31
33
  router = APIRouter()
@@ -37,10 +39,15 @@ async def save_subscription_customer_description_endpoint(data: SubscriptionDesc
37
39
 
38
40
 
39
41
  @router.put("/", response_model=None, status_code=HTTPStatus.NO_CONTENT)
40
- async def update_subscription_customer_description_endpoint(data: SubscriptionDescriptionSchema = Body(...)) -> None:
42
+ async def update_subscription_customer_description_endpoint(
43
+ data: UpdateSubscriptionDescriptionSchema = Body(...),
44
+ ) -> None:
41
45
  description = get_customer_description_by_customer_subscription(data.customer_id, data.subscription_id)
42
46
  if description:
43
- await update_subscription_customer_description(description, data.description, data.created_at)
47
+ try:
48
+ await update_subscription_customer_description(description, data.description, data.created_at, data.version)
49
+ except StaleDataError as error:
50
+ raise_status(HTTPStatus.BAD_REQUEST, str(error))
44
51
 
45
52
 
46
53
  @router.delete("/{_id}", response_model=None, status_code=HTTPStatus.NO_CONTENT)
@@ -24,6 +24,7 @@ logger = structlog.get_logger(__name__)
24
24
  SUBSCRIPTION_TABLE_COLUMN_CLAUSES = default_inferred_column_clauses(SubscriptionTable) | {
25
25
  "product": inferred_filter(ProductTable.name),
26
26
  "tag": filter_exact(ProductTable.tag),
27
+ "type": filter_exact(ProductTable.product_type),
27
28
  }
28
29
 
29
30
  subscription_filter_fields = create_memoized_field_list(SUBSCRIPTION_TABLE_COLUMN_CLAUSES)
@@ -554,6 +554,7 @@ class SubscriptionCustomerDescriptionTable(BaseModel):
554
554
  customer_id = mapped_column(String, nullable=False, index=True)
555
555
  description = mapped_column(Text(), nullable=False)
556
556
  created_at = mapped_column(UtcTimestamp, nullable=False, server_default=text("current_timestamp()"))
557
+ version = mapped_column(Integer, nullable=False, server_default="1")
557
558
 
558
559
  subscription = relationship("SubscriptionTable", back_populates="customer_descriptions")
559
560
 
@@ -572,6 +573,7 @@ class SubscriptionTable(BaseModel):
572
573
  start_date = mapped_column(UtcTimestamp, nullable=True)
573
574
  end_date = mapped_column(UtcTimestamp)
574
575
  note = mapped_column(Text())
576
+ version = mapped_column(Integer, nullable=False, server_default="1")
575
577
 
576
578
  product = relationship("ProductTable", foreign_keys=[product_id])
577
579
  instances = relationship(
@@ -435,16 +435,29 @@ class Populator:
435
435
  self.log.info("Providing user input.")
436
436
 
437
437
  user_inputs: list[State] = [self.get_form_data(form)] if form else []
438
+ # Keep submitting the form until it has been successfully submitted
438
439
  while True:
439
440
  self.log.info("Submitting user input", data=user_inputs)
440
441
  response = self.session.request(method, url, json=user_inputs)
441
- if not response.ok and "MigrationSummary" in response.text:
442
- user_inputs[-1] = {}
443
- continue
442
+ self.log.debug("Response", response=response.content)
443
+
444
+ # Return the response if the form has been successfully submitted
444
445
  if response.status_code != HTTPStatus.NOT_EXTENDED:
445
446
  return response
446
- input_fields = response.json()["form"]
447
- user_inputs.append(self.get_form_data(input_fields))
447
+
448
+ response_json = response.json()
449
+ meta = response_json.get("meta", {}) or {}
450
+ no_next = meta.get("hasNext") is False
451
+ is_summary_form = response_json.get("form", {}).get("title", "").endswith("Summary")
452
+
453
+ # If there are no next pages and a summary form is expected then append an empty form/dict
454
+ if no_next and is_summary_form:
455
+ self.log.info("Append empty form", response=response_json)
456
+ user_inputs.append({})
457
+ # Otherwise resolve the values for the input fields on the form
458
+ else:
459
+ input_fields = response_json["form"]
460
+ user_inputs.append(self.get_form_data(input_fields))
448
461
 
449
462
  def reset(self) -> None:
450
463
  """Reset internal state."""
@@ -1017,6 +1017,7 @@ class SubscriptionModel(DomainModel):
1017
1017
  start_date: datetime | None = None # pragma: no mutate
1018
1018
  end_date: datetime | None = None # pragma: no mutate
1019
1019
  note: str | None = None # pragma: no mutate
1020
+ version: int = 1 # pragma: no mutate
1020
1021
 
1021
1022
  def __new__(cls, *args: Any, status: SubscriptionLifecycle | None = None, **kwargs: Any) -> "SubscriptionModel":
1022
1023
  # status can be none if created during change_lifecycle
@@ -1108,6 +1109,7 @@ class SubscriptionModel(DomainModel):
1108
1109
  start_date: datetime | None = None,
1109
1110
  end_date: datetime | None = None,
1110
1111
  note: str | None = None,
1112
+ version: int = 1,
1111
1113
  ) -> S:
1112
1114
  """Use product_id (and customer_id) to return required fields of a new empty subscription."""
1113
1115
  # Caller wants a new instance and provided a product_id and customer_id
@@ -1140,6 +1142,7 @@ class SubscriptionModel(DomainModel):
1140
1142
  start_date=start_date,
1141
1143
  end_date=end_date,
1142
1144
  note=note,
1145
+ version=version,
1143
1146
  )
1144
1147
  db.session.add(subscription)
1145
1148
 
@@ -1156,6 +1159,7 @@ class SubscriptionModel(DomainModel):
1156
1159
  start_date=start_date,
1157
1160
  end_date=end_date,
1158
1161
  note=note,
1162
+ version=version,
1159
1163
  **fixed_inputs,
1160
1164
  **instances,
1161
1165
  )
@@ -1270,6 +1274,7 @@ class SubscriptionModel(DomainModel):
1270
1274
  start_date=subscription.start_date,
1271
1275
  end_date=subscription.end_date,
1272
1276
  note=subscription.note,
1277
+ version=subscription.version,
1273
1278
  **fixed_inputs,
1274
1279
  **instances,
1275
1280
  )
@@ -1320,6 +1325,7 @@ class SubscriptionModel(DomainModel):
1320
1325
  start_date=subscription.start_date,
1321
1326
  end_date=subscription.end_date,
1322
1327
  note=subscription.note,
1328
+ version=subscription.version,
1323
1329
  **fixed_inputs,
1324
1330
  **instances,
1325
1331
  )
@@ -20,7 +20,9 @@ from sqlalchemy import select
20
20
 
21
21
  from orchestrator.api.models import delete
22
22
  from orchestrator.db import SubscriptionCustomerDescriptionTable, db
23
+ from orchestrator.utils.errors import StaleDataError
23
24
  from orchestrator.utils.redis import delete_subscription_from_redis
25
+ from orchestrator.utils.validate_data_version import validate_data_version
24
26
  from orchestrator.websocket import invalidate_subscription_cache
25
27
 
26
28
  router = APIRouter()
@@ -53,8 +55,14 @@ async def create_subscription_customer_description(
53
55
 
54
56
  @delete_subscription_from_redis()
55
57
  async def update_subscription_customer_description(
56
- customer_description: SubscriptionCustomerDescriptionTable, description: str, created_at: datetime | None = None
58
+ customer_description: SubscriptionCustomerDescriptionTable,
59
+ description: str,
60
+ created_at: datetime | None = None,
61
+ version: int | None = None,
57
62
  ) -> SubscriptionCustomerDescriptionTable:
63
+ if not validate_data_version(customer_description.version, version):
64
+ raise StaleDataError(customer_description.version, version)
65
+
58
66
  customer_description.description = description
59
67
  customer_description.created_at = created_at if created_at else datetime.now(tz=timezone("UTC"))
60
68
  db.session.commit()
@@ -25,25 +25,28 @@ from orchestrator.domain.customer_description import (
25
25
  )
26
26
  from orchestrator.graphql.schemas.customer_description import CustomerDescription
27
27
  from orchestrator.graphql.types import MutationError, NotFoundError
28
+ from orchestrator.utils.errors import StaleDataError
28
29
 
29
30
  logger = structlog.get_logger(__name__)
30
31
 
31
32
 
32
33
  async def upsert_customer_description(
33
- customer_id: str, subscription_id: UUID, description: str
34
+ customer_id: str, subscription_id: UUID, description: str, version: int | None
34
35
  ) -> SubscriptionCustomerDescriptionTable | NotFoundError:
35
36
  current_description = get_customer_description_by_customer_subscription(customer_id, subscription_id)
36
37
 
37
38
  if current_description:
38
- return await update_subscription_customer_description(current_description, description)
39
+ return await update_subscription_customer_description(current_description, description, version=version)
39
40
  return await create_subscription_customer_description(customer_id, subscription_id, description)
40
41
 
41
42
 
42
43
  async def resolve_upsert_customer_description(
43
- customer_id: str, subscription_id: UUID, description: str
44
+ customer_id: str, subscription_id: UUID, description: str, version: int | None = None
44
45
  ) -> CustomerDescription | NotFoundError | MutationError:
45
46
  try:
46
- customer_description = await upsert_customer_description(customer_id, subscription_id, description)
47
+ customer_description = await upsert_customer_description(customer_id, subscription_id, description, version)
48
+ except StaleDataError as error:
49
+ return MutationError(message=str(error))
47
50
  except Exception:
48
51
  return NotFoundError(message="Subscription not found")
49
52
  return CustomerDescription.from_pydantic(customer_description) # type: ignore
@@ -77,6 +77,7 @@ class SubscriptionInterface:
77
77
  status: SubscriptionLifecycle
78
78
  insync: bool
79
79
  note: str | None
80
+ version: int
80
81
 
81
82
  @strawberry.field(description="Product information") # type: ignore
82
83
  async def product(self) -> ProductModelGraphql:
@@ -0,0 +1,64 @@
1
+ """Add version column to subscription and subscription customer descriptions.
2
+
3
+ Revision ID: 4c5859620539
4
+ Revises: 460ec6748e37
5
+ Create Date: 2025-01-08 15:07:41.957937
6
+
7
+ """
8
+
9
+ import sqlalchemy as sa
10
+ from alembic import op
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "4c5859620539"
14
+ down_revision = "460ec6748e37"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ conn = op.get_bind()
21
+ op.add_column(
22
+ "subscription_customer_descriptions", sa.Column("version", sa.Integer(), server_default="1", nullable=False)
23
+ )
24
+ op.add_column("subscriptions", sa.Column("version", sa.Integer(), server_default="1", nullable=False))
25
+
26
+ conn.execute(
27
+ sa.text(
28
+ """
29
+ CREATE OR REPLACE FUNCTION increment_version()
30
+ RETURNS TRIGGER AS $$
31
+ BEGIN
32
+ NEW.version := OLD.version + 1;
33
+ RETURN NEW;
34
+ END;
35
+ $$ LANGUAGE plpgsql;
36
+
37
+ CREATE TRIGGER subscriptions_increment_version_trigger
38
+ BEFORE UPDATE ON subscriptions
39
+ FOR EACH ROW
40
+ EXECUTE FUNCTION increment_version();
41
+
42
+ CREATE TRIGGER subscription_customer_descriptions_increment_version_trigger
43
+ BEFORE UPDATE ON subscription_customer_descriptions
44
+ FOR EACH ROW
45
+ EXECUTE FUNCTION increment_version();
46
+ """
47
+ )
48
+ )
49
+
50
+
51
+ def downgrade() -> None:
52
+ conn = op.get_bind()
53
+ op.drop_column("subscriptions", "version")
54
+ op.drop_column("subscription_customer_descriptions", "version")
55
+
56
+ conn.execute(
57
+ sa.text(
58
+ """
59
+ DROP TRIGGER IF EXISTS subscriptions_increment_version_trigger on subscriptions;
60
+ DROP TRIGGER IF EXISTS subscription_customer_descriptions_increment_version_trigger on subscription_customer_descriptions;
61
+ DROP FUNCTION IF EXISTS increment_version;
62
+ """
63
+ )
64
+ )
@@ -0,0 +1,41 @@
1
+ """Validate Product Type.
2
+
3
+ Revision ID: 4fjdn13f83ga
4
+ Revises: 2c7e8a43d4f9
5
+ Create Date: 2025-10-13 16:21:43.956814
6
+
7
+ """
8
+
9
+ from uuid import uuid4
10
+
11
+ import sqlalchemy as sa
12
+ from alembic import op
13
+
14
+ # revision identifiers, used by Alembic.
15
+ revision = "4fjdn13f83ga"
16
+ down_revision = "4c5859620539"
17
+ branch_labels = None
18
+ depends_on = None
19
+
20
+
21
+ workflow = {
22
+ "name": "task_validate_product_type",
23
+ "target": "SYSTEM",
24
+ "description": "Validate all subscriptions of Product Type",
25
+ "workflow_id": uuid4(),
26
+ }
27
+
28
+
29
+ def upgrade() -> None:
30
+ conn = op.get_bind()
31
+ conn.execute(
32
+ sa.text(
33
+ "INSERT INTO workflows VALUES (:workflow_id, :name, :target, :description, now()) ON CONFLICT DO NOTHING"
34
+ ),
35
+ workflow,
36
+ )
37
+
38
+
39
+ def downgrade() -> None:
40
+ conn = op.get_bind()
41
+ conn.execute(sa.text("DELETE FROM workflows WHERE name = :name"), {"name": workflow["name"]})
@@ -15,14 +15,17 @@
15
15
  from threading import BoundedSemaphore
16
16
 
17
17
  import structlog
18
- from sqlalchemy import select
19
18
 
20
- from orchestrator.db import ProductTable, SubscriptionTable, db
21
19
  from orchestrator.schedules.scheduling import scheduler
22
- from orchestrator.services.processes import get_execution_context
23
- from orchestrator.services.subscriptions import TARGET_DEFAULT_USABLE_MAP, WF_USABLE_MAP
20
+ from orchestrator.services.subscriptions import (
21
+ get_subscriptions_on_product_table,
22
+ get_subscriptions_on_product_table_in_sync,
23
+ )
24
+ from orchestrator.services.workflows import (
25
+ get_system_product_workflows_for_subscription,
26
+ start_validation_workflow_for_workflows,
27
+ )
24
28
  from orchestrator.settings import app_settings
25
- from orchestrator.targets import Target
26
29
 
27
30
  logger = structlog.get_logger(__name__)
28
31
 
@@ -34,29 +37,19 @@ task_semaphore = BoundedSemaphore(value=2)
34
37
  def validate_subscriptions() -> None:
35
38
  if app_settings.VALIDATE_OUT_OF_SYNC_SUBSCRIPTIONS:
36
39
  # Automatically re-validate out-of-sync subscriptions. This is not recommended for production.
37
- select_query = select(SubscriptionTable).join(ProductTable)
40
+ subscriptions = get_subscriptions_on_product_table()
38
41
  else:
39
- select_query = select(SubscriptionTable).join(ProductTable).filter(SubscriptionTable.insync.is_(True))
40
- subscriptions = db.session.scalars(select_query)
41
- for subscription in subscriptions:
42
- validation_workflow = None
43
-
44
- for workflow in subscription.product.workflows:
45
- if workflow.target == Target.SYSTEM:
46
- validation_workflow = workflow.name
47
-
48
- if validation_workflow:
49
- default = TARGET_DEFAULT_USABLE_MAP[Target.SYSTEM]
50
- usable_when = WF_USABLE_MAP.get(validation_workflow, default)
42
+ subscriptions = get_subscriptions_on_product_table_in_sync()
51
43
 
52
- if subscription.status in usable_when:
53
- json = [{"subscription_id": str(subscription.subscription_id)}]
44
+ for subscription in subscriptions:
45
+ system_product_workflows = get_system_product_workflows_for_subscription(subscription)
54
46
 
55
- validate_func = get_execution_context()["validate"]
56
- validate_func(validation_workflow, json=json)
57
- else:
47
+ if not system_product_workflows:
58
48
  logger.warning(
59
49
  "SubscriptionTable has no validation workflow",
60
50
  subscription=subscription,
61
51
  product=subscription.product.name,
62
52
  )
53
+ break
54
+
55
+ start_validation_workflow_for_workflows(subscription=subscription, workflows=system_product_workflows)
@@ -84,6 +84,7 @@ class SubscriptionSchema(SubscriptionBaseSchema):
84
84
  product: ProductBaseSchema | None = None
85
85
  customer_descriptions: list[SubscriptionDescriptionSchema] | None = None
86
86
  tag: str | None = None
87
+ version: int
87
88
  model_config = ConfigDict(from_attributes=True)
88
89
 
89
90
 
@@ -28,4 +28,12 @@ class SubscriptionDescriptionBaseSchema(OrchestratorBaseModel):
28
28
  class SubscriptionDescriptionSchema(SubscriptionDescriptionBaseSchema):
29
29
  id: UUID
30
30
  created_at: datetime | None = None
31
+ version: int
32
+ model_config = ConfigDict(from_attributes=True)
33
+
34
+
35
+ class UpdateSubscriptionDescriptionSchema(SubscriptionDescriptionBaseSchema):
36
+ id: UUID
37
+ created_at: datetime | None = None
38
+ version: int | None = None
31
39
  model_config = ConfigDict(from_attributes=True)
@@ -670,3 +670,13 @@ def format_extended_domain_model(subscription: dict, filter_owner_relations: boo
670
670
  filter_instance_ids_on_subscription()
671
671
 
672
672
  return subscription
673
+
674
+
675
+ def get_subscriptions_on_product_table() -> list[SubscriptionTable]:
676
+ select_query = select(SubscriptionTable).join(ProductTable)
677
+ return list(db.session.scalars(select_query))
678
+
679
+
680
+ def get_subscriptions_on_product_table_in_sync(in_sync: bool = True) -> list[SubscriptionTable]:
681
+ select_query = select(SubscriptionTable).join(ProductTable).filter(SubscriptionTable.insync.is_(in_sync))
682
+ return list(db.session.scalars(select_query))
@@ -2,8 +2,14 @@ from collections.abc import Iterable
2
2
 
3
3
  from sqlalchemy import Select, select
4
4
 
5
- from orchestrator.db import WorkflowTable, db
5
+ from orchestrator.db import (
6
+ SubscriptionTable,
7
+ WorkflowTable,
8
+ db,
9
+ )
6
10
  from orchestrator.schemas import StepSchema, WorkflowSchema
11
+ from orchestrator.services.subscriptions import TARGET_DEFAULT_USABLE_MAP, WF_USABLE_MAP
12
+ from orchestrator.targets import Target
7
13
  from orchestrator.workflows import get_workflow
8
14
 
9
15
 
@@ -42,3 +48,43 @@ def get_workflows(
42
48
 
43
49
  def get_workflow_by_name(workflow_name: str) -> WorkflowTable | None:
44
50
  return db.session.scalar(select(WorkflowTable).where(WorkflowTable.name == workflow_name))
51
+
52
+
53
+ def get_system_product_workflows_for_subscription(
54
+ subscription: SubscriptionTable,
55
+ ) -> list:
56
+ return [workflow.name for workflow in subscription.product.workflows if workflow.target == Target.SYSTEM]
57
+
58
+
59
+ def start_validation_workflow_for_workflows(
60
+ subscription: SubscriptionTable,
61
+ workflows: list,
62
+ product_type_filter: str | None = None,
63
+ ) -> list:
64
+ """Start validation workflows for a subscription."""
65
+ result = []
66
+
67
+ for workflow_name in workflows:
68
+ default = TARGET_DEFAULT_USABLE_MAP[Target.SYSTEM]
69
+ usable_when = WF_USABLE_MAP.get(workflow_name, default)
70
+
71
+ if subscription.status in usable_when and (
72
+ product_type_filter is None or subscription.product.product_type == product_type_filter
73
+ ):
74
+ json = [{"subscription_id": str(subscription.subscription_id)}]
75
+
76
+ # against circular import
77
+ from orchestrator.services.processes import get_execution_context
78
+
79
+ validate_func = get_execution_context()["validate"]
80
+ validate_func(workflow_name, json=json)
81
+
82
+ result.append(
83
+ {
84
+ "workflow_name": workflow_name,
85
+ "subscription_id": subscription.subscription_id,
86
+ "product_type": subscription.product.product_type,
87
+ }
88
+ )
89
+
90
+ return result
@@ -33,6 +33,7 @@ def format_subscription(subscription: SubscriptionTable) -> dict:
33
33
  "note": subscription.note,
34
34
  "start_date": subscription.start_date if subscription.start_date else None,
35
35
  "end_date": subscription.end_date if subscription.end_date else None,
36
+ "version": subscription.version,
36
37
  "product": {
37
38
  "product_id": prod.product_id,
38
39
  "description": prod.description,
@@ -74,6 +74,14 @@ class InconsistentDataError(ProcessFailureError):
74
74
  pass
75
75
 
76
76
 
77
+ class StaleDataError(ValueError):
78
+ """The version of the update payload does not match the version in the database."""
79
+
80
+ def __init__(self, current_version: int, new_version: int | None = None) -> None:
81
+ message = f"Stale data: given version ({new_version}) does not match the current version ({current_version})"
82
+ super().__init__(message)
83
+
84
+
77
85
  def is_api_exception(ex: Exception) -> bool:
78
86
  """Test for swagger-codegen ApiException.
79
87
 
@@ -0,0 +1,2 @@
1
+ def validate_data_version(current_version: int, new_version: int | None = None) -> bool:
2
+ return (new_version is not None and new_version == current_version) or new_version is None
@@ -110,5 +110,6 @@ LazyWorkflowInstance(".modify_note", "modify_note")
110
110
  LazyWorkflowInstance(".tasks.cleanup_tasks_log", "task_clean_up_tasks")
111
111
  LazyWorkflowInstance(".tasks.resume_workflows", "task_resume_workflows")
112
112
  LazyWorkflowInstance(".tasks.validate_products", "task_validate_products")
113
+ LazyWorkflowInstance(".tasks.validate_product_type", "task_validate_product_type")
113
114
 
114
115
  __doc__ = make_workflow_index_doc(ALL_WORKFLOWS)