ansys-saf-glow-engine 2.3.dev0__tar.gz → 2.4.dev0__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 (196) hide show
  1. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/PKG-INFO +6 -7
  2. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/pyproject.toml +12 -18
  3. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/client.py +2 -2
  4. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/project_proxy.py +3 -3
  5. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/step_proxy.py +2 -2
  6. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/storagescope.py +2 -2
  7. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/settings.py +8 -0
  8. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/client_exceptions.py +3 -3
  9. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/gc.py +2 -2
  10. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/decorator.py +4 -4
  11. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/hps_job_script_str.py +92 -1
  12. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/identification.py +2 -2
  13. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/long_running.py +2 -2
  14. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/transaction.py +3 -3
  15. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/solution_configuration_relational.py +4 -3
  16. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/method_runner.py +12 -12
  17. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/transaction.py +4 -4
  18. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/hps_authenticator.py +44 -6
  19. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/interactive_authenticator.py +2 -2
  20. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/server.py +55 -30
  21. ansys_saf_glow_engine-2.4.dev0/src/ansys/saf/glow/_repository/engine.py +38 -0
  22. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/relational.py +17 -9
  23. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/dependencies.py +5 -5
  24. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/inject_trace_http_transport.py +10 -10
  25. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_testing/solution.py +31 -2
  26. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/ip_utilities.py +3 -3
  27. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/testing/__init__.py +1 -0
  28. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/LICENSE +0 -0
  29. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/README.rst +0 -0
  30. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/__init__.py +0 -0
  31. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/__init__.py +0 -0
  32. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/datarepo.py +0 -0
  33. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/filesystem.py +0 -0
  34. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/hps_scope.py +0 -0
  35. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/minerva.py +0 -0
  36. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/multiplexor.py +0 -0
  37. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/py.typed +0 -0
  38. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/storage_contexts.py +0 -0
  39. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/storage_factory.py +0 -0
  40. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/storage_utils.py +0 -0
  41. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/storage_variable_names.py +0 -0
  42. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/subsystem_names.py +0 -0
  43. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/subsystem_scope.py +0 -0
  44. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/__init__.py +0 -0
  45. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/dashclient.py +0 -0
  46. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/py.typed +0 -0
  47. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/__init__.py +0 -0
  48. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/const.py +0 -0
  49. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/directories.py +0 -0
  50. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/py.typed +0 -0
  51. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/__init__.py +0 -0
  52. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/blob_managers.py +0 -0
  53. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/dag.py +0 -0
  54. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/exceptions.py +0 -0
  55. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/field_state.py +0 -0
  56. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/get_step_resource_directory.py +0 -0
  57. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/gql.py +0 -0
  58. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/gql_helper.py +0 -0
  59. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/__init__.py +0 -0
  60. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/attribute.py +0 -0
  61. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/healthcheck.py +0 -0
  62. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/hps_system.py +0 -0
  63. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/iinstance_system.py +0 -0
  64. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/manager.py +0 -0
  65. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/mock_system.py +0 -0
  66. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/null_system.py +0 -0
  67. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/pim_system.py +0 -0
  68. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/py.typed +0 -0
  69. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/recoverystate.py +0 -0
  70. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/storagescope.py +0 -0
  71. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/livehandles.py +0 -0
  72. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/method_status.py +0 -0
  73. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/migrations.py +0 -0
  74. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/project_files_locator.py +0 -0
  75. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/py.typed +0 -0
  76. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/solution.py +0 -0
  77. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/state_engine.py +0 -0
  78. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/step_model.py +0 -0
  79. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/step_spec.py +0 -0
  80. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/__init__.py +0 -0
  81. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/archive_helper.py +0 -0
  82. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/bdm_helper.py +0 -0
  83. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/crud.py +0 -0
  84. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/instance_helper.py +0 -0
  85. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/project_builder.py +0 -0
  86. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/py.typed +0 -0
  87. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/solution_configuration_abstract.py +0 -0
  88. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/solution_configuration_models.py +0 -0
  89. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/step_data_processor.py +0 -0
  90. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_events/__init__.py +0 -0
  91. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_events/ievent_manager.py +0 -0
  92. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_events/py.typed +0 -0
  93. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_events/repository_event_manager.py +0 -0
  94. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/__init__.py +0 -0
  95. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/local.py +0 -0
  96. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/py.typed +0 -0
  97. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/__init__.py +0 -0
  98. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/hps_authentication_type.py +0 -0
  99. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/ihps_authenticator.py +0 -0
  100. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/py.typed +0 -0
  101. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/api.py +0 -0
  102. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/base.py +0 -0
  103. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/exec_python.py +0 -0
  104. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/execution_specification.py +0 -0
  105. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/inner_exec_python.py +0 -0
  106. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/project_impl.py +0 -0
  107. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/project_wrapper.py +0 -0
  108. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/py.typed +0 -0
  109. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/serialization.py +0 -0
  110. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/study_definition.py +0 -0
  111. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/system.py +0 -0
  112. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_parametric_studies/system_info_impl.py +0 -0
  113. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/__init__.py +0 -0
  114. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/py.typed +0 -0
  115. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/solution_doc.py +0 -0
  116. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/abstract_repository.py +0 -0
  117. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/generate_project_id.py +0 -0
  118. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/postgresql.py +0 -0
  119. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/relational_mapper.py +0 -0
  120. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/relational_models.py +0 -0
  121. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/sqlite.py +0 -0
  122. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/sqlite_adapters.py +0 -0
  123. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/sqlite_factory.py +0 -0
  124. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/__init__.py +0 -0
  125. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/analysis.py +0 -0
  126. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/exceptions.py +0 -0
  127. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/filter_parser.py +0 -0
  128. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/hidden_project_directories.py +0 -0
  129. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/hps_auth_info.py +0 -0
  130. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/main.py +0 -0
  131. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/method_url.py +0 -0
  132. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/models.py +0 -0
  133. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/product_instances_tracker.py +0 -0
  134. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/project_files_manager.py +0 -0
  135. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/py.typed +0 -0
  136. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/__init__.py +0 -0
  137. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/blobs.py +0 -0
  138. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/desktop.py +0 -0
  139. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/events.py +0 -0
  140. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/graphql.py +0 -0
  141. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/instances.py +0 -0
  142. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/methods.py +0 -0
  143. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/projects.py +0 -0
  144. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/py.typed +0 -0
  145. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/solution_configuration.py +0 -0
  146. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/steps.py +0 -0
  147. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/schemas.py +0 -0
  148. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/server.py +0 -0
  149. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/solution.py +0 -0
  150. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/__init__.py +0 -0
  151. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/base.py +0 -0
  152. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/os.py +0 -0
  153. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/py.typed +0 -0
  154. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/__init__.py +0 -0
  155. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/config.py +0 -0
  156. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/instrumentor.py +0 -0
  157. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/metrics_middleware.py +0 -0
  158. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/py.typed +0 -0
  159. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_testing/__init__.py +0 -0
  160. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_testing/py.typed +0 -0
  161. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_ui/assets/glow_auth_refresh.js +0 -0
  162. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_ui/main.py +0 -0
  163. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_ui/server.py +0 -0
  164. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/__init__.py +0 -0
  165. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/code.py +0 -0
  166. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/compute_source_root.py +0 -0
  167. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/conversion.py +0 -0
  168. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/decrypt_file.py +0 -0
  169. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/path_parser.py +0 -0
  170. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/procs.py +0 -0
  171. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/py.typed +0 -0
  172. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/random_identifier.py +0 -0
  173. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/requests.py +0 -0
  174. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/solution_modules.py +0 -0
  175. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/api.py +0 -0
  176. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/cli/__init__.py +0 -0
  177. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/cli/__main__.py +0 -0
  178. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/cli/_cli_entry_point.py +0 -0
  179. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/cli/py.typed +0 -0
  180. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/client/__init__.py +0 -0
  181. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/client/py.typed +0 -0
  182. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/default_wheel_version.txt +0 -0
  183. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/hps_execution.py +0 -0
  184. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/hps_execution_str.py +0 -0
  185. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/py.typed +0 -0
  186. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/runtime/__init__.py +0 -0
  187. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/runtime/_solution_entry_point.py +0 -0
  188. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/runtime/py.typed +0 -0
  189. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/__init__.py +0 -0
  190. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/hps/__init__.py +0 -0
  191. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/hps/py.typed +0 -0
  192. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/products/config.py +0 -0
  193. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/products/py.typed +0 -0
  194. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/py.typed +0 -0
  195. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/testing/py.typed +0 -0
  196. {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/ui.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ansys-saf-glow-engine
3
- Version: 2.3.dev0
3
+ Version: 2.4.dev0
4
4
  Summary: Solution Application Framework / Guided Low-Code Workflow (SAF GLOW) engine
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -31,7 +31,7 @@ Requires-Dist: aiosqlite (>=0.19.0,<1.0)
31
31
  Requires-Dist: ansys-bdm-api (>=0.5.0,<1.0)
32
32
  Requires-Dist: ansys-bdm-shared-volume (>=0.4.0,<1.0)
33
33
  Requires-Dist: ansys-hps-client (>=0.12,<1.0) ; extra == "hps" or extra == "all"
34
- Requires-Dist: ansys-iam-oidc (>=0.8.0,<1.0)
34
+ Requires-Dist: ansys-iam-oidc (>=0.9.0,<1.0)
35
35
  Requires-Dist: ansys-platform-instancemanagement (>=1.0.2,<2.0.0) ; extra == "pim" or extra == "all"
36
36
  Requires-Dist: ansys-saf-product-configuration (>=0.22.0,<1.0)
37
37
  Requires-Dist: ariadne (>=1.0.1,<2.0.0)
@@ -46,22 +46,21 @@ Requires-Dist: googleapis-common-protos (>=1.52.0,<2.0.0)
46
46
  Requires-Dist: gql (>=3.5.0,<4.0.0)
47
47
  Requires-Dist: grpcio (>=1.71.2,<2.0.0)
48
48
  Requires-Dist: grpcio-health-checking (>=1.24.0,<2.0.0)
49
- Requires-Dist: httpx (>=0,<1)
50
- Requires-Dist: httpx2 (>=2.5.0,<3.0.0) ; extra == "test" or extra == "all"
49
+ Requires-Dist: httpx2 (>=2.5.0,<3.0.0)
51
50
  Requires-Dist: isoduration (==20.11.0) ; extra == "mcp" or extra == "all"
52
51
  Requires-Dist: joserfc (>=1.2.2,<2.0.0)
53
52
  Requires-Dist: mcp (==1.28.1) ; extra == "mcp" or extra == "all"
54
53
  Requires-Dist: networkx (>=3.0,<4.0)
55
54
  Requires-Dist: opentelemetry-exporter-otlp-proto-http (>=1.18,<2.0)
56
- Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.64b0,<0.65)
55
+ Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.64b0,<1.0)
57
56
  Requires-Dist: opentelemetry-instrumentation-flask (>=0,<1)
