squidient 4.0.0__tar.gz → 4.0.2__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.
- squidient-4.0.2/PKG-INFO +107 -0
- squidient-4.0.2/README.md +89 -0
- {squidient-4.0.0 → squidient-4.0.2}/pyproject.toml +1 -1
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x2/t3.small/t3.small.tf +2 -2
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x6/t3.small/t3.small.tf +2 -2
- {squidient-4.0.0/src/squidient/data/terraform/aws-ec2-t3.small-x6/t3.small → squidient-4.0.2/src/squidient/data/terraform/common}/cloud-init-slurm-fedora.sh +59 -5
- squidient-4.0.0/PKG-INFO +0 -49
- squidient-4.0.0/README.md +0 -31
- squidient-4.0.0/src/squidient/data/terraform/aws-ec2-t3.small-x2/t3.small/cloud-init-slurm-fedora.sh +0 -315
- squidient-4.0.0/src/squidient/data/terraform/aws-ec2-t3.small-x2/t3.small/replace-var.sh +0 -4
- squidient-4.0.0/src/squidient/data/terraform/aws-ec2-t3.small-x3/t3.small/cloud-init-slurm-fedora.sh +0 -1
- {squidient-4.0.0 → squidient-4.0.2}/.gitignore +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/LICENSE.txt +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/builds/benchmark_build_execution.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/builds/benchmark_build_orchestrator.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/builds/build_definition.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/builds/build_execution.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/builds/build_orchestrator.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/builds/build_presets.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/cli/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/cli/__main__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/cli/main.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/cli/monitoring.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/cli/staging.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/cli/update.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/code_coverage/code_coverage.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/code_coverage/gcovr_code_coverage.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/code_coverage/intel_code_coverage.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/compare.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/compare_with_diff_table.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/absolute.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/close.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/diff.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/l1_norm.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/l1_relative.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/l2_norm.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/l2_relative.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/linf_norm.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/linf_relative.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/power.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/relative.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/scalar_tolerance.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/tolerance.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compare/methods/vector_tolerance.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/compilation/cmake_options.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/configuration/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/configuration/code_coverage.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/configuration/data_revision.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/configuration/generator.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/configuration/prompts.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/configure.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/connection/job.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/connection/ssh.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/connection/ssh_config_checker.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/.squidient-initialized +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-alamak.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-chemint.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-clang.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-commdom.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-gnu.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-intel.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-mumps.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-nvhpc.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/alya-config/cmake-talp.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/benchmarks/benchmarks.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/builds/builds.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/builds/cc.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/builds/defaults.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/builds/predefined-old.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/builds/predefined.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/configurations/projects.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/configurations/systems.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/configurations/tests.json +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/email/report.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/icons/big.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/icons/small.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/index.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/.gitignore +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small/.gitignore +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small/t3.small/cloud-init-slurm-fedora.sh +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small/t3.small/t3.small.tf +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small/t3.small/terraform.tfvars +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x2/t3.small/.gitignore +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x2/t3.small/terraform.tfvars +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x3/t3.small/.gitignore +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x3/t3.small/t3.small.tf +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x3/t3.small/terraform.tfvars +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x6/t3.small/.gitignore +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/terraform/aws-ec2-t3.small-x6/t3.small/terraform.tfvars +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/btest.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/cc-gcovr.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/cc-intel.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/files.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/canceled.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/created.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/failed.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/failed_black.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/failed_green.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/file_cloud.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/file_config.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/file_ko.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/file_ok.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/skipped.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/squidient_logo.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/success.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/success_black.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/timeout.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/tolerance.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/warning.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/warning_black.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/png/warning_green.png +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/canceled.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/created.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/failed.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/failed_black.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/failed_green.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/manual.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/running.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/skipped.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/success.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/success_black.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/warning.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/warning_black.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/img/svg/warning_green.svg +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/index.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/jquery.dynatable.css +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/jquery.dynatable.js +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/monitoring.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/monitoring_build.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/monitoring_test.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/perf.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/staging_build.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/staging_test.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/test.html +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/testsuite.css +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/data/web/testsuite.js +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/definitions.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/deployment/initialization.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/deployment/module_generator.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/exceptions.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/monitoring/build_phase.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/monitoring/full_workflow.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/monitoring/monitoring.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/monitoring/monitoring_db.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/monitoring/notification_failures.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/monitoring/test_phase.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/cases/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/cases/base.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/cases/case.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/cases/detailed.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/cases/full.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/monitoring/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/monitoring/report.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/reports/report.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/build_phase.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/execution_warning.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/full_workflow.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/report_cleaner.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/report_transfer.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/staging.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/test_phase.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/staging/test_relauncher.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/systems/partition.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/systems/platform.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/systems/qos.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/systems/queue_tester.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/systems/reservation.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/systems/system.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/systems/system_manager.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/terraform/terraform.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/benchmarks/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/benchmarks/failure_notifier.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/benchmarks/instance.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/benchmarks/test_case.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/benchmarks/test_orchestrator.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/cases/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/cases/instance.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/cases/instance_merger.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/cases/test_case.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/testing/test_orchestrator.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/timers/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/timers/timer.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/arguments.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/gitlab.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/lock.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/log.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/message.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/package.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/utils.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/utils/watchdog.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/version_control/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/version_control/git_repository.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/workflows/__init__.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/workflows/base.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/workflows/code_coverage.py +0 -0
- {squidient-4.0.0 → squidient-4.0.2}/src/squidient/workflows/locks.py +0 -0
squidient-4.0.2/PKG-INFO
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: squidient
|
|
3
|
+
Version: 4.0.2
|
|
4
|
+
Summary: CI/CD framework for alya
|
|
5
|
+
Project-URL: Homepage, https://alya.gitlab.bsc.es/alya/ci-cd/squidient
|
|
6
|
+
Project-URL: Bug Tracker, https://alya.gitlab.bsc.es/alya/ci-cd/squidient/issues
|
|
7
|
+
Author-email: Damien Dosimont <damien.dosimont@gmail.com>
|
|
8
|
+
License-File: LICENSE.txt
|
|
9
|
+
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
10
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Requires-Python: >=3.7
|
|
13
|
+
Requires-Dist: importlib-resources; python_version < '3.9'
|
|
14
|
+
Requires-Dist: lxml
|
|
15
|
+
Requires-Dist: mariasql>=5
|
|
16
|
+
Requires-Dist: packaging>=21.3
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
|
|
19
|
+
# Squidient
|
|
20
|
+
|
|
21
|
+
Squidient is a scheduler for testing, benchmarking and deploying HPC programs on SLURM machines.
|
|
22
|
+
|
|
23
|
+
## Refreshing Workspace Data
|
|
24
|
+
|
|
25
|
+
Squidient records a fingerprint of its packaged `data/` in `version/data.json`
|
|
26
|
+
when `squidient init .` completes. A completed full configuration records
|
|
27
|
+
that fingerprint in `configuration.json.dataRevision`. Staging and monitoring stop
|
|
28
|
+
with exit code 1 if either differs from the installed package, including for older
|
|
29
|
+
workspaces without this metadata. No confirmation prompt is displayed. The check
|
|
30
|
+
runs before Terraform provisioning, remote connections, or job submission.
|
|
31
|
+
A package release that leaves `data/` unchanged does not require a refresh.
|
|
32
|
+
|
|
33
|
+
Refreshing is explicit: back up any customized workspace files and configuration
|
|
34
|
+
first, then run:
|
|
35
|
+
|
|
36
|
+
```sh
|
|
37
|
+
squidient init .
|
|
38
|
+
squidient configure --all
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`init` overwrites packaged workspace files but does not regenerate
|
|
42
|
+
`configuration.json`. `configure --all` regenerates the configuration; reapply
|
|
43
|
+
your local settings as necessary. Partial reconfiguration does not mark an old
|
|
44
|
+
configuration as current. The check never overwrites customizations automatically.
|
|
45
|
+
Help and cleanup commands, including `terraform stop`, remain available.
|
|
46
|
+
The former `fileFormat` counter and `version/version.json` are no longer used;
|
|
47
|
+
legacy configurations must be refreshed before workflow execution when their
|
|
48
|
+
data revision cannot be established.
|
|
49
|
+
|
|
50
|
+
## MR Concurrency Checks
|
|
51
|
+
|
|
52
|
+
Each MR staging/monitoring `run` job checks the GitLab API before installing
|
|
53
|
+
Squidient or starting a campaign. `version:final` repeats the check before its
|
|
54
|
+
release-version validation. A running or canceling MR run/version job in another
|
|
55
|
+
pipeline makes the current job fail immediately, with the conflicting pipeline
|
|
56
|
+
and job identifiers. There is no waiting, automatic cancellation or write API
|
|
57
|
+
operation. Jobs in the same parent pipeline, including its staging and monitoring
|
|
58
|
+
children, are excluded so those two workflows can still run together.
|
|
59
|
+
|
|
60
|
+
The check uses `CI_API_V4_URL` and the existing `SQUIDIENT_READ_API_TOKEN`.
|
|
61
|
+
Pagination, response sizes and request/check durations are bounded. API failures,
|
|
62
|
+
invalid metadata or missing credentials prevent campaign execution. Master and
|
|
63
|
+
trigger workflows are unchanged. Retried child runs are detected independently
|
|
64
|
+
of their parent pipeline's completion status.
|
|
65
|
+
|
|
66
|
+
This is a best-effort API snapshot, not an atomic lock: simultaneous starts can
|
|
67
|
+
race. That risk is accepted instead of queueing campaigns or using a remote lock.
|
|
68
|
+
Retry a rejected job after the other campaign finishes. TestPyPI publication is
|
|
69
|
+
automatic after successful validations for eligible version-changing MRs.
|
|
70
|
+
|
|
71
|
+
## CI Report Comments
|
|
72
|
+
|
|
73
|
+
The three `post` jobs delegate MR comments to Taskmaster's declared `task=comment`
|
|
74
|
+
input. The helper sends a JSON `inputs` object, never arbitrary pipeline variables.
|
|
75
|
+
Define `TASKMASTER_PROJECT_ID` and `TASKMASTER_TOKEN` in Squidient's CI/CD settings.
|
|
76
|
+
The latter is a Taskmaster pipeline trigger token, not a GitLab write API token.
|
|
77
|
+
Mask it in job logs and make it available to the MR pipelines that need to post;
|
|
78
|
+
the protected write API tokens remain exclusively in Taskmaster for this operation.
|
|
79
|
+
`TASKMASTER_REF` optionally selects the trusted execution reference and defaults
|
|
80
|
+
to `master`. GitLab provides `CI_API_V4_URL` automatically.
|
|
81
|
+
|
|
82
|
+
Taskmaster selects its own write credential using the target project: Squidient
|
|
83
|
+
for MR staging/monitoring reports, or Alya for triggered staging reports. Titles
|
|
84
|
+
and report links are unchanged. No write API credential is used by the `post`
|
|
85
|
+
scripts. Execution jobs use `SQUIDIENT_READ_API_TOKEN` for the watchdog
|
|
86
|
+
and MR lock checks; triggered Alya staging jobs also use `ALYA_READ_API_TOKEN` to
|
|
87
|
+
watch the source Alya pipeline. Neither `ALYA_WRITE_API_TOKEN` nor
|
|
88
|
+
`SQUIDIENT_WRITE_API_TOKEN` is required by Squidient's CI anymore. Their use for
|
|
89
|
+
publishing comments is confined to Taskmaster.
|
|
90
|
+
|
|
91
|
+
The caller only submits the request; successful submission does not mean that
|
|
92
|
+
Taskmaster has already posted the comment. Check the indicated Taskmaster pipeline
|
|
93
|
+
for the publication result. Posting remains non-blocking for the Squidient
|
|
94
|
+
pipeline. Automatic retries are disabled to reduce duplicate comments; manually
|
|
95
|
+
rerunning a post job can still create duplicates. Credentials, comment bodies
|
|
96
|
+
and API response bodies are not printed by the submission helper.
|
|
97
|
+
|
|
98
|
+
The Gazix, Taskmaster, Alya and Squidient migrations may be merged together.
|
|
99
|
+
Gazix 2.0.0 must finish publishing before Taskmaster jobs can install it. Configure
|
|
100
|
+
Taskmaster's protected write credentials and a protected execution ref, then run
|
|
101
|
+
its `tools/activate_inputs.py` preflight and explicit activation after both known
|
|
102
|
+
master callers have migrated. This disables arbitrary pipeline-variable overrides
|
|
103
|
+
in Taskmaster; there is no legacy-variable fallback. Only Alya and
|
|
104
|
+
Squidient on the same GitLab instance are currently authorized by Taskmaster;
|
|
105
|
+
an explicitly configured source API URL on another instance is rejected rather
|
|
106
|
+
than silently posting to the wrong project.
|
|
107
|
+
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Squidient
|
|
2
|
+
|
|
3
|
+
Squidient is a scheduler for testing, benchmarking and deploying HPC programs on SLURM machines.
|
|
4
|
+
|
|
5
|
+
## Refreshing Workspace Data
|
|
6
|
+
|
|
7
|
+
Squidient records a fingerprint of its packaged `data/` in `version/data.json`
|
|
8
|
+
when `squidient init .` completes. A completed full configuration records
|
|
9
|
+
that fingerprint in `configuration.json.dataRevision`. Staging and monitoring stop
|
|
10
|
+
with exit code 1 if either differs from the installed package, including for older
|
|
11
|
+
workspaces without this metadata. No confirmation prompt is displayed. The check
|
|
12
|
+
runs before Terraform provisioning, remote connections, or job submission.
|
|
13
|
+
A package release that leaves `data/` unchanged does not require a refresh.
|
|
14
|
+
|
|
15
|
+
Refreshing is explicit: back up any customized workspace files and configuration
|
|
16
|
+
first, then run:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
squidient init .
|
|
20
|
+
squidient configure --all
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`init` overwrites packaged workspace files but does not regenerate
|
|
24
|
+
`configuration.json`. `configure --all` regenerates the configuration; reapply
|
|
25
|
+
your local settings as necessary. Partial reconfiguration does not mark an old
|
|
26
|
+
configuration as current. The check never overwrites customizations automatically.
|
|
27
|
+
Help and cleanup commands, including `terraform stop`, remain available.
|
|
28
|
+
The former `fileFormat` counter and `version/version.json` are no longer used;
|
|
29
|
+
legacy configurations must be refreshed before workflow execution when their
|
|
30
|
+
data revision cannot be established.
|
|
31
|
+
|
|
32
|
+
## MR Concurrency Checks
|
|
33
|
+
|
|
34
|
+
Each MR staging/monitoring `run` job checks the GitLab API before installing
|
|
35
|
+
Squidient or starting a campaign. `version:final` repeats the check before its
|
|
36
|
+
release-version validation. A running or canceling MR run/version job in another
|
|
37
|
+
pipeline makes the current job fail immediately, with the conflicting pipeline
|
|
38
|
+
and job identifiers. There is no waiting, automatic cancellation or write API
|
|
39
|
+
operation. Jobs in the same parent pipeline, including its staging and monitoring
|
|
40
|
+
children, are excluded so those two workflows can still run together.
|
|
41
|
+
|
|
42
|
+
The check uses `CI_API_V4_URL` and the existing `SQUIDIENT_READ_API_TOKEN`.
|
|
43
|
+
Pagination, response sizes and request/check durations are bounded. API failures,
|
|
44
|
+
invalid metadata or missing credentials prevent campaign execution. Master and
|
|
45
|
+
trigger workflows are unchanged. Retried child runs are detected independently
|
|
46
|
+
of their parent pipeline's completion status.
|
|
47
|
+
|
|
48
|
+
This is a best-effort API snapshot, not an atomic lock: simultaneous starts can
|
|
49
|
+
race. That risk is accepted instead of queueing campaigns or using a remote lock.
|
|
50
|
+
Retry a rejected job after the other campaign finishes. TestPyPI publication is
|
|
51
|
+
automatic after successful validations for eligible version-changing MRs.
|
|
52
|
+
|
|
53
|
+
## CI Report Comments
|
|
54
|
+
|
|
55
|
+
The three `post` jobs delegate MR comments to Taskmaster's declared `task=comment`
|
|
56
|
+
input. The helper sends a JSON `inputs` object, never arbitrary pipeline variables.
|
|
57
|
+
Define `TASKMASTER_PROJECT_ID` and `TASKMASTER_TOKEN` in Squidient's CI/CD settings.
|
|
58
|
+
The latter is a Taskmaster pipeline trigger token, not a GitLab write API token.
|
|
59
|
+
Mask it in job logs and make it available to the MR pipelines that need to post;
|
|
60
|
+
the protected write API tokens remain exclusively in Taskmaster for this operation.
|
|
61
|
+
`TASKMASTER_REF` optionally selects the trusted execution reference and defaults
|
|
62
|
+
to `master`. GitLab provides `CI_API_V4_URL` automatically.
|
|
63
|
+
|
|
64
|
+
Taskmaster selects its own write credential using the target project: Squidient
|
|
65
|
+
for MR staging/monitoring reports, or Alya for triggered staging reports. Titles
|
|
66
|
+
and report links are unchanged. No write API credential is used by the `post`
|
|
67
|
+
scripts. Execution jobs use `SQUIDIENT_READ_API_TOKEN` for the watchdog
|
|
68
|
+
and MR lock checks; triggered Alya staging jobs also use `ALYA_READ_API_TOKEN` to
|
|
69
|
+
watch the source Alya pipeline. Neither `ALYA_WRITE_API_TOKEN` nor
|
|
70
|
+
`SQUIDIENT_WRITE_API_TOKEN` is required by Squidient's CI anymore. Their use for
|
|
71
|
+
publishing comments is confined to Taskmaster.
|
|
72
|
+
|
|
73
|
+
The caller only submits the request; successful submission does not mean that
|
|
74
|
+
Taskmaster has already posted the comment. Check the indicated Taskmaster pipeline
|
|
75
|
+
for the publication result. Posting remains non-blocking for the Squidient
|
|
76
|
+
pipeline. Automatic retries are disabled to reduce duplicate comments; manually
|
|
77
|
+
rerunning a post job can still create duplicates. Credentials, comment bodies
|
|
78
|
+
and API response bodies are not printed by the submission helper.
|
|
79
|
+
|
|
80
|
+
The Gazix, Taskmaster, Alya and Squidient migrations may be merged together.
|
|
81
|
+
Gazix 2.0.0 must finish publishing before Taskmaster jobs can install it. Configure
|
|
82
|
+
Taskmaster's protected write credentials and a protected execution ref, then run
|
|
83
|
+
its `tools/activate_inputs.py` preflight and explicit activation after both known
|
|
84
|
+
master callers have migrated. This disables arbitrary pipeline-variable overrides
|
|
85
|
+
in Taskmaster; there is no legacy-variable fallback. Only Alya and
|
|
86
|
+
Squidient on the same GitLab instance are currently authorized by Taskmaster;
|
|
87
|
+
an explicitly configured source API URL on another instance is rejected rather
|
|
88
|
+
than silently posting to the wrong project.
|
|
89
|
+
|
|
@@ -95,7 +95,7 @@ resource "aws_instance" "slurm_head" {
|
|
|
95
95
|
|
|
96
96
|
# Head gets a single "primary" compute hostname for its slurm.conf
|
|
97
97
|
user_data = templatefile(
|
|
98
|
-
"${path.module}/cloud-init-slurm-fedora.sh",
|
|
98
|
+
"${path.module}/../../common/cloud-init-slurm-fedora.sh",
|
|
99
99
|
{
|
|
100
100
|
ROLE = "head"
|
|
101
101
|
HEAD_HOSTNAME = "slurm-head"
|
|
@@ -131,7 +131,7 @@ resource "aws_instance" "slurm_compute" {
|
|
|
131
131
|
depends_on = [aws_instance.slurm_head]
|
|
132
132
|
|
|
133
133
|
user_data = templatefile(
|
|
134
|
-
"${path.module}/cloud-init-slurm-fedora.sh",
|
|
134
|
+
"${path.module}/../../common/cloud-init-slurm-fedora.sh",
|
|
135
135
|
{
|
|
136
136
|
ROLE = "compute"
|
|
137
137
|
HEAD_HOSTNAME = "slurm-head"
|
|
@@ -95,7 +95,7 @@ resource "aws_instance" "slurm_head" {
|
|
|
95
95
|
|
|
96
96
|
# Head gets a single "primary" compute hostname for its slurm.conf
|
|
97
97
|
user_data = templatefile(
|
|
98
|
-
"${path.module}/cloud-init-slurm-fedora.sh",
|
|
98
|
+
"${path.module}/../../common/cloud-init-slurm-fedora.sh",
|
|
99
99
|
{
|
|
100
100
|
ROLE = "head"
|
|
101
101
|
HEAD_HOSTNAME = "slurm-head"
|
|
@@ -131,7 +131,7 @@ resource "aws_instance" "slurm_compute" {
|
|
|
131
131
|
depends_on = [aws_instance.slurm_head]
|
|
132
132
|
|
|
133
133
|
user_data = templatefile(
|
|
134
|
-
"${path.module}/cloud-init-slurm-fedora.sh",
|
|
134
|
+
"${path.module}/../../common/cloud-init-slurm-fedora.sh",
|
|
135
135
|
{
|
|
136
136
|
ROLE = "compute"
|
|
137
137
|
HEAD_HOSTNAME = "slurm-head"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
set -eux
|
|
3
3
|
|
|
4
4
|
# ------------------------------------------------------------
|
|
5
|
-
# Role and topology (
|
|
5
|
+
# Role and topology (provided by each Terraform configuration)
|
|
6
6
|
# ------------------------------------------------------------
|
|
7
7
|
ROLE="${ROLE}"
|
|
8
8
|
HEAD_HOSTNAME="${HEAD_HOSTNAME}"
|
|
@@ -154,13 +154,67 @@ else
|
|
|
154
154
|
sleep 3
|
|
155
155
|
done
|
|
156
156
|
|
|
157
|
-
if mountpoint -q /shared; then
|
|
158
|
-
COMPUTE_IP="$(hostname -I | awk '{print $1}')"
|
|
159
|
-
echo "$COMPUTE_IP" > "/shared/${COMPUTE_HOSTNAME}.ip" || true
|
|
160
|
-
fi
|
|
161
157
|
fi
|
|
162
158
|
fi
|
|
163
159
|
|
|
160
|
+
# ------------------------------------------------------------
|
|
161
|
+
# Share the complete cluster host map with every MPI launch node
|
|
162
|
+
# ------------------------------------------------------------
|
|
163
|
+
if [ "${ROLE}" != "head" ] && ! mountpoint -q /shared; then
|
|
164
|
+
echo "Shared storage is not mounted; cannot resolve cluster nodes" >&2
|
|
165
|
+
exit 1
|
|
166
|
+
fi
|
|
167
|
+
|
|
168
|
+
LOCAL_IP="$(hostname -I | awk '{print $1}')"
|
|
169
|
+
printf '%s\n' "$LOCAL_IP" > "/shared/$HOSTNAME.ip"
|
|
170
|
+
|
|
171
|
+
all_ready=false
|
|
172
|
+
for i in $(seq 1 300); do
|
|
173
|
+
all_ready=true
|
|
174
|
+
for node in "${HEAD_HOSTNAME}" ${COMPUTE_NODE_LIST}; do
|
|
175
|
+
if [ ! -s "/shared/$node.ip" ]; then
|
|
176
|
+
all_ready=false
|
|
177
|
+
fi
|
|
178
|
+
done
|
|
179
|
+
if $all_ready; then break; fi
|
|
180
|
+
sleep 2
|
|
181
|
+
done
|
|
182
|
+
|
|
183
|
+
if ! $all_ready; then
|
|
184
|
+
echo "Timed out waiting for all cluster node addresses in /shared" >&2
|
|
185
|
+
exit 1
|
|
186
|
+
fi
|
|
187
|
+
|
|
188
|
+
python3 - /shared /etc/hosts "${HEAD_HOSTNAME}" "${COMPUTE_NODE_LIST}" <<'CLUSTER_HOSTS_PY'
|
|
189
|
+
import ipaddress
|
|
190
|
+
from pathlib import Path
|
|
191
|
+
import sys
|
|
192
|
+
|
|
193
|
+
shared = Path(sys.argv[1])
|
|
194
|
+
hosts = Path(sys.argv[2])
|
|
195
|
+
names = [sys.argv[3]] + sys.argv[4].split()
|
|
196
|
+
addresses = {
|
|
197
|
+
name: str(ipaddress.IPv4Address((shared / (name + ".ip")).read_text().strip()))
|
|
198
|
+
for name in names
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
# Replace cluster aliases while preserving unrelated host entries and comments.
|
|
202
|
+
lines = []
|
|
203
|
+
for line in hosts.read_text().splitlines():
|
|
204
|
+
body, separator, comment = line.partition("#")
|
|
205
|
+
fields = body.split()
|
|
206
|
+
if len(fields) > 1 and any(alias in addresses for alias in fields[1:]):
|
|
207
|
+
aliases = [alias for alias in fields[1:] if alias not in addresses]
|
|
208
|
+
if not aliases and not separator:
|
|
209
|
+
continue
|
|
210
|
+
line = " ".join([fields[0]] + aliases) if aliases else ""
|
|
211
|
+
if separator:
|
|
212
|
+
line += (" " if line else "") + "#" + comment
|
|
213
|
+
lines.append(line)
|
|
214
|
+
lines.extend(addresses[name] + " " + name for name in names)
|
|
215
|
+
hosts.write_text("\n".join(lines) + "\n")
|
|
216
|
+
CLUSTER_HOSTS_PY
|
|
217
|
+
|
|
164
218
|
# ------------------------------------------------------------
|
|
165
219
|
# Munge setup
|
|
166
220
|
# ------------------------------------------------------------
|
squidient-4.0.0/PKG-INFO
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: squidient
|
|
3
|
-
Version: 4.0.0
|
|
4
|
-
Summary: CI/CD framework for alya
|
|
5
|
-
Project-URL: Homepage, https://alya.gitlab.bsc.es/alya/ci-cd/squidient
|
|
6
|
-
Project-URL: Bug Tracker, https://alya.gitlab.bsc.es/alya/ci-cd/squidient/issues
|
|
7
|
-
Author-email: Damien Dosimont <damien.dosimont@gmail.com>
|
|
8
|
-
License-File: LICENSE.txt
|
|
9
|
-
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
10
|
-
Classifier: Operating System :: POSIX :: Linux
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Requires-Python: >=3.7
|
|
13
|
-
Requires-Dist: importlib-resources; python_version < '3.9'
|
|
14
|
-
Requires-Dist: lxml
|
|
15
|
-
Requires-Dist: mariasql>=5
|
|
16
|
-
Requires-Dist: packaging>=21.3
|
|
17
|
-
Description-Content-Type: text/markdown
|
|
18
|
-
|
|
19
|
-
# Squidient
|
|
20
|
-
|
|
21
|
-
Squidient is a scheduler for testing, benchmarking and deploying HPC programs on SLURM machines.
|
|
22
|
-
|
|
23
|
-
## Refreshing Workspace Data
|
|
24
|
-
|
|
25
|
-
Squidient records a fingerprint of its packaged `data/` in `version/data.json`
|
|
26
|
-
when `squidient init .` completes. A completed full configuration records
|
|
27
|
-
that fingerprint in `configuration.json.dataRevision`. Staging and monitoring stop
|
|
28
|
-
with exit code 1 if either differs from the installed package, including for older
|
|
29
|
-
workspaces without this metadata. No confirmation prompt is displayed. The check
|
|
30
|
-
runs before Terraform provisioning, remote connections, or job submission.
|
|
31
|
-
A package release that leaves `data/` unchanged does not require a refresh.
|
|
32
|
-
|
|
33
|
-
Refreshing is explicit: back up any customized workspace files and configuration
|
|
34
|
-
first, then run:
|
|
35
|
-
|
|
36
|
-
```sh
|
|
37
|
-
squidient init .
|
|
38
|
-
squidient configure --all
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
`init` overwrites packaged workspace files but does not regenerate
|
|
42
|
-
`configuration.json`. `configure --all` regenerates the configuration; reapply
|
|
43
|
-
your local settings as necessary. Partial reconfiguration does not mark an old
|
|
44
|
-
configuration as current. The check never overwrites customizations automatically.
|
|
45
|
-
Help and cleanup commands, including `terraform stop`, remain available.
|
|
46
|
-
The former `fileFormat` counter and `version/version.json` are no longer used;
|
|
47
|
-
legacy configurations must be refreshed before workflow execution when their
|
|
48
|
-
data revision cannot be established.
|
|
49
|
-
|
squidient-4.0.0/README.md
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Squidient
|
|
2
|
-
|
|
3
|
-
Squidient is a scheduler for testing, benchmarking and deploying HPC programs on SLURM machines.
|
|
4
|
-
|
|
5
|
-
## Refreshing Workspace Data
|
|
6
|
-
|
|
7
|
-
Squidient records a fingerprint of its packaged `data/` in `version/data.json`
|
|
8
|
-
when `squidient init .` completes. A completed full configuration records
|
|
9
|
-
that fingerprint in `configuration.json.dataRevision`. Staging and monitoring stop
|
|
10
|
-
with exit code 1 if either differs from the installed package, including for older
|
|
11
|
-
workspaces without this metadata. No confirmation prompt is displayed. The check
|
|
12
|
-
runs before Terraform provisioning, remote connections, or job submission.
|
|
13
|
-
A package release that leaves `data/` unchanged does not require a refresh.
|
|
14
|
-
|
|
15
|
-
Refreshing is explicit: back up any customized workspace files and configuration
|
|
16
|
-
first, then run:
|
|
17
|
-
|
|
18
|
-
```sh
|
|
19
|
-
squidient init .
|
|
20
|
-
squidient configure --all
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
`init` overwrites packaged workspace files but does not regenerate
|
|
24
|
-
`configuration.json`. `configure --all` regenerates the configuration; reapply
|
|
25
|
-
your local settings as necessary. Partial reconfiguration does not mark an old
|
|
26
|
-
configuration as current. The check never overwrites customizations automatically.
|
|
27
|
-
Help and cleanup commands, including `terraform stop`, remain available.
|
|
28
|
-
The former `fileFormat` counter and `version/version.json` are no longer used;
|
|
29
|
-
legacy configurations must be refreshed before workflow execution when their
|
|
30
|
-
data revision cannot be established.
|
|
31
|
-
|