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.
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/PKG-INFO +6 -7
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/pyproject.toml +12 -18
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/client.py +2 -2
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/project_proxy.py +3 -3
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/step_proxy.py +2 -2
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/storagescope.py +2 -2
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/settings.py +8 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/client_exceptions.py +3 -3
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/gc.py +2 -2
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/decorator.py +4 -4
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/identification.py +2 -2
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/long_running.py +2 -2
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/transaction.py +3 -3
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/method_runner.py +12 -12
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/transaction.py +4 -4
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/server.py +55 -30
- ansys_saf_glow_engine-2.4.dev0/src/ansys/saf/glow/_repository/engine.py +38 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/relational.py +17 -9
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/dependencies.py +5 -5
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_testing/solution.py +31 -2
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/ip_utilities.py +3 -3
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/testing/__init__.py +1 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/LICENSE +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/README.rst +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/datarepo.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/filesystem.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/hps_scope.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/minerva.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/multiplexor.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/storage_contexts.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/storage_factory.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/storage_utils.py +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/subsystem_names.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_bdm/subsystem_scope.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/dashclient.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_client/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/const.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/directories.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_config/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/blob_managers.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/dag.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/exceptions.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/field_state.py +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/gql.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/gql_helper.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/attribute.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/healthcheck.py +0 -0
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/manager.py +0 -0
- {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
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/recoverystate.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/instance/storagescope.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/livehandles.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/method_status.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/migrations.py +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/solution.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/state_engine.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/step_model.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/step_spec.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/archive_helper.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/bdm_helper.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/crud.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/instance_helper.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/project_builder.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_crud/py.typed +0 -0
- {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
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_events/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_events/ievent_manager.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_events/py.typed +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/local.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_executor/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/__init__.py +0 -0
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_hps_auth/py.typed +0 -0
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_mcp/solution_doc.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/abstract_repository.py +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/postgresql.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/relational_mapper.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/relational_models.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/sqlite.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/sqlite_adapters.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_repository/sqlite_factory.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/analysis.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/exceptions.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/filter_parser.py +0 -0
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/main.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/method_url.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/models.py +0 -0
- {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
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/blobs.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/desktop.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/events.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/graphql.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/instances.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/methods.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/projects.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/py.typed +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/routers/steps.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/schemas.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/server.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_server/solution.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/base.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/os.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_storage/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/config.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/instrumentor.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/metrics_middleware.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_telemetry/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_testing/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_testing/py.typed +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_ui/main.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_ui/server.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/code.py +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/conversion.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/decrypt_file.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/path_parser.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/procs.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/random_identifier.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/requests.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_utilities/solution_modules.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/api.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/cli/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/cli/__main__.py +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/cli/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/client/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/client/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/default_wheel_version.txt +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/hps_execution.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/hps_execution_str.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/runtime/__init__.py +0 -0
- {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
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/runtime/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/hps/__init__.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/hps/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/products/config.py +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/products/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/solution/py.typed +0 -0
- {ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/testing/py.typed +0 -0
- {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
|
+
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.
|
|
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:
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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 = "
|
|
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 = "
|
|
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 = "
|
|
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"
|
|
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.
|
|
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 = "
|
|
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/*"
|
|
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", "
|
|
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
|
|
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 =
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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)
|
{ansys_saf_glow_engine-2.3.dev0 → ansys_saf_glow_engine-2.4.dev0}/src/ansys/saf/glow/_core/gc.py
RENAMED
|
@@ -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 =
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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 =
|
|
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 =
|
|
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
|
|