58
- Requires-Dist: opentelemetry-instrumentation-httpx (>=0,<1)
57
+ Requires-Dist: opentelemetry-instrumentation-httpx (>=0.65b0,<1.0)
59
58
  Requires-Dist: opentelemetry-instrumentation-logging (>=0,<1)
60
59
  Requires-Dist: opentelemetry-sdk (>=1.39,<2.0)
61
60
  Requires-Dist: psutil (>=7.0,<8.0)
62
61
  Requires-Dist: pydantic (>=2.13.4,<3.0.0)
63
62
  Requires-Dist: pydantic-settings (>=2.0.2,<3.0.0,!=2.6.0)
64
- Requires-Dist: pytest (>=9.1.0,<10.0.0) ; extra == "test" or extra == "all"
63
+ Requires-Dist: pytest (>=9.0.3,<9.1.0) ; extra == "test" or extra == "all"
65
64
  Requires-Dist: pytest-mock (>=3.15.0,<4.0.0) ; extra == "test" or extra == "all"
66
65
  Requires-Dist: python-dotenv (>=1.0.0,<2.0.0)
67
66
  Requires-Dist: python-multipart (>=0.0.30,<1.0)
@@ -4,7 +4,7 @@ requires = [ "poetry-core>=2.0.0", "setuptools>=67.0" ]
4
4
 
5
5
  [tool.poetry]
6
6
  name = "ansys-saf-glow-engine"
7
- version = "2.3.dev0"
7
+ version = "2.4.dev0"
8
8
  description = "Solution Application Framework / Guided Low-Code Workflow (SAF GLOW) engine"
9
9
  license = "Apache-2.0"
10
10
  authors = [ "ANSYS, Inc. <pyansys.core@ansys.com>" ]
@@ -50,7 +50,7 @@ ariadne = "^1.0.1"
50
50
  ansys-bdm-api = { version = ">=0.5.0, <1.0", allow-prereleases = true }
51
51
  ansys-bdm-shared-volume = { version = ">=0.4.0, <1.0", allow-prereleases = true }
52
52
  ansys-hps-client = { version = ">=0.12, <1.0", optional = true } # for using HPS
53
- ansys-iam-oidc = { version = ">=0.8.0, <1.0", allow-prereleases = true }
53
+ ansys-iam-oidc = { version = ">=0.9.0, <1.0", allow-prereleases = true }
54
54
  ansys-platform-instancemanagement = { version = "^1.0.2", optional = true } # for using PIM
55
55
  ansys-saf-product-configuration = { version = ">=0.22.0, <1.0", allow-prereleases = true }
56
56
  asyncpg = ">=0.29.0, <1.0"
@@ -63,21 +63,20 @@ googleapis-common-protos = "^1.52.0"
63
63
  gql = "^3.5.0"
64
64
  grpcio = "^1.71.2"
65
65
  grpcio-health-checking = "^1.24.0"
66
- httpx = "^0"
66
+ httpx2 = "^2.5.0"
67
67
  joserfc = "^1.2.2"
68
68
  networkx = "^3.0"
69
69
  opentelemetry-exporter-otlp-proto-http = "^1.18"
70
- opentelemetry-instrumentation-fastapi = { version = "^0.64b0", allow-prereleases = true } # Minimum version compatible with fastapi 0.139
70
+ opentelemetry-instrumentation-fastapi = { version = ">=0.64b0, <1.0", allow-prereleases = true } # Minimum version compatible with fastapi 0.139
71
71
  opentelemetry-instrumentation-flask = { version = "^0", allow-prereleases = true }
72
- opentelemetry-instrumentation-httpx = { version = "^0", allow-prereleases = true }
72
+ opentelemetry-instrumentation-httpx = { version = ">=0.65b0, <1.0", allow-prereleases = true } # Minimum version compatible with httpx2
73
73
  opentelemetry-instrumentation-logging = { version = "^0", allow-prereleases = true }
74
74
  opentelemetry-sdk = "^1.39"
75
75
  psutil = "^7.0"
76
76
  pydantic = "^2.13.4"
77
77
  pydantic-settings = "^2.0.2, !=2.6.0" # In 2.6.0, they changed how Settings.model_validate() works, breaking everything: https://github.com/pydantic/pydantic-settings/issues/445. It was fixed in 2.6.1.
78
- pytest = { version = "^9.1.0", optional = true }
78
+ pytest = { version = "~9.0.3", optional = true }
79
79
  pytest-mock = { version = "^3.15.0", optional = true }
80
- httpx2 = { version = "^2.5.0", optional = true }
81
80
  python-dotenv = "^1.0.0"
82
81
  python-multipart = ">=0.0.30, <1.0" # needed by fastapi for uploading files
83
82
  pyyaml = "^6.0"
@@ -95,7 +94,7 @@ isoduration = { version = "20.11.0", optional = true }
95
94
  dash = [ "dash", "dash-extensions" ]
96
95
  pim = [ "ansys-platform-instancemanagement" ]
97
96
  hps = [ "ansys-hps-client" ]
98
- test = [ "pytest", "pytest-mock", "httpx2" ]
97
+ test = [ "pytest", "pytest-mock" ]
99
98
  mcp = [ "fastmcp", "mcp", "isoduration" ]
100
99
  # didn't find a way to dynamically include previous groups, so we need to copy all dependencies
101
100
  all = [
@@ -105,7 +104,6 @@ all = [
105
104
  "ansys-hps-client",
106
105
  "pytest",
107
106
  "pytest-mock",
108
- "httpx2",
109
107
  "fastmcp",
110
108
  "mcp",
111
109
  "isoduration",
@@ -136,7 +134,7 @@ tox = "^4.4.6"
136
134
  optional = true
137
135
  [tool.poetry.group.tests.dependencies]
138
136
  aiohttp = "^3.10.2"
139
- ansys-saf-testing = { version = ">=0.13.0, <1.0", allow-prereleases = true, extras = [
137
+ ansys-saf-testing = { version = ">=0.14.0, <1.0", allow-prereleases = true, extras = [
140
138
  "docker",
141
139
  "selenium",
142
140
  "hps",
@@ -144,12 +142,11 @@ ansys-saf-testing = { version = ">=0.13.0, <1.0", allow-prereleases = true, extr
144
142
  ] }
145
143
  asgi-lifespan = "^2.1.0"
146
144
  coverage = "^7.2.6"
147
- httpx2 = "^2.5.0"
148
145
  dash = { version = "^3.0.0", extras = [ "diskcache" ] } # diskcache needed for background callbacks
149
146
  docker = "^7.1.0" # lower versions are not compatible with requests >= 2.32 https://github.com/docker/docker-py/pull/3257
150
147
  mock = "^4.0.3"
151
148
  pyc-wheel = "^1.2.7"
152
- pytest = "^9.0.0"
149
+ pytest = "~9.0.3"
153
150
  pytest-asyncio = "^1.0.0"
154
151
  pytest-cov = "^7.0.0"
155
152
  pytest-html = "^4.1.1"
@@ -189,7 +186,6 @@ line-length = 120
189
186
  extend-exclude = [
190
187
  "*_pb2.py",
191
188
  "*_pb2_grpc.py",
192
- "setup_environment.py",
193
189
  "tests/mocks/mock_products/wnua.py",
194
190
  ]
195
191
 
@@ -225,7 +221,6 @@ lint.per-file-ignores.".poetry/**" = [ "S" ]
225
221
  lint.per-file-ignores.".venv/**" = [ "S" ]
226
222
  lint.per-file-ignores."benchmarks/**" = [ "S" ]
227
223
  lint.per-file-ignores."cache/**" = [ "S" ]
228
- lint.per-file-ignores."setup_environment.py" = [ "S" ]
229
224
  # Ignore `S` rules everywhere except for the `src/` directory.
230
225
  lint.per-file-ignores."tests/**.py" = [ "S" ]
231
226
  lint.flake8-bugbear.extend-immutable-calls = [
@@ -305,7 +300,7 @@ source = [ "ansys.saf.glow" ]
305
300
 
306
301
  [tool.coverage.report]
307
302
  show_missing = true
308
- omit = [ "*/pytest-of-*/pytest-*/popen-*/*", "/tmp/*", "setup_environment.py" ]
303
+ omit = [ "*/pytest-of-*/pytest-*/popen-*/*", "/tmp/*" ]
309
304
 
310
305
  [tool.pyright]
311
306
  extraPaths = [ "src" ]
@@ -313,7 +308,6 @@ include = [ "src", "tests", "benchmarks", "doc/source" ]
313
308
  exclude = [
314
309
  "**/*_pb2.py",
315
310
  "**/*_pb2_grpc.py",
316
- "setup_environment.py",
317
311
  ]
318
312
  strict = [ "src", "tests", "benchmarks" ]
319
313
  venvPath = "."
@@ -325,5 +319,5 @@ build-system-version = "2.3.2"
325
319
 
326
320
  [tool.bandit]
327
321
  # targets = ["src"]
328
- exclude_dirs = [ "tests", "setup_environment", ".venv", ".github", ".poetry", "doc", "benchmarks", "cache" ]
329
- skips = [ "B112", "B603" ]
322
+ exclude_dirs = [ "tests", ".venv", ".github", ".poetry", "doc", "benchmarks", "cache" ]
323
+ skips = [ "B112", "B603" ]
@@ -18,7 +18,7 @@ import logging
18
18
  from pathlib import Path
19
19
  from typing import Any, Generic, TypeVar, cast
20
20
 
21
- import httpx
21
+ import httpx2
22
22
 
23
23
  from ansys.saf.glow._client.project_proxy import ProjectProxy
24
24
  from ansys.saf.glow._config.const import Deployment
@@ -74,7 +74,7 @@ class Client(Generic[T]):
74
74
  elif access_token:
75
75
  headers["Authorization"] = f"Bearer {access_token}"
76
76
  self._access_token = access_token
77
- self._http_client = httpx.Client(timeout=300, transport=InjectTraceTransport(), headers=headers)
77
+ self._http_client = httpx2.Client(timeout=300, transport=InjectTraceTransport(), headers=headers)
78
78
  if api_key:
79
79
  self._graphql_client = GqlClientConnectionPool(url=f"{url}/graphql", api_key=api_key)
80
80
  else:
@@ -21,7 +21,7 @@ from pathlib import Path
21
21
  from typing import Any, TypeVar
22
22
 
23
23
  from ansys.bdm.api import IStorageScope
24
- import httpx
24
+ import httpx2
25
25
 
26
26
  from ansys.saf.glow._client.step_proxy import StepProxy
27
27
  from ansys.saf.glow._client.storagescope import ClientStorageScope
@@ -42,7 +42,7 @@ class ProjectProxy:
42
42
  solution_type: type[Solution],
43
43
  url: str,
44
44
  external_url: str,
45
- http_client: httpx.Client,
45
+ http_client: httpx2.Client,
46
46
  project_files_dir: Path,
47
47
  graphql_client: GqlClientConnectionPool,
48
48
  settings: Settings,
@@ -69,7 +69,7 @@ class ProjectProxy:
69
69
  solution_type: type[Solution],
70
70
  url: str,
71
71
  external_url: str,
72
- http_client: httpx.Client,
72
+ http_client: httpx2.Client,
73
73
  project_files_dir: Path,
74
74
  graphql_client: GqlClientConnectionPool,
75
75
  access_token: str | None = None,
@@ -20,7 +20,7 @@ from typing import Any, get_type_hints
20
20
  from urllib.parse import quote
21
21
 
22
22
  from fastapi.encoders import jsonable_encoder
23
- import httpx
23
+ import httpx2
24
24
  from pydantic import TypeAdapter
25
25
 
26
26
  from ansys.saf.glow._core.client_exceptions import BadRequestException, NotFoundException, check
@@ -41,7 +41,7 @@ class StepProxy:
41
41
  external_project_url: str,
42
42
  step_name: str,
43
43
  step_model_type: type[StepModel],
44
- http_client: httpx.Client,
44
+ http_client: httpx2.Client,
45
45
  project_files_dir: Path,
46
46
  graphql_client: GqlClientConnectionPool,
47
47
  ) -> None:
@@ -27,7 +27,7 @@ from ansys.bdm.api import (
27
27
  IEntityWriter,
28
28
  IStorageScope,
29
29
  )
30
- import httpx
30
+ import httpx2
31
31
  from pydantic import FutureDate, TypeAdapter, ValidationError
32
32
 
33
33
  from ansys.saf.glow._bdm.multiplexor import SafMultiplexorStorageScopeFactory
@@ -47,7 +47,7 @@ class ClientStorageScope(IStorageScope):
47
47
  def __init__(
48
48
  self,
49
49
  root_directory: str,
50
- http_client: httpx.Client,
50
+ http_client: httpx2.Client,
51
51
  project_url: str,
52
52
  project_display_name: str,
53
53
  settings: Settings,
@@ -167,6 +167,14 @@ class Settings(BaseSettings):
167
167
  default=DEFAULT_GLOW_HPS_CLIENT_ID,
168
168
  description="HPS client id for the configuration of the interactive authorization",
169
169
  )
170
+ glow_auth_service_account_client_id: str | None = Field(
171
+ default=None,
172
+ description="Client id of the service account.",
173
+ )
174
+ glow_auth_service_account_client_secret: str | None = Field(
175
+ default=None,
176
+ description="Client secret of the service account.",
177
+ )
170
178
  glow_auth_issuer_url: str | None = Field(
171
179
  default=None,
172
180
  description="Address of the Identity Provider for authenticated access to the GLOW API.",
@@ -14,7 +14,7 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- import httpx
17
+ import httpx2
18
18
 
19
19
 
20
20
  class SolutionClientError(Exception):
@@ -70,7 +70,7 @@ CLIENT_EXCEPTIONS_BY_GRAPHQL_STATUS: dict[str, type[Exception]] = {
70
70
  }
71
71
 
72
72
 
73
- def _get_message(r: httpx.Response, raw: str) -> str:
73
+ def _get_message(r: httpx2.Response, raw: str) -> str:
74
74
  try:
75
75
  return r.json()["detail"]
76
76
  except Exception:
@@ -98,7 +98,7 @@ def raise_for_graphql_status(result: dict[str, str]):
98
98
  raise exception(message)
99
99
 
100
100
 
101
- def check(r: httpx.Response) -> None:
101
+ def check(r: httpx2.Response) -> None:
102
102
  if r.status_code // 100 == 2:
103
103
  return
104
104
  message = _get_message(r, r.text)
@@ -23,13 +23,13 @@ import uuid
23
23
 
24
24
  from fastapi import BackgroundTasks
25
25
  from opentelemetry import trace
26
- from sqlalchemy.ext.asyncio import create_async_engine
27
26
 
28
27
  from ansys.saf.glow._bdm.multiplexor import SafMultiplexorStorageScopeFactory
29
28
  from ansys.saf.glow._config.const import DatabaseType
30
29
  from ansys.saf.glow._config.settings import Settings
31
30
  from ansys.saf.glow._core.solution import Solution
32
31
  from ansys.saf.glow._crud.crud import Crud
32
+ from ansys.saf.glow._repository.engine import create_glow_async_engine
33
33
  from ansys.saf.glow._repository.postgresql import PostgresqlSessionFactory
34
34
  from ansys.saf.glow._repository.sqlite_factory import SqliteSessionFactory
35
35
  from ansys.saf.glow._server.models import BdmLockModel
@@ -144,7 +144,7 @@ async def cleanup_expired_bdm_locks_on_startup(
144
144
  session_factory = SqliteSessionFactory(settings, solution_service)
145
145
  else:
146
146
  database_url = str(db_location).replace("postgresql:", "postgresql+asyncpg:", 1)
147
- engine = create_async_engine(database_url, json_serializer=json.dumps)
147
+ engine = create_glow_async_engine(database_url, json_serializer=json.dumps)
148
148
  try:
149
149
  async with engine.connect():
150
150
  # Check whether the PostgreSQL instance exists or not
@@ -28,7 +28,7 @@ from ansys.saf.glow._core.instance.identification import InstanceIdentificationC
28
28
  if TYPE_CHECKING:
29
29
  from collections.abc import Callable
30
30
 
31
- import httpx
31
+ import httpx2
32
32
 
33
33
  from ansys.saf.glow._config.settings import Settings
34
34
  from ansys.saf.glow._core.instance.manager import ProductInstanceManager
@@ -110,7 +110,7 @@ def instance_decorator_func(
110
110
  solution: Solution,
111
111
  name_of_step_containing_method: str,
112
112
  settings: Settings,
113
- http_client: httpx.Client,
113
+ http_client: httpx2.Client,
114
114
  **kwargs: Any,
115
115
  ) -> T:
116
116
  referenced_step_name = attribute.parse_field_reference(name_of_step_containing_method)[0]
@@ -205,7 +205,7 @@ def instance(
205
205
  solution: Solution,
206
206
  name_of_step_containing_method: str,
207
207
  settings: Settings,
208
- http_client: httpx.Client,
208
+ http_client: httpx2.Client,
209
209
  *_: P.args,
210
210
  **kwargs: P.kwargs,
211
211
  ) -> T:
@@ -295,7 +295,7 @@ def create_instance(
295
295
  solution: Solution,
296
296
  name_of_step_containing_method: str,
297
297
  settings: Settings,
298
- http_client: httpx.Client,
298
+ http_client: httpx2.Client,
299
299
  *_: P.args,
300
300
  **kwargs: P.kwargs,
301
301
  ) -> T:
@@ -17,16 +17,98 @@ HPS_JOB_SCRIPT_CONTENT = """# Copyright (C) 2026 ANSYS, Inc. and/or its affiliat
17
17
 
18
18
  # type: ignore
19
19
 
20
+ import ipaddress
20
21
  import os
21
22
  import platform
22
23
  import socket
23
24
  import string
24
25
  import tempfile
26
+ from urllib.parse import urlparse
25
27
 
26
28
  from ansys.hps.client.jms import ProjectApi # type: ignore
27
29
  from ansys.rep.common.logging import log
28
30
  from ansys.rep.evaluator.task_manager import ApplicationExecution
29
31
 
32
+ def _is_ip_literal(value: str) -> bool:
33
+ '''Return True if value parses as an IPv4 or IPv6 address literal (not a hostname).'''
34
+ try:
35
+ ipaddress.ip_address(value)
36
+ except ValueError:
37
+ return False
38
+ return True
39
+
40
+
41
+ def _is_advertisable(ip: str) -> bool:
42
+ '''Return False for addresses no external caller can reach back on.
43
+
44
+ Rejects loopback (127/8, ::1), link-local (169.254/16, fe80::/10),
45
+ and unspecified (0.0.0.0) addresses using the ipaddress stdlib module
46
+ for correct IPv4 and IPv6 handling. Non-IP-literal values (such as hostnames)
47
+ are also rejected: callers should use _is_ip_literal first to distinguish
48
+ "not an advertisable IP" from "not an IP at all".
49
+ '''
50
+ try:
51
+ addr = ipaddress.ip_address(ip)
52
+ except ValueError:
53
+ return False
54
+ return not (addr.is_loopback or addr.is_link_local or addr.is_unspecified)
55
+
56
+
57
+ def _probe_route_to(host: str) -> str | None:
58
+ '''Return the local address the OS would use to route toward host, if advertisable.
59
+
60
+ Uses a UDP "connect" so the OS consults its routing table without sending any data
61
+ on the wire - works even when host is unreachable. Returns None if the route can't
62
+ be determined or the resulting local address isn't advertisable.
63
+ '''
64
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
65
+ try:
66
+ s.connect((host, 80))
67
+ ip = s.getsockname()[0]
68
+ except OSError:
69
+ return None
70
+ finally:
71
+ s.close()
72
+ return ip if _is_advertisable(ip) else None
73
+
74
+
75
+ def detect_host_ip(target_host: str | None = None) -> str:
76
+ '''Return a best-effort IPv4 address suitable for advertising to external callers.
77
+
78
+ If GLOW_PRODUCT_HOST is set, it is returned verbatim (it may be an IP literal or a hostname).
79
+ Avoids socket.gethostbyname(socket.gethostname()), which can return loopback addresses
80
+ (127.x.x.x) on systems where the hostname maps to loopback in /etc/hosts.
81
+
82
+ Resolution order:
83
+ 1. GLOW_PRODUCT_HOST environment variable (explicit override for NAT/overlay).
84
+ 2. UDP route probe toward target_host, if provided.
85
+ 3. UDP route probe toward 8.8.8.8 as a fallback public sink.
86
+ 4. First advertisable address from socket.getaddrinfo.
87
+ 5. Legacy socket.gethostbyname(socket.gethostname()) for compatibility.
88
+ '''
89
+ override = os.environ.get("GLOW_PRODUCT_HOST")
90
+ if override:
91
+ return override
92
+
93
+ if target_host:
94
+ ip = _probe_route_to(target_host)
95
+ if ip:
96
+ return ip
97
+
98
+ ip = _probe_route_to("8.8.8.8")
99
+ if ip:
100
+ return ip
101
+
102
+ try:
103
+ for *_, sockaddr in socket.getaddrinfo(socket.gethostname(), None, socket.AF_INET):
104
+ ip = sockaddr[0]
105
+ if _is_advertisable(ip):
106
+ return ip
107
+ except OSError:
108
+ pass
109
+
110
+ return socket.gethostbyname(socket.gethostname())
111
+
30
112
 
31
113
  class GlowInstanceExecution(ApplicationExecution):
32
114
  LOCALHOSTS = ["localhost", "127.0.0.1"]
@@ -78,7 +160,16 @@ class GlowInstanceExecution(ApplicationExecution):
78
160
  task = project_api.get_tasks(id=self.context.task["task_id"], fields="all")[0]
79
161
  task_definition = project_api.get_task_definitions(id=self.context.task["task_definition_id"], fields="all")[0]
80
162
 
81
- published_host = env.get(self.GLOW_PRODUCT_HOST, socket.gethostbyname(socket.gethostname()))
163
+ hps_hostname = urlparse(self.context.client.url).hostname
164
+ published_host = env.get(self.GLOW_PRODUCT_HOST) or detect_host_ip(hps_hostname)
165
+ if _is_ip_literal(published_host) and not _is_advertisable(published_host):
166
+ log.warning(
167
+ f"The detected address for this product instance ('{published_host}') is a loopback, "
168
+ "link-local, or unspecified address, so other machines will not be able to reach it. "
169
+ "The Solution API may be unable to connect to the running instance. If this machine has "
170
+ "multiple network interfaces or runs in a container, set the GLOW_PRODUCT_HOST environment "
171
+ "variable to an address or hostname that other machines can use to reach it."
172
+ )
82
173
  bind_host = env.get(
83
174
  self.GLOW_PRODUCT_BINDING_HOST,
84
175
  (
@@ -19,7 +19,7 @@ from typing import Generic
19
19
  from urllib.parse import urlparse
20
20
 
21
21
  from fastapi.encoders import jsonable_encoder
22
- import httpx
22
+ import httpx2
23
23
 
24
24
  from ansys.saf.glow._core.instance.recoverystate import TRecoveryStateInfo
25
25
  from ansys.saf.glow._server.schemas import CreateInstanceRequest, InstanceResponse, ModifyInstanceRequest
@@ -112,7 +112,7 @@ class InstanceIdentificationClient(AbstractInstanceIdentificationClient[TRecover
112
112
  def __init__(
113
113
  self,
114
114
  instance_identification_url: str,
115
- http_client: httpx.Client,
115
+ http_client: httpx2.Client,
116
116
  recovery_state_info_type: type[TRecoveryStateInfo],
117
117
  is_create_instance: bool = False,
118
118
  ) -> None:
@@ -19,7 +19,7 @@ import functools
19
19
  import time
20
20
  from typing import Generic, ParamSpec, TypeVar
21
21
 
22
- import httpx
22
+ import httpx2
23
23
  from pydantic import TypeAdapter
24
24
 
25
25
  from ansys.saf.glow._core.client_exceptions import CLIENT_EXCEPTIONS_BY_CODE, BadRequestException, check
@@ -70,7 +70,7 @@ class LongRunning(Generic[T]):
70
70
  step_name: str,
71
71
  method_name: str,
72
72
  method_url: str,
73
- http_client: httpx.Client,
73
+ http_client: httpx2.Client,
74
74
  return_type: T,
75
75
  ) -> None:
76
76
  self._step_model_type = step_model_type
@@ -23,7 +23,7 @@ from typing import Annotated, Any, ParamSpec, TypeVar, get_origin, get_type_hint
23
23
  from ansys.bdm.api import IStorageScope
24
24
  from ansys.iam.oidc import OidcClient
25
25
  from fastapi import Body
26
- import httpx
26
+ import httpx2
27
27
  from pydantic import (
28
28
  BaseModel,
29
29
  ConfigDict,
@@ -288,7 +288,7 @@ def transaction(enable_termination_event: bool = False, **kwargs: StepSpec):
288
288
  project_url: str,
289
289
  solution: Solution,
290
290
  name_of_step_containing_method: str,
291
- http_client: httpx.Client,
291
+ http_client: httpx2.Client,
292
292
  settings: Settings,
293
293
  instance_system_factory: IProductInstanceSystemFactory,
294
294
  storage_scope: IStorageScope,
@@ -395,7 +395,7 @@ def transaction(enable_termination_event: bool = False, **kwargs: StepSpec):
395
395
 
396
396
 
397
397
  def _get_solution_configuration(
398
- http_client: httpx.Client,
398
+ http_client: httpx2.Client,
399
399
  project_url: str,
400
400
  solution_configuration_type: type[TSolutionConfig],
401
401
  ) -> TSolutionConfig:
@@ -26,7 +26,7 @@ from pydantic import BaseModel, PostgresDsn, ValidationError
26
26
  from pydantic_core import MultiHostUrl
27
27
  from sqlalchemy import update
28
28
  from sqlalchemy.exc import OperationalError, ProgrammingError
29
- from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
29
+ from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
30
30
 
31
31
  from ansys.saf.glow._config.const import GLOW_OVERWRITE_SOLUTION_CONFIG, DatabaseType
32
32
  from ansys.saf.glow._crud.solution_configuration_abstract import AbstractSolutionConfigurationCRUD
@@ -36,6 +36,7 @@ from ansys.saf.glow._crud.solution_configuration_models import (
36
36
  SolutionConfiguration,
37
37
  SolutionConfigurationSQL,
38
38
  )
39
+ from ansys.saf.glow._repository.engine import create_glow_async_engine
39
40
  from ansys.saf.glow._server.exceptions import MalformedDatabaseError, NotFoundError, UnprocessableEntityError
40
41
 
41
42
  logger = logging.getLogger(__name__)
@@ -80,7 +81,7 @@ class RelationalSolutionConfigurationCRUD(AbstractSolutionConfigurationCRUD[TSol
80
81
 
81
82
  @asynccontextmanager
82
83
  async def _get_session(self) -> AsyncGenerator[AsyncSession, None]:
83
- engine = create_async_engine(self._database_url)
84
+ engine = create_glow_async_engine(self._database_url)
84
85
 
85
86
  # Run all the transactions on the solution configuration as EXCLUSIVE / SERIALIZABLE.
86
87
  # (This means that each transaction has exclusive access to the database for its duration.)
@@ -103,7 +104,7 @@ class RelationalSolutionConfigurationCRUD(AbstractSolutionConfigurationCRUD[TSol
103
104
  raise UnprocessableEntityError(str(e)) from None
104
105
 
105
106
  async def initialize_database(self, default_solution_configuration: TSolutionConfig) -> None:
106
- engine = create_async_engine(self._database_url)
107
+ engine = create_glow_async_engine(self._database_url)
107
108
  async with engine.begin() as conn:
108
109
  await conn.run_sync(Base.metadata.create_all)
109
110