Showing preview only (5,800K chars total). Download the full file or copy to clipboard to get everything.
Repository: dellhpc/omnia
Branch: main
Commit: 483ce3abf010
Files: 1073
Total size: 5.3 MB
Directory structure:
gitextract_fe371nzs/
├── .all-contributorsrc
├── .ansible-lint
├── .config/
│ ├── ansible-lint.yml
│ └── requirements.yml
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── logo_community.md
│ ├── branch-switcher.yml
│ ├── pull_request_template.md
│ ├── stale.yml
│ └── workflows/
│ ├── ansible-lint.yml
│ └── pylint.yml
├── .gitignore
├── .metadata/
│ └── omnia_version
├── .readthedocs.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── ansible.cfg
├── build_image_aarch64/
│ ├── ansible.cfg
│ ├── build_image_aarch64.yml
│ └── roles/
│ ├── fetch_packages/
│ │ ├── tasks/
│ │ │ ├── aarch64_build_image_completion.yml
│ │ │ ├── build_stream_prerequisite.yml
│ │ │ ├── check_aarch64_fg.yml
│ │ │ ├── fetch_packages.yml
│ │ │ ├── fetch_pulp_repos.yml
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── image_creation/
│ │ ├── tasks/
│ │ │ ├── build_base_image.yml
│ │ │ ├── build_compute_image.yml
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ ├── base_image_template.j2
│ │ │ └── compute_images_templates.j2
│ │ └── vars/
│ │ └── main.yml
│ └── prepare_arm_node/
│ ├── tasks/
│ │ ├── gather_oim_data.yml
│ │ └── main.yml
│ └── vars/
│ └── main.yml
├── build_image_x86_64/
│ ├── ansible.cfg
│ ├── build_image_x86_64.yml
│ └── roles/
│ ├── fetch_packages/
│ │ ├── tasks/
│ │ │ ├── build_stream_prerequisite.yml
│ │ │ ├── check_x86_64_fg.yml
│ │ │ ├── fetch_packages.yml
│ │ │ ├── fetch_pulp_repos.yml
│ │ │ ├── main.yml
│ │ │ └── x86_64_build_image_completion.yml
│ │ └── vars/
│ │ └── main.yml
│ └── image_creation/
│ ├── tasks/
│ │ ├── build_base_image.yml
│ │ ├── build_compute_image.yml
│ │ ├── main.yml
│ │ └── prepare_pulp_image.yml
│ ├── templates/
│ │ ├── base_image_template.j2
│ │ └── compute_images_templates.j2
│ └── vars/
│ └── main.yml
├── build_stream/
│ ├── .gitignore
│ ├── README.md
│ ├── __init__.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── auth/
│ │ │ ├── __init__.py
│ │ │ ├── jwt_handler.py
│ │ │ ├── password_handler.py
│ │ │ ├── routes.py
│ │ │ ├── schemas.py
│ │ │ └── service.py
│ │ ├── build_image/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── catalog_roles/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ ├── schemas.py
│ │ │ └── service.py
│ │ ├── dependencies.py
│ │ ├── generate_input_files/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── jobs/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── local_repo/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── logging_utils.py
│ │ ├── parse_catalog/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ ├── schemas.py
│ │ │ └── service.py
│ │ ├── router.py
│ │ ├── validate/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ └── vault_client.py
│ ├── build_stream.ini
│ ├── common/
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── constants.py
│ │ ├── logging.py
│ │ └── user_messages.py
│ ├── container.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── artifacts/
│ │ │ ├── __init__.py
│ │ │ ├── entities.py
│ │ │ ├── exceptions.py
│ │ │ ├── interfaces.py
│ │ │ ├── ports.py
│ │ │ └── value_objects.py
│ │ ├── build/
│ │ │ └── __init__.py
│ │ ├── build_image/
│ │ │ ├── __init__.py
│ │ │ ├── entities.py
│ │ │ ├── exceptions.py
│ │ │ ├── repositories.py
│ │ │ ├── services.py
│ │ │ └── value_objects.py
│ │ ├── catalog/
│ │ │ ├── ADAPTER_POLICY_GUIDE.md
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── adapter.py
│ │ │ ├── adapter_policy.py
│ │ │ ├── adapter_policy_schema_consts.py
│ │ │ ├── exceptions.py
│ │ │ ├── generator.py
│ │ │ ├── models.py
│ │ │ ├── parser.py
│ │ │ ├── resources/
│ │ │ │ ├── AdapterPolicySchema.json
│ │ │ │ ├── CatalogSchema.json
│ │ │ │ ├── RootLevelSchema.json
│ │ │ │ └── adapter_policy_default.json
│ │ │ ├── test_fixtures/
│ │ │ │ ├── adapter_policy_test.json
│ │ │ │ ├── catalog_rhel.json
│ │ │ │ └── functional_layer.json
│ │ │ ├── tests/
│ │ │ │ ├── sample.py
│ │ │ │ ├── test_adapter_cli_defaults.py
│ │ │ │ ├── test_adapter_policy.py
│ │ │ │ ├── test_generator_cli_defaults.py
│ │ │ │ ├── test_generator_package_list.py
│ │ │ │ ├── test_generator_roles.py
│ │ │ │ └── test_parser_defaults.py
│ │ │ └── utils.py
│ │ ├── common/
│ │ │ └── __init__.py
│ │ ├── exceptions.py
│ │ ├── jobs/
│ │ │ ├── __init__.py
│ │ │ ├── entities/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── audit.py
│ │ │ │ ├── idempotency.py
│ │ │ │ ├── job.py
│ │ │ │ └── stage.py
│ │ │ ├── exceptions.py
│ │ │ ├── repositories.py
│ │ │ ├── services.py
│ │ │ └── value_objects.py
│ │ ├── localrepo/
│ │ │ ├── __init__.py
│ │ │ ├── entities.py
│ │ │ ├── exceptions.py
│ │ │ ├── repositories.py
│ │ │ ├── services.py
│ │ │ └── value_objects.py
│ │ ├── utils/
│ │ │ └── __init__.py
│ │ └── validate/
│ │ ├── __init__.py
│ │ ├── entities.py
│ │ ├── exceptions.py
│ │ └── services.py
│ ├── doc/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── build_image.md
│ │ ├── catalog.md
│ │ ├── jobs.md
│ │ ├── local_repo.md
│ │ └── validation.md
│ ├── generate_catalog.py
│ ├── generate_catalog_examples.py
│ ├── infra/
│ │ ├── __init__.py
│ │ ├── artifact_store/
│ │ │ ├── __init__.py
│ │ │ ├── file_artifact_store.py
│ │ │ ├── in_memory_artifact_metadata.py
│ │ │ └── in_memory_artifact_store.py
│ │ ├── db/
│ │ │ ├── __init__.py
│ │ │ ├── alembic/
│ │ │ │ ├── env.py
│ │ │ │ ├── script.py.mako
│ │ │ │ └── versions/
│ │ │ │ ├── 20260219_001_create_jobs_table.py
│ │ │ │ ├── 20260219_002_create_stages_table.py
│ │ │ │ ├── 20260219_003_create_idempotency_keys_table.py
│ │ │ │ ├── 20260219_004_create_audit_events_table.py
│ │ │ │ └── 20260219_005_create_artifact_metadata_table.py
│ │ │ ├── alembic.ini
│ │ │ ├── config.py
│ │ │ ├── mappers.py
│ │ │ ├── models.py
│ │ │ ├── repositories.py
│ │ │ └── session.py
│ │ ├── id_generator.py
│ │ └── repositories/
│ │ ├── __init__.py
│ │ ├── in_memory.py
│ │ ├── nfs_build_image_inventory_repository.py
│ │ ├── nfs_input_repository.py
│ │ ├── nfs_playbook_queue_request_repository.py
│ │ └── nfs_playbook_queue_result_repository.py
│ ├── main.py
│ ├── orchestrator/
│ │ ├── __init__.py
│ │ ├── build_image/
│ │ │ ├── __init__.py
│ │ │ ├── commands/
│ │ │ │ ├── __init__.py
│ │ │ │ └── create_build_image.py
│ │ │ ├── dtos/
│ │ │ │ ├── __init__.py
│ │ │ │ └── build_image_response.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ └── create_build_image.py
│ │ ├── catalog/
│ │ │ ├── commands/
│ │ │ │ ├── generate_input_files.py
│ │ │ │ └── parse_catalog.py
│ │ │ ├── dtos.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ ├── generate_input_files.py
│ │ │ └── parse_catalog.py
│ │ ├── common/
│ │ │ ├── __init__.py
│ │ │ └── result_poller.py
│ │ ├── jobs/
│ │ │ ├── __init__.py
│ │ │ ├── commands/
│ │ │ │ ├── __init__.py
│ │ │ │ └── create_job.py
│ │ │ ├── dtos/
│ │ │ │ ├── __init__.py
│ │ │ │ └── job_response.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ └── create_job.py
│ │ ├── local_repo/
│ │ │ ├── __init__.py
│ │ │ ├── commands/
│ │ │ │ ├── __init__.py
│ │ │ │ └── create_local_repo.py
│ │ │ ├── dtos/
│ │ │ │ ├── __init__.py
│ │ │ │ └── local_repo_response.py
│ │ │ ├── result_poller.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ └── create_local_repo.py
│ │ └── validate/
│ │ ├── __init__.py
│ │ ├── commands/
│ │ │ ├── __init__.py
│ │ │ └── validate_image_on_test.py
│ │ ├── dtos/
│ │ │ ├── __init__.py
│ │ │ └── validate_image_on_test_response.py
│ │ └── use_cases/
│ │ ├── __init__.py
│ │ └── validate_image_on_test.py
│ ├── playbook-watcher/
│ │ └── playbook_watcher_service.py
│ ├── pytest.ini
│ ├── requirements-dev.txt
│ ├── requirements.txt
│ ├── scripts/
│ │ └── generate_jwt_keys.sh
│ ├── tests/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── demo/
│ │ │ └── buildstream_demo.py
│ │ ├── end_to_end/
│ │ │ └── api/
│ │ │ ├── conftest.py
│ │ │ ├── test_api_flow_e2e.py
│ │ │ ├── test_build_image_e2e.py
│ │ │ ├── test_generate_input_files_e2e.py
│ │ │ ├── test_parse_catalog_e2e.py
│ │ │ ├── test_register_e2e.py
│ │ │ └── test_token_e2e.py
│ │ ├── integration/
│ │ │ ├── api/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_register.py
│ │ │ │ │ └── test_token.py
│ │ │ │ ├── build_image/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ └── test_build_image_api.py
│ │ │ │ ├── catalog_roles/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ └── test_catalog_roles_api.py
│ │ │ │ ├── conftest.py
│ │ │ │ ├── generate_input_files/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_generate_input_files_api.py
│ │ │ │ │ ├── test_generate_input_files_artifact_integration.py
│ │ │ │ │ └── test_generate_input_files_routes.py
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_create_job_api.py
│ │ │ │ │ ├── test_delete_job_api.py
│ │ │ │ │ └── test_get_job_api.py
│ │ │ │ ├── local_repo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_create_local_repo_api.py
│ │ │ │ │ └── test_create_local_repo_edge_cases.py
│ │ │ │ ├── parse_catalog/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_parse_catalog_api.py
│ │ │ │ │ ├── test_parse_catalog_artifact_integration.py
│ │ │ │ │ └── test_parse_catalog_routes.py
│ │ │ │ └── validate/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_models.py
│ │ │ │ └── test_validate_image_on_test_api.py
│ │ │ ├── conftest.py
│ │ │ ├── core/
│ │ │ │ └── catalog/
│ │ │ │ ├── test_adapter_cli_defaults.py
│ │ │ │ ├── test_adapter_policy.py
│ │ │ │ ├── test_generator_cli_defaults.py
│ │ │ │ ├── test_generator_package_list.py
│ │ │ │ └── test_generator_roles.py
│ │ │ └── infra/
│ │ │ ├── artifact_store/
│ │ │ │ └── test_file_artifact_store.py
│ │ │ └── db/
│ │ │ ├── conftest.py
│ │ │ └── test_sql_repositories.py
│ │ ├── mocks/
│ │ │ ├── __init__.py
│ │ │ ├── mock_jwt_handler.py
│ │ │ └── mock_vault_client.py
│ │ ├── others/
│ │ │ ├── __init__.py
│ │ │ └── test_dependency_rules.py
│ │ ├── performance/
│ │ │ └── test_local_repo_performance.py
│ │ ├── unit/
│ │ │ ├── __init__.py
│ │ │ ├── api/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── test_password_handler.py
│ │ │ │ │ ├── test_service.py
│ │ │ │ │ └── test_token_service.py
│ │ │ │ ├── build_image/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── test_routes.py
│ │ │ │ ├── catalog_roles/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── test_catalog_roles_service.py
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── test_dependencies.py
│ │ │ │ │ └── test_schemas.py
│ │ │ │ ├── local_repo/
│ │ │ │ │ ├── test_local_repo_dependencies.py
│ │ │ │ │ ├── test_local_repo_schemas.py
│ │ │ │ │ └── test_routes.py
│ │ │ │ └── validate/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_routes.py
│ │ │ ├── core/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── artifacts/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ ├── build_image/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_entities.py
│ │ │ │ │ ├── test_services.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ ├── catalog/
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ ├── test_generate_software_config.py
│ │ │ │ │ ├── test_parser.py
│ │ │ │ │ └── test_parser_defaults.py
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── entities/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── conftest.py
│ │ │ │ │ │ ├── test_audit.py
│ │ │ │ │ │ ├── test_idempotency.py
│ │ │ │ │ │ ├── test_job.py
│ │ │ │ │ │ └── test_stage.py
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ ├── localrepo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_entities.py
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ ├── test_services.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ └── validate/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── test_entities.py
│ │ │ │ ├── test_exceptions.py
│ │ │ │ └── test_services.py
│ │ │ ├── infra/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── artifact_store/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_in_memory_artifact_metadata.py
│ │ │ │ │ └── test_in_memory_artifact_store.py
│ │ │ │ ├── db/
│ │ │ │ │ ├── test_mappers.py
│ │ │ │ │ └── test_repositories_unit.py
│ │ │ │ ├── test_id_generator.py
│ │ │ │ ├── test_nfs_input_directory_repository.py
│ │ │ │ ├── test_nfs_playbook_queue_result_service.py
│ │ │ │ └── test_nfs_repositories.py
│ │ │ └── orchestrator/
│ │ │ ├── __init__.py
│ │ │ ├── build_image/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_create_build_image_use_case.py
│ │ │ ├── catalog/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_generate_input_files_command.py
│ │ │ │ ├── test_generate_input_files_use_case.py
│ │ │ │ ├── test_parse_catalog_command.py
│ │ │ │ └── test_parse_catalog_use_case.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_result_poller.py
│ │ │ ├── jobs/
│ │ │ │ ├── __init__.py
│ │ │ │ └── use_cases/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── conftest.py
│ │ │ │ └── test_create_job.py
│ │ │ ├── local_repo/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── test_commands.py
│ │ │ │ ├── test_dtos.py
│ │ │ │ ├── test_result_poller.py
│ │ │ │ └── test_use_case.py
│ │ │ └── validate/
│ │ │ ├── __init__.py
│ │ │ └── test_validate_image_on_test_use_case.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ └── test_data.py
│ └── utils/
│ └── __init__.py
├── common/
│ ├── library/
│ │ ├── module_utils/
│ │ │ ├── build_image/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common_functions.py
│ │ │ │ └── config.py
│ │ │ ├── discovery/
│ │ │ │ ├── __init__.py
│ │ │ │ └── standard_functions.py
│ │ │ ├── input_validation/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common_utils/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── config.py
│ │ │ │ │ ├── data_fetch.py
│ │ │ │ │ ├── data_validation.py
│ │ │ │ │ ├── data_verification.py
│ │ │ │ │ ├── en_us_validation_msg.py
│ │ │ │ │ ├── logical_validation.py
│ │ │ │ │ ├── slurm_conf_utils.py
│ │ │ │ │ ├── timezone.txt
│ │ │ │ │ └── validation_utils.py
│ │ │ │ ├── schema/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── additional_software.json
│ │ │ │ │ ├── build_stream_config.json
│ │ │ │ │ ├── credential_rules.json
│ │ │ │ │ ├── functional_groups_config.json
│ │ │ │ │ ├── gitlab_config.json
│ │ │ │ │ ├── high_availability_config.json
│ │ │ │ │ ├── k8s_scheduler.json
│ │ │ │ │ ├── local_repo_config.json
│ │ │ │ │ ├── network_spec.json
│ │ │ │ │ ├── omnia_config.json
│ │ │ │ │ ├── provision_config.json
│ │ │ │ │ ├── security_config.json
│ │ │ │ │ ├── slurm_config_parameters.json
│ │ │ │ │ ├── software_config.json
│ │ │ │ │ ├── storage_config.json
│ │ │ │ │ └── telemetry_config.json
│ │ │ │ └── validation_flows/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── build_stream_validation.py
│ │ │ │ ├── common_validation.py
│ │ │ │ ├── csi_driver_validation.py
│ │ │ │ ├── gitlab_validation.py
│ │ │ │ ├── high_availability_validation.py
│ │ │ │ ├── local_repo_validation.py
│ │ │ │ ├── provision_validation.py
│ │ │ │ └── scheduler_validation.py
│ │ │ └── local_repo/
│ │ │ ├── __init__.py
│ │ │ ├── common_functions.py
│ │ │ ├── config.py
│ │ │ ├── container_repo_utils.py
│ │ │ ├── download_common.py
│ │ │ ├── download_image.py
│ │ │ ├── download_rpm.py
│ │ │ ├── parse_and_download.py
│ │ │ ├── process_metadata.py
│ │ │ ├── process_parallel.py
│ │ │ ├── registry_utils.py
│ │ │ ├── rest_client.py
│ │ │ ├── software_utils.py
│ │ │ ├── standard_logger.py
│ │ │ ├── user_image_utility.py
│ │ │ └── validate_utils.py
│ │ └── modules/
│ │ ├── additional_images_collector.py
│ │ ├── base_image_package_collector.py
│ │ ├── cert_vault_handler.py
│ │ ├── check_user_registry.py
│ │ ├── delete_idracips_from_mysqldb.py
│ │ ├── disable_idrac_telemetry.py
│ │ ├── enable_telemetry_service.py
│ │ ├── fetch_credential_rule.py
│ │ ├── fetch_idrac_ips.py
│ │ ├── fetch_mapping_details.py
│ │ ├── fetch_roles_config.py
│ │ ├── fetch_software_arch.py
│ │ ├── fetch_telemetry_status.py
│ │ ├── functional_group_parser.py
│ │ ├── generate_argon2_password.py
│ │ ├── generate_functional_groups.py
│ │ ├── generate_ssha_password.py
│ │ ├── generate_xname_in_mapping_file.py
│ │ ├── get_service_cluster_info.py
│ │ ├── group_package_map.py
│ │ ├── idrac_telemetry_filter.py
│ │ ├── image_package_collector.py
│ │ ├── insert_idracips_mysqldb.py
│ │ ├── localrepo_metadata_manager.py
│ │ ├── parallel_file_copy.py
│ │ ├── parallel_tasks.py
│ │ ├── prepare_tasklist.py
│ │ ├── process_rpm_config.py
│ │ ├── pulp_cleanup.py
│ │ ├── read_idracips_from_mysqldb.py
│ │ ├── slurm_conf.py
│ │ ├── update_bmc_group_entry.py
│ │ ├── validate_bmc_group_data.py
│ │ ├── validate_credentials.py
│ │ ├── validate_input.py
│ │ └── validate_user_repo.py
│ ├── tasks/
│ │ ├── common/
│ │ │ ├── decrypt_include_encrypt.yml
│ │ │ ├── get_container_image_list.yml
│ │ │ ├── openchami_auth.yml
│ │ │ └── validate_image_tars.yml
│ │ ├── provision/
│ │ │ └── main.yml
│ │ ├── scheduler/
│ │ │ └── main.yml
│ │ └── telemetry/
│ │ └── main.yml
│ └── vars/
│ ├── common_messages.yml
│ ├── common_vars.yml
│ ├── encrypt_files_vars.yml
│ ├── image_vars.yml
│ ├── openchami_image_cmd.yml
│ ├── openchami_vars.yml
│ ├── provision_messages.yml
│ ├── provision_vars.yml
│ ├── scheduler_messages.yml
│ ├── scheduler_vars.yml
│ ├── telemetry_messages.yml
│ └── telemetry_vars.yml
├── discovery/
│ ├── ansible.cfg
│ ├── discovery.yml
│ └── roles/
│ ├── README.md
│ ├── configure_ochami/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ ├── configure_bss_cloud_init.yml
│ │ │ ├── configure_bss_group.yml
│ │ │ ├── configure_cloud_init_common.yml
│ │ │ ├── configure_cloud_init_group.yml
│ │ │ ├── create_groups.yml
│ │ │ ├── create_groups_common.yml
│ │ │ ├── delete_smd_config.yml
│ │ │ ├── discover_mapping_nodes.yml
│ │ │ ├── discovery_completion.yml
│ │ │ ├── fetch_additional_images.yml
│ │ │ ├── main.yml
│ │ │ └── update_smd_groups.yaml
│ │ ├── templates/
│ │ │ ├── bss/
│ │ │ │ └── bss.yaml.j2
│ │ │ ├── cloud_init/
│ │ │ │ ├── ci-defaults.yaml.j2
│ │ │ │ ├── ci-group-common.yaml.j2
│ │ │ │ ├── ci-group-default_x86_64.yaml.j2
│ │ │ │ ├── ci-group-login_compiler_node_aarch64.yaml.j2
│ │ │ │ ├── ci-group-login_compiler_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-login_node_aarch64.yaml.j2
│ │ │ │ ├── ci-group-login_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-service_kube_control_plane_first_x86_64.yaml.j2
│ │ │ │ ├── ci-group-service_kube_control_plane_x86_64.yaml.j2
│ │ │ │ ├── ci-group-service_kube_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-slurm_control_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-slurm_node_aarch64.yaml.j2
│ │ │ │ └── ci-group-slurm_node_x86_64.yaml.j2
│ │ │ ├── doca-ofed/
│ │ │ │ ├── configure-ib-network.sh.j2
│ │ │ │ └── doca-install.sh.j2
│ │ │ ├── hpc_tools/
│ │ │ │ ├── configure_nvhpc_env.sh.j2
│ │ │ │ ├── configure_ucx_openmpi_env.sh.j2
│ │ │ │ ├── export_nvhpc_env.sh.j2
│ │ │ │ ├── install_nvhpc_sdk.sh.j2
│ │ │ │ ├── install_openmpi.sh.j2
│ │ │ │ ├── install_ucx.sh.j2
│ │ │ │ └── setup_nvhpc_sdk.sh.j2
│ │ │ ├── ldms/
│ │ │ │ └── ldms_sampler.sh.j2
│ │ │ ├── nodes/
│ │ │ │ ├── apptainer_mirror.conf.j2
│ │ │ │ ├── bmc_group_data.csv.j2
│ │ │ │ ├── groups.yaml.j2
│ │ │ │ ├── groups_common.yaml.j2
│ │ │ │ ├── hostname.yaml.j2
│ │ │ │ └── nodes.yaml.j2
│ │ │ ├── openldap/
│ │ │ │ ├── sssd.conf.j2
│ │ │ │ └── update_ldap_conf.sh.j2
│ │ │ ├── pull_additional_images.yaml.j2
│ │ │ ├── slurm/
│ │ │ │ └── check_slurm_controller_status.sh.j2
│ │ │ └── telemetry/
│ │ │ └── telemetry.sh.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── discovery_validations/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ ├── build_stream_prerequisite.yml
│ │ │ ├── include_inputs.yml
│ │ │ ├── include_software_config.yml
│ │ │ ├── main.yml
│ │ │ ├── update_hosts.yml
│ │ │ ├── validate_image.yml
│ │ │ ├── validate_mapping_file.yml
│ │ │ ├── validate_mapping_mechanism.yml
│ │ │ ├── validate_oim_timezone.yml
│ │ │ ├── validate_openldap_container.yml
│ │ │ └── validate_telemetry_config.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── k8s_config/
│ │ ├── README.md
│ │ ├── files/
│ │ │ └── empty_certificate_template.yml
│ │ ├── tasks/
│ │ │ ├── create_k8s_config_nfs.yml
│ │ │ ├── create_node_dir.yml
│ │ │ ├── get_powerscale_dependencies.yml
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ └── ps_storage_class.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── nfs_client/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ ├── main.yml
│ │ │ └── nfs_client.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── openldap/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── passwordless_ssh/
│ │ ├── tasks/
│ │ │ ├── build_host_lists.yml
│ │ │ ├── configure_oim_ssh.yml
│ │ │ ├── main.yml
│ │ │ └── read_nodes_yaml.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── slurm_config/
│ │ ├── README.md
│ │ ├── defaults/
│ │ │ └── main.yml
│ │ ├── tasks/
│ │ │ ├── backup_conf.yml
│ │ │ ├── build_slurm_conf.yml
│ │ │ ├── check_ctld_running.yml
│ │ │ ├── confs.yml
│ │ │ ├── create_slurm_dir.yml
│ │ │ ├── detect_busy_nodes.yml
│ │ │ ├── drain_and_remove_node.yml
│ │ │ ├── exist_dir.yml
│ │ │ ├── extract_path_overrides.yml
│ │ │ ├── handle_extra_confs.yml
│ │ │ ├── hpc_tools.yml
│ │ │ ├── main.yml
│ │ │ ├── openldap_config.yml
│ │ │ ├── read_node_homogeneous.yml
│ │ │ ├── read_node_idrac.yml
│ │ │ ├── read_node_idrac_group.yml
│ │ │ ├── read_slurm_hostnames.yml
│ │ │ ├── remove_node.yml
│ │ │ ├── storage.yml
│ │ │ ├── update_hosts_munge.yml
│ │ │ └── validate_path_overrides.yml
│ │ ├── templates/
│ │ │ ├── all_other.conf.j2
│ │ │ ├── container_image.list.j2
│ │ │ ├── download_container_image.sh.j2
│ │ │ ├── logout_user.sh.j2
│ │ │ └── mariadb-server.cnf.j2
│ │ └── vars/
│ │ └── main.yml
│ └── telemetry/
│ ├── README.md
│ ├── files/
│ │ └── nersc-ldms-aggr/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── health_check.bash
│ │ ├── host_map.slurm-cluster.json
│ │ ├── make_host_map.bash
│ │ ├── make_host_map.dell.py
│ │ ├── manifest.yaml.in
│ │ ├── mkmanifest.py
│ │ ├── nersc-ldms-aggr/
│ │ │ ├── Chart.yaml
│ │ │ └── templates/
│ │ │ ├── NetworkAttachmentDefinition.yaml
│ │ │ ├── Service.nersc-ldms-agg.yaml
│ │ │ ├── Service.nersc-ldms-store.yaml
│ │ │ ├── Statefulset.nersc-ldms-agg.yaml
│ │ │ └── Statefulset.nersc-ldms-store.yaml
│ │ ├── nersc_ldms_make_ldms_config.py
│ │ └── scripts/
│ │ ├── decomp.json
│ │ ├── kafka.conf
│ │ ├── ldms_ls.bash
│ │ ├── ldms_msg_publish.py
│ │ ├── ldms_msg_subscribe.py
│ │ ├── ldms_stats.bash
│ │ ├── ldmsd.bash
│ │ ├── ldmsd_stream.bash
│ │ └── start_munge.bash
│ ├── tasks/
│ │ ├── apply_telemetry_on_upgrade.yml
│ │ ├── check_pxe_changes.yml
│ │ ├── generate_service_cluster_metadata.yml
│ │ ├── generate_telemetry_deployments.yml
│ │ ├── load_service_images.yml
│ │ ├── main.yml
│ │ ├── read_software_config.yml
│ │ ├── restart_ldms_configs.yml
│ │ ├── telemetry_prereq.yml
│ │ ├── update_ldms_agg_config.yml
│ │ ├── update_ldms_sampler.yml
│ │ └── validate_idrac_inventory.yml
│ ├── templates/
│ │ └── telemetry/
│ │ ├── cleanup_telemetry.sh.j2
│ │ ├── common/
│ │ │ ├── telemetry_cleaner_rbac.yaml.j2
│ │ │ ├── telemetry_namespace_creation.yaml.j2
│ │ │ ├── telemetry_pod_cleanup.yaml.j2
│ │ │ └── telemetry_secret_creation.yaml.j2
│ │ ├── idrac_telemetry/
│ │ │ └── idrac_telemetry_statefulset.yaml.j2
│ │ ├── kafka/
│ │ │ ├── kafka.kafka.yaml.j2
│ │ │ ├── kafka.kafka_bridge.yaml.j2
│ │ │ ├── kafka.kafka_bridge_lb.yaml.j2
│ │ │ ├── kafka.kafkapump_user.yaml.j2
│ │ │ ├── kafka.tls_test_job.yaml.j2
│ │ │ └── kafka.topic.yaml.j2
│ │ ├── kustomization.yaml.j2
│ │ ├── ldms/
│ │ │ ├── host_map.slurm-cluster.json.j2
│ │ │ ├── ldms_machine_config.json.j2
│ │ │ ├── ldmsauth.conf.j2
│ │ │ ├── ldmsd.sampler.env.j2
│ │ │ ├── sampler.conf.j2
│ │ │ └── values.yaml.j2
│ │ └── victoria/
│ │ ├── gen_victoria_certs.sh.j2
│ │ ├── victoria-agent-deployment.yaml.j2
│ │ ├── victoria-cluster-vminsert.yaml.j2
│ │ ├── victoria-cluster-vmselect.yaml.j2
│ │ ├── victoria-cluster-vmstorage.yaml.j2
│ │ ├── victoria-statefulset.yaml.j2
│ │ ├── victoria-tls-secret.yaml.j2
│ │ ├── victoria-tls-test-job.yaml.j2
│ │ ├── victoria-vmagent-rbac.yaml.j2
│ │ └── vmagent-scrape-config.yaml.j2
│ └── vars/
│ └── main.yml
├── docs/
│ └── README.rst
├── examples/
│ ├── catalog/
│ │ ├── catalog_rhel.json
│ │ ├── catalog_rhel_aarch64_with_slurm_only.json
│ │ ├── catalog_rhel_with_ucx_openmpi.json
│ │ ├── catalog_rhel_x86_64_with_slurm_only.json
│ │ └── mapping_file_software_config/
│ │ ├── catalog_rhel_aarch64_with_slurm_only_json/
│ │ │ ├── pxe_mapping_file.csv
│ │ │ └── software_config.json
│ │ ├── catalog_rhel_json/
│ │ │ ├── pxe_mapping_file.csv
│ │ │ └── software_config.json
│ │ ├── catalog_rhel_with_ucx_openmpi_json/
│ │ │ ├── pxe_mapping_file.csv
│ │ │ └── software_config.json
│ │ └── catalog_rhel_x86_64_with_slurm_only_json/
│ │ ├── pxe_mapping_file.csv
│ │ └── software_config.json
│ ├── input_template/
│ │ └── bare_metal_slurm/
│ │ ├── aarch64/
│ │ │ ├── with_service_k8s/
│ │ │ │ ├── only_login_compiler_node/
│ │ │ │ │ ├── high_availability_config.yml
│ │ │ │ │ ├── local_repo_config.yml
│ │ │ │ │ ├── network_spec.yml
│ │ │ │ │ ├── omnia_config.yml
│ │ │ │ │ ├── provision_config.yml
│ │ │ │ │ ├── security_config.yml
│ │ │ │ │ ├── software_config.json
│ │ │ │ │ ├── storage_config.yml
│ │ │ │ │ ├── telemetry_config.yml
│ │ │ │ │ └── user_registry_credential.yml
│ │ │ │ └── only_login_node/
│ │ │ │ ├── high_availability_config.yml
│ │ │ │ ├── local_repo_config.yml
│ │ │ │ ├── network_spec.yml
│ │ │ │ ├── omnia_config.yml
│ │ │ │ ├── provision_config.yml
│ │ │ │ ├── security_config.yml
│ │ │ │ ├── software_config.json
│ │ │ │ ├── storage_config.yml
│ │ │ │ ├── telemetry_config.yml
│ │ │ │ └── user_registry_credential.yml
│ │ │ └── without_service_k8s/
│ │ │ ├── only_login_compiler_node/
│ │ │ │ ├── high_availability_config.yml
│ │ │ │ ├── local_repo_config.yml
│ │ │ │ ├── network_spec.yml
│ │ │ │ ├── omnia_config.yml
│ │ │ │ ├── provision_config.yml
│ │ │ │ ├── security_config.yml
│ │ │ │ ├── software_config.json
│ │ │ │ ├── storage_config.yml
│ │ │ │ ├── telemetry_config.yml
│ │ │ │ └── user_registry_credential.yml
│ │ │ └── only_login_node/
│ │ │ ├── high_availability_config.yml
│ │ │ ├── local_repo_config.yml
│ │ │ ├── network_spec.yml
│ │ │ ├── omnia_config.yml
│ │ │ ├── provision_config.yml
│ │ │ ├── security_config.yml
│ │ │ ├── software_config.json
│ │ │ ├── storage_config.yml
│ │ │ ├── telemetry_config.yml
│ │ │ └── user_registry_credential.yml
│ │ └── x86_64/
│ │ ├── with_service_k8s/
│ │ │ ├── only_login_compiler_node/
│ │ │ │ ├── high_availability_config.yml
│ │ │ │ ├── local_repo_config.yml
│ │ │ │ ├── network_spec.yml
│ │ │ │ ├── omnia_config.yml
│ │ │ │ ├── provision_config.yml
│ │ │ │ ├── security_config.yml
│ │ │ │ ├── software_config.json
│ │ │ │ ├── storage_config.yml
│ │ │ │ ├── telemetry_config.yml
│ │ │ │ └── user_registry_credential.yml
│ │ │ └── only_login_node/
│ │ │ ├── high_availability_config.yml
│ │ │ ├── local_repo_config.yml
│ │ │ ├── network_spec.yml
│ │ │ ├── omnia_config.yml
│ │ │ ├── provision_config.yml
│ │ │ ├── security_config.yml
│ │ │ ├── software_config.json
│ │ │ ├── storage_config.yml
│ │ │ ├── telemetry_config.yml
│ │ │ └── user_registry_credential.yml
│ │ └── without_service_k8s/
│ │ ├── only_login_compiler_node/
│ │ │ ├── high_availability_config.yml
│ │ │ ├── local_repo_config.yml
│ │ │ ├── network_spec.yml
│ │ │ ├── omnia_config.yml
│ │ │ ├── provision_config.yml
│ │ │ ├── security_config.yml
│ │ │ ├── software_config.json
│ │ │ ├── storage_config.yml
│ │ │ ├── telemetry_config.yml
│ │ │ └── user_registry_credential.yml
│ │ └── only_login_node/
│ │ ├── high_availability_config.yml
│ │ ├── local_repo_config.yml
│ │ ├── network_spec.yml
│ │ ├── omnia_config.yml
│ │ ├── provision_config.yml
│ │ ├── security_config.yml
│ │ ├── software_config.json
│ │ ├── storage_config.yml
│ │ ├── telemetry_config.yml
│ │ └── user_registry_credential.yml
│ ├── inventory/
│ │ └── bmc_inventory_file
│ ├── pxe_mapping_file.csv
│ ├── rhel_software_config.json
│ ├── slurm_conf/
│ │ ├── cgroup.conf
│ │ ├── slurm.conf
│ │ └── slurmdbd.conf
│ └── software_config_template/
│ ├── template_rhel_10.0_multi_arch_software_config.json
│ └── template_rhel_10.0_x86-64_software_config.json
├── gitlab/
│ ├── ansible.cfg
│ ├── cleanup_gitlab.yml
│ ├── gitlab.yml
│ └── roles/
│ ├── cleanup_gitlab/
│ │ ├── tasks/
│ │ │ ├── cleanup_buildstream_oauth.yml
│ │ │ ├── cleanup_cicd.yml
│ │ │ ├── cleanup_credentials.yml
│ │ │ ├── cleanup_directories.yml
│ │ │ ├── cleanup_packages.yml
│ │ │ ├── cleanup_runner.yml
│ │ │ ├── cleanup_services.yml
│ │ │ ├── cleanup_summary.yml
│ │ │ ├── cleanup_tls.yml
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── gitlab_passwordless_ssh/
│ │ ├── files/
│ │ │ └── check_gitlab_port.sh
│ │ ├── tasks/
│ │ │ ├── authorize_key.yml
│ │ │ ├── generate_keypair.yml
│ │ │ ├── main.yml
│ │ │ ├── prereq_checks.yml
│ │ │ └── validate_ssh.yml
│ │ └── vars/
│ │ └── main.yml
│ └── hosted_gitlab/
│ ├── files/
│ │ └── .gitlab-ci.yml
│ ├── tasks/
│ │ ├── check_oim_prerequisites.yml
│ │ ├── configure_firewall.yml
│ │ ├── configure_gitlab.yml
│ │ ├── create_directories.yml
│ │ ├── create_project.yml
│ │ ├── create_trigger.yml
│ │ ├── deploy_runner.yml
│ │ ├── display_summary.yml
│ │ ├── generate_tls_certs.yml
│ │ ├── install_gitlab.yml
│ │ ├── install_packages.yml
│ │ ├── main.yml
│ │ ├── podman_login.yml
│ │ ├── prereq_checks.yml
│ │ ├── push_ci_files.yml
│ │ ├── root_password_change.yml
│ │ ├── set_pipeline_variables.yml
│ │ └── validate_prerequisites.yml
│ ├── templates/
│ │ ├── gitlab.rb.j2
│ │ ├── gitlab_runner.container.j2
│ │ └── san.cnf.j2
│ └── vars/
│ └── main.yml
├── input/
│ ├── build_stream_config.yml
│ ├── config/
│ │ ├── aarch64/
│ │ │ └── rhel/
│ │ │ └── 10.0/
│ │ │ ├── additional_packages.json
│ │ │ ├── admin_debug_packages.json
│ │ │ ├── default_packages.json
│ │ │ ├── ldms.json
│ │ │ ├── openldap.json
│ │ │ ├── openmpi.json
│ │ │ ├── slurm_custom.json
│ │ │ └── ucx.json
│ │ └── x86_64/
│ │ └── rhel/
│ │ └── 10.0/
│ │ ├── additional_packages.json
│ │ ├── admin_debug_packages.json
│ │ ├── csi_driver_powerscale.json
│ │ ├── default_packages.json
│ │ ├── ldms.json
│ │ ├── openldap.json
│ │ ├── openmpi.json
│ │ ├── service_k8s.json
│ │ ├── slurm_custom.json
│ │ └── ucx.json
│ ├── gitlab_config.yml
│ ├── high_availability_config.yml
│ ├── local_repo_config.yml
│ ├── network_spec.yml
│ ├── omnia_config.yml
│ ├── provision_config.yml
│ ├── pxe_mapping_file.csv
│ ├── security_config.yml
│ ├── software_config.json
│ ├── storage_config.yml
│ ├── telemetry_config.yml
│ └── user_registry_credential.yml
├── input_validation/
│ ├── ansible.cfg
│ ├── roles/
│ │ ├── validate_input/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── validate_subscription/
│ │ ├── tasks/
│ │ │ ├── check_rhel_subscription.yml
│ │ │ └── configure_rhel_os_urls.yml
│ │ └── vars/
│ │ └── main.yml
│ └── validate_config.yml
├── local_repo/
│ ├── ansible.cfg
│ ├── local_repo.yml
│ ├── pulp_cleanup.yml
│ └── roles/
│ ├── parse_and_download/
│ │ ├── tasks/
│ │ │ ├── arch_component_loop.yml
│ │ │ ├── create_metadata.yml
│ │ │ ├── execute_parallel_tasks.yml
│ │ │ ├── localrepo_completion.yml
│ │ │ ├── main.yml
│ │ │ └── process_rpm_repo.yml
│ │ ├── templates/
│ │ │ └── local_repo_access.yml.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── pulp_validation/
│ │ ├── tasks/
│ │ │ ├── check_pulp_status.yml
│ │ │ ├── main.yml
│ │ │ └── read_network_spec.yml
│ │ └── vars/
│ │ └── main.yml
│ └── validation/
│ ├── tasks/
│ │ ├── check_additional_packages_images.yml
│ │ ├── check_images_per_arch.yml
│ │ ├── display_msg.yml
│ │ ├── main.yml
│ │ ├── prerequisites.yml
│ │ ├── validate_metadata.yml
│ │ └── validate_software_config_json.yml
│ └── vars/
│ └── main.yml
├── omnia.sh
├── prepare_oim/
│ ├── ansible.cfg
│ ├── prepare_oim.yml
│ └── roles/
│ ├── deploy_containers/
│ │ ├── auth/
│ │ │ ├── files/
│ │ │ │ ├── bootstrap.ldif
│ │ │ │ └── slapd.conf
│ │ │ ├── tasks/
│ │ │ │ ├── configure_bootstrap_ldif.yml
│ │ │ │ ├── configure_slapd_conf.yml
│ │ │ │ ├── deploy_auth_service.yml
│ │ │ │ ├── generate_ldap_password_hashes.yml
│ │ │ │ ├── include_security_config.yml
│ │ │ │ └── main.yml
│ │ │ ├── templates/
│ │ │ │ └── auth.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── build_stream/
│ │ │ ├── handlers/
│ │ │ │ └── main.yml
│ │ │ ├── tasks/
│ │ │ │ ├── deploy_build_stream.yml
│ │ │ │ ├── enable_watcher_service.yml
│ │ │ │ └── main.yml
│ │ │ ├── templates/
│ │ │ │ ├── build_stream.j2
│ │ │ │ └── playbook_watcher.service.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── common/
│ │ │ ├── tasks/
│ │ │ │ ├── aarch64_prereq.yml
│ │ │ │ ├── add_known_hosts.yml
│ │ │ │ ├── configure_chrony.yml
│ │ │ │ ├── firewall_settings.yml
│ │ │ │ ├── main.yml
│ │ │ │ ├── omnia_service.yml
│ │ │ │ ├── package_installation.yml
│ │ │ │ ├── podman_login.yml
│ │ │ │ └── prepare_oim_completion.yml
│ │ │ ├── templates/
│ │ │ │ ├── bmc_group_data.j2
│ │ │ │ └── omnia.service.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── openchami/
│ │ │ ├── tasks/
│ │ │ │ ├── deploy_openchami.yml
│ │ │ │ ├── deployment_prereq.yml
│ │ │ │ ├── main.yml
│ │ │ │ └── verify_openchami.yml
│ │ │ ├── templates/
│ │ │ │ ├── configs.yaml.j2
│ │ │ │ └── inventory.yaml.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── postgres/
│ │ │ ├── tasks/
│ │ │ │ ├── deploy_postgres.yml
│ │ │ │ └── main.yml
│ │ │ ├── templates/
│ │ │ │ ├── init_build_stream_db.sql.j2
│ │ │ │ └── postgres.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── pulp/
│ │ ├── tasks/
│ │ │ ├── create_pulp_config_http.yml
│ │ │ ├── create_pulp_config_https.yml
│ │ │ ├── deploy_pulp_container_http.yml
│ │ │ ├── deploy_pulp_container_https.yml
│ │ │ ├── deployment_prereq.yml
│ │ │ ├── main.yml
│ │ │ └── reload_pulp_nginx.yml
│ │ ├── templates/
│ │ │ ├── http_quadlet.j2
│ │ │ ├── https_quadlet.j2
│ │ │ ├── nginx_conf.j2
│ │ │ └── settings_template.j2
│ │ └── vars/
│ │ └── main.yml
│ └── prepare_oim_validation/
│ ├── tasks/
│ │ ├── check_k8s_support.yml
│ │ ├── check_openldap_support.yml
│ │ ├── include_local_repo_config.yml
│ │ ├── main.yml
│ │ ├── pre_requisite.yml
│ │ ├── validate_network_spec.yml
│ │ └── validate_passwordless_ssh_oim.yml
│ └── vars/
│ └── main.yml
├── telemetry/
│ ├── ansible.cfg
│ ├── roles/
│ │ ├── idrac_telemetry/
│ │ │ ├── tasks/
│ │ │ │ ├── create_telemetry_report.yml
│ │ │ │ ├── initiate_telemetry_service_cluster.yml
│ │ │ │ ├── main.yml
│ │ │ │ ├── remove_deleted_nodes.yml
│ │ │ │ ├── trigger_telemetry_collection.yml
│ │ │ │ └── validate_bmcips_reachability.yml
│ │ │ ├── templates/
│ │ │ │ └── telemetry_report.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── service_k8s_telemetry/
│ │ │ ├── tasks/
│ │ │ │ ├── main.yml
│ │ │ │ └── update_metadata_file.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── telemetry_validation/
│ │ ├── files/
│ │ │ └── timezone.txt
│ │ ├── tasks/
│ │ │ ├── main.yml
│ │ │ ├── validate_idrac_inventory.yml
│ │ │ ├── validate_telemetry_config.yml
│ │ │ └── validation_status_check.yml
│ │ └── vars/
│ │ └── main.yml
│ └── telemetry.yml
├── upgrade/
│ ├── ansible.cfg
│ ├── main.yml
│ ├── roles/
│ │ ├── import_input_parameters/
│ │ │ ├── tasks/
│ │ │ │ ├── display_warnings.yml
│ │ │ │ ├── main.yml
│ │ │ │ ├── precheck_backup_location.yml
│ │ │ │ ├── restore_input_files.yml
│ │ │ │ ├── restore_omnia_config_credentials.yml
│ │ │ │ ├── restore_single_input_file.yml
│ │ │ │ ├── restore_user_registry_credential.yml
│ │ │ │ ├── set_backup_location.yml
│ │ │ │ ├── transform_high_availability_config.yml
│ │ │ │ ├── transform_local_repo_config.yml
│ │ │ │ ├── transform_network_spec.yml
│ │ │ │ ├── transform_omnia_config.yml
│ │ │ │ ├── transform_provision_config.yml
│ │ │ │ ├── transform_storage_config.yml
│ │ │ │ └── transform_telemetry_config.yml
│ │ │ ├── templates/
│ │ │ │ ├── high_availability_config.j2
│ │ │ │ ├── local_repo_config.j2
│ │ │ │ ├── network_spec.j2
│ │ │ │ ├── omnia_config.j2
│ │ │ │ ├── omnia_config_credentials.yml.j2
│ │ │ │ ├── provision_config.j2
│ │ │ │ ├── storage_config.j2
│ │ │ │ └── telemetry_config.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── upgrade_cluster/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── upgrade_oim/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── rollback_omnia.yml
│ ├── upgrade_cluster.yml
│ ├── upgrade_oim.yml
│ └── upgrade_omnia.yml
└── utils/
├── ansible.cfg
├── create_container_group.yml
├── credential_utility/
│ ├── ansible.cfg
│ ├── get_config_credentials.yml
│ └── roles/
│ ├── create_config/
│ │ ├── tasks/
│ │ │ ├── create_credential_file.yml
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ ├── build_stream_credential.j2
│ │ │ └── omnia_credential.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── update_config/
│ │ ├── tasks/
│ │ │ ├── credential_status.yml
│ │ │ ├── fetch_conditional_mandatory_credentials.yml
│ │ │ ├── fetch_credentials.yml
│ │ │ ├── fetch_mandatory_credentials.yml
│ │ │ ├── fetch_optional_credentials.yml
│ │ │ ├── main.yml
│ │ │ ├── prompt_credentials.yml
│ │ │ ├── prompt_password.yml
│ │ │ ├── prompt_username.yml
│ │ │ ├── update_bs_credential_file.yml
│ │ │ └── update_credentials.yml
│ │ └── vars/
│ │ └── main.yml
│ └── validation/
│ ├── tasks/
│ │ ├── main.yml
│ │ ├── pre_requisite.yml
│ │ └── validate_cred_file.yml
│ └── vars/
│ └── main.yml
├── external_kafka_connect_details.yml
├── external_victoria_connect_details.yml
├── generate_functional_groups.yml
├── include_input_dir.yml
├── oim_cleanup.yml
├── roles/
│ ├── common/
│ │ ├── tasks/
│ │ │ ├── include_omnia_config.yml
│ │ │ ├── include_omnia_config_credentials.yml
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── create_container_group/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── external_kafka_connect_details/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── external_victoria_connect_details/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── generate_functional_groups/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── idrac_pxe_boot/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── include_input_dir/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── oim_cleanup/
│ │ ├── oim_container_cleanup/
│ │ │ ├── tasks/
│ │ │ │ ├── cleanup_auth.yml
│ │ │ │ ├── cleanup_build_stream.yml
│ │ │ │ ├── cleanup_common.yml
│ │ │ │ ├── cleanup_note.yml
│ │ │ │ ├── cleanup_omnia_postgres.yml
│ │ │ │ ├── cleanup_openchami.yml
│ │ │ │ ├── cleanup_pulp.yml
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── omnia_credential_cleanup/
│ │ │ ├── tasks/
│ │ │ │ ├── cleanup_credentials.yml
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── pre_requisite/
│ │ ├── tasks/
│ │ │ ├── main.yml
│ │ │ └── pre_requisite.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── slurm_cleanup/
│ │ ├── defaults/
│ │ │ └── main.yml
│ │ └── tasks/
│ │ └── main.yml
│ ├── slurm_config_backup/
│ │ ├── defaults/
│ │ │ └── main.yml
│ │ └── tasks/
│ │ └── main.yml
│ └── slurm_config_rollback/
│ ├── defaults/
│ │ └── main.yml
│ └── tasks/
│ └── main.yml
├── set_pxe_boot.yml
├── slurm_config_util.yml
└── upgrade_checkup.yml
================================================
FILE CONTENTS
================================================
================================================
FILE: .all-contributorsrc
================================================
{
"files": [
"README.md"
],
"imageSize": 100,
"commit": false,
"badgeTemplate": "<!-- DO NOT ADD A BADGE -->",
"contributors": [
{
"login": "j0hnL",
"name": "John Lockman",
"avatar_url": "https://avatars.githubusercontent.com/u/912987?v=4",
"profile": "http://johnlockman.com",
"contributions": [
"test",
"code",
"blog",
"ideas",
"maintenance",
"mentoring",
"design",
"review",
"talk",
"bug"
]
},
{
"login": "lwilson",
"name": "Lucas A. Wilson",
"avatar_url": "https://avatars.githubusercontent.com/u/1236922?v=4",
"profile": "https://github.com/lwilson",
"contributions": [
"code",
"design",
"maintenance",
"ideas",
"blog",
"doc",
"mentoring",
"projectManagement",
"review",
"talk",
"bug"
]
},
{
"login": "sujit-jadhav",
"name": "Sujit Jadhav",
"avatar_url": "https://avatars.githubusercontent.com/u/73123831?v=4",
"profile": "https://github.com/sujit-jadhav",
"contributions": [
"ideas",
"doc",
"code",
"review",
"maintenance",
"projectManagement",
"mentoring",
"talk",
"question",
"test",
"bug"
]
},
{
"login": "DeepikaKrishnaiah",
"name": "Deepika K",
"avatar_url": "https://avatars.githubusercontent.com/u/73213880?v=4",
"profile": "https://github.com/DeepikaKrishnaiah",
"contributions": [
"code",
"test",
"bug",
"security",
"talk",
"review",
"mentoring"
]
},
{
"login": "abhishek-sa1",
"name": "Abhishek SA",
"avatar_url": "https://avatars.githubusercontent.com/u/94038029?v=4",
"profile": "https://github.com/abhishek-sa1",
"contributions": [
"code",
"bug",
"doc",
"test",
"maintenance",
"talk",
"mentoring",
"review"
]
},
{
"login": "sakshiarora13",
"name": "Sakshi Arora",
"avatar_url": "https://avatars.githubusercontent.com/u/73195862?v=4",
"profile": "https://github.com/sakshiarora13",
"contributions": [
"code",
"bug",
"talk"
]
},
{
"login": "Shubhangi-dell",
"name": "Shubhangi Srivastava",
"avatar_url": "https://avatars.githubusercontent.com/u/72869337?v=4",
"profile": "https://github.com/Shubhangi-dell",
"contributions": [
"code",
"maintenance",
"bug",
"talk"
]
},
{
"login": "cgoveas",
"name": "Cassey Goveas",
"avatar_url": "https://avatars.githubusercontent.com/u/88071888?v=4",
"profile": "https://github.com/cgoveas",
"contributions": [
"doc",
"bug",
"maintenance",
"talk"
]
},
{
"login": "Khushboodholi",
"name": "Khushboo Dholi",
"avatar_url": "https://avatars.githubusercontent.com/u/12014935?v=4",
"profile": "https://github.com/Khushboodholi",
"contributions": [
"code"
]
},
{
"login": "prasoon-sinha",
"name": "Prasoon Kumar Sinha",
"avatar_url": "https://avatars.githubusercontent.com/u/5362594?v=4",
"profile": "https://github.com/prasoon-sinha",
"contributions": [
"ideas",
"talk",
"mentoring"
]
},
{
"login": "SajithDas",
"name": "SajithDas",
"avatar_url": "https://avatars.githubusercontent.com/u/78676226?v=4",
"profile": "https://github.com/SajithDas",
"contributions": [
"projectManagement",
"talk"
]
},
{
"login": "i3igpete",
"name": "i3igpete",
"avatar_url": "https://avatars.githubusercontent.com/u/33877827?v=4",
"profile": "https://github.com/i3igpete",
"contributions": [
"business",
"talk"
]
},
{
"login": "renzo-granados",
"name": "renzo-granados",
"avatar_url": "https://avatars.githubusercontent.com/u/83035817?v=4",
"profile": "https://github.com/renzo-granados",
"contributions": [
"bug"
]
},
{
"login": "Aditya-DP",
"name": "Aditya-DP",
"avatar_url": "https://avatars.githubusercontent.com/u/115771515?v=4",
"profile": "https://github.com/Aditya-DP",
"contributions": [
"code",
"bug",
"test"
]
},
{
"login": "Katakam-Rakesh",
"name": "Katakam Rakesh Naga Sai",
"avatar_url": "https://avatars.githubusercontent.com/u/125246792?v=4",
"profile": "https://github.com/Katakam-Rakesh",
"contributions": [
"code",
"bug",
"test"
]
},
{
"login": "araji",
"name": "araji",
"avatar_url": "https://avatars.githubusercontent.com/u/216020?v=4",
"profile": "https://github.com/araji",
"contributions": [
"code"
]
},
{
"login": "mikerenfro",
"name": "Mike Renfro",
"avatar_url": "https://avatars.githubusercontent.com/u/1451881?v=4",
"profile": "https://mike.renf.ro/blog/",
"contributions": [
"doc"
]
},
{
"login": "leereyno-asu",
"name": "Lee Reynolds",
"avatar_url": "https://avatars.githubusercontent.com/u/81774548?v=4",
"profile": "https://github.com/leereyno-asu",
"contributions": [
"code",
"doc",
"tutorial"
]
},
{
"login": "blesson-james",
"name": "blesson-james",
"avatar_url": "https://avatars.githubusercontent.com/u/72782936?v=4",
"profile": "https://github.com/blesson-james",
"contributions": [
"code",
"test",
"bug"
]
},
{
"login": "avinashvishwanath",
"name": "avinashvishwanath",
"avatar_url": "https://avatars.githubusercontent.com/u/77823538?v=4",
"profile": "https://github.com/avinashvishwanath",
"contributions": [
"doc"
]
},
{
"login": "abhishek-s-a",
"name": "abhishek-s-a",
"avatar_url": "https://avatars.githubusercontent.com/u/73212230?v=4",
"profile": "https://github.com/abhishek-s-a",
"contributions": [
"code",
"doc",
"test"
]
},
{
"login": "Franklin-Johnson",
"name": "Franklin-Johnson",
"avatar_url": "https://avatars.githubusercontent.com/u/84760103?v=4",
"profile": "https://github.com/Franklin-Johnson",
"contributions": [
"code",
"blog"
]
},
{
"login": "teiland7",
"name": "teiland7",
"avatar_url": "https://avatars.githubusercontent.com/u/85184708?v=4",
"profile": "https://github.com/teiland7",
"contributions": [
"code",
"blog"
]
},
{
"login": "VishnupriyaKrish",
"name": "VishnupriyaKrish",
"avatar_url": "https://avatars.githubusercontent.com/u/72784834?v=4",
"profile": "https://github.com/VishnupriyaKrish",
"contributions": [
"code",
"test"
]
},
{
"login": "ishitadatta",
"name": "Ishita Datta",
"avatar_url": "https://avatars.githubusercontent.com/u/48859631?v=4",
"profile": "https://rb.gy/ndlbhv",
"contributions": [
"doc"
]
},
{
"login": "asu-wdizon",
"name": "William Dizon",
"avatar_url": "https://avatars.githubusercontent.com/u/81772355?v=4",
"profile": "https://github.com/asu-wdizon",
"contributions": [
"tutorial"
]
},
{
"login": "bssitton-BU",
"name": "bssitton-BU",
"avatar_url": "https://avatars.githubusercontent.com/u/14130464?v=4",
"profile": "https://github.com/bssitton-BU",
"contributions": [
"bug"
]
},
{
"login": "hearnsj",
"name": "John Hearns",
"avatar_url": "https://avatars.githubusercontent.com/u/19259589?v=4",
"profile": "https://github.com/hearnsj",
"contributions": [
"bug"
]
},
{
"login": "kbuggenhout",
"name": "kris buggenhout",
"avatar_url": "https://avatars.githubusercontent.com/u/30471699?v=4",
"profile": "https://github.com/kbuggenhout",
"contributions": [
"bug"
]
},
{
"login": "jiad-vmware",
"name": "jiad-vmware",
"avatar_url": "https://avatars.githubusercontent.com/u/68653329?v=4",
"profile": "https://github.com/jiad-vmware",
"contributions": [
"bug"
]
},
{
"login": "jlec",
"name": "Justin Lecher",
"avatar_url": "https://avatars.githubusercontent.com/u/79732?v=4",
"profile": "https://jlec.de",
"contributions": [
"ideas"
]
},
{
"login": "Kavyabr23",
"name": "Kavyabr23",
"avatar_url": "https://avatars.githubusercontent.com/u/90390587?v=4",
"profile": "https://github.com/Kavyabr23",
"contributions": [
"code",
"test"
]
},
{
"login": "vedaprakashanp",
"name": "vedaprakashanp",
"avatar_url": "https://avatars.githubusercontent.com/u/90596073?v=4",
"profile": "https://github.com/vedaprakashanp",
"contributions": [
"test",
"code"
]
},
{
"login": "Bhagyashree-shetty",
"name": "Bhagyashree-shetty",
"avatar_url": "https://avatars.githubusercontent.com/u/90620926?v=4",
"profile": "https://github.com/Bhagyashree-shetty",
"contributions": [
"test",
"code"
]
},
{
"login": "nihalranjan-hpc",
"name": "Nihal Ranjan",
"avatar_url": "https://avatars.githubusercontent.com/u/84398828?v=4",
"profile": "https://github.com/nihalranjan-hpc",
"contributions": [
"test",
"code",
"talk",
"bug"
]
},
{
"login": "ptrinesh",
"name": "ptrinesh",
"avatar_url": "https://avatars.githubusercontent.com/u/73214211?v=4",
"profile": "https://github.com/ptrinesh",
"contributions": [
"code"
]
},
{
"login": "eltociear",
"name": "Ikko Ashimine",
"avatar_url": "https://avatars.githubusercontent.com/u/22633385?v=4",
"profile": "https://bandism.net/",
"contributions": [
"code"
]
},
{
"login": "Lakshmi-Patneedi",
"name": "Lakshmi-Patneedi",
"avatar_url": "https://avatars.githubusercontent.com/u/94051091?v=4",
"profile": "https://github.com/Lakshmi-Patneedi",
"contributions": [
"code"
]
},
{
"login": "Artlands",
"name": "Jie Li",
"avatar_url": "https://avatars.githubusercontent.com/u/31781106?v=4",
"profile": "https://github.com/Artlands",
"contributions": [
"code"
]
},
{
"login": "githubyongchen",
"name": "Yong Chen",
"avatar_url": "https://avatars.githubusercontent.com/u/5414112?v=4",
"profile": "https://github.com/githubyongchen",
"contributions": [
"design"
]
},
{
"login": "Zipexpo",
"name": "nvtngan",
"avatar_url": "https://avatars.githubusercontent.com/u/18387748?v=4",
"profile": "http://www.myweb.ttu.edu/ngu00336/",
"contributions": [
"code",
"plugin"
]
},
{
"login": "tamilarasansubrama1",
"name": "tamilarasansubrama1",
"avatar_url": "https://avatars.githubusercontent.com/u/100588942?v=4",
"profile": "https://github.com/tamilarasansubrama1",
"contributions": [
"test",
"code"
]
},
{
"login": "shemasr",
"name": "shemasr",
"avatar_url": "https://avatars.githubusercontent.com/u/100141664?v=4",
"profile": "https://github.com/shemasr",
"contributions": [
"bug",
"code",
"test"
]
},
{
"login": "naresh3774",
"name": "Naresh Sharma",
"avatar_url": "https://avatars.githubusercontent.com/u/101410892?v=4",
"profile": "https://github.com/naresh3774",
"contributions": [
"bug"
]
},
{
"login": "JonHass",
"name": "Jon Hass",
"avatar_url": "https://avatars.githubusercontent.com/u/6976486?v=4",
"profile": "https://github.com/JonHass",
"contributions": [
"doc",
"design"
]
},
{
"login": "KalyanKonatham",
"name": "KalyanKonatham",
"avatar_url": "https://avatars.githubusercontent.com/u/101596828?v=4",
"profile": "https://github.com/KalyanKonatham",
"contributions": [
"bug"
]
},
{
"login": "rahulakolkar",
"name": "Rahul Akolkar",
"avatar_url": "https://avatars.githubusercontent.com/u/22768133?v=4",
"profile": "https://github.com/rahulakolkar",
"contributions": [
"bug"
]
},
{
"login": "srinandini-karumuri",
"name": "srinandini-karumuri",
"avatar_url": "https://avatars.githubusercontent.com/u/104345504?v=4",
"profile": "https://github.com/srinandini-karumuri",
"contributions": [
"code"
]
},
{
"login": "Rishabhm47",
"name": "Rishabhm47",
"avatar_url": "https://avatars.githubusercontent.com/u/106973551?v=4",
"profile": "https://github.com/Rishabhm47",
"contributions": [
"test",
"code"
]
},
{
"login": "vaishakh-pm",
"name": "vaishakh-pm",
"avatar_url": "https://avatars.githubusercontent.com/u/104622022?v=4",
"profile": "https://github.com/vaishakh-pm",
"contributions": [
"test",
"code"
]
},
{
"login": "shridhar-sharma",
"name": "shridhar-sharma",
"avatar_url": "https://avatars.githubusercontent.com/u/104621992?v=4",
"profile": "https://github.com/shridhar-sharma",
"contributions": [
"test",
"code",
"bug"
]
},
{
"login": "JayaDayyala",
"name": "Jaya.Dayyala",
"avatar_url": "https://avatars.githubusercontent.com/u/108455487?v=4",
"profile": "https://github.com/JayaDayyala",
"contributions": [
"test",
"code"
]
},
{
"login": "fasongan",
"name": "fasongan",
"avatar_url": "https://avatars.githubusercontent.com/u/16153657?v=4",
"profile": "https://github.com/fasongan",
"contributions": [
"code"
]
},
{
"login": "rahuldell21",
"name": "rahuldell21",
"avatar_url": "https://avatars.githubusercontent.com/u/117621375?v=4",
"profile": "https://github.com/rahuldell21",
"contributions": [
"code",
"test"
]
},
{
"login": "diptiman12",
"name": "diptiman12",
"avatar_url": "https://avatars.githubusercontent.com/u/117987073?v=4",
"profile": "https://github.com/diptiman12",
"contributions": [
"code"
]
},
{
"login": "SupriyaParthasarathy",
"name": "Supriya Parthasarathy",
"avatar_url": "https://avatars.githubusercontent.com/u/139955493?v=4",
"profile": "https://github.com/SupriyaParthasarathy",
"contributions": [
"projectManagement"
]
},
{
"login": "Subhankar-Adak",
"name": "Subhankar-Adak",
"avatar_url": "https://avatars.githubusercontent.com/u/140381176?v=4",
"profile": "https://github.com/Subhankar-Adak",
"contributions": [
"code"
]
},
{
"login": "priti-parate",
"name": "priti-parate",
"avatar_url": "https://avatars.githubusercontent.com/u/140157516?v=4",
"profile": "https://github.com/priti-parate",
"contributions": [
"code",
"bug",
"talk",
"mentoring",
"review"
]
},
{
"login": "lavanya5899",
"name": "Lavanya Adhikari",
"avatar_url": "https://avatars.githubusercontent.com/u/140372459?v=4",
"profile": "https://github.com/lavanya5899",
"contributions": [
"code"
]
},
{
"login": "preeti-thankachan",
"name": "preeti-thankachan",
"avatar_url": "https://avatars.githubusercontent.com/u/141405483?v=4",
"profile": "https://github.com/preeti-thankachan",
"contributions": [
"test",
"bug"
]
},
{
"login": "glimchb",
"name": "Boris Glimcher",
"avatar_url": "https://avatars.githubusercontent.com/u/36732377?v=4",
"profile": "https://github.com/glimchb",
"contributions": [
"code",
"maintenance",
"doc"
]
},
{
"login": "MoshiBin",
"name": "Moshi Binyamini",
"avatar_url": "https://avatars.githubusercontent.com/u/1297388?v=4",
"profile": "https://github.com/MoshiBin",
"contributions": [
"code",
"maintenance"
]
},
{
"login": "paul-tp",
"name": "paul-tp",
"avatar_url": "https://avatars.githubusercontent.com/u/169248855?v=4",
"profile": "https://github.com/paul-tp",
"contributions": [
"code"
]
},
{
"login": "Milisha-Gupta",
"name": "Milisha Gupta",
"avatar_url": "https://avatars.githubusercontent.com/u/52577117?v=4",
"profile": "https://github.com/Milisha-Gupta",
"contributions": [
"code",
"test"
]
},
{
"login": "sakshi-singla-1735",
"name": "sakshi-singla-1735",
"avatar_url": "https://avatars.githubusercontent.com/u/169248923?v=4",
"profile": "https://github.com/sakshi-singla-1735",
"contributions": [
"code"
]
},
{
"login": "Sankeerna-S",
"name": "Sankeerna-S",
"avatar_url": "https://avatars.githubusercontent.com/u/169250907?v=4",
"profile": "https://github.com/Sankeerna-S",
"contributions": [
"code"
]
},
{
"login": "AjayKadoula",
"name": "Ajay Kadoula",
"avatar_url": "https://avatars.githubusercontent.com/u/38178003?v=4",
"profile": "https://github.com/AjayKadoula",
"contributions": [
"code"
]
},
{
"login": "ShubhamKumar1996",
"name": "ShubhamKumar1996",
"avatar_url": "https://avatars.githubusercontent.com/u/51914136?v=4",
"profile": "https://github.com/ShubhamKumar1996",
"contributions": [
"code"
]
},
{
"login": "SanthoshT2001",
"name": "SanthoshT2001",
"avatar_url": "https://avatars.githubusercontent.com/u/93521129?v=4",
"profile": "https://github.com/SanthoshT2001",
"contributions": [
"code"
]
},
{
"login": "Kratika-P",
"name": "Kratika-P",
"avatar_url": "https://avatars.githubusercontent.com/u/169249531?v=4",
"profile": "https://github.com/Kratika-P",
"contributions": [
"code",
"test"
]
},
{
"login": "sbasu96",
"name": "Soumyadeep Basu",
"avatar_url": "https://avatars.githubusercontent.com/u/162503707?v=4",
"profile": "https://github.com/sbasu96",
"contributions": [
"doc"
]
},
{
"login": "VrindaMarwah",
"name": "VrindaMarwah",
"avatar_url": "https://avatars.githubusercontent.com/u/169263232?v=4",
"profile": "https://github.com/VrindaMarwah",
"contributions": [
"code",
"test"
]
},
{
"login": "Kevin-Kodama",
"name": "Kevin-Kodama",
"avatar_url": "https://avatars.githubusercontent.com/u/163032741?v=4",
"profile": "https://github.com/Kevin-Kodama",
"contributions": [
"code"
]
},
{
"login": "balajikumaran-c-s",
"name": "balajikumaran-c-s",
"avatar_url": "https://avatars.githubusercontent.com/u/169248535?v=4",
"profile": "https://github.com/balajikumaran-c-s",
"contributions": [
"code",
"test",
"bug",
"code"
]
},
{
"login": "Amogha-Reddy",
"name": "Amogha-Reddy",
"avatar_url": "https://avatars.githubusercontent.com/u/140503786?v=4",
"profile": "https://github.com/Amogha-Reddy",
"contributions": [
"test",
"bug",
"code"
]
},
{
"login": "krsandeepit",
"name": "krsandeepit",
"avatar_url": "https://avatars.githubusercontent.com/u/162142649?v=4",
"profile": "https://github.com/krsandeepit",
"contributions": [
"test",
"bug"
]
},
{
"login": "Yash-shetty1",
"name": "Yash-shetty1",
"avatar_url": "https://avatars.githubusercontent.com/u/169258785?v=4",
"profile": "https://github.com/Yash-shetty1",
"contributions": [
"test",
"bug"
]
},
{
"login": "nethramg",
"name": "Nethravathi M G",
"avatar_url": "https://avatars.githubusercontent.com/u/146437298?v=4",
"profile": "https://github.com/nethramg",
"contributions": [
"code",
"projectManagement",
"talk"
]
},
{
"login": "AbdulRijwan",
"name": "Abdul Rijwan",
"avatar_url": "https://avatars.githubusercontent.com/u/170396052?v=4",
"profile": "https://github.com/AbdulRijwan",
"contributions": [
"infra"
]
},
{
"login": "dweineha",
"name": "David Weinehall",
"avatar_url": "https://avatars.githubusercontent.com/u/42206500?v=4",
"profile": "https://github.com/dweineha",
"contributions": [
"code"
]
},
{
"login": "VenkateswaraVatam",
"name": "Venkateswara Vatam",
"avatar_url": "https://avatars.githubusercontent.com/u/153504816?v=4",
"profile": "https://github.com/VenkateswaraVatam",
"contributions": [
"projectManagement",
"talk"
]
},
{
"login": "snarthan",
"name": "Narthan S",
"avatar_url": "https://avatars.githubusercontent.com/u/171680285?v=4",
"profile": "https://github.com/snarthan",
"contributions": [
"code",
"mentoring",
"review"
]
},
{
"login": "suman-square",
"name": "Suman S",
"avatar_url": "https://avatars.githubusercontent.com/u/178771071?v=4",
"profile": "https://github.com/suman-square",
"contributions": [
"code"
]
},
{
"login": "gurump21",
"name": "Prabhu Gurumurthy",
"avatar_url": "https://avatars.githubusercontent.com/u/189354746?v=4",
"profile": "https://github.com/gurump21",
"contributions": [
"bug"
]
},
{
"login": "Nagachandan-P",
"name": "Nagachandan P",
"avatar_url": "https://avatars.githubusercontent.com/Nagachandan-P",
"profile": "https://github.com/Nagachandan-P",
"contributions": [
"code"
]
},
{
"login": "pranavkumar74980",
"name": "Pranav kumar",
"avatar_url": "https://avatars.githubusercontent.com/pranavkumar74980",
"profile": "https://github.com/pranavkumar74980",
"contributions": [
"code",
"test"
]
},
{
"login": "aditi-sharma27",
"name": "Aditi Sharma",
"avatar_url": "https://avatars.githubusercontent.com/aditi-sharma27",
"profile": "https://github.com/aditi-sharma27",
"contributions": [
"code"
]
},
{
"login": "Rohith-Ravut",
"name": "Rohith-Ravut",
"avatar_url": "https://avatars.githubusercontent.com/u/196186062?v=4",
"profile": "https://github.com/Rohith-Ravut",
"contributions": [
"test",
"bug",
"code"
]
},
{
"login": "RvishankarOMnia",
"name": "RvishankarOMnia",
"avatar_url": "https://avatars.githubusercontent.com/u/186007052?v=4",
"profile": "https://github.com/RvishankarOMnia",
"contributions": [
"ideas",
"talk",
"mentoring"
]
},
{
"login": "jagadeeshnv",
"name": "Jagadeesh N V",
"avatar_url": "https://avatars.githubusercontent.com/u/39791839?v=4",
"profile": "https://github.com/jagadeeshnv",
"contributions": [
"code"
]
},
{
"login": "sourabh-sahu1",
"name": "sourabh-sahu1",
"avatar_url": "https://avatars.githubusercontent.com/u/196315600?v=4",
"profile": "https://github.com/sourabh-sahu1",
"contributions": [
"code"
]
},
{
"login": "ghandoura",
"name": "Adam Ghandoura",
"avatar_url": "https://avatars.githubusercontent.com/u/87424850?v=4",
"profile": "https://github.com/ghandoura",
"contributions": [
"test",
"code"
]
},
{
"login": "Coleman-Trader",
"name": "Coleman-Trader",
"avatar_url": "https://avatars.githubusercontent.com/u/196217244?v=4",
"profile": "https://github.com/Coleman-Trader",
"contributions": [
"code"
]
},
{
"login": "youngjae-hur7",
"name": "youngjae-hur7",
"avatar_url": "https://avatars.githubusercontent.com/u/196205015?v=4",
"profile": "https://github.com/youngjae-hur7",
"contributions": [
"code"
]
},
{
"login": "Grace-Chang2",
"name": "Grace-Chang2",
"avatar_url": "https://avatars.githubusercontent.com/u/196347461?v=4",
"profile": "https://github.com/Grace-Chang2",
"contributions": [
"code"
]
},
{
"login": "Cypher-Miller",
"name": "Cypher-Miller",
"avatar_url": "https://avatars.githubusercontent.com/u/123703182?v=4",
"profile": "https://github.com/Cypher-Miller",
"contributions": [
"code"
]
},
{
"login": "vvittal100",
"name": "vvittal100",
"avatar_url": "https://avatars.githubusercontent.com/u/202238575?v=4",
"profile": "https://github.com/vvittal100",
"contributions": [
"projectManagement",
"talk"
]
},
{
"login": "kksenthilkumar",
"name": "kksenthilkumar",
"avatar_url": "https://avatars.githubusercontent.com/u/202253529?v=4",
"profile": "https://github.com/kksenthilkumar",
"contributions": [
"test"
]
},
{
"login": "pullan1",
"name": "pullan1",
"avatar_url": "https://avatars.githubusercontent.com/u/173048662?v=4",
"profile": "https://github.com/pullan1",
"contributions": [
"code"
]
},
{
"login": "harshal2799",
"name": "harshal2799",
"avatar_url": "https://avatars.githubusercontent.com/u/202241497?v=4",
"profile": "https://github.com/harshal2799",
"contributions": [
"test"
]
},
{
"login": "Sindhu-Ranganath",
"name": "Sindhu-Ranganath",
"avatar_url": "https://avatars.githubusercontent.com/u/208789597?v=4",
"profile": "https://github.com/Sindhu-Ranganath",
"contributions": [
"test"
]
},
{
"login": "Manasa-Hemmanur",
"name": "Manasa H",
"avatar_url": "https://avatars.githubusercontent.com/u/205002578?v=4",
"profile": "https://github.com/Manasa-Hemmanur",
"contributions": [
"code",
"test"
]
},
{
"login": "Diya-Sumod",
"name": "Diya-Sumod",
"avatar_url": "https://avatars.githubusercontent.com/u/225136254?v=4",
"profile": "https://github.com/Diya-Sumod",
"contributions": [
"code",
"test"
]
},
{
"login": "Tanmay-Raj1004",
"name": "Tanmay-Raj1004",
"avatar_url": "https://avatars.githubusercontent.com/u/227950687?v=4",
"profile": "https://github.com/Tanmay-Raj1004",
"contributions": [
"code",
"test"
]
},
{
"login": "Anurag-Bijalwan",
"name": "Anurag-Bijalwan",
"avatar_url": "https://avatars.githubusercontent.com/u/218922922?v=4",
"profile": "https://github.com/Anurag-Bijalwan",
"contributions": [
"code"
]
},
{
"login": "SOWJANYAJAGADISH123",
"name": "SOWJANYAJAGADISH123",
"avatar_url": "https://avatars.githubusercontent.com/u/257989626?v=4",
"profile": "https://github.com/SOWJANYAJAGADISH123",
"contributions": [
"code"
]
},
{
"login": "mithileshreddy04",
"name": "mithileshreddy04",
"avatar_url": "https://avatars.githubusercontent.com/u/258000200?v=4",
"profile": "https://github.com/mithileshreddy04",
"contributions": [
"code"
]
},
{
"login": "Rajeshkumar-s2",
"name": "Rajeshkumar-s2",
"avatar_url": "https://avatars.githubusercontent.com/u/242588082?v=4",
"profile": "https://github.com/Rajeshkumar-s2",
"contributions": [
"code",
"test"
]
},
{
"login": "Venu-p1",
"name": "Venu-p1",
"avatar_url": "https://avatars.githubusercontent.com/u/236371043?v=4",
"profile": "https://github.com/Venu-p1",
"contributions": [
"code",
"test"
]
}
],
"contributorsPerLine": 7,
"projectName": "omnia",
"projectOwner": "dell",
"repoType": "github",
"repoHost": "https://github.com",
"skipCi": true,
"commitConvention": "angular",
"commitType": "docs"
}
================================================
FILE: .ansible-lint
================================================
skip_list:
- var-naming[no-role-prefix]
- unresolved-module
- fqcn[canonical]
- internal-error
- role-name[path]
================================================
FILE: .config/ansible-lint.yml
================================================
---
exclude_paths:
- .git/
- .github/
- accelerator/tests/
- network/tests/
- provision/tests/
- scheduler/tests/
- security/tests/
- storage/tests/
- test/
- utils/obsolete/
- docs/
- platforms/
- examples/
- input/
- .ansible-lint.yml
- .readthedocs.yaml
- prepare_oim/roles/configure_proxy/tasks/configure_proxy_rocky.yml
- upgrade/roles/upgrade_idrac_telemetry/tasks/filter_idrac.yml
- utils/server_spec_update/roles/os_update/tasks/kcmdline_update_rocky.yml
- utils/roles/oim_cleanup/vars/rocky.yml
- scheduler/roles/k8s_start_services/files/k8s_dashboard_admin.yaml
- scheduler/playbooks/k8s_add_node.yml
- "*ubuntu*"
- "*rocky*"
skip_list:
- var-naming
- unresolved-module
- fqcn[canonical]
- internal-error
- role-name[path]
verbosity: 1
profile: production
================================================
FILE: .config/requirements.yml
================================================
---
collections:
- name: kubernetes.core
version: 5.0.0
- name: ansible.utils
version: 5.1.1
- name: community.crypto
version: 2.23.0
- name: community.docker
version: 3.12.1
- name: community.general
version: 10.3.0
- name: community.grafana
version: 2.1.0
- name: community.mysql
version: 3.10.3
- name: dellemc.os10
version: 1.1.1
- name: dellemc.openmanage
version: 9.6.0
- name: ansible.posix
version: 2.0.0
- name: containers.podman
version: 1.16.2
- name: community.postgresql
version: 3.10.2
================================================
FILE: .gitattributes
================================================
*.yml linguist-detectable
*.tar.gz filter=lfs diff=lfs merge=lfs -text
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
Omnia Version: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: 'enhancement'
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/logo_community.md
================================================
---
name: Add organization logo to the Omnia community list
about: Display your organization's logo on the Omnia website
title: 'Add logo to Omnia community list'
labels: 'logo'
assignees: ''
---
**Permanent link to your organization's logo:**
_Please replace this text with a permanent URL to your organization's logo. Logos will be automatically resized to fit._
================================================
FILE: .github/branch-switcher.yml
================================================
preferredBranch: devel
switchComment: >
Hey @{{author}}, the base branch of your pull request has been changed
to {{preferredBranch}}. Have a nice day! :wave:
================================================
FILE: .github/pull_request_template.md
================================================
### Issues Resolved by this Pull Request
Please be sure to associate your pull request with one or more open issues. Use the word _Fixes_ as well as a hashtag (_#_) prior to the issue number in order to automatically resolve associated issues (e.g., _Fixes #100_).
Fixes #
### Description of the Solution
Please describe the solution provided and how it resolves the associated issues.
### Suggested Reviewers
If you wish to suggest specific reviewers for this solution, please include them in this section. Be sure to include the _@_ before the GitHub username.
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 14
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- security
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
================================================
FILE: .github/workflows/ansible-lint.yml
================================================
name: Ansible Lint
on:
pull_request:
branches:
- main
- staging
- release_1.7.1
- pub/build_stream
- pub/v2.1_rc1
- pub/q1_dev
jobs:
build:
name: Ansible Lint
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install Ansible and Ansible Lint
run: |
python -m pip install --upgrade pip
pip install ansible-core
- name: Install Ansible Collections from requirements.yml
run: |
ansible-galaxy collection install -r .config/requirements.yml --force
- name: Run ansible-lint
uses: ansible/ansible-lint@main
with:
args: --config=.config/ansible-lint.yml
================================================
FILE: .github/workflows/pylint.yml
================================================
name: Pylint
on:
pull_request:
branches:
- main
- staging
- release_1.7.1
- pub/build_stream
- pub/v2.1_rc1
- pub/q1_dev
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.11"]
env:
PYLINT_THRESHOLD: 8
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install ansible pylint kubernetes prettytable requests passlib fastapi uvicorn sqlalchemy pytest httpx argon2-cffi pyyaml dependency-injector
- name: Get changed Python files (excluding deleted)
id: changed-files
run: |
git fetch origin ${{ github.base_ref }}
CHANGED=$(git diff --name-only --diff-filter=d origin/${{ github.base_ref }} HEAD -- '*.py' || true)
FILES=""
for f in $CHANGED; do
if [ -f "$f" ]; then
FILES="$FILES $f"
fi
done
FILES=$(echo "$FILES" | xargs) # Trim extra spaces
echo "Filtered files: $FILES"
echo "files=$FILES" >> "$GITHUB_OUTPUT"
- name: Run pylint on changed files
if: steps.changed-files.outputs.files != ''
run: |
echo "Running pylint on: ${{ steps.changed-files.outputs.files }}"
# Filter out files from the excluded directory
FILES=$(echo "${{ steps.changed-files.outputs.files }}" | tr ' ' '\n' | grep -v '^discovery/roles/telemetry/files/nersc-ldms-aggr/' | xargs)
if [ -n "$FILES" ]; then
# Set PYTHONPATH to include build_stream directory for proper import resolution
# This allows pylint to resolve both relative imports in build_stream and regular imports elsewhere
PYTHONPATH=.:./build_stream pylint $FILES --fail-under=${PYLINT_THRESHOLD}
else
echo "No files to lint after filtering."
fi
================================================
FILE: .gitignore
================================================
/.idea/
/docs/build/
**/__pycache__/
.venv
================================================
FILE: .metadata/omnia_version
================================================
omnia_version: 2.0.0.0
omnia_installation_path: ""
================================================
FILE: .readthedocs.yaml
================================================
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
# Set the version of Python and other tools you might need
build:
os: ubuntu-22.04
tools:
python: "3.11"
# You can also specify other tool versions:
# nodejs: "19"
# rust: "1.64"
# golang: "1.19"
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: docs/source/conf.py
# If using Sphinx, optionally build your docs in additional formats such as PDF
formats:
- epub
- htmlzip
# Optionally declare the Python requirements required to build your docs
python:
install:
- requirements: docs/source/requirements.txt
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at luke_wilson@dell.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
================================================
FILE: CONTRIBUTING.md
================================================
# CONTRIBUTE
## Introduction
We encourage everyone to help us improve Omnia by contributing to the project. Contributions can be as small as documentation updates or adding example use cases, to adding commenting or properly styling code segments, to full feature contributions. We ask that contributors follow our established guidelines for contributing to the project.
These guidelines are based on the [pravega project](https://github.com/pravega/pravega/).
This document will evolve as the project matures. Please be sure to regularly refer back in order to stay in-line with contribution guidelines.
## How to Contribute to Omnia
Contributions to Omnia are made through [Pull Requests (PRs)](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests). To make a pull request against Omnia, use the following steps:
1. **Create an issue:** [Create an issue](https://help.github.com/en/github/managing-your-work-on-github/creating-an-issue) and describe what you are trying to solve. It does not matter whether it is a new feature, a bug fix, or an improvement. All pull requests need to be associated to an issue. When creating an issue, be sure to use the appropriate issue template (bug fix or feature request) and complete all of the required fields. If your issue does not fit in either a bug fix or feature request, then create a blank issue and be sure to including the following information:
* **Problem description:** Describe what you believe needs to be addressed
* **Problem location:** In which file and at what line does this issue occur?
* **Suggested resolution:** How do you intend to resolve the problem?
2. **Create a personal fork:** All work on Omnia should be done in a [fork of the repository](https://help.github.com/en/github/getting-started-with-github/fork-a-repo). Only the maintiners are allowed to commit directly to the project repository.
3. **Issue branch:** [Create a new branch](https://help.github.com/en/desktop/contributing-to-projects/creating-a-branch-for-your-work) on your fork of the repository. All contributions should be branched from `devel`. Use `git checkout devel; git checkout -b <new-branch-name>` to create the new branch.
* **Branch name:** The branch name should be based on the issue you are addressing. Use the following pattern to create your new branch name: issue-number, e.g., issue-1023.
4. **Commit changes to the issue branch:** It is important to commit your changes to the issue branch. Commit messages should be descriptive of the changes being made.
* **Signing your commits:** All commits to Omnia need to be signed with the [Developer Certificate of Origin (DCO)](https://developercertificate.org/) in order to certify that the contributor has permission to contribute the code. In order to sign commits, use either the `--signoff` or `-s` option to `git commit`:
```
git commit --signoff
git commit -s
```
Ensure you have your user name and e-mail set. The `--signoff | -s` option will use the configured user name and e-mail, so it is important to configure it before the first time you commit. Check the following references:
* [Setting up your github user name](https://help.github.com/articles/setting-your-username-in-git/)
* [Setting up your e-mail address](https://help.github.com/articles/setting-your-commit-email-address-in-git/)
5. **Push the changes to your personal repo:** To be able to create a pull request, push the changes to origin: `git push origin <new-branch-name>`. Here I assume that `origin` is your personal repo, e.g., `lwilson/omnia.git`.
6. **Create a pull request:** [Create a pull request](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request) with a title following this format Issue ###: Description (_i.e., Issue 1023: Reformat testutils_). It is important that you do a good job with the description to make the job of the code reviewer easier. A good description not only reduces review time, but also reduces the probability of a misunderstanding with the pull request.
* **Important:** When preparing a pull request it is important to stay up-to-date with the project repository. We recommend that you rebase against the upstream repo _frequently_. To do this, use the following commands:
```
git pull --rebase upstream devel #upstream is dellhpc/omnia
git push --force origin <pr-branch-name> #origin is your fork of the repository (e.g., <github_user_name>/omnia.git)
```
* **PR Description:** Be sure to fully describe the pull request. Ideally, your PR description will contain:
1. A description of the main point (_e.g., why was this PR made?_),
2. Linking text to the related issue (_e.g., This PR closes issue #<issue_number>_),
3. How the changes solves the problem, and
4. How to verify that the changes work correctly.
## Omnia Branches and Contribution Flow
The diagram below describes the contribution flow. Omnia has two lifetime branches: `devel` and `release`. The `release` branch is reserved for releases and their associated tags. The `devel` branch is where all development work occurs. The `devel` branch is also the default branch for the project.

## Developer Certificate of Origin
Contributions to Omnia must be signed with the [Developer Certificate of Origin (DCO)](https://developercertificate.org/):
```
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
1 Letterman Drive
Suite D4700
San Francisco, CA, 94129
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
```
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2020 Dell Inc. or its subsidiaries. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
<img src="docs/logos/omnia-logo-transparent.png" width="500px">
<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
<!-- DO NOT ADD A BADGE -->
<!-- ALL-CONTRIBUTORS-BADGE:END -->
   
   
 [<img src="https://img.shields.io/badge/slack-dell-blue.svg?logo=slack">](https://app.slack.com/client/TH80K68HY/C018L5109PW)
#### Ansible playbook-based deployment of Slurm and Kubernetes on servers running on Linux OS.
Omnia is an open-source deployment toolkit that helps customers efficiently manage compute servers, storage, and networking within complex environments.
Omnia utilizes Ansible playbook-based deployment to automate OS provisioning, driver installation and configuration, deployment of schedulers like Slurm and Kubernetes, as well as optimization libraries, machine learning frameworks/platforms and AI models.
## Omnia Documentation
Omnia 1.x Documentation is hosted on [Read The Docs 1.x](https://omnia-doc.readthedocs.io/en/latest/index.html).
Omnia 2.x Documentation is hosted on [Read The Docs 2.x](https://omnia.readthedocs.io/en/latest/index.html).
Current Status: 
## Licensing
Omnia is made available under the [Apache 2.0 license](https://opensource.org/licenses/Apache-2.0)
## Contributing To Omnia
We encourage everyone to help us improve Omnia by contributing to the project. Contributions can be as small as documentation updates or adding example use cases, to adding commenting and properly styling code segments all the way up to full feature contributions. We ask that contributors follow our established [guidelines](https://omnia.readthedocs.io/en/latest/Contributing/index.html) for contributing to the project.
## Omnia Community Members:
<img src="docs/logos/delltech.jpg" height="80px" alt="Dell Technologies">
<img src="https://upload.wikimedia.org/wikipedia/commons/0/0e/Intel_logo_%282020%2C_light_blue%29.svg" height="50px" alt="Intel Corporation">
<img src="docs/logos/pisa.png" height="60px" alt="Universita di Pisa"> <img src="https://user-images.githubusercontent.com/83095575/117071024-64956c80-ace3-11eb-9d90-2dac7daef11c.png" height="50px" alt="Arizona State University"> <img src="https://images.squarespace-cdn.com/content/v1/660f1a48587dbb2769709a33/9ac5520f-a308-4751-80f4-415d07a23473/VIZIAS+Blue.png" height="50px" alt="Vizias">
<img src="https://cdn.prod.website-files.com/5ab1342d0735aa53115fca62/5d00133d02bbf495113e8bca_Liqid-Composable-Infrastructure-Blue-Wave-Black-Logotype.svg" height="50px" alt="LIQID Inc."> <img src="https://user-images.githubusercontent.com/5414112/153955170-0a4b199a-54f0-42af-939c-03eac76881c0.png" height="60px" alt="Texas Tech University">
## Contributors
Our thanks go to everyone who makes Omnia possible ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start -->
<!-- markdownlint-disable -->
<table>
<tbody>
<tr>
<td align="center" valign="top" width="14.28%"><a href="http://johnlockman.com"><img src="https://avatars.githubusercontent.com/u/912987?v=4?s=100" width="100px;" alt="John Lockman"/><br /><sub><b>John Lockman</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=j0hnL" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=j0hnL" title="Code">💻</a> <a href="#blog-j0hnL" title="Blogposts">📝</a> <a href="#ideas-j0hnL" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-j0hnL" title="Maintenance">🚧</a> <a href="#mentoring-j0hnL" title="Mentoring">🧑🏫</a> <a href="#design-j0hnL" title="Design">🎨</a> <a href="https://github.com/dell/omnia/pulls?q=is%3Apr+reviewed-by%3Aj0hnL" title="Reviewed Pull Requests">👀</a> <a href="#talk-j0hnL" title="Talks">📢</a> <a href="https://github.com/dell/omnia/issues?q=author%3Aj0hnL" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lwilson"><img src="https://avatars.githubusercontent.com/u/1236922?v=4?s=100" width="100px;" alt="Lucas A. Wilson"/><br /><sub><b>Lucas A. Wilson</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=lwilson" title="Code">💻</a> <a href="#design-lwilson" title="Design">🎨</a> <a href="#maintenance-lwilson" title="Maintenance">🚧</a> <a href="#ideas-lwilson" title="Ideas, Planning, & Feedback">🤔</a> <a href="#blog-lwilson" title="Blogposts">📝</a> <a href="https://github.com/dell/omnia/commits?author=lwilson" title="Documentation">📖</a> <a href="#mentoring-lwilson" title="Mentoring">🧑🏫</a> <a href="#projectManagement-lwilson" title="Project Management">📆</a> <a href="https://github.com/dell/omnia/pulls?q=is%3Apr+reviewed-by%3Alwilson" title="Reviewed Pull Requests">👀</a> <a href="#talk-lwilson" title="Talks">📢</a> <a href="https://github.com/dell/omnia/issues?q=author%3Alwilson" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sujit-jadhav"><img src="https://avatars.githubusercontent.com/u/73123831?v=4?s=100" width="100px;" alt="Sujit Jadhav"/><br /><sub><b>Sujit Jadhav</b></sub></a><br /><a href="#ideas-sujit-jadhav" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/dell/omnia/commits?author=sujit-jadhav" title="Documentation">📖</a> <a href="https://github.com/dell/omnia/commits?author=sujit-jadhav" title="Code">💻</a> <a href="https://github.com/dell/omnia/pulls?q=is%3Apr+reviewed-by%3Asujit-jadhav" title="Reviewed Pull Requests">👀</a> <a href="#maintenance-sujit-jadhav" title="Maintenance">🚧</a> <a href="#projectManagement-sujit-jadhav" title="Project Management">📆</a> <a href="#mentoring-sujit-jadhav" title="Mentoring">🧑🏫</a> <a href="#talk-sujit-jadhav" title="Talks">📢</a> <a href="#question-sujit-jadhav" title="Answering Questions">💬</a> <a href="https://github.com/dell/omnia/commits?author=sujit-jadhav" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3Asujit-jadhav" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DeepikaKrishnaiah"><img src="https://avatars.githubusercontent.com/u/73213880?v=4?s=100" width="100px;" alt="Deepika K"/><br /><sub><b>Deepika K</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=DeepikaKrishnaiah" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=DeepikaKrishnaiah" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3ADeepikaKrishnaiah" title="Bug reports">🐛</a> <a href="#security-DeepikaKrishnaiah" title="Security">🛡️</a> <a href="#talk-DeepikaKrishnaiah" title="Talks">📢</a> <a href="https://github.com/dell/omnia/pulls?q=is%3Apr+reviewed-by%3ADeepikaKrishnaiah" title="Reviewed Pull Requests">👀</a> <a href="#mentoring-DeepikaKrishnaiah" title="Mentoring">🧑🏫</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abhishek-sa1"><img src="https://avatars.githubusercontent.com/u/94038029?v=4?s=100" width="100px;" alt="Abhishek SA"/><br /><sub><b>Abhishek SA</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=abhishek-sa1" title="Code">💻</a> <a href="https://github.com/dell/omnia/issues?q=author%3Aabhishek-sa1" title="Bug reports">🐛</a> <a href="https://github.com/dell/omnia/commits?author=abhishek-sa1" title="Documentation">📖</a> <a href="https://github.com/dell/omnia/commits?author=abhishek-sa1" title="Tests">⚠️</a> <a href="#maintenance-abhishek-sa1" title="Maintenance">🚧</a> <a href="#talk-abhishek-sa1" title="Talks">📢</a> <a href="#mentoring-abhishek-sa1" title="Mentoring">🧑🏫</a> <a href="https://github.com/dell/omnia/pulls?q=is%3Apr+reviewed-by%3Aabhishek-sa1" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sakshiarora13"><img src="https://avatars.githubusercontent.com/u/73195862?v=4?s=100" width="100px;" alt="Sakshi Arora"/><br /><sub><b>Sakshi Arora</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=sakshiarora13" title="Code">💻</a> <a href="https://github.com/dell/omnia/issues?q=author%3Asakshiarora13" title="Bug reports">🐛</a> <a href="#talk-sakshiarora13" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Shubhangi-dell"><img src="https://avatars.githubusercontent.com/u/72869337?v=4?s=100" width="100px;" alt="Shubhangi Srivastava"/><br /><sub><b>Shubhangi Srivastava</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Shubhangi-dell" title="Code">💻</a> <a href="#maintenance-Shubhangi-dell" title="Maintenance">🚧</a> <a href="https://github.com/dell/omnia/issues?q=author%3AShubhangi-dell" title="Bug reports">🐛</a> <a href="#talk-Shubhangi-dell" title="Talks">📢</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cgoveas"><img src="https://avatars.githubusercontent.com/u/88071888?v=4?s=100" width="100px;" alt="Cassey Goveas"/><br /><sub><b>Cassey Goveas</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=cgoveas" title="Documentation">📖</a> <a href="https://github.com/dell/omnia/issues?q=author%3Acgoveas" title="Bug reports">🐛</a> <a href="#maintenance-cgoveas" title="Maintenance">🚧</a> <a href="#talk-cgoveas" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Khushboodholi"><img src="https://avatars.githubusercontent.com/u/12014935?v=4?s=100" width="100px;" alt="Khushboo Dholi"/><br /><sub><b>Khushboo Dholi</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Khushboodholi" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/prasoon-sinha"><img src="https://avatars.githubusercontent.com/u/5362594?v=4?s=100" width="100px;" alt="Prasoon Kumar Sinha"/><br /><sub><b>Prasoon Kumar Sinha</b></sub></a><br /><a href="#ideas-prasoon-sinha" title="Ideas, Planning, & Feedback">🤔</a> <a href="#talk-prasoon-sinha" title="Talks">📢</a> <a href="#mentoring-prasoon-sinha" title="Mentoring">🧑🏫</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SajithDas"><img src="https://avatars.githubusercontent.com/u/78676226?v=4?s=100" width="100px;" alt="SajithDas"/><br /><sub><b>SajithDas</b></sub></a><br /><a href="#projectManagement-SajithDas" title="Project Management">📆</a> <a href="#talk-SajithDas" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/i3igpete"><img src="https://avatars.githubusercontent.com/u/33877827?v=4?s=100" width="100px;" alt="i3igpete"/><br /><sub><b>i3igpete</b></sub></a><br /><a href="#business-i3igpete" title="Business development">💼</a> <a href="#talk-i3igpete" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/renzo-granados"><img src="https://avatars.githubusercontent.com/u/83035817?v=4?s=100" width="100px;" alt="renzo-granados"/><br /><sub><b>renzo-granados</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Arenzo-granados" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Aditya-DP"><img src="https://avatars.githubusercontent.com/u/115771515?v=4?s=100" width="100px;" alt="Aditya-DP"/><br /><sub><b>Aditya-DP</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Aditya-DP" title="Code">💻</a> <a href="https://github.com/dell/omnia/issues?q=author%3AAditya-DP" title="Bug reports">🐛</a> <a href="https://github.com/dell/omnia/commits?author=Aditya-DP" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Katakam-Rakesh"><img src="https://avatars.githubusercontent.com/u/125246792?v=4?s=100" width="100px;" alt="Katakam Rakesh Naga Sai"/><br /><sub><b>Katakam Rakesh Naga Sai</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Katakam-Rakesh" title="Code">💻</a> <a href="https://github.com/dell/omnia/issues?q=author%3AKatakam-Rakesh" title="Bug reports">🐛</a> <a href="https://github.com/dell/omnia/commits?author=Katakam-Rakesh" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/araji"><img src="https://avatars.githubusercontent.com/u/216020?v=4?s=100" width="100px;" alt="araji"/><br /><sub><b>araji</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=araji" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://mike.renf.ro/blog/"><img src="https://avatars.githubusercontent.com/u/1451881?v=4?s=100" width="100px;" alt="Mike Renfro"/><br /><sub><b>Mike Renfro</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=mikerenfro" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/leereyno-asu"><img src="https://avatars.githubusercontent.com/u/81774548?v=4?s=100" width="100px;" alt="Lee Reynolds"/><br /><sub><b>Lee Reynolds</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=leereyno-asu" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=leereyno-asu" title="Documentation">📖</a> <a href="#tutorial-leereyno-asu" title="Tutorials">✅</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/blesson-james"><img src="https://avatars.githubusercontent.com/u/72782936?v=4?s=100" width="100px;" alt="blesson-james"/><br /><sub><b>blesson-james</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=blesson-james" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=blesson-james" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3Ablesson-james" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/avinashvishwanath"><img src="https://avatars.githubusercontent.com/u/77823538?v=4?s=100" width="100px;" alt="avinashvishwanath"/><br /><sub><b>avinashvishwanath</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=avinashvishwanath" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abhishek-s-a"><img src="https://avatars.githubusercontent.com/u/73212230?v=4?s=100" width="100px;" alt="abhishek-s-a"/><br /><sub><b>abhishek-s-a</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=abhishek-s-a" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=abhishek-s-a" title="Documentation">📖</a> <a href="https://github.com/dell/omnia/commits?author=abhishek-s-a" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Franklin-Johnson"><img src="https://avatars.githubusercontent.com/u/84760103?v=4?s=100" width="100px;" alt="Franklin-Johnson"/><br /><sub><b>Franklin-Johnson</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Franklin-Johnson" title="Code">💻</a> <a href="#blog-Franklin-Johnson" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/teiland7"><img src="https://avatars.githubusercontent.com/u/85184708?v=4?s=100" width="100px;" alt="teiland7"/><br /><sub><b>teiland7</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=teiland7" title="Code">💻</a> <a href="#blog-teiland7" title="Blogposts">📝</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VishnupriyaKrish"><img src="https://avatars.githubusercontent.com/u/72784834?v=4?s=100" width="100px;" alt="VishnupriyaKrish"/><br /><sub><b>VishnupriyaKrish</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=VishnupriyaKrish" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=VishnupriyaKrish" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://rb.gy/ndlbhv"><img src="https://avatars.githubusercontent.com/u/48859631?v=4?s=100" width="100px;" alt="Ishita Datta"/><br /><sub><b>Ishita Datta</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=ishitadatta" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/asu-wdizon"><img src="https://avatars.githubusercontent.com/u/81772355?v=4?s=100" width="100px;" alt="William Dizon"/><br /><sub><b>William Dizon</b></sub></a><br /><a href="#tutorial-asu-wdizon" title="Tutorials">✅</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bssitton-BU"><img src="https://avatars.githubusercontent.com/u/14130464?v=4?s=100" width="100px;" alt="bssitton-BU"/><br /><sub><b>bssitton-BU</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Abssitton-BU" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hearnsj"><img src="https://avatars.githubusercontent.com/u/19259589?v=4?s=100" width="100px;" alt="John Hearns"/><br /><sub><b>John Hearns</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Ahearnsj" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kbuggenhout"><img src="https://avatars.githubusercontent.com/u/30471699?v=4?s=100" width="100px;" alt="kris buggenhout"/><br /><sub><b>kris buggenhout</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Akbuggenhout" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jiad-vmware"><img src="https://avatars.githubusercontent.com/u/68653329?v=4?s=100" width="100px;" alt="jiad-vmware"/><br /><sub><b>jiad-vmware</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Ajiad-vmware" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://jlec.de"><img src="https://avatars.githubusercontent.com/u/79732?v=4?s=100" width="100px;" alt="Justin Lecher"/><br /><sub><b>Justin Lecher</b></sub></a><br /><a href="#ideas-jlec" title="Ideas, Planning, & Feedback">🤔</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kavyabr23"><img src="https://avatars.githubusercontent.com/u/90390587?v=4?s=100" width="100px;" alt="Kavyabr23"/><br /><sub><b>Kavyabr23</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Kavyabr23" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Kavyabr23" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vedaprakashanp"><img src="https://avatars.githubusercontent.com/u/90596073?v=4?s=100" width="100px;" alt="vedaprakashanp"/><br /><sub><b>vedaprakashanp</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=vedaprakashanp" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=vedaprakashanp" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Bhagyashree-shetty"><img src="https://avatars.githubusercontent.com/u/90620926?v=4?s=100" width="100px;" alt="Bhagyashree-shetty"/><br /><sub><b>Bhagyashree-shetty</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Bhagyashree-shetty" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=Bhagyashree-shetty" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nihalranjan-hpc"><img src="https://avatars.githubusercontent.com/u/84398828?v=4?s=100" width="100px;" alt="Nihal Ranjan"/><br /><sub><b>Nihal Ranjan</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=nihalranjan-hpc" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=nihalranjan-hpc" title="Code">💻</a> <a href="#talk-nihalranjan-hpc" title="Talks">📢</a> <a href="https://github.com/dell/omnia/issues?q=author%3Anihalranjan-hpc" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ptrinesh"><img src="https://avatars.githubusercontent.com/u/73214211?v=4?s=100" width="100px;" alt="ptrinesh"/><br /><sub><b>ptrinesh</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=ptrinesh" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://bandism.net/"><img src="https://avatars.githubusercontent.com/u/22633385?v=4?s=100" width="100px;" alt="Ikko Ashimine"/><br /><sub><b>Ikko Ashimine</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=eltociear" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Lakshmi-Patneedi"><img src="https://avatars.githubusercontent.com/u/94051091?v=4?s=100" width="100px;" alt="Lakshmi-Patneedi"/><br /><sub><b>Lakshmi-Patneedi</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Lakshmi-Patneedi" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Artlands"><img src="https://avatars.githubusercontent.com/u/31781106?v=4?s=100" width="100px;" alt="Jie Li"/><br /><sub><b>Jie Li</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Artlands" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/githubyongchen"><img src="https://avatars.githubusercontent.com/u/5414112?v=4?s=100" width="100px;" alt="Yong Chen"/><br /><sub><b>Yong Chen</b></sub></a><br /><a href="#design-githubyongchen" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="http://www.myweb.ttu.edu/ngu00336/"><img src="https://avatars.githubusercontent.com/u/18387748?v=4?s=100" width="100px;" alt="nvtngan"/><br /><sub><b>nvtngan</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Zipexpo" title="Code">💻</a> <a href="#plugin-Zipexpo" title="Plugin/utility libraries">🔌</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/tamilarasansubrama1"><img src="https://avatars.githubusercontent.com/u/100588942?v=4?s=100" width="100px;" alt="tamilarasansubrama1"/><br /><sub><b>tamilarasansubrama1</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=tamilarasansubrama1" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=tamilarasansubrama1" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shemasr"><img src="https://avatars.githubusercontent.com/u/100141664?v=4?s=100" width="100px;" alt="shemasr"/><br /><sub><b>shemasr</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Ashemasr" title="Bug reports">🐛</a> <a href="https://github.com/dell/omnia/commits?author=shemasr" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=shemasr" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/naresh3774"><img src="https://avatars.githubusercontent.com/u/101410892?v=4?s=100" width="100px;" alt="Naresh Sharma"/><br /><sub><b>Naresh Sharma</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Anaresh3774" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JonHass"><img src="https://avatars.githubusercontent.com/u/6976486?v=4?s=100" width="100px;" alt="Jon Hass"/><br /><sub><b>Jon Hass</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=JonHass" title="Documentation">📖</a> <a href="#design-JonHass" title="Design">🎨</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/KalyanKonatham"><img src="https://avatars.githubusercontent.com/u/101596828?v=4?s=100" width="100px;" alt="KalyanKonatham"/><br /><sub><b>KalyanKonatham</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3AKalyanKonatham" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rahulakolkar"><img src="https://avatars.githubusercontent.com/u/22768133?v=4?s=100" width="100px;" alt="Rahul Akolkar"/><br /><sub><b>Rahul Akolkar</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Arahulakolkar" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/srinandini-karumuri"><img src="https://avatars.githubusercontent.com/u/104345504?v=4?s=100" width="100px;" alt="srinandini-karumuri"/><br /><sub><b>srinandini-karumuri</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=srinandini-karumuri" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Rishabhm47"><img src="https://avatars.githubusercontent.com/u/106973551?v=4?s=100" width="100px;" alt="Rishabhm47"/><br /><sub><b>Rishabhm47</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Rishabhm47" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=Rishabhm47" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vaishakh-pm"><img src="https://avatars.githubusercontent.com/u/104622022?v=4?s=100" width="100px;" alt="vaishakh-pm"/><br /><sub><b>vaishakh-pm</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=vaishakh-pm" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=vaishakh-pm" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shridhar-sharma"><img src="https://avatars.githubusercontent.com/u/104621992?v=4?s=100" width="100px;" alt="shridhar-sharma"/><br /><sub><b>shridhar-sharma</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=shridhar-sharma" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=shridhar-sharma" title="Code">💻</a> <a href="https://github.com/dell/omnia/issues?q=author%3Ashridhar-sharma" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JayaDayyala"><img src="https://avatars.githubusercontent.com/u/108455487?v=4?s=100" width="100px;" alt="Jaya.Dayyala"/><br /><sub><b>Jaya.Dayyala</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=JayaDayyala" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=JayaDayyala" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/fasongan"><img src="https://avatars.githubusercontent.com/u/16153657?v=4?s=100" width="100px;" alt="fasongan"/><br /><sub><b>fasongan</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=fasongan" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/rahuldell21"><img src="https://avatars.githubusercontent.com/u/117621375?v=4?s=100" width="100px;" alt="rahuldell21"/><br /><sub><b>rahuldell21</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=rahuldell21" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=rahuldell21" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/diptiman12"><img src="https://avatars.githubusercontent.com/u/117987073?v=4?s=100" width="100px;" alt="diptiman12"/><br /><sub><b>diptiman12</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=diptiman12" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SupriyaParthasarathy"><img src="https://avatars.githubusercontent.com/u/139955493?v=4?s=100" width="100px;" alt="Supriya Parthasarathy"/><br /><sub><b>Supriya Parthasarathy</b></sub></a><br /><a href="#projectManagement-SupriyaParthasarathy" title="Project Management">📆</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Subhankar-Adak"><img src="https://avatars.githubusercontent.com/u/140381176?v=4?s=100" width="100px;" alt="Subhankar-Adak"/><br /><sub><b>Subhankar-Adak</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Subhankar-Adak" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/priti-parate"><img src="https://avatars.githubusercontent.com/u/140157516?v=4?s=100" width="100px;" alt="priti-parate"/><br /><sub><b>priti-parate</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=priti-parate" title="Code">💻</a> <a href="https://github.com/dell/omnia/issues?q=author%3Apriti-parate" title="Bug reports">🐛</a> <a href="#talk-priti-parate" title="Talks">📢</a> <a href="#mentoring-priti-parate" title="Mentoring">🧑🏫</a> <a href="https://github.com/dell/omnia/pulls?q=is%3Apr+reviewed-by%3Apriti-parate" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/lavanya5899"><img src="https://avatars.githubusercontent.com/u/140372459?v=4?s=100" width="100px;" alt="Lavanya Adhikari"/><br /><sub><b>Lavanya Adhikari</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=lavanya5899" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/preeti-thankachan"><img src="https://avatars.githubusercontent.com/u/141405483?v=4?s=100" width="100px;" alt="preeti-thankachan"/><br /><sub><b>preeti-thankachan</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=preeti-thankachan" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3Apreeti-thankachan" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/glimchb"><img src="https://avatars.githubusercontent.com/u/36732377?v=4?s=100" width="100px;" alt="Boris Glimcher"/><br /><sub><b>Boris Glimcher</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=glimchb" title="Code">💻</a> <a href="#maintenance-glimchb" title="Maintenance">🚧</a> <a href="https://github.com/dell/omnia/commits?author=glimchb" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MoshiBin"><img src="https://avatars.githubusercontent.com/u/1297388?v=4?s=100" width="100px;" alt="Moshi Binyamini"/><br /><sub><b>Moshi Binyamini</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=MoshiBin" title="Code">💻</a> <a href="#maintenance-MoshiBin" title="Maintenance">🚧</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/paul-tp"><img src="https://avatars.githubusercontent.com/u/169248855?v=4?s=100" width="100px;" alt="paul-tp"/><br /><sub><b>paul-tp</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=paul-tp" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Milisha-Gupta"><img src="https://avatars.githubusercontent.com/u/52577117?v=4?s=100" width="100px;" alt="Milisha Gupta"/><br /><sub><b>Milisha Gupta</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Milisha-Gupta" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Milisha-Gupta" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sakshi-singla-1735"><img src="https://avatars.githubusercontent.com/u/169248923?v=4?s=100" width="100px;" alt="sakshi-singla-1735"/><br /><sub><b>sakshi-singla-1735</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=sakshi-singla-1735" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sankeerna-S"><img src="https://avatars.githubusercontent.com/u/169250907?v=4?s=100" width="100px;" alt="Sankeerna-S"/><br /><sub><b>Sankeerna-S</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Sankeerna-S" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AjayKadoula"><img src="https://avatars.githubusercontent.com/u/38178003?v=4?s=100" width="100px;" alt="Ajay Kadoula"/><br /><sub><b>Ajay Kadoula</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=AjayKadoula" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShubhamKumar1996"><img src="https://avatars.githubusercontent.com/u/51914136?v=4?s=100" width="100px;" alt="ShubhamKumar1996"/><br /><sub><b>ShubhamKumar1996</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=ShubhamKumar1996" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SanthoshT2001"><img src="https://avatars.githubusercontent.com/u/93521129?v=4?s=100" width="100px;" alt="SanthoshT2001"/><br /><sub><b>SanthoshT2001</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=SanthoshT2001" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kratika-P"><img src="https://avatars.githubusercontent.com/u/169249531?v=4?s=100" width="100px;" alt="Kratika-P"/><br /><sub><b>Kratika-P</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Kratika-P" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Kratika-P" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sbasu96"><img src="https://avatars.githubusercontent.com/u/162503707?v=4?s=100" width="100px;" alt="Soumyadeep Basu"/><br /><sub><b>Soumyadeep Basu</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=sbasu96" title="Documentation">📖</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VrindaMarwah"><img src="https://avatars.githubusercontent.com/u/169263232?v=4?s=100" width="100px;" alt="VrindaMarwah"/><br /><sub><b>VrindaMarwah</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=VrindaMarwah" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=VrindaMarwah" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Kevin-Kodama"><img src="https://avatars.githubusercontent.com/u/163032741?v=4?s=100" width="100px;" alt="Kevin-Kodama"/><br /><sub><b>Kevin-Kodama</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Kevin-Kodama" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/balajikumaran-c-s"><img src="https://avatars.githubusercontent.com/u/169248535?v=4?s=100" width="100px;" alt="balajikumaran-c-s"/><br /><sub><b>balajikumaran-c-s</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=balajikumaran-c-s" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=balajikumaran-c-s" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3Abalajikumaran-c-s" title="Bug reports">🐛</a> <a href="https://github.com/dell/omnia/commits?author=balajikumaran-c-s" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Amogha-Reddy"><img src="https://avatars.githubusercontent.com/u/140503786?v=4?s=100" width="100px;" alt="Amogha-Reddy"/><br /><sub><b>Amogha-Reddy</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Amogha-Reddy" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3AAmogha-Reddy" title="Bug reports">🐛</a> <a href="https://github.com/dell/omnia/commits?author=Amogha-Reddy" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/krsandeepit"><img src="https://avatars.githubusercontent.com/u/162142649?v=4?s=100" width="100px;" alt="krsandeepit"/><br /><sub><b>krsandeepit</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=krsandeepit" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3Akrsandeepit" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Yash-shetty1"><img src="https://avatars.githubusercontent.com/u/169258785?v=4?s=100" width="100px;" alt="Yash-shetty1"/><br /><sub><b>Yash-shetty1</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Yash-shetty1" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3AYash-shetty1" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/nethramg"><img src="https://avatars.githubusercontent.com/u/146437298?v=4?s=100" width="100px;" alt="Nethravathi M G"/><br /><sub><b>Nethravathi M G</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=nethramg" title="Code">💻</a> <a href="#projectManagement-nethramg" title="Project Management">📆</a> <a href="#talk-nethramg" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AbdulRijwan"><img src="https://avatars.githubusercontent.com/u/170396052?v=4?s=100" width="100px;" alt="Abdul Rijwan"/><br /><sub><b>Abdul Rijwan</b></sub></a><br /><a href="#infra-AbdulRijwan" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/dweineha"><img src="https://avatars.githubusercontent.com/u/42206500?v=4?s=100" width="100px;" alt="David Weinehall"/><br /><sub><b>David Weinehall</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=dweineha" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VenkateswaraVatam"><img src="https://avatars.githubusercontent.com/u/153504816?v=4?s=100" width="100px;" alt="Venkateswara Vatam"/><br /><sub><b>Venkateswara Vatam</b></sub></a><br /><a href="#projectManagement-VenkateswaraVatam" title="Project Management">📆</a> <a href="#talk-VenkateswaraVatam" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/snarthan"><img src="https://avatars.githubusercontent.com/u/171680285?v=4?s=100" width="100px;" alt="Narthan S"/><br /><sub><b>Narthan S</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=snarthan" title="Code">💻</a> <a href="#mentoring-snarthan" title="Mentoring">🧑🏫</a> <a href="https://github.com/dell/omnia/pulls?q=is%3Apr+reviewed-by%3Asnarthan" title="Reviewed Pull Requests">👀</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/suman-square"><img src="https://avatars.githubusercontent.com/u/178771071?v=4?s=100" width="100px;" alt="Suman S"/><br /><sub><b>Suman S</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=suman-square" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gurump21"><img src="https://avatars.githubusercontent.com/u/189354746?v=4?s=100" width="100px;" alt="Prabhu Gurumurthy"/><br /><sub><b>Prabhu Gurumurthy</b></sub></a><br /><a href="https://github.com/dell/omnia/issues?q=author%3Agurump21" title="Bug reports">🐛</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Nagachandan-P"><img src="https://avatars.githubusercontent.com/Nagachandan-P?s=100" width="100px;" alt="Nagachandan P"/><br /><sub><b>Nagachandan P</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Nagachandan-P" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pranavkumar74980"><img src="https://avatars.githubusercontent.com/pranavkumar74980?s=100" width="100px;" alt="Pranav kumar"/><br /><sub><b>Pranav kumar</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=pranavkumar74980" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=pranavkumar74980" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aditi-sharma27"><img src="https://avatars.githubusercontent.com/aditi-sharma27?s=100" width="100px;" alt="Aditi Sharma"/><br /><sub><b>Aditi Sharma</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=aditi-sharma27" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Rohith-Ravut"><img src="https://avatars.githubusercontent.com/u/196186062?v=4?s=100" width="100px;" alt="Rohith-Ravut"/><br /><sub><b>Rohith-Ravut</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Rohith-Ravut" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/issues?q=author%3ARohith-Ravut" title="Bug reports">🐛</a> <a href="https://github.com/dell/omnia/commits?author=Rohith-Ravut" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RvishankarOMnia"><img src="https://avatars.githubusercontent.com/u/186007052?v=4?s=100" width="100px;" alt="RvishankarOMnia"/><br /><sub><b>RvishankarOMnia</b></sub></a><br /><a href="#ideas-RvishankarOMnia" title="Ideas, Planning, & Feedback">🤔</a> <a href="#talk-RvishankarOMnia" title="Talks">📢</a> <a href="#mentoring-RvishankarOMnia" title="Mentoring">🧑🏫</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jagadeeshnv"><img src="https://avatars.githubusercontent.com/u/39791839?v=4?s=100" width="100px;" alt="Jagadeesh N V"/><br /><sub><b>Jagadeesh N V</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=jagadeeshnv" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sourabh-sahu1"><img src="https://avatars.githubusercontent.com/u/196315600?v=4?s=100" width="100px;" alt="sourabh-sahu1"/><br /><sub><b>sourabh-sahu1</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=sourabh-sahu1" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ghandoura"><img src="https://avatars.githubusercontent.com/u/87424850?v=4?s=100" width="100px;" alt="Adam Ghandoura"/><br /><sub><b>Adam Ghandoura</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=ghandoura" title="Tests">⚠️</a> <a href="https://github.com/dell/omnia/commits?author=ghandoura" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Coleman-Trader"><img src="https://avatars.githubusercontent.com/u/196217244?v=4?s=100" width="100px;" alt="Coleman-Trader"/><br /><sub><b>Coleman-Trader</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Coleman-Trader" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/youngjae-hur7"><img src="https://avatars.githubusercontent.com/u/196205015?v=4?s=100" width="100px;" alt="youngjae-hur7"/><br /><sub><b>youngjae-hur7</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=youngjae-hur7" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Grace-Chang2"><img src="https://avatars.githubusercontent.com/u/196347461?v=4?s=100" width="100px;" alt="Grace-Chang2"/><br /><sub><b>Grace-Chang2</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Grace-Chang2" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Cypher-Miller"><img src="https://avatars.githubusercontent.com/u/123703182?v=4?s=100" width="100px;" alt="Cypher-Miller"/><br /><sub><b>Cypher-Miller</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Cypher-Miller" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vvittal100"><img src="https://avatars.githubusercontent.com/u/202238575?v=4?s=100" width="100px;" alt="vvittal100"/><br /><sub><b>vvittal100</b></sub></a><br /><a href="#projectManagement-vvittal100" title="Project Management">📆</a> <a href="#talk-vvittal100" title="Talks">📢</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kksenthilkumar"><img src="https://avatars.githubusercontent.com/u/202253529?v=4?s=100" width="100px;" alt="kksenthilkumar"/><br /><sub><b>kksenthilkumar</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=kksenthilkumar" title="Tests">⚠️</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pullan1"><img src="https://avatars.githubusercontent.com/u/173048662?v=4?s=100" width="100px;" alt="pullan1"/><br /><sub><b>pullan1</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=pullan1" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harshal2799"><img src="https://avatars.githubusercontent.com/u/202241497?v=4?s=100" width="100px;" alt="harshal2799"/><br /><sub><b>harshal2799</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=harshal2799" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sindhu-Ranganath"><img src="https://avatars.githubusercontent.com/u/208789597?v=4?s=100" width="100px;" alt="Sindhu-Ranganath"/><br /><sub><b>Sindhu-Ranganath</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Sindhu-Ranganath" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Manasa-Hemmanur"><img src="https://avatars.githubusercontent.com/u/205002578?v=4?s=100" width="100px;" alt="Manasa H"/><br /><sub><b>Manasa H</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Manasa-Hemmanur" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Manasa-Hemmanur" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Diya-Sumod"><img src="https://avatars.githubusercontent.com/u/225136254?v=4?s=100" width="100px;" alt="Diya-Sumod"/><br /><sub><b>Diya-Sumod</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Diya-Sumod" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Diya-Sumod" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Tanmay-Raj1004"><img src="https://avatars.githubusercontent.com/u/227950687?v=4?s=100" width="100px;" alt="Tanmay-Raj1004"/><br /><sub><b>Tanmay-Raj1004</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Tanmay-Raj1004" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Tanmay-Raj1004" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Anurag-Bijalwan"><img src="https://avatars.githubusercontent.com/u/218922922?v=4?s=100" width="100px;" alt="Anurag-Bijalwan"/><br /><sub><b>Anurag-Bijalwan</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Anurag-Bijalwan" title="Code">💻</a></td>
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SOWJANYAJAGADISH123"><img src="https://avatars.githubusercontent.com/u/257989626?v=4?s=100" width="100px;" alt="SOWJANYAJAGADISH123"/><br /><sub><b>SOWJANYAJAGADISH123</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=SOWJANYAJAGADISH123" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mithileshreddy04"><img src="https://avatars.githubusercontent.com/u/258000200?v=4?s=100" width="100px;" alt="mithileshreddy04"/><br /><sub><b>mithileshreddy04</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=mithileshreddy04" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Rajeshkumar-s2"><img src="https://avatars.githubusercontent.com/u/242588082?v=4?s=100" width="100px;" alt="Rajeshkumar-s2"/><br /><sub><b>Rajeshkumar-s2</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Rajeshkumar-s2" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Rajeshkumar-s2" title="Tests">⚠️</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Venu-p1"><img src="https://avatars.githubusercontent.com/u/236371043?v=4?s=100" width="100px;" alt="Venu-p1"/><br /><sub><b>Venu-p1</b></sub></a><br /><a href="https://github.com/dell/omnia/commits?author=Venu-p1" title="Code">💻</a> <a href="https://github.com/dell/omnia/commits?author=Venu-p1" title="Tests">⚠️</a></td>
</tr>
</tbody>
</table>
<!-- markdownlint-restore -->
<!-- prettier-ignore-end -->
<!-- ALL-CONTRIBUTORS-LIST:END -->
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
Omnia provides security support for Omnia 1.7. All users utilizing older versions are highly recommended to upgrade to the latest version. Omnia 1.6.1 users are also highly recommended to upgrade to Omnia 1.7. The upgrade functionality allows users to upgrade from Omnia 1.6.1 to Omnia 1.7. The upgrade process ensures that all the security updates and fixes are applied to the system.
| Version | Supported |
| ------- | ------------------ |
| 1.7 | :white_check_mark: |
| 1.6.1 | :white_check_mark: |
| 1.5.1 | :x: |
| 1.4.3.1 | :x: |
## Reporting a Vulnerability
To report a vulnerability, users can raise an issue with vulnerability details. Please include a CVE (Common Vulnerabilities and Exposures) identifier if one has been assigned to the issue. This will help us track the issue and ensure it is addressed appropriately.
If the vulnerability is accepted, the team will review the issue and make appropriate changes to fix the vulnerability. The fix can be expected in a minor patch release or will be included in the next major release.
In case the vulnerability is deemed to be high risk, the team may also provide a temporary fix or workaround until the next release is available.
However, if the vulnerability is deemed to be low risk or is not covered in the product security coverage scope, the issue may be denied.
================================================
FILE: ansible.cfg
================================================
[defaults]
log_path = /opt/omnia/log/core/playbooks/omnia.log
# Set the remote temporary directory to a shared path to avoid SELinux issues
remote_tmp = /opt/omnia/tmp/.ansible/tmp/
host_key_checking = false
forks = 5
timeout = 180
executable = /bin/bash
display_skipped_hosts = false
library = discovery/library:common/library/modules
#inventory = /opt/omnia/omnia_inventory/cluster_layout
module_utils = common/library/module_utils
[persistent_connection]
command_timeout = 180
connect_timeout = 180
[ssh_connection]
retries = 3
ssh_args = -o ControlMaster=auto -o ControlPersist=60 -o ConnectTimeout=60
================================================
FILE: build_image_aarch64/ansible.cfg
================================================
[defaults]
log_path = /opt/omnia/log/core/playbooks/build_image_aarch64.log
remote_tmp = /opt/omnia/tmp/.ansible/tmp/
host_key_checking = false
forks = 5
timeout = 180
executable = /bin/bash
library = ../common/library/modules
module_utils = ../common/library/module_utils
[persistent_connection]
command_timeout = 180
connect_timeout = 180
[ssh_connection]
retries = 3
ssh_args = -o ControlMaster=auto -o ControlPersist=60 -o ConnectTimeout=60
================================================
FILE: build_image_aarch64/build_image_aarch64.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Check if upgrade is in progress
ansible.builtin.import_playbook: ../utils/upgrade_checkup.yml
- name: Set_fact for fetch omnia config credentials
hosts: localhost
connection: local
tags: always
tasks:
- name: Set dynamic run tags including 'build_aarch_image'
when: not config_file_status | default(false) | bool
ansible.builtin.set_fact:
omnia_run_tags: "{{ (ansible_run_tags | default([]) + ['build_aarch_image']) | unique }}"
cacheable: true
- name: Invoke validate_config.yml to perform L1 and L2 validations with build_image tag
ansible.builtin.import_playbook: ../input_validation/validate_config.yml
tags: always
- name: Invoke get_config_credentials.yml
ansible.builtin.import_playbook: ../utils/credential_utility/get_config_credentials.yml
- name: Include input project directory
when: not project_dir_status | default(false) | bool
ansible.builtin.import_playbook: ../utils/include_input_dir.yml
vars:
openchami_vars_suppport: true
omnia_metadata_support: true
- name: Load build_stream configuration
hosts: localhost
connection: local
gather_facts: false
tags: always
tasks:
- name: Include build_stream config file
ansible.builtin.include_vars:
file: "{{ input_project_dir }}/build_stream_config.yml"
failed_when: false
- name: Set build_stream variables from extra_vars
ansible.builtin.set_fact:
build_stream_job_id: "{{ job_id | default('') }}"
build_stream_image_key: "{{ image_key | default('') }}"
build_stream_functional_groups: "{{ functional_groups | default([]) }}"
enable_build_stream_flag: "{{ enable_build_stream | default(false) | bool }}"
- name: Debug - Show build_stream variables
ansible.builtin.debug:
msg:
- "build_stream_job_id: {{ build_stream_job_id }}"
- "build_stream_image_key: {{ build_stream_image_key }}"
- "build_stream_functional_groups: {{ build_stream_functional_groups }}"
- "enable_build_stream_flag: {{ enable_build_stream_flag }}"
verbosity: 2
- name: Fetch build_stream prerequisites
ansible.builtin.include_role:
name: fetch_packages
tasks_from: build_stream_prerequisite.yml
vars:
job_id: "{{ build_stream_job_id }}"
image_key: "{{ build_stream_image_key }}"
functional_groups: "{{ build_stream_functional_groups }}"
enable_build_stream: "{{ enable_build_stream_flag }}"
when: enable_build_stream_flag
- name: Gather OIM data
hosts: localhost
gather_facts: false
tasks:
- name: Include gather_oim_data role
ansible.builtin.include_role:
name: prepare_arm_node
tasks_from: gather_oim_data.yml
vars_from: main
- name: Create oim group and provision group
ansible.builtin.import_playbook: ../utils/create_container_group.yml
vars:
oim_group: true
tags: always
- name: Configure auth for OpenCHAMI
hosts: oim
connection: ssh
tasks:
- name: OpenCHAMI cluster authentication
ansible.builtin.include_tasks: "{{ playbook_dir }}/../common/tasks/common/openchami_auth.yml"
vars:
oim_node_name: "{{ hostvars['localhost']['oim_node_name'] }}"
- name: Generate functional groups configuration when enable_build_stream is false
ansible.builtin.import_playbook: ../utils/generate_functional_groups.yml
tags: always
when: not enable_build_stream
- name: Verify aarch64 functional_group presnt
hosts: localhost
connection: local
tasks:
- name: Fetch aarch64 functional_groups
ansible.builtin.include_role:
name: fetch_packages
tasks_from: check_aarch64_fg.yml
when: not enable_build_stream
- name: Prepare aarch64 nodes
hosts: admin_aarch64
gather_facts: false
roles:
- prepare_arm_node
- name: Fetch packages for aarch64
hosts: localhost
connection: local
gather_facts: false
roles:
- fetch_packages
- name: Openchmi build image for aarch_64
hosts: localhost
connection: local
gather_facts: false
roles:
- image_creation
- name: Build aarch64 image completion
hosts: localhost
connection: local
tasks:
- name: Build Image completion
ansible.builtin.include_role:
name: fetch_packages
tasks_from: aarch64_build_image_completion.yml
================================================
FILE: build_image_aarch64/roles/fetch_packages/tasks/aarch64_build_image_completion.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Build Image completion
ansible.builtin.debug:
msg: "{{ aarch64_build_image_completion_msg.splitlines() | join(' ') }}"
================================================
FILE: build_image_aarch64/roles/fetch_packages/tasks/build_stream_prerequisite.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Debug - Show explicitly passed variables
ansible.builtin.debug:
msg:
- "job_id: {{ job_id | default('NOT_SET') }}"
- "image_key: {{ image_key | default('NOT_SET') }}"
- "functional_groups: {{ functional_groups | default('NOT_SET') }}"
- "enable_build_stream: {{ enable_build_stream | default('NOT_SET') }}"
verbosity: 2
- name: Set build_stream variables from explicitly passed values
ansible.builtin.set_fact:
build_stream_job_id: "{{ job_id }}"
image_key: "{{ image_key }}"
cacheable: true
- name: Normalize functional_groups input into list
ansible.builtin.set_fact:
functional_group_list: "{{ functional_groups if functional_groups is iterable and functional_groups is not string else (functional_groups | from_yaml) }}"
when: functional_groups is defined and enable_build_stream
- name: Fail when build stream enabled without job id or functional groups
ansible.builtin.fail:
msg: "{{ build_stream_prerequisite_fail_msg }}"
when:
- enable_build_stream | bool
- (build_stream_job_id | default('') | string) | length == 0 or (functional_group_list | default([]) | length == 0) or (image_key | default('') | string) | length == 0 # noqa: yaml[line-length]
================================================
FILE: build_image_aarch64/roles/fetch_packages/tasks/check_aarch64_fg.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Load functional_group_config.yml
ansible.builtin.include_vars:
file: "{{ functional_groups_config_path }}"
name: functional_group_cfg
- name: Check for aarch64 functional groups
ansible.builtin.set_fact:
fg_aarch64: >-
{{ functional_group_cfg.functional_groups
| selectattr('name', 'search', '_aarch64$')
| list
| length > 0 }}
cacheable: true
- name: Fail if aarch64 functional groups are not present
ansible.builtin.fail:
msg: "{{ functional_group_absent_msg.splitlines() | join(' ') }}"
when: not fg_aarch64
================================================
FILE: build_image_aarch64/roles/fetch_packages/tasks/fetch_packages.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Fetch aarch64 default_packages.json and additional_packages.json software packages
block:
- name: Collect base image RPM packages (default + additional + admin_debug)
base_image_package_collector:
default_json_path: "{{ default_json_path }}"
additional_json_path: "{{ additional_json_path | default('') }}"
admin_debug_json_path: "{{ admin_debug_json_path | default('') }}"
software_config_path: "{{ software_config_file_path }}"
register: base_image_output
- name: Set aarch64_base_image_packages
ansible.builtin.set_fact:
aarch64_base_image_packages: "{{ base_image_output.base_image_packages }}"
- name: Debug package aarch64_base_image_packages
ansible.builtin.debug:
var: aarch64_base_image_packages
verbosity: 2
- name: Parse functional_group_config.yml to list
functional_group_parser:
functional_groups_file: "{{ functional_groups_file_path }}"
register: functional_group_parser_list
when: not enable_build_stream
- name: Set fact for functional_group_list
ansible.builtin.set_fact:
functional_group_list: "{{ functional_group_parser_list.functional_groups }}"
when: not enable_build_stream
- name: Debug full functional group parser output
ansible.builtin.debug:
var: functional_group_list
verbosity: 2
- name: Read packages for compute image softwares
image_package_collector:
functional_groups: "{{ functional_group_list }}"
software_config_file: "{{ software_config_file_path }}"
input_project_dir: "{{ input_project_dir }}"
additional_json_path: "{{ additional_json_path }}"
register: compute_images_output
- name: Save packages for aarch64 keys in compute_images_dict
ansible.builtin.set_fact:
compute_images_dict: >-
{{
compute_images_output.compute_images_dict
| dict2items
| selectattr('key', 'search', '_aarch64$')
| items2dict
}}
- name: Debug software directory compute_images_dict
ansible.builtin.debug:
var: compute_images_dict
verbosity: 2
================================================
FILE: build_image_aarch64/roles/fetch_packages/tasks/fetch_pulp_repos.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Fetch pulp endpoints when aarch_64 build_stream enabled
block:
- name: Fetch pulp endpoints for aarch64
ansible.builtin.command: >
pulp rpm distribution list --field name,base_url
register: pulp_endpoints
changed_when: false
- name: Filter only aarch_64 distributions
ansible.builtin.set_fact:
pulp_aarch_64_distributions: >-
{{ pulp_endpoints.stdout | from_json
| selectattr('name', 'match', '^aarch64')
| list }}
- name: Build rhel_repos list from pulp_aarch_64_distributions
ansible.builtin.set_fact:
rhel_aarch64_repos: >-
{{ pulp_aarch_64_distributions | map('combine', {'gpg': ''}) | list }}
- name: Debug rhel_aarch64_repos
ansible.builtin.debug:
msg: "{{ rhel_aarch64_repos | to_nice_yaml(indent=2) }}"
verbosity: 2
================================================
FILE: build_image_aarch64/roles/fetch_packages/tasks/main.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Check local_repo.yml execution
block:
- name: Check if local_repo.yml is executed successfully
ansible.builtin.stat:
path: "{{ metadata_file_path }}"
register: metadata_file_status
rescue:
- name: Fail if metadata file is not present
ansible.builtin.fail:
msg: "{{ local_repo_check_msg }}"
when: not metadata_file_status.stat.exists
- name: Initialize fg_aarch64 as false
ansible.builtin.set_fact:
fg_aarch64: "{{ fg_aarch64 | default(false) }}"
when: enable_build_stream | default(false)
- name: Include functional groups config
ansible.builtin.include_vars:
file: "{{ functional_groups_file_path }}"
name: functional_groups_config
when: not enable_build_stream
- name: Set functional_groups_file_path for build_stream disabled flow
ansible.builtin.set_fact:
functional_groups_file_path: "{{ functional_groups_file_path }}"
when: not enable_build_stream
- name: Include software config
ansible.builtin.include_vars:
file: "{{ software_config_file_path }}"
name: software_config
when: enable_build_stream | default(false)
- name: Set cluster OS facts
ansible.builtin.set_fact:
rhel_tag: "{{ software_config.cluster_os_version }}"
default_json_path: "{{ input_project_dir }}/config/aarch64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/default_packages.json" # noqa: yaml[line-length]
additional_json_path: "{{ input_project_dir }}/config/aarch64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/additional_packages.json" # noqa: yaml[line-length]
admin_debug_json_path: "{{ input_project_dir }}/config/aarch64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/admin_debug_packages.json" # noqa: yaml[line-length]
- name: Fetch pulp endpoint repos
ansible.builtin.include_tasks: fetch_pulp_repos.yml
when: fg_aarch64 or enable_build_stream
- name: Fetch packages for base and compute image softwares
ansible.builtin.include_tasks: fetch_packages.yml
when: fg_aarch64 or enable_build_stream
================================================
FILE: build_image_aarch64/roles/fetch_packages/vars/main.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
metadata_file_path: "/opt/omnia/offline_repo/.data/localrepo_metadata.yml"
local_repo_check_msg: |
Failure: metadata file is not present at path {{ metadata_file_path }}.
Please make sure that local_repo.yml playbook is executed successfully.
input_project_dir: "{{ hostvars['localhost']['input_project_dir'] }}"
functional_groups_file_path: "{{ hostvars['localhost']['functional_groups_config_path'] | default('/opt/omnia/.data/functional_groups_config.yml') }}"
software_config_file_path: "{{ input_project_dir }}/software_config.json"
aarch64_build_image_completion_msg: |
The playbook build_image_aarch64.yml has been completed successfully.
To boot x86_64 and aarch64 nodes execute discovery/discovery.yml playbook.
functional_group_absent_msg: |
Failure: No aarch64 functional groups found in functional_group_config.yml input file.
Please make sure aarch64 functional_group should be present in input file functional_group_config.yml
to execute build_image_aarch64.yml successfully.
build_stream_prerequisite_fail_msg: |
Build Stream mode is enabled. Manual execution is not supported.
Please trigger this workflow via the GitLab pipeline.
================================================
FILE: build_image_aarch64/roles/image_creation/tasks/build_base_image.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Normalize build stream inputs for base image
ansible.builtin.set_fact:
enable_build_stream: "{{ enable_build_stream | default(false) | bool }}"
build_stream_job_id: "{{ build_stream_job_id | default('') }}"
image_key: "{{ image_key | default('') }}"
base_image_suffix: ""
- name: Set base image suffix when build stream inputs present
ansible.builtin.set_fact:
base_image_suffix: "_{{ build_stream_job_id }}-{{ image_key | default('') }}"
rhel_base_image_name: "{{ rhel_aarch64_base_image_name }}_{{ build_stream_job_id }}-{{ image_key | default('') }}"
when:
- enable_build_stream | bool
- (build_stream_job_id | default('') | length) > 0
- (image_key | default('') | length) > 0
- name: Create temporary inventory with ochami group
ansible.builtin.copy:
dest: "{{ aarch64_inventory_file }}"
content: |
[ochami]
{{ groups['admin_aarch64'] | join('\n') }}
mode: "{{ hostvars['localhost']['file_permissions_644'] }}"
- name: Create aarch64_base_image.log as a file
ansible.builtin.file:
path: "{{ openchami_aarch64_base_image_log_path }}"
state: touch
mode: "{{ dir_permissions_644 }}"
- name: Load the openchami image vars
ansible.builtin.template:
src: "{{ openchami_base_image_vars_template }}"
dest: "{{ openchami_aarch64_base_image_vars_path }}"
mode: "{{ dir_permissions_644 }}"
- name: Invoking Openchami playbook for rhel-base image build
ansible.builtin.shell: |
set -o pipefail
ansible-playbook {{ openchami_clone_path }}/dell/podman-quadlets/image.yaml \
-i {{ aarch64_inventory_file }} -v \
--extra-vars "@{{ openchami_aarch64_base_image_vars_path }}" \
--tags base_image -v | \
/usr/bin/tee {{ openchami_aarch64_base_image_log_path }}
async: 3600 # Set async timeout (e.g., 1 hour)
poll: 0 # Non-blocking (continue the playbook without waiting for completion)
register: base_image_build
changed_when: true
- name: Wait for rhel-base image OpenCHAMI jobs to finish
block:
- name: Wait for rhel-base image OpenCHAMI jobs to finish
ansible.builtin.async_status:
jid: "{{ base_image_build.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: "{{ job_retry }}"
delay: "{{ job_delay }}"
rescue:
- name: Fail the build if the base image build fails
ansible.builtin.fail:
msg: |
{{ base_image_failure_msg }}
always:
- name: Remove generated base image vars file
ansible.builtin.file:
path: "{{ openchami_aarch64_base_image_vars_path }}"
state: absent
- name: Set openchami SELinux context
ansible.builtin.command: chcon -R system_u:object_r:container_file_t:s0 "{{ oim_shared_path }}/omnia/openchami"
changed_when: true
delegate_to: oim
connection: ssh
failed_when: false
================================================
FILE: build_image_aarch64/roles/image_creation/tasks/build_compute_image.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Normalize build stream inputs
ansible.builtin.set_fact:
enable_build_stream: "{{ enable_build_stream | default(false) | bool }}"
build_stream_job_id: "{{ build_stream_job_id | default('') }}"
image_key: "{{ image_key | default('') }}"
compute_image_suffix: ""
- name: Set compute image suffix when build stream inputs present
ansible.builtin.set_fact:
compute_image_suffix: "_{{ build_stream_job_id }}-{{ image_key | default('') }}"
when:
- enable_build_stream | bool
- (build_stream_job_id | default('') | length) > 0
- (image_key | default('') | length) > 0
- name: Create temporary inventory with ochami group
ansible.builtin.copy:
dest: "{{ aarch64_inventory_file }}"
content: |
[ochami]
{{ groups['admin_aarch64'] | join('\n') }}
mode: "{{ hostvars['localhost']['file_permissions_644'] }}"
- name: Create aarch64 compute image log files
ansible.builtin.file:
path: "{{ openchami_log_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_image.log"
state: touch
mode: "{{ dir_permissions_644 }}"
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
- name: Render compute images templates
ansible.builtin.template:
src: "{{ openchami_compute_image_vars_template }}"
dest: "{{ openchami_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_images.yaml"
mode: "{{ dir_permissions_644 }}"
vars:
functional_group: "{{ item.value.functional_group }}"
packages: "{{ item.value.packages }}"
base_compute_image_name: "{{ item.key }}{{ compute_image_suffix }}"
rhel_base_compute_image_name: "rhel-{{ item.key }}{{ compute_image_suffix }}"
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
- name: Invoking OpenCHAMI playbooks asynchronously for aarch64 compute image_build
ansible.builtin.shell: |
set -o pipefail
ansible-playbook {{ openchami_clone_path }}/dell/podman-quadlets/image.yaml \
-i {{ aarch64_inventory_file }} -v \
--extra-vars '@{{ openchami_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_images.yaml' \
--tags compute_image -v | \
/usr/bin/tee '{{ openchami_log_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_image.log'
async: 3600 # Set async timeout (e.g., 1 hour)
poll: 0 # Non-blocking (continue the playbook without waiting for completion)
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
register: compute_image_build_job
changed_when: true
- name: Wait for all OpenCHAMI jobs to finish and remove generated compute images templates
block:
- name: Display image build jobs status
ansible.builtin.debug:
msg: "Waiting for image build: {{ item.item.key }} (Job ID: {{ item.ansible_job_id }})"
loop: "{{ compute_image_build_job.results }}"
loop_control:
label: "{{ item.item.key }}"
- name: Wait for all OpenCHAMI jobs to finish
ansible.builtin.async_status:
jid: "{{ item.ansible_job_id }}"
register: job_result
until: job_result.finished
no_log: true
retries: "{{ job_retry }}"
delay: "{{ job_delay }}"
loop: "{{ compute_image_build_job.results }}"
loop_control:
label: "Building: {{ item.item.key }}"
rescue:
- name: Identify failed image builds
ansible.builtin.set_fact:
failed_images: >
{{ job_result.results
| selectattr('failed', 'defined')
| selectattr('failed', 'equalto', true)
| map(attribute='item.item.key')
| list }}
when: job_result.results is defined
- name: Build failure message list
ansible.builtin.set_fact:
failure_msg_list:
- "aarch64 compute image build job did not complete successfully."
- "Check logs at {{ openchami_log_dir }} for respective functional group for more details."
- ""
- "Failed images:"
- name: Add failed image names to message
ansible.builtin.set_fact:
failure_msg_list: "{{ failure_msg_list + [' - ' + item] }}"
loop: "{{ failed_images | default(['Unknown - check all logs']) }}"
- name: Add log paths section to message
ansible.builtin.set_fact:
failure_msg_list: "{{ failure_msg_list + ['', 'Check logs at ' + openchami_log_dir + ' for details:'] }}"
- name: Add log file paths to message
ansible.builtin.set_fact:
failure_msg_list: "{{ failure_msg_list + [' - ' + openchami_log_dir + '/' + item + log_suffix + '_compute_image.log'] }}"
vars:
log_suffix: "{{ compute_image_suffix }}"
loop: "{{ failed_images | default([]) }}"
- name: Display aarch64 compute image build failure details
ansible.builtin.debug:
msg: "{{ failure_msg_list }}"
- name: Failed to build the aarch64 compute image
ansible.builtin.fail:
msg: "aarch64 compute image build failed. See details above."
always:
- name: Remove generated compute images templates
ansible.builtin.file:
path: "{{ openchami_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_images.yaml"
state: absent
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
- name: Remove temporary inventory file
ansible.builtin.file:
path: "{{ aarch64_inventory_file }}"
state: absent
- name: Set openchami SELinux context
ansible.builtin.command: chcon -R system_u:object_r:container_file_t:s0 "{{ oim_shared_path }}/omnia/openchami"
changed_when: true
delegate_to: oim
connection: ssh
failed_when: false
================================================
FILE: build_image_aarch64/roles/image_creation/tasks/main.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Include metadata vars
ansible.builtin.include_vars: "{{ omnia_metadata_file }}"
register: include_metadata
no_log: true
- name: Include global variables from common folder
ansible.builtin.include_vars: "{{ role_path }}/../../../common/vars/openchami_image_cmd.yml"
register: ochami_image_global_vars
- name: Invoking aarch64 build base image playbook
ansible.builtin.include_tasks: build_base_image.yml
tags: base_image
- name: Invoking aarch64 build rhel compute image playbooks
ansible.builtin.include_tasks: build_compute_image.yml
tags: compute_image
================================================
FILE: build_image_aarch64/roles/image_creation/templates/base_image_template.j2
================================================
openchami_work_dir: "{{ openchami_work_dir }}"
rhel_tag: "{{ rhel_tag }}"
rhel_base_image_name: "{{ rhel_aarch64_base_image_name }}"
rhel_base_image: "{{ oim_node_name }}/{{ rhel_aarch64_base_image_name }}"
cluster_name: "{{ oim_node_name }}"
cluster_domain: "{{ domain_name }}"
group_name: base
rhel_base_mounts: {{ ochami_mounts | join(' ') }}
image_build_name: {{ ochami_aarch64_image | join(' ') }}
rhel_base_command_options: {{ ochami_base_command | join(' ') }}
rhel_repos:
{% for repo in rhel_aarch64_repos %}
- { name: '{{ repo.name }}', url: '{{ repo.base_url }}', gpg: '{{ repo.gpg }}' }
{% endfor %}
base_image_packages:
{% for pkg in aarch64_base_image_packages %}
- {{ pkg }}
{% endfor %}
base_image_commands:
{% for cmd in base_image_commands %}
- {{ cmd | to_json }}
{% endfor %}
================================================
FILE: build_image_aarch64/roles/image_creation/templates/compute_images_templates.j2
================================================
openchami_work_dir: "{{ openchami_work_dir }}"
rhel_tag: "{{ rhel_tag }}"
rhel_base_image: "{{ oim_node_name }}/{{ rhel_aarch64_base_image_name }}"
{% set image_name_suffix = compute_image_suffix | default('') %}
base_compute_image_name: "{{ item.key }}{{ image_name_suffix }}"
rhel_base_compute_image_name: "rhel-{{ item.key }}{{ image_name_suffix }}"
rhel_base_compute_image: "{{ oim_node_name }}/rhel-{{ item.key }}{{ image_name_suffix }}"
# S3 directory should stay stable (no job-id) while the filename will carry job-id via image name
s3_dir_name: "rhel-{{ item.key }}"
cluster_name: "{{ oim_node_name }}"
cluster_domain: "{{ domain_name }}"
group_name: "{{ item.key }}"
rhel_base_compute_mounts: --user 0 --privileged -v {{ oim_shared_path }}/omnia/pulp/settings/certs/pulp_webserver.crt:/etc/pki/ca-trust/source/anchors/pulp_webserver.crt:z -v {{ openchami_work_dir }}/images/{{ rhel_base_compute_image_name }}-{{ rhel_tag }}.yaml:/home/builder/config.yaml:z
image_build_name: {{ ochami_aarch64_image | join (' ') }}
rhel_base_compute_command_options: {{ ochami_base_command | join (' ') }}
minio_s3_username: "{{ minio_s3_username }}"
minio_s3_password: "{{ minio_s3_password }}"
{% set s3_prefix_suffix = '' %}
s3_prefix_suffix: "{{ s3_prefix_suffix }}"
# Override OpenCHAMI defaults to ensure correct mount path
rhel_tag: "{{ rhel_tag }}"
rhel_repos:
{% set rhel_repo = rhel_aarch64_repos %}
{% for repo in rhel_repo %}
- { name: '{{ repo.name }}', url: '{{ repo.base_url }}', gpg: '{{ repo.gpg }}' }
{% endfor %}
base_compute_image_packages:
{% for pkg in packages %}
- {{ pkg }}
{% endfor %}
# Commands for this role
{% set command_var = functional_group + '_compute_commands' %}
{% set commands_list = lookup('vars', command_var, default=[]) %}
base_compute_image_commands:
{% if commands_list | length > 0 %}
{% for cmd in commands_list %}
- "{{ cmd }}"
{% endfor %}
{% else %}
[]
{% endif %}
================================================
FILE: build_image_aarch64/roles/image_creation/vars/main.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
input_project_dir: "{{ hostvars['localhost']['input_project_dir'] }}"
omnia_metadata_file: "/opt/omnia/.data/oim_metadata.yml"
dir_permissions_644: "0644"
dir_permissions_755: "0755"
aarch64_local_tag: "aarch64-image-builder/ochami"
openchami_dir: "/opt/omnia/openchami"
openchami_clone_path: /opt/omnia/openchami/deployment-recipes
job_retry: "120"
job_delay: "30"
openchami_work_dir: "{{ oim_shared_path }}/omnia/openchami/workdir"
ochami_mounts:
- --user 0 --privileged
- -v {{ oim_shared_path }}/omnia/pulp/settings/certs/pulp_webserver.crt:/etc/pki/ca-trust/source/anchors/pulp_webserver.crt:z
- -v {{ openchami_work_dir }}/images/{{ rhel_aarch64_base_image_name }}-{{ rhel_tag }}.yaml:/home/builder/config.yaml:z
ochami_compute_mounts:
- --user 0 --privileged
- -v {{ oim_shared_path }}/omnia/pulp/settings/certs/pulp_webserver.crt:/etc/pki/ca-trust/source/anchors/pulp_webserver.crt:z
- -v {{ openchami_work_dir }}/images/{{ rhel_base_compute_image_name }}-{{ rhel_tag }}.yaml:/home/builder/config.yaml:z
ochami_aarch64_image:
- --entrypoint /bin/bash
- "localhost/{{ aarch64_local_tag }}"
ochami_base_command:
- -c 'update-ca-trust extract && image-build --config /home/builder/config.yaml --log-level DEBUG'
# Usage: build_base_image.yml
openchami_log_dir: /opt/omnia/log/openchami
openchami_aarch64_base_image_log_path: "{{ openchami_log_dir }}/aarch64_base_image.log"
openchami_base_image_vars_template: "{{ role_path }}/templates/base_image_template.j2"
openchami_aarch64_base_image_vars_path: "/opt/omnia/openchami/aarch64_base_image_template.yaml"
aarch64_inventory_file: "/tmp/temp_ochami_inventory.ini"
base_image_failure_msg: |
Base aarch64 image build job failed or timed out.
Check logs at path {{ openchami_aarch64_base_image_log_path }} for details.
compute_image_failure_msg: |
aarch64 compute image build job did not complete successfully.
Check logs at {{ openchami_log_dir }} for respective functional group for more details.
# Usage: build_compute_image.yml
openchami_compute_image_vars_template: "{{ role_path }}/templates/compute_images_templates.j2"
openchami_compute_image_vars_path: "/opt/omnia/openchami/compute_images_template.yaml"
================================================
FILE: build_image_aarch64/roles/prepare_arm_node/tasks/gather_oim_data.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
# Inventory Validation
- name: Fail if no inventory provided
ansible.builtin.fail:
msg: "{{ no_inventory_error_msg }}"
when: groups['all'] | length == 0
- name: Fail if inventory group 'admin_aarch64' is empty
ansible.builtin.fail:
msg: "{{ admin_aarch64_empty_error_msg }}"
when: groups['admin_aarch64'] is not defined or groups['admin_aarch64'] | length == 0
- name: Fail if inventory group 'admin_aarch64' has more than one host
ansible.builtin.fail:
msg: "{{ admin_aarch64_count_error_msg }}"
when: groups['admin_aarch64'] | length != 1
# Validate share option
- name: Set share option fact
ansible.builtin.set_fact:
omnia_share_option: "{{ hostvars['localhost']['omnia_share_option'] }}"
- name: Fail if share option is not NFS
ansible.builtin.fail:
msg: "{{ nfs_not_configured_msg }}"
when: omnia_share_option != "NFS"
# Load network specification
- name: Load network spec file
ansible.builtin.include_vars:
file: "{{ network_spec }}"
register: include_network_spec
no_log: true
- name: Fail if network spec cannot be loaded
ansible.builtin.fail:
msg: "{{ network_spec_syntax_fail_msg }} Error: {{ include_network_spec.message }}"
when: include_network_spec is failed
# Parse network spec data
- name: Parse network spec
ansible.builtin.set_fact:
network_data: "{{ network_data | default({}) | combine({item.key: item.value}) }}"
with_dict: "{{ Networks }}"
# Set PXE IP fact
- name: Set PXE IP fact
ansible.builtin.set_fact:
oim_pxe_ip: "{{ network_data.admin_network.primary_oim_admin_ip }}"
cacheable: true
- name: Create aarch64 directory if not exists
ansible.builtin.file:
path: "{{ ochami_aarch_64_dir }}"
state: directory
mode: "{{ hostvars['localhost']['dir_permissions_755'] }}"
# Validate pulp.repo existence
- name: Check if pulp.repo exists
ansible.builtin.stat:
path: "{{ pulp_repo_file_path }}"
register: pulp_repo_stat
# Handle missing pulp.repo
- name: Notify if pulp.repo is missing
ansible.builtin.fail:
msg: "{{ pulp_repo_missing_error_msg }}"
when: not pulp_repo_stat.stat.exists
# Read pulp.repo file
- name: Read pulp.repo content
ansible.builtin.slurp:
path: "{{ pulp_repo_file_path }}"
register: pulp_repo_content
when: pulp_repo_stat.stat.exists
- name: Extract aarch64_baseos repo section
ansible.builtin.set_fact:
aarch64_baseos_repo: >-
{{
(pulp_repo_content.content | b64decode)
| regex_search(
'''(?s)\[aarch64_baseos\].*?(?=\n\[|\Z)'''
)
}}
when: pulp_repo_stat.stat.exists
# Fail if aarch64_appstream repo is not found
- name: Fail if aarch64_baseos repo section is missing
ansible.builtin.fail:
msg: "{{ repo_not_found_error_msg }}"
when: aarch64_baseos_repo is not defined or aarch64_baseos_repo | length == 0
# Write only aarch64_appstream repo into new pulp.repo
- name: Write aarch64_appstream repo into pulp repo path
ansible.builtin.copy:
content: "{{ aarch64_baseos_repo }}"
dest: "{{ pulp_repo_store_path }}"
mode: "{{ hostvars['localhost']['file_permissions_644'] }}"
when: aarch64_baseos_repo is defined
================================================
FILE: build_image_aarch64/roles/prepare_arm_node/tasks/main.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Add target host to known_hosts
ansible.builtin.known_hosts:
name: "{{ inventory_hostname }}"
key: "{{ lookup('pipe', 'ssh-keyscan -H ' + inventory_hostname) }}"
delegate_to: localhost
- name: Check if passwordless SSH is enabled
ansible.builtin.command:
cmd: ssh -o BatchMode=yes -o ConnectTimeout=5 root@{{ inventory_hostname }} 'echo OK'
register: ssh_check
ignore_errors: true
changed_when: false
delegate_to: localhost
# Set up passwordless SSH from localhost if not already enabled
- name: Setup passwordless SSH from localhost
ansible.builtin.expect:
command: "ssh-copy-id -i /root/.ssh/id_rsa.pub root@{{ inventory_hostname }}"
responses:
"password:": "{{ hostvars['localhost']['provision_password'] }}"
when: ssh_check.failed
delegate_to: localhost
no_log: true
- name: Verify passwordless SSH
ansible.builtin.command:
cmd: ssh -o BatchMode=yes root@{{ inventory_hostname }} 'echo OK'
register: ssh_verify
failed_when: ssh_verify.stdout != "OK"
changed_when: false
delegate_to: localhost
# Check the machine architecture of the target host
- name: Check machine architecture
ansible.builtin.command: uname -m
register: arch_result
changed_when: false
# Fail the play if the target machine is not aarch64
- name: Fail if machine is not aarch64
ansible.builtin.fail:
msg: "{{ not_aarch64_error_msg }}"
when: arch_result.stdout != "aarch64"
- name: Remove any existing entries for OIM hostname in /etc/hosts
ansible.builtin.lineinfile:
path: /etc/hosts
regexp: '.*\s+{{ hostvars["localhost"]["oim_hostname"] }}$'
state: absent
changed_when: true
- name: Add correct OIM PXE IP and hostname to /etc/hosts
ansible.builtin.lineinfile:
path: /etc/hosts
line: "{{ hostvars['localhost']['oim_pxe_ip'] }} {{ hostvars['localhost']['oim_hostname'] }}"
state: present
mode: "{{ hostvars['localhost']['file_permissions_644'] }}"
create: true
# Verify the entry exists in /etc/hosts
- name: Verify OIM PXE IP and hostname in /etc/hosts
ansible.builtin.command:
cmd: "grep {{ hostvars['localhost']['oim_pxe_ip'] }} /etc/hosts"
register: etc_hosts_check
changed_when: false
failed_when: etc_hosts_check.stdout == ""
- name: Display verification result
ansible.builtin.debug:
msg: "Entry in /etc/hosts: {{ etc_hosts_check.stdout }}"
- name: Ping OIM hostname from target host
ansible.builtin.raw: "ping -c 2 {{ hostvars['localhost']['oim_hostname'] }}"
register: ping_result
changed_when: false
failed_when: ping_result.rc != 0
- name: Show ping result
ansible.builtin.debug:
msg: "{{ ping_result.stdout }}"
# Register NFS details
- name: Set NFS info fact
ansible.builtin.set_fact:
nfs_info:
server_ip: "{{ hostvars['localhost']['nfs_server_ip'] }}"
server_share_path: "{{ hostvars['localhost']['nfs_server_share_path'] }}"
shared_path: "{{ hostvars['localhost']['oim_shared_path'] }}"
- name: Ensure NFS mount point directory exists
ansible.builtin.file:
path: "{{ nfs_info.shared_path }}"
state: directory
mode: "{{ hostvars['localhost']['dir_permissions_755'] }}"
become: true
- name: Copy pulp.repo from omnia_core to target host
ansible.builtin.copy:
src: "{{ pulp_repo_store_path }}"
dest: "{{ pulp_repo_file_path }}"
mode: "{{ hostvars['localhost']['file_permissions_644'] }}"
- name: Copy pulp webserver certificate to target host
ansible.builtin.copy:
src: "{{ pulp_webserver_cert_path }}"
dest: "{{ anchors_path }}"
mode: "{{ hostvars['localhost']['file_permissions_644'] }}"
become: true
- name: Update CA trust on target host
ansible.builtin.command: update-ca-trust
register: update_ca
changed_when: false
- name: Check if NFS is mounted
ansible.builtin.command:
cmd: "mountpoint -q {{ nfs_info.shared_path }}"
register: nfs_mounted
ignore_errors: true
changed_when: false
# Install NFS client package
- name: Install NFS client package
ansible.builtin.dnf:
name: nfs-utils
state: present
when: nfs_mounted.rc != 0
become: true
# Mount NFS share if not mounted
- name: Mount NFS share
ansible.builtin.mount:
path: "{{ nfs_info.shared_path }}"
src: "{{ nfs_info.server_ip }}:{{ nfs_info.server_share_path }}"
fstype: nfs
opts: defaults
state: mounted
when: nfs_mounted.rc != 0
become: true
# Verify the mount
- name: Verify NFS mount
ansible.builtin.command:
cmd: "mountpoint -q {{ nfs_info.shared_path }}"
register: verify_nfs
failed_when: verify_nfs.rc != 0
changed_when: false
- name: Display NFS mount status
ansible.builtin.debug:
msg: "NFS share {{ nfs_info.server_ip }}:{{ nfs_info.server_share_path }} is mounted on {{ nfs_info.shared_path }}"
- name: Build full Podman image path
ansible.builtin.set_fact:
pulp_aarch_image: "{{ hostvars['localhost']['oim_pxe_ip'] }}:2225/{{ pulp_aarch64_image_name }}"
- name: Pull and tag aarch64 image
block:
- name: Pull aarch64 image using Podman
containers.podman.podman_image:
name: "{{ pulp_aarch_image }}"
state: present
register: podman_pull_result
retries: "{{ pull_image_retries }}"
delay: "{{ pull_image_delay }}"
until: podman_pull_result is not failed
changed_when: false
- name: Tag pulled image
containers.podman.podman_tag:
image: "{{ pulp_aarch_image }}"
target_names:
- "{{ aarch64_local_tag }}"
changed_when: false
rescue:
- name: Fail if Podman pull failed
ansible.builtin.fail:
msg: "Failed to pull image {{ pulp_aarch_image }}"
- name: Check if regctl binary exists
ansible.builtin.stat:
path: "{{ ochami_aarch_64_dir }}/regctl"
register: regctl_stat
delegate_to: localhost
- name: Fail if regctl binary not found
ansible.builtin.fail:
msg: "{{ regctl_not_found_msg }}"
when: not regctl_stat.stat.exists
- name: Copy regctl binary to /usr/local/bin on target host
ansible.builtin.copy:
src: "{{ ochami_aarch_64_dir }}/regctl"
dest: "{{ regctl_bin_path }}"
mode: "{{ hostvars['localhost']['dir_permissions_755'] }}"
become: true
- name: Set registry TLS option using regctl
ansible.builtin.command: "{{ regctl_bin_path }} registry set --tls disabled {{ hostvars['localhost']['oim_hostname'] }}:5000"
register: regctl_result
changed_when: regctl_result.rc == 0
become: true
================================================
FILE: build_image_aarch64/roles/prepare_arm_node/vars/main.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
# input files
input_project_dir: "{{ hostvars['localhost']['input_project_dir'] }}"
pulp_aarch64_image_name: "dellhpcomniaaisolution/image-build-aarch64:1.1"
aarch64_local_tag: "aarch64-image-builder/ochami"
pull_image_retries: "3"
pull_image_delay: "10"
network_spec: "{{ input_project_dir }}/network_spec.yml"
ochami_aarch_64_dir: "/opt/omnia/openchami/aarch64"
pulp_repo_store_path: "{{ ochami_aarch_64_dir }}/pulp.repo"
pulp_repo_file_path: "/etc/yum.repos.d/pulp.repo"
pulp_webserver_cert_path: "/opt/omnia/pulp/settings/certs/pulp_webserver.crt"
anchors_path: "/etc/pki/ca-trust/source/anchors/pulp_webserver.crt"
regctl_bin_path: "/usr/local/bin/regctl"
# Error messages
no_inventory_error_msg: "No inventory provided. Please specify an inventory with -i option."
admin_aarch64_empty_error_msg: "The inventory group 'admin_aarch64' does not exist or has no hosts."
admin_aarch64_count_error_msg: "The inventory group 'admin_aarch64' must have exactly one host."
network_spec_syntax_fail_msg: "Failed to load network_spec.yml due to syntax error"
pulp_repo_missing_error_msg: "pulp.repo file not found. Please run local_repo.yml playbook to create a repo file."
not_aarch64_error_msg: "This is not an aarch64 machine. Only ARM nodes can be used to build the image."
repo_not_found_error_msg: "The aarch64_baseos repo section is not available in pulp.repo"
nfs_not_configured_msg: >
To build aarch64 images on an ARM node, the NFS server must be configured on the OIM.
Please run oim_cleanup.yml and reinstall the omnia_core container with the NFS option.
aarch64_image_fail_msg: >
Unable to pull the Ochami aarch64 image builder image.
Make sure you have added the default package for aarch64 in the software_config.json file and ran local_repo.yml.
If not, add that package and rerun local_repo.yml.
regctl_not_found_msg: >
regctl binary not found at {{ ochami_aarch_64_dir }}/regctl.
Please run prepare_oim.yml playbook to download the regctl binary.
================================================
FILE: build_image_x86_64/ansible.cfg
================================================
[defaults]
log_path = /opt/omnia/log/core/playbooks/build_image_x86_64.yml
remote_tmp = /opt/omnia/tmp/.ansible/tmp/
host_key_checking = false
forks = 5
timeout = 180
executable = /bin/bash
library = ../common/library/modules
module_utils = ../common/library/module_utils
[persistent_connection]
command_timeout = 180
connect_timeout = 180
[ssh_connection]
retries = 3
ssh_args = -o ControlMaster=auto -o ControlPersist=60 -o ConnectTimeout=60
================================================
FILE: build_image_x86_64/build_image_x86_64.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Check if upgrade is in progress
ansible.builtin.import_playbook: ../utils/upgrade_checkup.yml
- name: Set_fact for fetch omnia config credentials
hosts: localhost
connection: local
tags: always
tasks:
- name: Set dynamic run tags including 'build_image'
when: not config_file_status | default(false) | bool
ansible.builtin.set_fact:
omnia_run_tags: "{{ (ansible_run_tags | default([]) + ['build_image']) | unique }}"
cacheable: true
- name: Invoke validate_config.yml to perform L1 and L2 validations with build_image tag
ansible.builtin.import_playbook: ../input_validation/validate_config.yml
tags: always
- name: Invoke get_config_credentials.yml
ansible.builtin.import_playbook: ../utils/credential_utility/get_config_credentials.yml
- name: Include input project directory
when: not project_dir_status | default(false) | bool
ansible.builtin.import_playbook: ../utils/include_input_dir.yml
vars:
openchami_vars_suppport: true
omnia_metadata_support: true
- name: Load build_stream configuration
hosts: localhost
connection: local
gather_facts: false
tags: always
tasks:
- name: Include build_stream config file
ansible.builtin.include_vars:
file: "{{ input_project_dir }}/build_stream_config.yml"
failed_when: false
- name: Set build_stream variables from extra_vars
ansible.builtin.set_fact:
build_stream_job_id: "{{ job_id | default('') }}"
build_stream_image_key: "{{ image_key | default('') }}"
build_stream_functional_groups: "{{ functional_groups | default([]) }}"
enable_build_stream_flag: "{{ enable_build_stream | default(false) | bool }}"
- name: Debug - Show build_stream variables
ansible.builtin.debug:
msg:
- "build_stream_job_id: {{ build_stream_job_id }}"
- "build_stream_image_key: {{ build_stream_image_key }}"
- "build_stream_functional_groups: {{ build_stream_functional_groups }}"
- "enable_build_stream_flag: {{ enable_build_stream_flag }}"
verbosity: 2
- name: Fetch build_stream prerequisites
ansible.builtin.include_role:
name: fetch_packages
tasks_from: build_stream_prerequisite.yml
vars:
job_id: "{{ build_stream_job_id }}"
image_key: "{{ build_stream_image_key }}"
functional_groups: "{{ build_stream_functional_groups }}"
enable_build_stream: "{{ enable_build_stream_flag }}"
when: enable_build_stream_flag
- name: Create oim group and provision group
ansible.builtin.import_playbook: ../utils/create_container_group.yml
vars:
oim_group: true
tags: always
- name: Configure auth for OpenCHAMI
hosts: oim
connection: ssh
tasks:
- name: OpenCHAMI cluster authentication
ansible.builtin.include_tasks: "{{ playbook_dir }}/../common/tasks/common/openchami_auth.yml"
vars:
oim_node_name: "{{ hostvars['localhost']['oim_node_name'] }}"
- name: Generate functional groups configuration when enable_build_stream is false
ansible.builtin.import_playbook: ../utils/generate_functional_groups.yml
tags: always
when: not enable_build_stream
- name: Verify x86_64 functional_group presnt
hosts: localhost
connection: local
tasks:
- name: Fetch x86_64 functional_groups
ansible.builtin.include_role:
name: fetch_packages
tasks_from: check_x86_64_fg.yml
when: not enable_build_stream
- name: Fetch packages for x86_64
hosts: localhost
connection: local
gather_facts: false
roles:
- fetch_packages
- name: Tagging OpenCHAMI image
hosts: oim
connection: ssh
tasks:
- name: Tag OpenCHAMI image
ansible.builtin.include_role:
name: image_creation
tasks_from: prepare_pulp_image.yml
- name: OpenCHAMI build image for x86_64
hosts: localhost
connection: local
gather_facts: false
roles:
- image_creation
- name: Build x86_64 image completion
hosts: localhost
connection: local
tasks:
- name: Build Image completion
ansible.builtin.include_role:
name: fetch_packages
tasks_from: x86_64_build_image_completion.yml
================================================
FILE: build_image_x86_64/roles/fetch_packages/tasks/build_stream_prerequisite.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Debug - Show explicitly passed variables
ansible.builtin.debug:
msg:
- "job_id: {{ job_id | default('NOT_SET') }}"
- "image_key: {{ image_key | default('NOT_SET') }}"
- "functional_groups: {{ functional_groups | default('NOT_SET') }}"
- "enable_build_stream: {{ enable_build_stream | default('NOT_SET') }}"
verbosity: 2
- name: Set build_stream variables from explicitly passed values
ansible.builtin.set_fact:
build_stream_job_id: "{{ job_id }}"
image_key: "{{ image_key }}"
cacheable: true
- name: Normalize functional_groups input into list
ansible.builtin.set_fact:
functional_group_list: "{{ functional_groups if functional_groups is iterable and functional_groups is not string else (functional_groups | from_yaml) }}"
when: functional_groups is defined and enable_build_stream
- name: Fail when build stream enabled without job id or functional groups
ansible.builtin.fail:
msg: "{{ build_stream_prerequisite_fail_msg }}"
when:
- enable_build_stream | bool
- (build_stream_job_id | default('') | string) | length == 0 or (functional_group_list | default([]) | length == 0) or (image_key | default('') | string) | length == 0 # noqa: yaml[line-length]
================================================
FILE: build_image_x86_64/roles/fetch_packages/tasks/check_x86_64_fg.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Load functional_group_config.yml
ansible.builtin.include_vars:
file: "{{ functional_groups_config_path }}"
name: functional_group_cfg
- name: Check for x86_64 functional groups
ansible.builtin.set_fact:
fg_x86_64: >-
{{ functional_group_cfg.functional_groups
| selectattr('name', 'search', '_x86_64$')
| list
| length > 0 }}
cacheable: true
- name: Fail if x86_64 functional groups are not present
ansible.builtin.fail:
msg: "{{ functional_group_absent_msg.splitlines() | join(' ') }}"
when: not fg_x86_64
================================================
FILE: build_image_x86_64/roles/fetch_packages/tasks/fetch_packages.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Fetch x86_64 default_packages.json and additional_packages.json software packages
block:
- name: Collect base image RPM packages (default + additional + admin_debug)
base_image_package_collector:
default_json_path: "{{ default_json_path }}"
additional_json_path: "{{ additional_json_path | default('') }}"
admin_debug_json_path: "{{ admin_debug_json_path | default('') }}"
software_config_path: "{{ software_config_file_path }}"
register: base_image_output
- name: Set x86_64_base_image_packages
ansible.builtin.set_fact:
x86_64_base_image_packages: "{{ base_image_output.base_image_packages }}"
- name: Debug package x86_64_base_image_packages
ansible.builtin.debug:
var: x86_64_base_image_packages
verbosity: 2
- name: Parse functional_group_config.yml to list
functional_group_parser:
functional_groups_file: "{{ functional_groups_file_path }}"
register: functional_group_parser_list
when: not enable_build_stream
- name: Set fact for functional_group_list
ansible.builtin.set_fact:
functional_group_list: "{{ functional_group_parser_list.functional_groups }}"
when: not enable_build_stream
- name: Debug full functional group parser output
ansible.builtin.debug:
var: functional_group_list
verbosity: 2
- name: Read packages for compute image softwares
image_package_collector:
functional_groups: "{{ functional_group_list }}"
software_config_file: "{{ software_config_file_path }}"
input_project_dir: "{{ input_project_dir }}"
additional_json_path: "{{ additional_json_path }}"
register: compute_images_output
- name: Save packages for x86_64 keys in compute_images_dict
ansible.builtin.set_fact:
compute_images_dict: >-
{{
compute_images_output.compute_images_dict
| dict2items
| selectattr('key', 'search', '_x86_64$')
| items2dict
}}
- name: Debug software directory compute_images_dict
ansible.builtin.debug:
var: compute_images_dict
verbosity: 2
================================================
FILE: build_image_x86_64/roles/fetch_packages/tasks/fetch_pulp_repos.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Fetch pulp endpoints when x86_64 build_stream enabled
block:
- name: Fetch pulp endpoints for x86_64
ansible.builtin.command: >
pulp rpm distribution list --field name,base_url
register: pulp_endpoints
changed_when: false
- name: Filter only x86_64 distributions
ansible.builtin.set_fact:
pulp_x86_64_distributions: >-
{{ pulp_endpoints.stdout | from_json
| selectattr('name', 'match', '^x86_64')
| list }}
- name: Build rhel_repos list from pulp_x86_64_distributions
ansible.builtin.set_fact:
rhel_x86_64_repos: >-
{{ pulp_x86_64_distributions | map('combine', {'gpg': ''}) | list }}
- name: Debug rhel_x86_64_repos
ansible.builtin.debug:
msg: "{{ rhel_x86_64_repos | to_nice_yaml(indent=2) }}"
verbosity: 2
================================================
FILE: build_image_x86_64/roles/fetch_packages/tasks/main.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Check local_repo.yml execution
block:
- name: Check if metadata file exists
ansible.builtin.stat:
path: "{{ metadata_file_path }}"
register: metadata_file_status
- name: Fail if metadata file is not present
ansible.builtin.fail:
msg: "{{ local_repo_check_msg }}"
when: not metadata_file_status.stat.exists
- name: Initialize fg_x86_64 as false
ansible.builtin.set_fact:
fg_x86_64: "{{ fg_x86_64 | default(false) }}"
when: enable_build_stream | default(false)
- name: Include functional groups config
ansible.builtin.include_vars:
file: "{{ functional_groups_file_path }}"
name: functional_groups_config
when: not enable_build_stream
- name: Set functional_groups_file_path for build_stream disabled flow
ansible.builtin.set_fact:
functional_groups_file_path: "{{ functional_groups_file_path }}"
when: not enable_build_stream
- name: Include software config
ansible.builtin.include_vars:
file: "{{ software_config_file_path }}"
name: software_config
when: enable_build_stream | default(false)
- name: Set cluster OS facts
ansible.builtin.set_fact:
rhel_tag: "{{ software_config.cluster_os_version }}"
default_json_path: "{{ input_project_dir }}/config/x86_64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/default_packages.json" # noqa: yaml[line-length]
additional_json_path: "{{ input_project_dir }}/config/x86_64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/additional_packages.json" # noqa: yaml[line-length]
admin_debug_json_path: "{{ input_project_dir }}/config/x86_64/{{ software_config.cluster_os_type }}/{{ software_config.cluster_os_version }}/admin_debug_packages.json" # noqa: yaml[line-length]
- name: Fetch pulp endpoint repos
ansible.builtin.include_tasks: fetch_pulp_repos.yml
when: fg_x86_64 or enable_build_stream
- name: Fetch packages for base and compute image softwares
ansible.builtin.include_tasks: fetch_packages.yml
when: fg_x86_64 or enable_build_stream
================================================
FILE: build_image_x86_64/roles/fetch_packages/tasks/x86_64_build_image_completion.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Build Image completion
ansible.builtin.debug:
msg: "{{ x86_64_build_image_completion_msg.splitlines() | join(' ') }}"
================================================
FILE: build_image_x86_64/roles/fetch_packages/vars/main.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
metadata_file_path: "/opt/omnia/offline_repo/.data/localrepo_metadata.yml"
local_repo_check_msg: |
Failure: metadata file path {{ metadata_file_path }} is not present.
Please make sure that local_repo.yml playbook is executed successfully.
input_project_dir: "{{ hostvars['localhost']['input_project_dir'] }}"
functional_groups_file_path: "{{ hostvars['localhost']['functional_groups_config_path'] | default('/opt/omnia/.data/functional_groups_config.yml') }}"
software_config_file_path: "{{ input_project_dir }}/software_config.json"
x86_64_build_image_completion_msg: |
The playbook build_image_x86_64.yml has been completed successfully.
To boot x86_64 nodes execute discovery/discovery.yml playbook.
To build image for aarch64 nodes execute build_image_aarch64/build_image_aarch64.yml playbook.
functional_group_absent_msg: |
Failure: No x86_64 functional groups found in functional_group_config.yml input file.
Please make sure x86_64 functional_group should be present in input file functional_group_config.yml
to execute build_image_x86_64.yml successfully.
build_stream_prerequisite_fail_msg: |
Build Stream mode is enabled. Manual execution is not supported.
Please trigger this workflow via the GitLab pipeline.
================================================
FILE: build_image_x86_64/roles/image_creation/tasks/build_base_image.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Normalize build stream inputs for base image
ansible.builtin.set_fact:
enable_build_stream: "{{ enable_build_stream | default(false) | bool }}"
build_stream_job_id: "{{ build_stream_job_id | default('') }}"
image_key: "{{ image_key | default('') }}"
base_image_suffix: ""
- name: Set base image suffix when build stream inputs present
ansible.builtin.set_fact:
base_image_suffix: "_{{ build_stream_job_id }}-{{ image_key | default('') }}"
rhel_base_image_name: "{{ rhel_x86_64_base_image_name }}_{{ build_stream_job_id }}-{{ image_key | default('') }}"
when:
- enable_build_stream | bool
- (build_stream_job_id | default('') | length) > 0
- (image_key | default('') | length) > 0
- name: Create x86_64_base_image.log as a file
ansible.builtin.file:
path: "{{ openchami_x86_64_base_image_log_path }}"
state: touch
mode: "{{ dir_permissions_644 }}"
- name: Load the openchami image vars
ansible.builtin.template:
src: "{{ openchami_base_image_vars_template }}"
dest: "{{ openchami_x86_64_base_image_vars_path }}"
mode: "{{ dir_permissions_644 }}"
- name: Invoking Openchami playbook for rhel-base image build
ansible.builtin.shell: |
set -o pipefail
ansible-playbook {{ openchami_clone_path }}/dell/podman-quadlets/image.yaml \
-i {{ openchami_clone_path }}/dell/podman-quadlets/inventory -v \
--extra-vars "@{{ openchami_x86_64_base_image_vars_path }}" \
--tags base_image -v | \
/usr/bin/tee {{ openchami_x86_64_base_image_log_path }}
async: 3600 # Set async timeout (e.g., 1 hour)
poll: 0 # Non-blocking (continue the playbook without waiting for completion)
register: base_image_build
changed_when: true
- name: Wait for rhel-base image OpenCHAMI jobs to finish
block:
- name: Wait for rhel-base image OpenCHAMI jobs to finish
ansible.builtin.async_status:
jid: "{{ base_image_build.ansible_job_id }}"
register: job_result
until: job_result.finished
retries: "{{ job_retry }}"
delay: "{{ job_delay }}"
rescue:
- name: Fail the build if the base image build fails
ansible.builtin.fail:
msg: |
{{ base_image_failure_msg }}
always:
- name: Remove generated base image vars file
ansible.builtin.file:
path: "{{ openchami_x86_64_base_image_vars_path }}"
state: absent
- name: Set openchami SELinux context
ansible.builtin.command: chcon -R system_u:object_r:container_file_t:s0 "{{ oim_shared_path }}/omnia/openchami"
changed_when: true
delegate_to: oim
connection: ssh
failed_when: false
================================================
FILE: build_image_x86_64/roles/image_creation/tasks/build_compute_image.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Normalize build stream inputs
ansible.builtin.set_fact:
enable_build_stream: "{{ enable_build_stream | default(false) | bool }}"
build_stream_job_id: "{{ build_stream_job_id | default('') }}"
image_key: "{{ image_key | default('') }}"
compute_image_suffix: ""
- name: Set compute image suffix when build stream inputs present
ansible.builtin.set_fact:
compute_image_suffix: "_{{ build_stream_job_id }}-{{ image_key | default('') }}"
when:
- enable_build_stream | bool
- (build_stream_job_id | default('') | length) > 0
- (image_key | default('') | length) > 0
- name: Create x86_64 compute image log files
ansible.builtin.file:
path: "{{ openchami_log_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_image.log"
state: touch
mode: "{{ dir_permissions_644 }}"
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
- name: Render compute images templates
ansible.builtin.template:
src: "{{ openchami_compute_image_vars_template }}"
dest: "{{ openchami_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_images.yaml"
mode: "{{ dir_permissions_644 }}"
vars:
functional_group: "{{ item.value.functional_group }}"
packages: "{{ item.value.packages }}"
# Pre-compute image names to avoid undefined errors inside template
base_compute_image_name: "{{ item.key }}{{ compute_image_suffix }}"
rhel_base_compute_image_name: "rhel-{{ item.key }}{{ compute_image_suffix }}"
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
- name: Invoking OpenCHAMI playbooks asynchronously for x86_64 compute image_build
ansible.builtin.shell: |
set -o pipefail
ansible-playbook {{ openchami_clone_path }}/dell/podman-quadlets/image.yaml \
-i {{ openchami_clone_path }}/dell/podman-quadlets/inventory -v \
--extra-vars '@{{ openchami_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_images.yaml' \
--tags compute_image -v | \
/usr/bin/tee '{{ openchami_log_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_image.log'
async: 3600 # Set async timeout (e.g., 1 hour)
poll: 0 # Non-blocking (continue the playbook without waiting for completion)
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
register: compute_image_build_job
changed_when: true
- name: Wait for all OpenCHAMI jobs to finish and remove generated compute images templates
block:
- name: Display image build jobs status
ansible.builtin.debug:
msg: "Waiting for image build: {{ item.item.key }} (Job ID: {{ item.ansible_job_id }})"
loop: "{{ compute_image_build_job.results }}"
loop_control:
label: "{{ item.item.key }}"
- name: Wait for all OpenCHAMI jobs to finish
ansible.builtin.async_status:
jid: "{{ item.ansible_job_id }}"
register: job_result
until: job_result.finished
no_log: true
retries: "{{ job_retry }}"
delay: "{{ job_delay }}"
loop: "{{ compute_image_build_job.results }}"
loop_control:
label: "Building: {{ item.item.key }}"
rescue:
- name: Identify failed image builds
ansible.builtin.set_fact:
failed_images: >
{{ job_result.results
| selectattr('failed', 'defined')
| selectattr('failed', 'equalto', true)
| map(attribute='item.item.key')
| list }}
when: job_result.results is defined
- name: Build failure message list
ansible.builtin.set_fact:
failure_msg_list:
- "x86_64 compute image build job did not complete successfully."
- "Check logs at {{ openchami_log_dir }} for respective functional group for more details."
- ""
- "Failed images:"
- name: Add failed image names to message
ansible.builtin.set_fact:
failure_msg_list: "{{ failure_msg_list + [' - ' + item] }}"
loop: "{{ failed_images | default(['Unknown - check all logs']) }}"
- name: Add log paths section to message
ansible.builtin.set_fact:
failure_msg_list: "{{ failure_msg_list + ['', 'Check logs at ' + openchami_log_dir + ' for details:'] }}"
- name: Add log file paths to message
ansible.builtin.set_fact:
failure_msg_list: "{{ failure_msg_list + [' - ' + openchami_log_dir + '/' + item + log_suffix + '_compute_image.log'] }}"
vars:
log_suffix: "{{ compute_image_suffix }}"
loop: "{{ failed_images | default([]) }}"
- name: Display x86_64 compute image build failure details
ansible.builtin.debug:
msg: "{{ failure_msg_list }}"
- name: Failed to build the x86_64 compute image
ansible.builtin.fail:
msg: "x86_64 compute image build failed. See details above."
always:
- name: Remove generated compute images templates
ansible.builtin.file:
path: "{{ openchami_dir }}/{{ item.key }}{{ compute_image_suffix }}_compute_images.yaml"
state: absent
loop: "{{ compute_images_dict | dict2items }}"
loop_control:
loop_var: item
- name: Set openchami SELinux context
ansible.builtin.command: chcon -R system_u:object_r:container_file_t:s0 "{{ oim_shared_path }}/omnia/openchami"
changed_when: true
delegate_to: oim
connection: ssh
failed_when: false
================================================
FILE: build_image_x86_64/roles/image_creation/tasks/main.yml
================================================
# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
- name: Include metadata vars
ansible.builtin.include_vars: "{{ omnia_metadata_file }}"
register: include_metadata
no_log: true
- name: Include global variables from common folder
ansible.builtin.include_vars: "{{ role_path }}/../../../common/vars/openchami_image_cmd.yml"
register: ochami_image_global_vars
- name: Invoking x86_64 build base image playbook
ansible.builtin.include_tasks: build_base_image.yml
tags: base_image
- name: Invoking x86_64 build rhel compute image playbooks
ansible.builtin.include_tasks: build_compute_image.yml
tags: compute_image
================================================
FILE: build_image_x86_64/roles/image_creation/tasks/prepare_pulp_image.yml
================================================
# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
---
# Load network specification
- name: Load network spec file
ansible.builtin.include_vars:
file: "{{ network_spec }}"
register: include_network_spec
no_log: true
- name: Fail if network spec cannot be loaded
ansible.builtin.fail:
msg: "{{ network_spec_syntax_fail_msg }} Error: {{ include_network_spec.message }}"
when: include_network_spec is failed
# Parse network spec data
- name: Parse network spec
ansible.builtin.set_fact:
network_data: "{{ network_data | default({}) | combine({item.key: item.value}) }}"
with_dict: "{{ Networks }}"
# Set PXE IP fact
- name: Set PXE IP fact
ansible.builtin.set_fact:
oim_pxe_ip: "{{ network_data.admin_network.primary_oim_admin_ip }}"
cacheable: true
# Copy pulp certificate and update CA trust
- name: Copy pulp webserver certificate to anchors
ansible.builtin.copy:
src: "{{ pulp_webserver_cert_path }}"
dest: "{{ anchors_path }}"
mode: "{{ dir_permissions_644 }}"
become: true
- name: Update CA trust
ansible.builtin.command: update-ca-trust
register: update_ca
changed_when: false
- name: Build full Podman image path for x86_64
ansible.builtin.set_fact:
pulp_x86_image: "{{ oim_pxe_ip }}:2225/{{ pulp_x86_64_image_name }}"
- name: Pull and tag x86_64 image
block:
- name: Pull x86_64 image using Podman
containers.podman.podman_image:
name: "{{ pulp_x86_image }}"
state: present
register: pull_result
retries: "{{ pull_image_retries }}"
delay: "{{ pull_image_delay }}"
until: pull_result is not failed
changed_when: false
- name: Tag pulled image for x86_64 build
containers.podman.podman_tag:
image: "{{ pulp_x86_image }}"
target_names:
- "{{ x86_64_local_tag }}"
changed_when: false
rescue:
- name: Fail if Podman pull failed
ansible.builtin.fail:
msg: "Failed to pull image {{ pulp_x86_image }}."
================================================
FILE: build_image_x86_64/roles/image_creation/templates/base_image_template.j2
================================================
openchami_work_dir: "{{ openchami_work_dir }}"
rhel_base_image_name: "{{ rhel_x86_64_base_image_name }}"
rhel_base_image: "{{ oim_node_name }}/{{ rhel_x86_64_base_image_name
gitextract_fe371nzs/
├── .all-contributorsrc
├── .ansible-lint
├── .config/
│ ├── ansible-lint.yml
│ └── requirements.yml
├── .gitattributes
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── logo_community.md
│ ├── branch-switcher.yml
│ ├── pull_request_template.md
│ ├── stale.yml
│ └── workflows/
│ ├── ansible-lint.yml
│ └── pylint.yml
├── .gitignore
├── .metadata/
│ └── omnia_version
├── .readthedocs.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── ansible.cfg
├── build_image_aarch64/
│ ├── ansible.cfg
│ ├── build_image_aarch64.yml
│ └── roles/
│ ├── fetch_packages/
│ │ ├── tasks/
│ │ │ ├── aarch64_build_image_completion.yml
│ │ │ ├── build_stream_prerequisite.yml
│ │ │ ├── check_aarch64_fg.yml
│ │ │ ├── fetch_packages.yml
│ │ │ ├── fetch_pulp_repos.yml
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── image_creation/
│ │ ├── tasks/
│ │ │ ├── build_base_image.yml
│ │ │ ├── build_compute_image.yml
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ ├── base_image_template.j2
│ │ │ └── compute_images_templates.j2
│ │ └── vars/
│ │ └── main.yml
│ └── prepare_arm_node/
│ ├── tasks/
│ │ ├── gather_oim_data.yml
│ │ └── main.yml
│ └── vars/
│ └── main.yml
├── build_image_x86_64/
│ ├── ansible.cfg
│ ├── build_image_x86_64.yml
│ └── roles/
│ ├── fetch_packages/
│ │ ├── tasks/
│ │ │ ├── build_stream_prerequisite.yml
│ │ │ ├── check_x86_64_fg.yml
│ │ │ ├── fetch_packages.yml
│ │ │ ├── fetch_pulp_repos.yml
│ │ │ ├── main.yml
│ │ │ └── x86_64_build_image_completion.yml
│ │ └── vars/
│ │ └── main.yml
│ └── image_creation/
│ ├── tasks/
│ │ ├── build_base_image.yml
│ │ ├── build_compute_image.yml
│ │ ├── main.yml
│ │ └── prepare_pulp_image.yml
│ ├── templates/
│ │ ├── base_image_template.j2
│ │ └── compute_images_templates.j2
│ └── vars/
│ └── main.yml
├── build_stream/
│ ├── .gitignore
│ ├── README.md
│ ├── __init__.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── auth/
│ │ │ ├── __init__.py
│ │ │ ├── jwt_handler.py
│ │ │ ├── password_handler.py
│ │ │ ├── routes.py
│ │ │ ├── schemas.py
│ │ │ └── service.py
│ │ ├── build_image/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── catalog_roles/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ ├── schemas.py
│ │ │ └── service.py
│ │ ├── dependencies.py
│ │ ├── generate_input_files/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── jobs/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── local_repo/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ ├── logging_utils.py
│ │ ├── parse_catalog/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ ├── schemas.py
│ │ │ └── service.py
│ │ ├── router.py
│ │ ├── validate/
│ │ │ ├── __init__.py
│ │ │ ├── dependencies.py
│ │ │ ├── routes.py
│ │ │ └── schemas.py
│ │ └── vault_client.py
│ ├── build_stream.ini
│ ├── common/
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── constants.py
│ │ ├── logging.py
│ │ └── user_messages.py
│ ├── container.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── artifacts/
│ │ │ ├── __init__.py
│ │ │ ├── entities.py
│ │ │ ├── exceptions.py
│ │ │ ├── interfaces.py
│ │ │ ├── ports.py
│ │ │ └── value_objects.py
│ │ ├── build/
│ │ │ └── __init__.py
│ │ ├── build_image/
│ │ │ ├── __init__.py
│ │ │ ├── entities.py
│ │ │ ├── exceptions.py
│ │ │ ├── repositories.py
│ │ │ ├── services.py
│ │ │ └── value_objects.py
│ │ ├── catalog/
│ │ │ ├── ADAPTER_POLICY_GUIDE.md
│ │ │ ├── README.md
│ │ │ ├── __init__.py
│ │ │ ├── adapter.py
│ │ │ ├── adapter_policy.py
│ │ │ ├── adapter_policy_schema_consts.py
│ │ │ ├── exceptions.py
│ │ │ ├── generator.py
│ │ │ ├── models.py
│ │ │ ├── parser.py
│ │ │ ├── resources/
│ │ │ │ ├── AdapterPolicySchema.json
│ │ │ │ ├── CatalogSchema.json
│ │ │ │ ├── RootLevelSchema.json
│ │ │ │ └── adapter_policy_default.json
│ │ │ ├── test_fixtures/
│ │ │ │ ├── adapter_policy_test.json
│ │ │ │ ├── catalog_rhel.json
│ │ │ │ └── functional_layer.json
│ │ │ ├── tests/
│ │ │ │ ├── sample.py
│ │ │ │ ├── test_adapter_cli_defaults.py
│ │ │ │ ├── test_adapter_policy.py
│ │ │ │ ├── test_generator_cli_defaults.py
│ │ │ │ ├── test_generator_package_list.py
│ │ │ │ ├── test_generator_roles.py
│ │ │ │ └── test_parser_defaults.py
│ │ │ └── utils.py
│ │ ├── common/
│ │ │ └── __init__.py
│ │ ├── exceptions.py
│ │ ├── jobs/
│ │ │ ├── __init__.py
│ │ │ ├── entities/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── audit.py
│ │ │ │ ├── idempotency.py
│ │ │ │ ├── job.py
│ │ │ │ └── stage.py
│ │ │ ├── exceptions.py
│ │ │ ├── repositories.py
│ │ │ ├── services.py
│ │ │ └── value_objects.py
│ │ ├── localrepo/
│ │ │ ├── __init__.py
│ │ │ ├── entities.py
│ │ │ ├── exceptions.py
│ │ │ ├── repositories.py
│ │ │ ├── services.py
│ │ │ └── value_objects.py
│ │ ├── utils/
│ │ │ └── __init__.py
│ │ └── validate/
│ │ ├── __init__.py
│ │ ├── entities.py
│ │ ├── exceptions.py
│ │ └── services.py
│ ├── doc/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── build_image.md
│ │ ├── catalog.md
│ │ ├── jobs.md
│ │ ├── local_repo.md
│ │ └── validation.md
│ ├── generate_catalog.py
│ ├── generate_catalog_examples.py
│ ├── infra/
│ │ ├── __init__.py
│ │ ├── artifact_store/
│ │ │ ├── __init__.py
│ │ │ ├── file_artifact_store.py
│ │ │ ├── in_memory_artifact_metadata.py
│ │ │ └── in_memory_artifact_store.py
│ │ ├── db/
│ │ │ ├── __init__.py
│ │ │ ├── alembic/
│ │ │ │ ├── env.py
│ │ │ │ ├── script.py.mako
│ │ │ │ └── versions/
│ │ │ │ ├── 20260219_001_create_jobs_table.py
│ │ │ │ ├── 20260219_002_create_stages_table.py
│ │ │ │ ├── 20260219_003_create_idempotency_keys_table.py
│ │ │ │ ├── 20260219_004_create_audit_events_table.py
│ │ │ │ └── 20260219_005_create_artifact_metadata_table.py
│ │ │ ├── alembic.ini
│ │ │ ├── config.py
│ │ │ ├── mappers.py
│ │ │ ├── models.py
│ │ │ ├── repositories.py
│ │ │ └── session.py
│ │ ├── id_generator.py
│ │ └── repositories/
│ │ ├── __init__.py
│ │ ├── in_memory.py
│ │ ├── nfs_build_image_inventory_repository.py
│ │ ├── nfs_input_repository.py
│ │ ├── nfs_playbook_queue_request_repository.py
│ │ └── nfs_playbook_queue_result_repository.py
│ ├── main.py
│ ├── orchestrator/
│ │ ├── __init__.py
│ │ ├── build_image/
│ │ │ ├── __init__.py
│ │ │ ├── commands/
│ │ │ │ ├── __init__.py
│ │ │ │ └── create_build_image.py
│ │ │ ├── dtos/
│ │ │ │ ├── __init__.py
│ │ │ │ └── build_image_response.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ └── create_build_image.py
│ │ ├── catalog/
│ │ │ ├── commands/
│ │ │ │ ├── generate_input_files.py
│ │ │ │ └── parse_catalog.py
│ │ │ ├── dtos.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ ├── generate_input_files.py
│ │ │ └── parse_catalog.py
│ │ ├── common/
│ │ │ ├── __init__.py
│ │ │ └── result_poller.py
│ │ ├── jobs/
│ │ │ ├── __init__.py
│ │ │ ├── commands/
│ │ │ │ ├── __init__.py
│ │ │ │ └── create_job.py
│ │ │ ├── dtos/
│ │ │ │ ├── __init__.py
│ │ │ │ └── job_response.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ └── create_job.py
│ │ ├── local_repo/
│ │ │ ├── __init__.py
│ │ │ ├── commands/
│ │ │ │ ├── __init__.py
│ │ │ │ └── create_local_repo.py
│ │ │ ├── dtos/
│ │ │ │ ├── __init__.py
│ │ │ │ └── local_repo_response.py
│ │ │ ├── result_poller.py
│ │ │ └── use_cases/
│ │ │ ├── __init__.py
│ │ │ └── create_local_repo.py
│ │ └── validate/
│ │ ├── __init__.py
│ │ ├── commands/
│ │ │ ├── __init__.py
│ │ │ └── validate_image_on_test.py
│ │ ├── dtos/
│ │ │ ├── __init__.py
│ │ │ └── validate_image_on_test_response.py
│ │ └── use_cases/
│ │ ├── __init__.py
│ │ └── validate_image_on_test.py
│ ├── playbook-watcher/
│ │ └── playbook_watcher_service.py
│ ├── pytest.ini
│ ├── requirements-dev.txt
│ ├── requirements.txt
│ ├── scripts/
│ │ └── generate_jwt_keys.sh
│ ├── tests/
│ │ ├── README.md
│ │ ├── __init__.py
│ │ ├── conftest.py
│ │ ├── demo/
│ │ │ └── buildstream_demo.py
│ │ ├── end_to_end/
│ │ │ └── api/
│ │ │ ├── conftest.py
│ │ │ ├── test_api_flow_e2e.py
│ │ │ ├── test_build_image_e2e.py
│ │ │ ├── test_generate_input_files_e2e.py
│ │ │ ├── test_parse_catalog_e2e.py
│ │ │ ├── test_register_e2e.py
│ │ │ └── test_token_e2e.py
│ │ ├── integration/
│ │ │ ├── api/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_register.py
│ │ │ │ │ └── test_token.py
│ │ │ │ ├── build_image/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ └── test_build_image_api.py
│ │ │ │ ├── catalog_roles/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ └── test_catalog_roles_api.py
│ │ │ │ ├── conftest.py
│ │ │ │ ├── generate_input_files/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_generate_input_files_api.py
│ │ │ │ │ ├── test_generate_input_files_artifact_integration.py
│ │ │ │ │ └── test_generate_input_files_routes.py
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_create_job_api.py
│ │ │ │ │ ├── test_delete_job_api.py
│ │ │ │ │ └── test_get_job_api.py
│ │ │ │ ├── local_repo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_create_local_repo_api.py
│ │ │ │ │ └── test_create_local_repo_edge_cases.py
│ │ │ │ ├── parse_catalog/
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_parse_catalog_api.py
│ │ │ │ │ ├── test_parse_catalog_artifact_integration.py
│ │ │ │ │ └── test_parse_catalog_routes.py
│ │ │ │ └── validate/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_models.py
│ │ │ │ └── test_validate_image_on_test_api.py
│ │ │ ├── conftest.py
│ │ │ ├── core/
│ │ │ │ └── catalog/
│ │ │ │ ├── test_adapter_cli_defaults.py
│ │ │ │ ├── test_adapter_policy.py
│ │ │ │ ├── test_generator_cli_defaults.py
│ │ │ │ ├── test_generator_package_list.py
│ │ │ │ └── test_generator_roles.py
│ │ │ └── infra/
│ │ │ ├── artifact_store/
│ │ │ │ └── test_file_artifact_store.py
│ │ │ └── db/
│ │ │ ├── conftest.py
│ │ │ └── test_sql_repositories.py
│ │ ├── mocks/
│ │ │ ├── __init__.py
│ │ │ ├── mock_jwt_handler.py
│ │ │ └── mock_vault_client.py
│ │ ├── others/
│ │ │ ├── __init__.py
│ │ │ └── test_dependency_rules.py
│ │ ├── performance/
│ │ │ └── test_local_repo_performance.py
│ │ ├── unit/
│ │ │ ├── __init__.py
│ │ │ ├── api/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── test_password_handler.py
│ │ │ │ │ ├── test_service.py
│ │ │ │ │ └── test_token_service.py
│ │ │ │ ├── build_image/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── test_routes.py
│ │ │ │ ├── catalog_roles/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ └── test_catalog_roles_service.py
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── test_dependencies.py
│ │ │ │ │ └── test_schemas.py
│ │ │ │ ├── local_repo/
│ │ │ │ │ ├── test_local_repo_dependencies.py
│ │ │ │ │ ├── test_local_repo_schemas.py
│ │ │ │ │ └── test_routes.py
│ │ │ │ └── validate/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_routes.py
│ │ │ ├── core/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── artifacts/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ ├── build_image/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_entities.py
│ │ │ │ │ ├── test_services.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ ├── catalog/
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ ├── test_generate_software_config.py
│ │ │ │ │ ├── test_parser.py
│ │ │ │ │ └── test_parser_defaults.py
│ │ │ │ ├── jobs/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── entities/
│ │ │ │ │ │ ├── __init__.py
│ │ │ │ │ │ ├── conftest.py
│ │ │ │ │ │ ├── test_audit.py
│ │ │ │ │ │ ├── test_idempotency.py
│ │ │ │ │ │ ├── test_job.py
│ │ │ │ │ │ └── test_stage.py
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ ├── localrepo/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── test_entities.py
│ │ │ │ │ ├── test_exceptions.py
│ │ │ │ │ ├── test_services.py
│ │ │ │ │ └── test_value_objects.py
│ │ │ │ └── validate/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── test_entities.py
│ │ │ │ ├── test_exceptions.py
│ │ │ │ └── test_services.py
│ │ │ ├── infra/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── artifact_store/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── conftest.py
│ │ │ │ │ ├── test_in_memory_artifact_metadata.py
│ │ │ │ │ └── test_in_memory_artifact_store.py
│ │ │ │ ├── db/
│ │ │ │ │ ├── test_mappers.py
│ │ │ │ │ └── test_repositories_unit.py
│ │ │ │ ├── test_id_generator.py
│ │ │ │ ├── test_nfs_input_directory_repository.py
│ │ │ │ ├── test_nfs_playbook_queue_result_service.py
│ │ │ │ └── test_nfs_repositories.py
│ │ │ └── orchestrator/
│ │ │ ├── __init__.py
│ │ │ ├── build_image/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_create_build_image_use_case.py
│ │ │ ├── catalog/
│ │ │ │ ├── conftest.py
│ │ │ │ ├── test_generate_input_files_command.py
│ │ │ │ ├── test_generate_input_files_use_case.py
│ │ │ │ ├── test_parse_catalog_command.py
│ │ │ │ └── test_parse_catalog_use_case.py
│ │ │ ├── common/
│ │ │ │ ├── __init__.py
│ │ │ │ └── test_result_poller.py
│ │ │ ├── jobs/
│ │ │ │ ├── __init__.py
│ │ │ │ └── use_cases/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── conftest.py
│ │ │ │ └── test_create_job.py
│ │ │ ├── local_repo/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── test_commands.py
│ │ │ │ ├── test_dtos.py
│ │ │ │ ├── test_result_poller.py
│ │ │ │ └── test_use_case.py
│ │ │ └── validate/
│ │ │ ├── __init__.py
│ │ │ └── test_validate_image_on_test_use_case.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ └── test_data.py
│ └── utils/
│ └── __init__.py
├── common/
│ ├── library/
│ │ ├── module_utils/
│ │ │ ├── build_image/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common_functions.py
│ │ │ │ └── config.py
│ │ │ ├── discovery/
│ │ │ │ ├── __init__.py
│ │ │ │ └── standard_functions.py
│ │ │ ├── input_validation/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── common_utils/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── config.py
│ │ │ │ │ ├── data_fetch.py
│ │ │ │ │ ├── data_validation.py
│ │ │ │ │ ├── data_verification.py
│ │ │ │ │ ├── en_us_validation_msg.py
│ │ │ │ │ ├── logical_validation.py
│ │ │ │ │ ├── slurm_conf_utils.py
│ │ │ │ │ ├── timezone.txt
│ │ │ │ │ └── validation_utils.py
│ │ │ │ ├── schema/
│ │ │ │ │ ├── __init__.py
│ │ │ │ │ ├── additional_software.json
│ │ │ │ │ ├── build_stream_config.json
│ │ │ │ │ ├── credential_rules.json
│ │ │ │ │ ├── functional_groups_config.json
│ │ │ │ │ ├── gitlab_config.json
│ │ │ │ │ ├── high_availability_config.json
│ │ │ │ │ ├── k8s_scheduler.json
│ │ │ │ │ ├── local_repo_config.json
│ │ │ │ │ ├── network_spec.json
│ │ │ │ │ ├── omnia_config.json
│ │ │ │ │ ├── provision_config.json
│ │ │ │ │ ├── security_config.json
│ │ │ │ │ ├── slurm_config_parameters.json
│ │ │ │ │ ├── software_config.json
│ │ │ │ │ ├── storage_config.json
│ │ │ │ │ └── telemetry_config.json
│ │ │ │ └── validation_flows/
│ │ │ │ ├── __init__.py
│ │ │ │ ├── build_stream_validation.py
│ │ │ │ ├── common_validation.py
│ │ │ │ ├── csi_driver_validation.py
│ │ │ │ ├── gitlab_validation.py
│ │ │ │ ├── high_availability_validation.py
│ │ │ │ ├── local_repo_validation.py
│ │ │ │ ├── provision_validation.py
│ │ │ │ └── scheduler_validation.py
│ │ │ └── local_repo/
│ │ │ ├── __init__.py
│ │ │ ├── common_functions.py
│ │ │ ├── config.py
│ │ │ ├── container_repo_utils.py
│ │ │ ├── download_common.py
│ │ │ ├── download_image.py
│ │ │ ├── download_rpm.py
│ │ │ ├── parse_and_download.py
│ │ │ ├── process_metadata.py
│ │ │ ├── process_parallel.py
│ │ │ ├── registry_utils.py
│ │ │ ├── rest_client.py
│ │ │ ├── software_utils.py
│ │ │ ├── standard_logger.py
│ │ │ ├── user_image_utility.py
│ │ │ └── validate_utils.py
│ │ └── modules/
│ │ ├── additional_images_collector.py
│ │ ├── base_image_package_collector.py
│ │ ├── cert_vault_handler.py
│ │ ├── check_user_registry.py
│ │ ├── delete_idracips_from_mysqldb.py
│ │ ├── disable_idrac_telemetry.py
│ │ ├── enable_telemetry_service.py
│ │ ├── fetch_credential_rule.py
│ │ ├── fetch_idrac_ips.py
│ │ ├── fetch_mapping_details.py
│ │ ├── fetch_roles_config.py
│ │ ├── fetch_software_arch.py
│ │ ├── fetch_telemetry_status.py
│ │ ├── functional_group_parser.py
│ │ ├── generate_argon2_password.py
│ │ ├── generate_functional_groups.py
│ │ ├── generate_ssha_password.py
│ │ ├── generate_xname_in_mapping_file.py
│ │ ├── get_service_cluster_info.py
│ │ ├── group_package_map.py
│ │ ├── idrac_telemetry_filter.py
│ │ ├── image_package_collector.py
│ │ ├── insert_idracips_mysqldb.py
│ │ ├── localrepo_metadata_manager.py
│ │ ├── parallel_file_copy.py
│ │ ├── parallel_tasks.py
│ │ ├── prepare_tasklist.py
│ │ ├── process_rpm_config.py
│ │ ├── pulp_cleanup.py
│ │ ├── read_idracips_from_mysqldb.py
│ │ ├── slurm_conf.py
│ │ ├── update_bmc_group_entry.py
│ │ ├── validate_bmc_group_data.py
│ │ ├── validate_credentials.py
│ │ ├── validate_input.py
│ │ └── validate_user_repo.py
│ ├── tasks/
│ │ ├── common/
│ │ │ ├── decrypt_include_encrypt.yml
│ │ │ ├── get_container_image_list.yml
│ │ │ ├── openchami_auth.yml
│ │ │ └── validate_image_tars.yml
│ │ ├── provision/
│ │ │ └── main.yml
│ │ ├── scheduler/
│ │ │ └── main.yml
│ │ └── telemetry/
│ │ └── main.yml
│ └── vars/
│ ├── common_messages.yml
│ ├── common_vars.yml
│ ├── encrypt_files_vars.yml
│ ├── image_vars.yml
│ ├── openchami_image_cmd.yml
│ ├── openchami_vars.yml
│ ├── provision_messages.yml
│ ├── provision_vars.yml
│ ├── scheduler_messages.yml
│ ├── scheduler_vars.yml
│ ├── telemetry_messages.yml
│ └── telemetry_vars.yml
├── discovery/
│ ├── ansible.cfg
│ ├── discovery.yml
│ └── roles/
│ ├── README.md
│ ├── configure_ochami/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ ├── configure_bss_cloud_init.yml
│ │ │ ├── configure_bss_group.yml
│ │ │ ├── configure_cloud_init_common.yml
│ │ │ ├── configure_cloud_init_group.yml
│ │ │ ├── create_groups.yml
│ │ │ ├── create_groups_common.yml
│ │ │ ├── delete_smd_config.yml
│ │ │ ├── discover_mapping_nodes.yml
│ │ │ ├── discovery_completion.yml
│ │ │ ├── fetch_additional_images.yml
│ │ │ ├── main.yml
│ │ │ └── update_smd_groups.yaml
│ │ ├── templates/
│ │ │ ├── bss/
│ │ │ │ └── bss.yaml.j2
│ │ │ ├── cloud_init/
│ │ │ │ ├── ci-defaults.yaml.j2
│ │ │ │ ├── ci-group-common.yaml.j2
│ │ │ │ ├── ci-group-default_x86_64.yaml.j2
│ │ │ │ ├── ci-group-login_compiler_node_aarch64.yaml.j2
│ │ │ │ ├── ci-group-login_compiler_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-login_node_aarch64.yaml.j2
│ │ │ │ ├── ci-group-login_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-service_kube_control_plane_first_x86_64.yaml.j2
│ │ │ │ ├── ci-group-service_kube_control_plane_x86_64.yaml.j2
│ │ │ │ ├── ci-group-service_kube_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-slurm_control_node_x86_64.yaml.j2
│ │ │ │ ├── ci-group-slurm_node_aarch64.yaml.j2
│ │ │ │ └── ci-group-slurm_node_x86_64.yaml.j2
│ │ │ ├── doca-ofed/
│ │ │ │ ├── configure-ib-network.sh.j2
│ │ │ │ └── doca-install.sh.j2
│ │ │ ├── hpc_tools/
│ │ │ │ ├── configure_nvhpc_env.sh.j2
│ │ │ │ ├── configure_ucx_openmpi_env.sh.j2
│ │ │ │ ├── export_nvhpc_env.sh.j2
│ │ │ │ ├── install_nvhpc_sdk.sh.j2
│ │ │ │ ├── install_openmpi.sh.j2
│ │ │ │ ├── install_ucx.sh.j2
│ │ │ │ └── setup_nvhpc_sdk.sh.j2
│ │ │ ├── ldms/
│ │ │ │ └── ldms_sampler.sh.j2
│ │ │ ├── nodes/
│ │ │ │ ├── apptainer_mirror.conf.j2
│ │ │ │ ├── bmc_group_data.csv.j2
│ │ │ │ ├── groups.yaml.j2
│ │ │ │ ├── groups_common.yaml.j2
│ │ │ │ ├── hostname.yaml.j2
│ │ │ │ └── nodes.yaml.j2
│ │ │ ├── openldap/
│ │ │ │ ├── sssd.conf.j2
│ │ │ │ └── update_ldap_conf.sh.j2
│ │ │ ├── pull_additional_images.yaml.j2
│ │ │ ├── slurm/
│ │ │ │ └── check_slurm_controller_status.sh.j2
│ │ │ └── telemetry/
│ │ │ └── telemetry.sh.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── discovery_validations/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ ├── build_stream_prerequisite.yml
│ │ │ ├── include_inputs.yml
│ │ │ ├── include_software_config.yml
│ │ │ ├── main.yml
│ │ │ ├── update_hosts.yml
│ │ │ ├── validate_image.yml
│ │ │ ├── validate_mapping_file.yml
│ │ │ ├── validate_mapping_mechanism.yml
│ │ │ ├── validate_oim_timezone.yml
│ │ │ ├── validate_openldap_container.yml
│ │ │ └── validate_telemetry_config.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── k8s_config/
│ │ ├── README.md
│ │ ├── files/
│ │ │ └── empty_certificate_template.yml
│ │ ├── tasks/
│ │ │ ├── create_k8s_config_nfs.yml
│ │ │ ├── create_node_dir.yml
│ │ │ ├── get_powerscale_dependencies.yml
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ └── ps_storage_class.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── nfs_client/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ ├── main.yml
│ │ │ └── nfs_client.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── openldap/
│ │ ├── README.md
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── passwordless_ssh/
│ │ ├── tasks/
│ │ │ ├── build_host_lists.yml
│ │ │ ├── configure_oim_ssh.yml
│ │ │ ├── main.yml
│ │ │ └── read_nodes_yaml.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── slurm_config/
│ │ ├── README.md
│ │ ├── defaults/
│ │ │ └── main.yml
│ │ ├── tasks/
│ │ │ ├── backup_conf.yml
│ │ │ ├── build_slurm_conf.yml
│ │ │ ├── check_ctld_running.yml
│ │ │ ├── confs.yml
│ │ │ ├── create_slurm_dir.yml
│ │ │ ├── detect_busy_nodes.yml
│ │ │ ├── drain_and_remove_node.yml
│ │ │ ├── exist_dir.yml
│ │ │ ├── extract_path_overrides.yml
│ │ │ ├── handle_extra_confs.yml
│ │ │ ├── hpc_tools.yml
│ │ │ ├── main.yml
│ │ │ ├── openldap_config.yml
│ │ │ ├── read_node_homogeneous.yml
│ │ │ ├── read_node_idrac.yml
│ │ │ ├── read_node_idrac_group.yml
│ │ │ ├── read_slurm_hostnames.yml
│ │ │ ├── remove_node.yml
│ │ │ ├── storage.yml
│ │ │ ├── update_hosts_munge.yml
│ │ │ └── validate_path_overrides.yml
│ │ ├── templates/
│ │ │ ├── all_other.conf.j2
│ │ │ ├── container_image.list.j2
│ │ │ ├── download_container_image.sh.j2
│ │ │ ├── logout_user.sh.j2
│ │ │ └── mariadb-server.cnf.j2
│ │ └── vars/
│ │ └── main.yml
│ └── telemetry/
│ ├── README.md
│ ├── files/
│ │ └── nersc-ldms-aggr/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── health_check.bash
│ │ ├── host_map.slurm-cluster.json
│ │ ├── make_host_map.bash
│ │ ├── make_host_map.dell.py
│ │ ├── manifest.yaml.in
│ │ ├── mkmanifest.py
│ │ ├── nersc-ldms-aggr/
│ │ │ ├── Chart.yaml
│ │ │ └── templates/
│ │ │ ├── NetworkAttachmentDefinition.yaml
│ │ │ ├── Service.nersc-ldms-agg.yaml
│ │ │ ├── Service.nersc-ldms-store.yaml
│ │ │ ├── Statefulset.nersc-ldms-agg.yaml
│ │ │ └── Statefulset.nersc-ldms-store.yaml
│ │ ├── nersc_ldms_make_ldms_config.py
│ │ └── scripts/
│ │ ├── decomp.json
│ │ ├── kafka.conf
│ │ ├── ldms_ls.bash
│ │ ├── ldms_msg_publish.py
│ │ ├── ldms_msg_subscribe.py
│ │ ├── ldms_stats.bash
│ │ ├── ldmsd.bash
│ │ ├── ldmsd_stream.bash
│ │ └── start_munge.bash
│ ├── tasks/
│ │ ├── apply_telemetry_on_upgrade.yml
│ │ ├── check_pxe_changes.yml
│ │ ├── generate_service_cluster_metadata.yml
│ │ ├── generate_telemetry_deployments.yml
│ │ ├── load_service_images.yml
│ │ ├── main.yml
│ │ ├── read_software_config.yml
│ │ ├── restart_ldms_configs.yml
│ │ ├── telemetry_prereq.yml
│ │ ├── update_ldms_agg_config.yml
│ │ ├── update_ldms_sampler.yml
│ │ └── validate_idrac_inventory.yml
│ ├── templates/
│ │ └── telemetry/
│ │ ├── cleanup_telemetry.sh.j2
│ │ ├── common/
│ │ │ ├── telemetry_cleaner_rbac.yaml.j2
│ │ │ ├── telemetry_namespace_creation.yaml.j2
│ │ │ ├── telemetry_pod_cleanup.yaml.j2
│ │ │ └── telemetry_secret_creation.yaml.j2
│ │ ├── idrac_telemetry/
│ │ │ └── idrac_telemetry_statefulset.yaml.j2
│ │ ├── kafka/
│ │ │ ├── kafka.kafka.yaml.j2
│ │ │ ├── kafka.kafka_bridge.yaml.j2
│ │ │ ├── kafka.kafka_bridge_lb.yaml.j2
│ │ │ ├── kafka.kafkapump_user.yaml.j2
│ │ │ ├── kafka.tls_test_job.yaml.j2
│ │ │ └── kafka.topic.yaml.j2
│ │ ├── kustomization.yaml.j2
│ │ ├── ldms/
│ │ │ ├── host_map.slurm-cluster.json.j2
│ │ │ ├── ldms_machine_config.json.j2
│ │ │ ├── ldmsauth.conf.j2
│ │ │ ├── ldmsd.sampler.env.j2
│ │ │ ├── sampler.conf.j2
│ │ │ └── values.yaml.j2
│ │ └── victoria/
│ │ ├── gen_victoria_certs.sh.j2
│ │ ├── victoria-agent-deployment.yaml.j2
│ │ ├── victoria-cluster-vminsert.yaml.j2
│ │ ├── victoria-cluster-vmselect.yaml.j2
│ │ ├── victoria-cluster-vmstorage.yaml.j2
│ │ ├── victoria-statefulset.yaml.j2
│ │ ├── victoria-tls-secret.yaml.j2
│ │ ├── victoria-tls-test-job.yaml.j2
│ │ ├── victoria-vmagent-rbac.yaml.j2
│ │ └── vmagent-scrape-config.yaml.j2
│ └── vars/
│ └── main.yml
├── docs/
│ └── README.rst
├── examples/
│ ├── catalog/
│ │ ├── catalog_rhel.json
│ │ ├── catalog_rhel_aarch64_with_slurm_only.json
│ │ ├── catalog_rhel_with_ucx_openmpi.json
│ │ ├── catalog_rhel_x86_64_with_slurm_only.json
│ │ └── mapping_file_software_config/
│ │ ├── catalog_rhel_aarch64_with_slurm_only_json/
│ │ │ ├── pxe_mapping_file.csv
│ │ │ └── software_config.json
│ │ ├── catalog_rhel_json/
│ │ │ ├── pxe_mapping_file.csv
│ │ │ └── software_config.json
│ │ ├── catalog_rhel_with_ucx_openmpi_json/
│ │ │ ├── pxe_mapping_file.csv
│ │ │ └── software_config.json
│ │ └── catalog_rhel_x86_64_with_slurm_only_json/
│ │ ├── pxe_mapping_file.csv
│ │ └── software_config.json
│ ├── input_template/
│ │ └── bare_metal_slurm/
│ │ ├── aarch64/
│ │ │ ├── with_service_k8s/
│ │ │ │ ├── only_login_compiler_node/
│ │ │ │ │ ├── high_availability_config.yml
│ │ │ │ │ ├── local_repo_config.yml
│ │ │ │ │ ├── network_spec.yml
│ │ │ │ │ ├── omnia_config.yml
│ │ │ │ │ ├── provision_config.yml
│ │ │ │ │ ├── security_config.yml
│ │ │ │ │ ├── software_config.json
│ │ │ │ │ ├── storage_config.yml
│ │ │ │ │ ├── telemetry_config.yml
│ │ │ │ │ └── user_registry_credential.yml
│ │ │ │ └── only_login_node/
│ │ │ │ ├── high_availability_config.yml
│ │ │ │ ├── local_repo_config.yml
│ │ │ │ ├── network_spec.yml
│ │ │ │ ├── omnia_config.yml
│ │ │ │ ├── provision_config.yml
│ │ │ │ ├── security_config.yml
│ │ │ │ ├── software_config.json
│ │ │ │ ├── storage_config.yml
│ │ │ │ ├── telemetry_config.yml
│ │ │ │ └── user_registry_credential.yml
│ │ │ └── without_service_k8s/
│ │ │ ├── only_login_compiler_node/
│ │ │ │ ├── high_availability_config.yml
│ │ │ │ ├── local_repo_config.yml
│ │ │ │ ├── network_spec.yml
│ │ │ │ ├── omnia_config.yml
│ │ │ │ ├── provision_config.yml
│ │ │ │ ├── security_config.yml
│ │ │ │ ├── software_config.json
│ │ │ │ ├── storage_config.yml
│ │ │ │ ├── telemetry_config.yml
│ │ │ │ └── user_registry_credential.yml
│ │ │ └── only_login_node/
│ │ │ ├── high_availability_config.yml
│ │ │ ├── local_repo_config.yml
│ │ │ ├── network_spec.yml
│ │ │ ├── omnia_config.yml
│ │ │ ├── provision_config.yml
│ │ │ ├── security_config.yml
│ │ │ ├── software_config.json
│ │ │ ├── storage_config.yml
│ │ │ ├── telemetry_config.yml
│ │ │ └── user_registry_credential.yml
│ │ └── x86_64/
│ │ ├── with_service_k8s/
│ │ │ ├── only_login_compiler_node/
│ │ │ │ ├── high_availability_config.yml
│ │ │ │ ├── local_repo_config.yml
│ │ │ │ ├── network_spec.yml
│ │ │ │ ├── omnia_config.yml
│ │ │ │ ├── provision_config.yml
│ │ │ │ ├── security_config.yml
│ │ │ │ ├── software_config.json
│ │ │ │ ├── storage_config.yml
│ │ │ │ ├── telemetry_config.yml
│ │ │ │ └── user_registry_credential.yml
│ │ │ └── only_login_node/
│ │ │ ├── high_availability_config.yml
│ │ │ ├── local_repo_config.yml
│ │ │ ├── network_spec.yml
│ │ │ ├── omnia_config.yml
│ │ │ ├── provision_config.yml
│ │ │ ├── security_config.yml
│ │ │ ├── software_config.json
│ │ │ ├── storage_config.yml
│ │ │ ├── telemetry_config.yml
│ │ │ └── user_registry_credential.yml
│ │ └── without_service_k8s/
│ │ ├── only_login_compiler_node/
│ │ │ ├── high_availability_config.yml
│ │ │ ├── local_repo_config.yml
│ │ │ ├── network_spec.yml
│ │ │ ├── omnia_config.yml
│ │ │ ├── provision_config.yml
│ │ │ ├── security_config.yml
│ │ │ ├── software_config.json
│ │ │ ├── storage_config.yml
│ │ │ ├── telemetry_config.yml
│ │ │ └── user_registry_credential.yml
│ │ └── only_login_node/
│ │ ├── high_availability_config.yml
│ │ ├── local_repo_config.yml
│ │ ├── network_spec.yml
│ │ ├── omnia_config.yml
│ │ ├── provision_config.yml
│ │ ├── security_config.yml
│ │ ├── software_config.json
│ │ ├── storage_config.yml
│ │ ├── telemetry_config.yml
│ │ └── user_registry_credential.yml
│ ├── inventory/
│ │ └── bmc_inventory_file
│ ├── pxe_mapping_file.csv
│ ├── rhel_software_config.json
│ ├── slurm_conf/
│ │ ├── cgroup.conf
│ │ ├── slurm.conf
│ │ └── slurmdbd.conf
│ └── software_config_template/
│ ├── template_rhel_10.0_multi_arch_software_config.json
│ └── template_rhel_10.0_x86-64_software_config.json
├── gitlab/
│ ├── ansible.cfg
│ ├── cleanup_gitlab.yml
│ ├── gitlab.yml
│ └── roles/
│ ├── cleanup_gitlab/
│ │ ├── tasks/
│ │ │ ├── cleanup_buildstream_oauth.yml
│ │ │ ├── cleanup_cicd.yml
│ │ │ ├── cleanup_credentials.yml
│ │ │ ├── cleanup_directories.yml
│ │ │ ├── cleanup_packages.yml
│ │ │ ├── cleanup_runner.yml
│ │ │ ├── cleanup_services.yml
│ │ │ ├── cleanup_summary.yml
│ │ │ ├── cleanup_tls.yml
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── gitlab_passwordless_ssh/
│ │ ├── files/
│ │ │ └── check_gitlab_port.sh
│ │ ├── tasks/
│ │ │ ├── authorize_key.yml
│ │ │ ├── generate_keypair.yml
│ │ │ ├── main.yml
│ │ │ ├── prereq_checks.yml
│ │ │ └── validate_ssh.yml
│ │ └── vars/
│ │ └── main.yml
│ └── hosted_gitlab/
│ ├── files/
│ │ └── .gitlab-ci.yml
│ ├── tasks/
│ │ ├── check_oim_prerequisites.yml
│ │ ├── configure_firewall.yml
│ │ ├── configure_gitlab.yml
│ │ ├── create_directories.yml
│ │ ├── create_project.yml
│ │ ├── create_trigger.yml
│ │ ├── deploy_runner.yml
│ │ ├── display_summary.yml
│ │ ├── generate_tls_certs.yml
│ │ ├── install_gitlab.yml
│ │ ├── install_packages.yml
│ │ ├── main.yml
│ │ ├── podman_login.yml
│ │ ├── prereq_checks.yml
│ │ ├── push_ci_files.yml
│ │ ├── root_password_change.yml
│ │ ├── set_pipeline_variables.yml
│ │ └── validate_prerequisites.yml
│ ├── templates/
│ │ ├── gitlab.rb.j2
│ │ ├── gitlab_runner.container.j2
│ │ └── san.cnf.j2
│ └── vars/
│ └── main.yml
├── input/
│ ├── build_stream_config.yml
│ ├── config/
│ │ ├── aarch64/
│ │ │ └── rhel/
│ │ │ └── 10.0/
│ │ │ ├── additional_packages.json
│ │ │ ├── admin_debug_packages.json
│ │ │ ├── default_packages.json
│ │ │ ├── ldms.json
│ │ │ ├── openldap.json
│ │ │ ├── openmpi.json
│ │ │ ├── slurm_custom.json
│ │ │ └── ucx.json
│ │ └── x86_64/
│ │ └── rhel/
│ │ └── 10.0/
│ │ ├── additional_packages.json
│ │ ├── admin_debug_packages.json
│ │ ├── csi_driver_powerscale.json
│ │ ├── default_packages.json
│ │ ├── ldms.json
│ │ ├── openldap.json
│ │ ├── openmpi.json
│ │ ├── service_k8s.json
│ │ ├── slurm_custom.json
│ │ └── ucx.json
│ ├── gitlab_config.yml
│ ├── high_availability_config.yml
│ ├── local_repo_config.yml
│ ├── network_spec.yml
│ ├── omnia_config.yml
│ ├── provision_config.yml
│ ├── pxe_mapping_file.csv
│ ├── security_config.yml
│ ├── software_config.json
│ ├── storage_config.yml
│ ├── telemetry_config.yml
│ └── user_registry_credential.yml
├── input_validation/
│ ├── ansible.cfg
│ ├── roles/
│ │ ├── validate_input/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── validate_subscription/
│ │ ├── tasks/
│ │ │ ├── check_rhel_subscription.yml
│ │ │ └── configure_rhel_os_urls.yml
│ │ └── vars/
│ │ └── main.yml
│ └── validate_config.yml
├── local_repo/
│ ├── ansible.cfg
│ ├── local_repo.yml
│ ├── pulp_cleanup.yml
│ └── roles/
│ ├── parse_and_download/
│ │ ├── tasks/
│ │ │ ├── arch_component_loop.yml
│ │ │ ├── create_metadata.yml
│ │ │ ├── execute_parallel_tasks.yml
│ │ │ ├── localrepo_completion.yml
│ │ │ ├── main.yml
│ │ │ └── process_rpm_repo.yml
│ │ ├── templates/
│ │ │ └── local_repo_access.yml.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── pulp_validation/
│ │ ├── tasks/
│ │ │ ├── check_pulp_status.yml
│ │ │ ├── main.yml
│ │ │ └── read_network_spec.yml
│ │ └── vars/
│ │ └── main.yml
│ └── validation/
│ ├── tasks/
│ │ ├── check_additional_packages_images.yml
│ │ ├── check_images_per_arch.yml
│ │ ├── display_msg.yml
│ │ ├── main.yml
│ │ ├── prerequisites.yml
│ │ ├── validate_metadata.yml
│ │ └── validate_software_config_json.yml
│ └── vars/
│ └── main.yml
├── omnia.sh
├── prepare_oim/
│ ├── ansible.cfg
│ ├── prepare_oim.yml
│ └── roles/
│ ├── deploy_containers/
│ │ ├── auth/
│ │ │ ├── files/
│ │ │ │ ├── bootstrap.ldif
│ │ │ │ └── slapd.conf
│ │ │ ├── tasks/
│ │ │ │ ├── configure_bootstrap_ldif.yml
│ │ │ │ ├── configure_slapd_conf.yml
│ │ │ │ ├── deploy_auth_service.yml
│ │ │ │ ├── generate_ldap_password_hashes.yml
│ │ │ │ ├── include_security_config.yml
│ │ │ │ └── main.yml
│ │ │ ├── templates/
│ │ │ │ └── auth.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── build_stream/
│ │ │ ├── handlers/
│ │ │ │ └── main.yml
│ │ │ ├── tasks/
│ │ │ │ ├── deploy_build_stream.yml
│ │ │ │ ├── enable_watcher_service.yml
│ │ │ │ └── main.yml
│ │ │ ├── templates/
│ │ │ │ ├── build_stream.j2
│ │ │ │ └── playbook_watcher.service.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── common/
│ │ │ ├── tasks/
│ │ │ │ ├── aarch64_prereq.yml
│ │ │ │ ├── add_known_hosts.yml
│ │ │ │ ├── configure_chrony.yml
│ │ │ │ ├── firewall_settings.yml
│ │ │ │ ├── main.yml
│ │ │ │ ├── omnia_service.yml
│ │ │ │ ├── package_installation.yml
│ │ │ │ ├── podman_login.yml
│ │ │ │ └── prepare_oim_completion.yml
│ │ │ ├── templates/
│ │ │ │ ├── bmc_group_data.j2
│ │ │ │ └── omnia.service.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── openchami/
│ │ │ ├── tasks/
│ │ │ │ ├── deploy_openchami.yml
│ │ │ │ ├── deployment_prereq.yml
│ │ │ │ ├── main.yml
│ │ │ │ └── verify_openchami.yml
│ │ │ ├── templates/
│ │ │ │ ├── configs.yaml.j2
│ │ │ │ └── inventory.yaml.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── postgres/
│ │ │ ├── tasks/
│ │ │ │ ├── deploy_postgres.yml
│ │ │ │ └── main.yml
│ │ │ ├── templates/
│ │ │ │ ├── init_build_stream_db.sql.j2
│ │ │ │ └── postgres.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── pulp/
│ │ ├── tasks/
│ │ │ ├── create_pulp_config_http.yml
│ │ │ ├── create_pulp_config_https.yml
│ │ │ ├── deploy_pulp_container_http.yml
│ │ │ ├── deploy_pulp_container_https.yml
│ │ │ ├── deployment_prereq.yml
│ │ │ ├── main.yml
│ │ │ └── reload_pulp_nginx.yml
│ │ ├── templates/
│ │ │ ├── http_quadlet.j2
│ │ │ ├── https_quadlet.j2
│ │ │ ├── nginx_conf.j2
│ │ │ └── settings_template.j2
│ │ └── vars/
│ │ └── main.yml
│ └── prepare_oim_validation/
│ ├── tasks/
│ │ ├── check_k8s_support.yml
│ │ ├── check_openldap_support.yml
│ │ ├── include_local_repo_config.yml
│ │ ├── main.yml
│ │ ├── pre_requisite.yml
│ │ ├── validate_network_spec.yml
│ │ └── validate_passwordless_ssh_oim.yml
│ └── vars/
│ └── main.yml
├── telemetry/
│ ├── ansible.cfg
│ ├── roles/
│ │ ├── idrac_telemetry/
│ │ │ ├── tasks/
│ │ │ │ ├── create_telemetry_report.yml
│ │ │ │ ├── initiate_telemetry_service_cluster.yml
│ │ │ │ ├── main.yml
│ │ │ │ ├── remove_deleted_nodes.yml
│ │ │ │ ├── trigger_telemetry_collection.yml
│ │ │ │ └── validate_bmcips_reachability.yml
│ │ │ ├── templates/
│ │ │ │ └── telemetry_report.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── service_k8s_telemetry/
│ │ │ ├── tasks/
│ │ │ │ ├── main.yml
│ │ │ │ └── update_metadata_file.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── telemetry_validation/
│ │ ├── files/
│ │ │ └── timezone.txt
│ │ ├── tasks/
│ │ │ ├── main.yml
│ │ │ ├── validate_idrac_inventory.yml
│ │ │ ├── validate_telemetry_config.yml
│ │ │ └── validation_status_check.yml
│ │ └── vars/
│ │ └── main.yml
│ └── telemetry.yml
├── upgrade/
│ ├── ansible.cfg
│ ├── main.yml
│ ├── roles/
│ │ ├── import_input_parameters/
│ │ │ ├── tasks/
│ │ │ │ ├── display_warnings.yml
│ │ │ │ ├── main.yml
│ │ │ │ ├── precheck_backup_location.yml
│ │ │ │ ├── restore_input_files.yml
│ │ │ │ ├── restore_omnia_config_credentials.yml
│ │ │ │ ├── restore_single_input_file.yml
│ │ │ │ ├── restore_user_registry_credential.yml
│ │ │ │ ├── set_backup_location.yml
│ │ │ │ ├── transform_high_availability_config.yml
│ │ │ │ ├── transform_local_repo_config.yml
│ │ │ │ ├── transform_network_spec.yml
│ │ │ │ ├── transform_omnia_config.yml
│ │ │ │ ├── transform_provision_config.yml
│ │ │ │ ├── transform_storage_config.yml
│ │ │ │ └── transform_telemetry_config.yml
│ │ │ ├── templates/
│ │ │ │ ├── high_availability_config.j2
│ │ │ │ ├── local_repo_config.j2
│ │ │ │ ├── network_spec.j2
│ │ │ │ ├── omnia_config.j2
│ │ │ │ ├── omnia_config_credentials.yml.j2
│ │ │ │ ├── provision_config.j2
│ │ │ │ ├── storage_config.j2
│ │ │ │ └── telemetry_config.j2
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── upgrade_cluster/
│ │ │ ├── tasks/
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── upgrade_oim/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── rollback_omnia.yml
│ ├── upgrade_cluster.yml
│ ├── upgrade_oim.yml
│ └── upgrade_omnia.yml
└── utils/
├── ansible.cfg
├── create_container_group.yml
├── credential_utility/
│ ├── ansible.cfg
│ ├── get_config_credentials.yml
│ └── roles/
│ ├── create_config/
│ │ ├── tasks/
│ │ │ ├── create_credential_file.yml
│ │ │ └── main.yml
│ │ ├── templates/
│ │ │ ├── build_stream_credential.j2
│ │ │ └── omnia_credential.j2
│ │ └── vars/
│ │ └── main.yml
│ ├── update_config/
│ │ ├── tasks/
│ │ │ ├── credential_status.yml
│ │ │ ├── fetch_conditional_mandatory_credentials.yml
│ │ │ ├── fetch_credentials.yml
│ │ │ ├── fetch_mandatory_credentials.yml
│ │ │ ├── fetch_optional_credentials.yml
│ │ │ ├── main.yml
│ │ │ ├── prompt_credentials.yml
│ │ │ ├── prompt_password.yml
│ │ │ ├── prompt_username.yml
│ │ │ ├── update_bs_credential_file.yml
│ │ │ └── update_credentials.yml
│ │ └── vars/
│ │ └── main.yml
│ └── validation/
│ ├── tasks/
│ │ ├── main.yml
│ │ ├── pre_requisite.yml
│ │ └── validate_cred_file.yml
│ └── vars/
│ └── main.yml
├── external_kafka_connect_details.yml
├── external_victoria_connect_details.yml
├── generate_functional_groups.yml
├── include_input_dir.yml
├── oim_cleanup.yml
├── roles/
│ ├── common/
│ │ ├── tasks/
│ │ │ ├── include_omnia_config.yml
│ │ │ ├── include_omnia_config_credentials.yml
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── create_container_group/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── external_kafka_connect_details/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── external_victoria_connect_details/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── generate_functional_groups/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── idrac_pxe_boot/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── include_input_dir/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── oim_cleanup/
│ │ ├── oim_container_cleanup/
│ │ │ ├── tasks/
│ │ │ │ ├── cleanup_auth.yml
│ │ │ │ ├── cleanup_build_stream.yml
│ │ │ │ ├── cleanup_common.yml
│ │ │ │ ├── cleanup_note.yml
│ │ │ │ ├── cleanup_omnia_postgres.yml
│ │ │ │ ├── cleanup_openchami.yml
│ │ │ │ ├── cleanup_pulp.yml
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ ├── omnia_credential_cleanup/
│ │ │ ├── tasks/
│ │ │ │ ├── cleanup_credentials.yml
│ │ │ │ └── main.yml
│ │ │ └── vars/
│ │ │ └── main.yml
│ │ └── pre_requisite/
│ │ ├── tasks/
│ │ │ ├── main.yml
│ │ │ └── pre_requisite.yml
│ │ └── vars/
│ │ └── main.yml
│ ├── slurm_cleanup/
│ │ ├── defaults/
│ │ │ └── main.yml
│ │ └── tasks/
│ │ └── main.yml
│ ├── slurm_config_backup/
│ │ ├── defaults/
│ │ │ └── main.yml
│ │ └── tasks/
│ │ └── main.yml
│ └── slurm_config_rollback/
│ ├── defaults/
│ │ └── main.yml
│ └── tasks/
│ └── main.yml
├── set_pxe_boot.yml
├── slurm_config_util.yml
└── upgrade_checkup.yml
Showing preview only (290K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (3013 symbols across 292 files)
FILE: build_stream/api/auth/jwt_handler.py
class JWTHandlerError (line 42) | class JWTHandlerError(Exception):
class JWTCreationError (line 46) | class JWTCreationError(JWTHandlerError):
class JWTValidationError (line 50) | class JWTValidationError(JWTHandlerError):
class JWTExpiredError (line 54) | class JWTExpiredError(JWTValidationError):
class JWTInvalidSignatureError (line 58) | class JWTInvalidSignatureError(JWTValidationError):
class JWTConfig (line 63) | class JWTConfig:
method from_env (line 75) | def from_env(cls) -> "JWTConfig":
class TokenData (line 95) | class TokenData:
class JWTHandler (line 106) | class JWTHandler:
method __init__ (line 109) | def __init__(self, config: Optional[JWTConfig] = None):
method _load_private_key (line 119) | def _load_private_key(self) -> str:
method _load_public_key (line 142) | def _load_public_key(self) -> str:
method create_access_token (line 165) | def create_access_token(
method validate_token (line 221) | def validate_token(self, token: str) -> TokenData:
FILE: build_stream/api/auth/password_handler.py
function hash_password (line 45) | def hash_password(password: str) -> str:
function verify_password (line 57) | def verify_password(password: str, hashed: str) -> bool:
function check_needs_rehash (line 74) | def check_needs_rehash(hashed: str) -> bool:
function generate_client_id (line 89) | def generate_client_id() -> str:
function generate_client_secret (line 98) | def generate_client_secret() -> str:
function generate_credentials (line 107) | def generate_credentials() -> Tuple[str, str, str]:
FILE: build_stream/api/auth/routes.py
function get_auth_service (line 48) | def get_auth_service() -> AuthService:
function _verify_basic_auth (line 53) | def _verify_basic_auth(
function register_client (line 148) | async def register_client(
function request_token (line 274) | async def request_token(
FILE: build_stream/api/auth/schemas.py
class ClientRegistrationRequest (line 26) | class ClientRegistrationRequest(BaseModel): # pylint: disable=too-few-p...
method validate_client_name (line 47) | def validate_client_name(cls, v: str) -> str:
method validate_scopes (line 58) | def validate_scopes(cls, v: Optional[List[str]]) -> Optional[List[str]]:
class ClientRegistrationResponse (line 68) | class ClientRegistrationResponse(BaseModel): # pylint: disable=too-few-...
class AuthErrorResponse (line 112) | class AuthErrorResponse(BaseModel): # pylint: disable=too-few-public-me...
class GrantType (line 140) | class GrantType(str, Enum):
class TokenRequest (line 146) | class TokenRequest: # pylint: disable=too-few-public-methods
method __init__ (line 149) | def __init__(
method _validate_client_id (line 163) | def _validate_client_id(v: Optional[str]) -> Optional[str]:
method _validate_client_secret (line 177) | def _validate_client_secret(v: Optional[str]) -> Optional[str]:
class TokenResponse (line 191) | class TokenResponse(BaseModel): # pylint: disable=too-few-public-methods
FILE: build_stream/api/auth/service.py
class AuthenticationError (line 36) | class AuthenticationError(Exception):
class ClientExistsError (line 40) | class ClientExistsError(Exception):
class MaxClientsReachedError (line 44) | class MaxClientsReachedError(Exception):
class RegistrationDisabledError (line 48) | class RegistrationDisabledError(Exception):
class RegisteredClient (line 53) | class RegisteredClient:
class TokenResult (line 65) | class TokenResult:
class AuthService (line 74) | class AuthService:
method __init__ (line 77) | def __init__(
method verify_registration_credentials (line 92) | def verify_registration_credentials(self, username: str, password: str...
method register_client (line 134) | def register_client(
method verify_client_credentials (line 189) | def verify_client_credentials(
method generate_token (line 232) | def generate_token(
FILE: build_stream/api/build_image/dependencies.py
function _get_container (line 34) | def _get_container():
function get_create_build_image_use_case (line 40) | def get_create_build_image_use_case(
function get_build_image_correlation_id (line 58) | def get_build_image_correlation_id(
FILE: build_stream/api/build_image/routes.py
function _build_error_response (line 54) | def _build_error_response(
function create_build_image (line 82) | def create_build_image(
FILE: build_stream/api/build_image/schemas.py
class CreateBuildImageRequest (line 21) | class CreateBuildImageRequest(BaseModel):
class CreateBuildImageResponse (line 43) | class CreateBuildImageResponse(BaseModel):
class BuildImageErrorResponse (line 56) | class BuildImageErrorResponse(BaseModel):
FILE: build_stream/api/catalog_roles/dependencies.py
function get_catalog_roles_service (line 37) | def get_catalog_roles_service(
FILE: build_stream/api/catalog_roles/routes.py
function get_catalog_roles (line 74) | async def get_catalog_roles(
FILE: build_stream/api/catalog_roles/schemas.py
class GetRolesResponse (line 22) | class GetRolesResponse(BaseModel): # pylint: disable=too-few-public-met...
class ErrorResponse (line 50) | class ErrorResponse(BaseModel): # pylint: disable=too-few-public-methods
FILE: build_stream/api/catalog_roles/service.py
class RolesNotFoundError (line 35) | class RolesNotFoundError(Exception):
class CatalogRolesService (line 39) | class CatalogRolesService:
method __init__ (line 42) | def __init__(
method get_roles (line 54) | def get_roles(self, job_id: JobId) -> Dict[str, any]:
method _extract_roles_from_archive (line 145) | def _extract_roles_from_archive(
method _validate_parse_catalog_completed (line 224) | def _validate_parse_catalog_completed(self, job_id: JobId) -> None:
method _extract_catalog_metadata (line 259) | def _extract_catalog_metadata(self, job_id: JobId) -> Dict[str, any]:
FILE: build_stream/api/dependencies.py
function _get_container (line 47) | def _get_container():
function get_jwt_handler (line 56) | def get_jwt_handler() -> JWTHandler:
function verify_token (line 65) | def verify_token(
function require_scope (line 137) | def require_scope(required_scope: str):
function get_db_session (line 193) | def get_db_session() -> Generator[Session, None, None]:
function _create_sql_job_repo (line 219) | def _create_sql_job_repo(session: Session):
function _create_sql_stage_repo (line 225) | def _create_sql_stage_repo(session: Session):
function _create_sql_idempotency_repo (line 231) | def _create_sql_idempotency_repo(session: Session):
function _create_sql_audit_repo (line 237) | def _create_sql_audit_repo(session: Session):
function mark_stage_as_failed (line 246) | def mark_stage_as_failed(
function get_job_repo (line 338) | def get_job_repo(db_session: Session = Depends(get_db_session)):
function get_stage_repo (line 345) | def get_stage_repo(db_session: Session = Depends(get_db_session)):
function get_audit_repo (line 351) | def get_audit_repo(db_session: Session = Depends(get_db_session)):
function get_id_generator (line 366) | def get_id_generator() -> JobUUIDGenerator:
function get_client_id (line 371) | def get_client_id(token_data: dict) -> ClientId:
function get_correlation_id (line 386) | def get_correlation_id(
function get_idempotency_key (line 405) | def get_idempotency_key(
function get_create_job_use_case (line 429) | def get_create_job_use_case(
FILE: build_stream/api/generate_input_files/dependencies.py
function get_generate_input_files_use_case (line 38) | def get_generate_input_files_use_case(
FILE: build_stream/api/generate_input_files/routes.py
function generate_input_files (line 66) | async def generate_input_files(
FILE: build_stream/api/generate_input_files/schemas.py
class GenerateInputFilesRequest (line 22) | class GenerateInputFilesRequest(BaseModel):
class ArtifactRefResponse (line 32) | class ArtifactRefResponse(BaseModel):
class GenerateInputFilesResponse (line 41) | class GenerateInputFilesResponse(BaseModel):
class ErrorResponse (line 49) | class ErrorResponse(BaseModel):
FILE: build_stream/api/jobs/routes.py
function _map_job_state_to_api_state (line 63) | def _map_job_state_to_api_state(internal_state: JobState) -> str:
function _build_error_response (line 75) | def _build_error_response(
function create_job (line 102) | async def create_job(
function get_job (line 256) | async def get_job(
function delete_job (line 464) | async def delete_job(
FILE: build_stream/api/jobs/schemas.py
class CreateJobRequest (line 23) | class CreateJobRequest(BaseModel):
method validate_client_id (line 51) | def validate_client_id(cls, v: str) -> str:
method validate_client_name (line 59) | def validate_client_name(cls, v: Optional[str]) -> Optional[str]:
class CreateStageResponse (line 68) | class CreateStageResponse(BaseModel):
class GetStageResponse (line 78) | class GetStageResponse(BaseModel):
class CreateJobResponse (line 89) | class CreateJobResponse(BaseModel):
class GetJobResponse (line 98) | class GetJobResponse(BaseModel):
class ErrorResponse (line 153) | class ErrorResponse(BaseModel):
method create (line 161) | def create(cls, error: str, message: str, correlation_id: str) -> "Err...
FILE: build_stream/api/local_repo/dependencies.py
function _get_container (line 35) | def _get_container():
function get_create_local_repo_use_case (line 41) | def get_create_local_repo_use_case(
function get_local_repo_correlation_id (line 58) | def get_local_repo_correlation_id(
FILE: build_stream/api/local_repo/routes.py
function _build_error_response (line 48) | def _build_error_response(
function create_local_repository (line 77) | def create_local_repository(
FILE: build_stream/api/local_repo/schemas.py
class CreateLocalRepoResponse (line 20) | class CreateLocalRepoResponse(BaseModel):
class LocalRepoErrorResponse (line 30) | class LocalRepoErrorResponse(BaseModel):
FILE: build_stream/api/logging_utils.py
function _sanitize_message (line 58) | def _sanitize_message(message: str) -> str:
function create_job_log_file (line 68) | def create_job_log_file(job_id: str) -> Optional[Path]:
function remove_job_logger (line 91) | def remove_job_logger(job_id: str) -> None:
function _get_job_log_file (line 105) | def _get_job_log_file(job_id: str) -> Optional[Path]:
function _get_or_create_job_logger (line 113) | def _get_or_create_job_logger(
function _get_or_create_auth_logger (line 145) | def _get_or_create_auth_logger() -> Optional[logging.Logger]:
function log_auth_info (line 176) | def log_auth_info(
function log_secure_info (line 214) | def log_secure_info(
FILE: build_stream/api/parse_catalog/dependencies.py
function get_parse_catalog_use_case (line 38) | def get_parse_catalog_use_case(
FILE: build_stream/api/parse_catalog/routes.py
function parse_catalog (line 76) | async def parse_catalog(
FILE: build_stream/api/parse_catalog/schemas.py
class ParseCatalogStatus (line 23) | class ParseCatalogStatus(str, Enum):
class ParseCatalogResponse (line 30) | class ParseCatalogResponse(BaseModel): # pylint: disable=too-few-public...
class ErrorResponse (line 58) | class ErrorResponse(BaseModel): # pylint: disable=too-few-public-methods
FILE: build_stream/api/parse_catalog/service.py
class CatalogParseError (line 34) | class CatalogParseError(Exception):
class InvalidFileFormatError (line 38) | class InvalidFileFormatError(CatalogParseError):
class InvalidJSONError (line 42) | class InvalidJSONError(CatalogParseError):
class ParseResult (line 47) | class ParseResult:
class ParseCatalogService (line 54) | class ParseCatalogService: # pylint: disable=too-few-public-methods
method __init__ (line 57) | def __init__(self, parse_catalog_use_case=None, output_root: Optional[...
method parse_catalog (line 79) | async def parse_catalog(
method _process_catalog_via_orchestrator (line 109) | async def _process_catalog_via_orchestrator(self, json_data: dict, job...
method _validate_file_format (line 140) | def _validate_file_format(self, filename: str) -> None:
method _parse_json_content (line 148) | def _parse_json_content(self, contents: bytes) -> dict:
method _validate_json_structure (line 159) | def _validate_json_structure(self, json_data: object) -> None:
method _process_catalog (line 167) | async def _process_catalog(self, json_data: dict) -> ParseResult:
method _write_temp_file (line 206) | def _write_temp_file(self, json_data: dict) -> str:
FILE: build_stream/api/validate/dependencies.py
function _get_container (line 34) | def _get_container():
function get_validate_image_on_test_use_case (line 40) | def get_validate_image_on_test_use_case(
function get_validate_correlation_id (line 56) | def get_validate_correlation_id(
FILE: build_stream/api/validate/routes.py
function _build_error_response (line 52) | def _build_error_response(
function create_validate_image_on_test (line 81) | def create_validate_image_on_test(
FILE: build_stream/api/validate/schemas.py
class ValidateImageOnTestRequest (line 20) | class ValidateImageOnTestRequest(BaseModel):
class ValidateImageOnTestResponse (line 26) | class ValidateImageOnTestResponse(BaseModel):
class ValidateImageOnTestErrorResponse (line 36) | class ValidateImageOnTestErrorResponse(BaseModel):
FILE: build_stream/api/vault_client.py
class VaultError (line 28) | class VaultError(Exception):
class VaultDecryptError (line 32) | class VaultDecryptError(VaultError):
class VaultEncryptError (line 36) | class VaultEncryptError(VaultError):
class VaultNotFoundError (line 40) | class VaultNotFoundError(VaultError):
class VaultClient (line 44) | class VaultClient: # pylint: disable=too-few-public-methods
method __init__ (line 47) | def __init__(
method _run_vault_command (line 74) | def _run_vault_command(
method read_vault (line 129) | def read_vault(self, vault_path: str) -> Dict[str, Any]:
method write_vault (line 150) | def write_vault(self, vault_path: str, data: Dict[str, Any]) -> None:
method get_auth_config (line 217) | def get_auth_config(self) -> Dict[str, Any]:
method get_oauth_clients (line 229) | def get_oauth_clients(self) -> Dict[str, Any]:
method save_oauth_client (line 245) | def save_oauth_client(
method get_active_client_count (line 272) | def get_active_client_count(self) -> int:
method client_exists (line 281) | def client_exists(self, client_name: str) -> bool:
FILE: build_stream/common/config.py
class ArtifactStoreConfig (line 26) | class ArtifactStoreConfig:
class PathsConfig (line 36) | class PathsConfig:
class FileStoreConfig (line 42) | class FileStoreConfig:
class BuildStreamConfig (line 48) | class BuildStreamConfig:
function load_config (line 55) | def load_config(config_path: Optional[str] = None) -> BuildStreamConfig:
FILE: build_stream/container.py
function _create_artifact_store (line 68) | def _create_artifact_store():
class DevContainer (line 107) | class DevContainer(containers.DeclarativeContainer): # pylint: disable=...
class ProdContainer (line 275) | class ProdContainer(containers.DeclarativeContainer): # pylint: disable...
function get_container_class (line 447) | def get_container_class():
FILE: build_stream/core/artifacts/entities.py
class ArtifactRecord (line 27) | class ArtifactRecord:
method __post_init__ (line 58) | def __post_init__(self) -> None:
FILE: build_stream/core/artifacts/exceptions.py
class ArtifactDomainError (line 20) | class ArtifactDomainError(Exception):
method __init__ (line 23) | def __init__(self, message: str, correlation_id: Optional[str] = None)...
class ArtifactNotFoundError (line 35) | class ArtifactNotFoundError(ArtifactDomainError):
method __init__ (line 38) | def __init__(
class ArtifactAlreadyExistsError (line 56) | class ArtifactAlreadyExistsError(ArtifactDomainError):
method __init__ (line 59) | def __init__(
class ArtifactStoreError (line 77) | class ArtifactStoreError(ArtifactDomainError):
method __init__ (line 80) | def __init__(
class ArtifactValidationError (line 94) | class ArtifactValidationError(ArtifactDomainError):
method __init__ (line 97) | def __init__(
FILE: build_stream/core/artifacts/interfaces.py
class ArtifactStore (line 29) | class ArtifactStore(Protocol):
method store (line 43) | def store(
method retrieve (line 73) | def retrieve(
method exists (line 99) | def exists(self, key: ArtifactKey) -> bool:
method delete (line 110) | def delete(self, key: ArtifactKey) -> bool:
method generate_key (line 121) | def generate_key(self, hint: StoreHint, kind: ArtifactKind) -> Artifac...
class ArtifactMetadataRepository (line 134) | class ArtifactMetadataRepository(Protocol):
method save (line 140) | def save(self, record: ArtifactRecord) -> None:
method find_by_job_stage_and_label (line 148) | def find_by_job_stage_and_label(
method find_by_job (line 166) | def find_by_job(self, job_id: JobId) -> List[ArtifactRecord]:
method delete_by_job (line 177) | def delete_by_job(self, job_id: JobId) -> int:
FILE: build_stream/core/artifacts/ports.py
class ArtifactStore (line 29) | class ArtifactStore(Protocol):
method store (line 43) | def store(
method retrieve (line 73) | def retrieve(
method exists (line 99) | def exists(self, key: ArtifactKey) -> bool:
method delete (line 110) | def delete(self, key: ArtifactKey) -> bool:
method generate_key (line 121) | def generate_key(self, hint: StoreHint, kind: ArtifactKind) -> Artifac...
class ArtifactMetadataRepository (line 134) | class ArtifactMetadataRepository(Protocol):
method save (line 140) | def save(self, record: ArtifactRecord) -> None:
method find_by_job_stage_and_label (line 148) | def find_by_job_stage_and_label(
method find_by_job (line 166) | def find_by_job(self, job_id: JobId) -> List[ArtifactRecord]:
method delete_by_job (line 177) | def delete_by_job(self, job_id: JobId) -> int:
FILE: build_stream/core/artifacts/value_objects.py
class ArtifactKind (line 27) | class ArtifactKind(str, Enum):
class SafePath (line 39) | class SafePath:
method __post_init__ (line 57) | def __post_init__(self) -> None:
method from_string (line 82) | def from_string(cls, path_str: str) -> "SafePath":
method __str__ (line 93) | def __str__(self) -> str:
class ArtifactKey (line 99) | class ArtifactKey:
method __post_init__ (line 116) | def __post_init__(self) -> None:
method __str__ (line 136) | def __str__(self) -> str:
class ArtifactDigest (line 142) | class ArtifactDigest:
method __post_init__ (line 157) | def __post_init__(self) -> None:
method __str__ (line 170) | def __str__(self) -> str:
class ArtifactRef (line 176) | class ArtifactRef:
method __post_init__ (line 198) | def __post_init__(self) -> None:
class StoreHint (line 214) | class StoreHint:
method __post_init__ (line 241) | def __post_init__(self) -> None:
FILE: build_stream/core/build_image/entities.py
class BuildImageRequest (line 26) | class BuildImageRequest:
method to_dict (line 54) | def to_dict(self) -> Dict[str, Any]:
method generate_filename (line 73) | def generate_filename(self) -> str:
method get_playbook_command (line 82) | def get_playbook_command(self) -> str:
FILE: build_stream/core/build_image/exceptions.py
class BuildImageDomainError (line 18) | class BuildImageDomainError(Exception):
method __init__ (line 21) | def __init__(self, message: str, correlation_id: str = ""):
class InvalidArchitectureError (line 33) | class InvalidArchitectureError(BuildImageDomainError):
class InvalidImageKeyError (line 37) | class InvalidImageKeyError(BuildImageDomainError):
class InvalidFunctionalGroupsError (line 41) | class InvalidFunctionalGroupsError(BuildImageDomainError):
class InventoryHostMissingError (line 45) | class InventoryHostMissingError(BuildImageDomainError):
FILE: build_stream/core/build_image/repositories.py
class BuildStreamConfigRepository (line 24) | class BuildStreamConfigRepository(ABC):
method get_aarch64_inv_host (line 28) | def get_aarch64_inv_host(self, job_id: str) -> Optional[InventoryHost]:
class BuildImageInventoryRepository (line 43) | class BuildImageInventoryRepository(ABC):
method create_inventory_file (line 47) | def create_inventory_file(self, inventory_host: InventoryHost, job_id:...
FILE: build_stream/core/build_image/services.py
class BuildImageConfigService (line 29) | class BuildImageConfigService:
method __init__ (line 32) | def __init__(self, config_repo: BuildStreamConfigRepository):
method get_inventory_host (line 36) | def get_inventory_host(
class BuildImageQueueService (line 64) | class BuildImageQueueService:
method __init__ (line 67) | def __init__(self, queue_repo):
method submit_request (line 71) | def submit_request(self, request: BuildImageRequest, correlation_id: C...
FILE: build_stream/core/build_image/value_objects.py
class Architecture (line 26) | class Architecture:
method __post_init__ (line 40) | def __post_init__(self) -> None:
method __str__ (line 50) | def __str__(self) -> str:
method is_x86_64 (line 55) | def is_x86_64(self) -> bool:
method is_aarch64 (line 60) | def is_aarch64(self) -> bool:
class ImageKey (line 66) | class ImageKey:
method __post_init__ (line 81) | def __post_init__(self) -> None:
method __str__ (line 96) | def __str__(self) -> str:
class FunctionalGroups (line 102) | class FunctionalGroups:
method __post_init__ (line 117) | def __post_init__(self) -> None:
method to_list (line 135) | def to_list(self) -> List[str]:
method __str__ (line 139) | def __str__(self) -> str:
class InventoryHost (line 145) | class InventoryHost:
method __post_init__ (line 160) | def __post_init__(self) -> None:
method __str__ (line 175) | def __str__(self) -> str:
FILE: build_stream/core/catalog/adapter.py
function _snake_case (line 55) | def _snake_case(name: str) -> str:
function _package_key (line 59) | def _package_key(pkg: Package) -> Tuple[str, str, str]:
function _package_to_dict (line 67) | def _package_to_dict(pkg: Package) -> Dict[str, str]:
function build_default_packages_config (line 76) | def build_default_packages_config(base_os: FeatureList) -> Dict:
function _build_subconfig_from_base_os (line 90) | def _build_subconfig_from_base_os(
function build_nfs_config (line 117) | def build_nfs_config(base_os: FeatureList) -> Dict | None:
function build_openldap_config (line 122) | def build_openldap_config(base_os: FeatureList) -> Dict | None:
function build_openmpi_config (line 127) | def build_openmpi_config(base_os: FeatureList) -> Dict | None:
function build_service_k8s_config (line 135) | def build_service_k8s_config(functional: FeatureList) -> Dict:
function build_slurm_custom_config (line 188) | def build_slurm_custom_config(functional: FeatureList) -> Dict:
function build_infra_configs (line 260) | def build_infra_configs(infra: FeatureList) -> Dict[str, Dict]:
function write_config_files (line 290) | def write_config_files(configs: Dict[str, Dict], output_dir: str) -> None:
function generate_all_configs (line 327) | def generate_all_configs(
function generate_omnia_json_from_catalog (line 396) | def generate_omnia_json_from_catalog(
FILE: build_stream/core/catalog/adapter_policy.py
function _validate_input_policy_and_schema_paths (line 46) | def _validate_input_policy_and_schema_paths(
function validate_policy_config (line 62) | def validate_policy_config(policy_config: Any, schema_config: Any, polic...
function discover_architectures (line 77) | def discover_architectures(input_dir: str) -> List[str]:
function discover_os_versions (line 88) | def discover_os_versions(input_dir: str, arch: str) -> List[Tuple[str, s...
function _has_non_empty_cluster (line 112) | def _has_non_empty_cluster(target_data: Dict) -> bool:
function _collect_non_empty_subgroups (line 120) | def _collect_non_empty_subgroups(
function _extract_version_from_target_config (line 131) | def _extract_version_from_target_config(
function generate_software_config (line 160) | def generate_software_config(
function _package_key (line 277) | def _package_key(pkg: Dict) -> Tuple[str, str, str]:
function transform_package (line 299) | def transform_package(pkg: Dict, transform_config: Optional[Dict]) -> Dict:
function apply_substring_filter (line 324) | def apply_substring_filter(
function apply_allowlist_filter (line 351) | def apply_allowlist_filter(
function apply_field_in_filter (line 380) | def apply_field_in_filter(
function apply_any_of_filter (line 417) | def apply_any_of_filter(
function compute_common_packages (line 437) | def compute_common_packages(
function apply_extract_common_filter (line 470) | def apply_extract_common_filter(
function apply_extract_unique_filter (line 495) | def apply_extract_unique_filter(
function apply_filter (line 514) | def apply_filter(
function merge_transform (line 542) | def merge_transform(base: Optional[Dict], override: Optional[Dict]) -> O...
function compute_common_keys_from_roles (line 555) | def compute_common_keys_from_roles(
function derive_common_role (line 573) | def derive_common_role(
function check_conditions (line 602) | def check_conditions(
function process_target_spec (line 627) | def process_target_spec(
function write_config_file (line 723) | def write_config_file(file_path: str, config: Dict) -> None:
function generate_configs_from_policy (line 752) | def generate_configs_from_policy(
function main (line 852) | def main():
FILE: build_stream/core/catalog/exceptions.py
class CatalogParseError (line 20) | class CatalogParseError(Exception):
method __init__ (line 23) | def __init__(self, message: str, correlation_id: Optional[str] = None)...
class InvalidFileFormatError (line 29) | class InvalidFileFormatError(CatalogParseError):
class InvalidJSONError (line 33) | class InvalidJSONError(CatalogParseError):
class CatalogSchemaValidationError (line 37) | class CatalogSchemaValidationError(CatalogParseError):
method __init__ (line 40) | def __init__(
class FileTooLargeError (line 50) | class FileTooLargeError(CatalogParseError):
method __init__ (line 53) | def __init__(
class AdapterPolicyValidationError (line 67) | class AdapterPolicyValidationError(CatalogParseError):
method __init__ (line 70) | def __init__(
class ConfigGenerationError (line 80) | class ConfigGenerationError(CatalogParseError):
FILE: build_stream/core/catalog/generator.py
function _validate_catalog_and_schema_paths (line 48) | def _validate_catalog_and_schema_paths(catalog_path: str, schema_path: s...
function _arch_suffix (line 62) | def _arch_suffix(architecture) -> str:
class Package (line 77) | class Package:
class Feature (line 91) | class Feature:
class FeatureList (line 99) | class FeatureList:
function _filter_featurelist_for_arch (line 105) | def _filter_featurelist_for_arch(feature_list: FeatureList, arch: str) -...
function _discover_arch_os_version_from_catalog (line 144) | def _discover_arch_os_version_from_catalog(catalog: Catalog) -> List[Tup...
function generate_functional_layer_json (line 177) | def generate_functional_layer_json(catalog: Catalog) -> FeatureList:
function generate_infrastructure_json (line 216) | def generate_infrastructure_json(catalog: Catalog) -> FeatureList:
function generate_drivers_json (line 255) | def generate_drivers_json(catalog: Catalog) -> FeatureList:
function generate_base_os_json (line 328) | def generate_base_os_json(catalog: Catalog) -> FeatureList:
function generate_miscellaneous_json (line 367) | def generate_miscellaneous_json(catalog: Catalog) -> FeatureList:
function _package_common_dict (line 405) | def _package_common_dict(pkg: Package) -> Dict:
function _package_to_json_dict (line 423) | def _package_to_json_dict(pkg: Package) -> Dict:
function _package_from_json_dict (line 429) | def _package_from_json_dict(data: Dict) -> Package:
function serialize_json (line 441) | def serialize_json(feature_list: FeatureList, output_path: str):
function deserialize_json (line 484) | def deserialize_json(input_path: str) -> FeatureList:
function get_functional_layer_roles_from_file (line 520) | def get_functional_layer_roles_from_file(
function get_package_list (line 563) | def get_package_list(
function generate_root_json_from_catalog (line 703) | def generate_root_json_from_catalog(
FILE: build_stream/core/catalog/models.py
class Package (line 24) | class Package:
class FunctionalPackage (line 42) | class FunctionalPackage(Package):
class OsPackage (line 46) | class OsPackage(Package):
class InfrastructurePackage (line 50) | class InfrastructurePackage:
method __init__ (line 53) | def __init__(self, id, name, version, uri, architecture, config, type,...
class Driver (line 65) | class Driver:
method __init__ (line 68) | def __init__(self, id, name, version, uri, architecture, config, type):
class Catalog (line 78) | class Catalog:
FILE: build_stream/core/catalog/parser.py
function ParseCatalog (line 33) | def ParseCatalog(file_path: str, schema_path: str = _DEFAULT_SCHEMA_PATH...
FILE: build_stream/core/catalog/tests/test_adapter_cli_defaults.py
class TestAdapterDefaults (line 29) | class TestAdapterDefaults(unittest.TestCase):
method test_default_schema_path_points_to_resources (line 30) | def test_default_schema_path_points_to_resources(self):
method test_generate_omnia_json_with_defaults_writes_output (line 35) | def test_generate_omnia_json_with_defaults_writes_output(self):
FILE: build_stream/core/catalog/tests/test_adapter_policy.py
class TestValidatePolicyConfig (line 52) | class TestValidatePolicyConfig(unittest.TestCase):
method setUp (line 55) | def setUp(self):
method test_valid_policy_passes_validation (line 73) | def test_valid_policy_passes_validation(self):
method test_missing_version_raises_error (line 82) | def test_missing_version_raises_error(self):
method test_missing_targets_raises_error (line 95) | def test_missing_targets_raises_error(self):
method test_invalid_target_spec_raises_error (line 108) | def test_invalid_target_spec_raises_error(self):
method test_allowlist_filter_policy_validates (line 125) | def test_allowlist_filter_policy_validates(self):
method test_field_in_filter_policy_validates (line 158) | def test_field_in_filter_policy_validates(self):
method test_any_of_filter_requires_filters (line 191) | def test_any_of_filter_requires_filters(self):
method test_any_of_filter_policy_validates (line 218) | def test_any_of_filter_policy_validates(self):
class TestDiscoverArchitectures (line 253) | class TestDiscoverArchitectures(unittest.TestCase):
method test_discovers_architecture_directories (line 256) | def test_discovers_architecture_directories(self):
method test_returns_empty_for_nonexistent_dir (line 268) | def test_returns_empty_for_nonexistent_dir(self):
method test_returns_empty_for_empty_dir (line 273) | def test_returns_empty_for_empty_dir(self):
class TestDiscoverOsVersions (line 280) | class TestDiscoverOsVersions(unittest.TestCase):
method test_discovers_os_and_versions (line 283) | def test_discovers_os_and_versions(self):
method test_returns_empty_for_nonexistent_arch (line 296) | def test_returns_empty_for_nonexistent_arch(self):
class TestTransformPackage (line 303) | class TestTransformPackage(unittest.TestCase):
method test_no_transform_returns_copy (line 306) | def test_no_transform_returns_copy(self):
method test_exclude_fields (line 313) | def test_exclude_fields(self):
method test_rename_fields (line 320) | def test_rename_fields(self):
method test_exclude_and_rename_combined (line 327) | def test_exclude_and_rename_combined(self):
class TestApplySubstringFilter (line 338) | class TestApplySubstringFilter(unittest.TestCase):
method test_filters_by_substring (line 341) | def test_filters_by_substring(self):
method test_case_insensitive_by_default (line 356) | def test_case_insensitive_by_default(self):
method test_case_sensitive_when_specified (line 369) | def test_case_sensitive_when_specified(self):
method test_empty_values_returns_all (line 384) | def test_empty_values_returns_all(self):
class TestAllowlistAndFieldFilters (line 392) | class TestAllowlistAndFieldFilters(unittest.TestCase):
method test_allowlist_matches_exact_package_names (line 393) | def test_allowlist_matches_exact_package_names(self):
method test_field_in_matches_classification_field (line 409) | def test_field_in_matches_classification_field(self):
method test_any_of_combines_multiple_strategies (line 425) | def test_any_of_combines_multiple_strategies(self):
class TestComputeCommonPackages (line 464) | class TestComputeCommonPackages(unittest.TestCase):
method test_finds_common_packages (line 467) | def test_finds_common_packages(self):
method test_respects_min_occurrences (line 484) | def test_respects_min_occurrences(self):
class TestMergeTransform (line 497) | class TestMergeTransform(unittest.TestCase):
method test_none_inputs_return_none (line 500) | def test_none_inputs_return_none(self):
method test_base_only (line 504) | def test_base_only(self):
method test_override_only (line 509) | def test_override_only(self):
method test_override_wins (line 514) | def test_override_wins(self):
class TestCheckConditions (line 522) | class TestCheckConditions(unittest.TestCase):
method test_no_conditions_returns_true (line 525) | def test_no_conditions_returns_true(self):
method test_architecture_condition (line 529) | def test_architecture_condition(self):
method test_os_family_condition (line 535) | def test_os_family_condition(self):
method test_os_version_condition (line 541) | def test_os_version_condition(self):
method test_multiple_conditions_all_must_pass (line 547) | def test_multiple_conditions_all_must_pass(self):
class TestDeriveCommonRole (line 558) | class TestDeriveCommonRole(unittest.TestCase):
method test_derives_common_packages (line 561) | def test_derives_common_packages(self):
method test_removes_from_sources_when_specified (line 578) | def test_removes_from_sources_when_specified(self):
method test_keeps_sources_when_not_removing (line 594) | def test_keeps_sources_when_not_removing(self):
class TestWriteConfigFile (line 610) | class TestWriteConfigFile(unittest.TestCase):
method test_writes_valid_json (line 613) | def test_writes_valid_json(self):
method test_creates_parent_directories (line 628) | def test_creates_parent_directories(self):
class TestGenerateConfigsFromPolicy (line 637) | class TestGenerateConfigsFromPolicy(unittest.TestCase):
method setUp (line 640) | def setUp(self):
method test_generates_output_files (line 644) | def test_generates_output_files(self):
method test_generates_openldap_with_any_of_filter (line 689) | def test_generates_openldap_with_any_of_filter(self):
method test_invalid_policy_raises_error (line 761) | def test_invalid_policy_raises_error(self):
method test_missing_input_dir_raises_file_not_found (line 783) | def test_missing_input_dir_raises_file_not_found(self):
method test_missing_policy_file_raises_file_not_found (line 797) | def test_missing_policy_file_raises_file_not_found(self):
method test_missing_schema_file_raises_file_not_found (line 814) | def test_missing_schema_file_raises_file_not_found(self):
class TestDefaultPaths (line 832) | class TestDefaultPaths(unittest.TestCase):
method test_default_policy_path_exists (line 835) | def test_default_policy_path_exists(self):
method test_default_schema_path_exists (line 842) | def test_default_schema_path_exists(self):
method test_default_policy_validates_against_schema (line 849) | def test_default_policy_validates_against_schema(self):
class TestProcessTargetSpec (line 865) | class TestProcessTargetSpec(unittest.TestCase):
method test_processes_simple_target (line 868) | def test_processes_simple_target(self):
method test_skips_when_conditions_not_met (line 896) | def test_skips_when_conditions_not_met(self):
method test_applies_transform (line 920) | def test_applies_transform(self):
FILE: build_stream/core/catalog/tests/test_generator_cli_defaults.py
class TestGeneratorDefaults (line 29) | class TestGeneratorDefaults(unittest.TestCase):
method test_default_schema_path_points_to_resources (line 30) | def test_default_schema_path_points_to_resources(self):
method test_generate_root_json_with_defaults_writes_output (line 35) | def test_generate_root_json_with_defaults_writes_output(self):
FILE: build_stream/core/catalog/tests/test_generator_package_list.py
class TestGetPackageList (line 38) | class TestGetPackageList(unittest.TestCase):
method setUp (line 41) | def setUp(self):
method test_get_packages_for_valid_single_role (line 48) | def test_get_packages_for_valid_single_role(self):
method test_get_packages_for_all_roles_when_role_is_none (line 59) | def test_get_packages_for_all_roles_when_role_is_none(self):
method test_invalid_role_raises_value_error (line 76) | def test_invalid_role_raises_value_error(self):
method test_empty_role_raises_value_error (line 83) | def test_empty_role_raises_value_error(self):
method test_file_not_found_raises_error (line 90) | def test_file_not_found_raises_error(self):
method test_malformed_json_raises_error (line 95) | def test_malformed_json_raises_error(self):
method test_schema_validation_failure_raises_error (line 105) | def test_schema_validation_failure_raises_error(self):
method test_empty_feature_list_returns_empty_list (line 128) | def test_empty_feature_list_returns_empty_list(self):
method test_package_attributes_are_complete (line 139) | def test_package_attributes_are_complete(self):
method test_package_with_uri_and_tag (line 153) | def test_package_with_uri_and_tag(self):
method test_role_with_spaces_in_name (line 170) | def test_role_with_spaces_in_name(self):
method test_all_roles_returns_correct_package_counts (line 177) | def test_all_roles_returns_correct_package_counts(self):
method test_case_insensitive_role_matching_lowercase (line 192) | def test_case_insensitive_role_matching_lowercase(self):
method test_case_insensitive_role_matching_uppercase (line 200) | def test_case_insensitive_role_matching_uppercase(self):
method test_case_insensitive_role_matching_mixed_case (line 207) | def test_case_insensitive_role_matching_mixed_case(self):
method test_case_insensitive_role_matching_preserves_original_name (line 214) | def test_case_insensitive_role_matching_preserves_original_name(self):
FILE: build_stream/core/catalog/tests/test_generator_roles.py
class TestGetFunctionalLayerRolesFromFile (line 34) | class TestGetFunctionalLayerRolesFromFile(unittest.TestCase):
method test_returns_all_role_names_from_fixture (line 35) | def test_returns_all_role_names_from_fixture(self):
method test_empty_feature_list_returns_empty_roles (line 54) | def test_empty_feature_list_returns_empty_roles(self):
method test_invalid_functional_layer_json_fails_schema_validation (line 64) | def test_invalid_functional_layer_json_fails_schema_validation(self):
FILE: build_stream/core/catalog/tests/test_parser_defaults.py
class TestParseCatalogDefaults (line 28) | class TestParseCatalogDefaults(unittest.TestCase):
method test_default_schema_path_points_to_resources (line 29) | def test_default_schema_path_points_to_resources(self):
method test_parse_catalog_with_explicit_paths_uses_fixture (line 34) | def test_parse_catalog_with_explicit_paths_uses_fixture(self):
FILE: build_stream/core/catalog/utils.py
function _configure_logging (line 23) | def _configure_logging(log_file: Optional[str] = None, log_level: int = ...
function load_json_file (line 58) | def load_json_file(file_path: str) -> Any:
FILE: build_stream/core/exceptions.py
class ClientDisabledError (line 18) | class ClientDisabledError(Exception):
class InvalidClientError (line 22) | class InvalidClientError(Exception):
class InvalidScopeError (line 26) | class InvalidScopeError(Exception):
class TokenCreationError (line 30) | class TokenCreationError(Exception):
FILE: build_stream/core/jobs/entities/audit.py
class AuditEvent (line 24) | class AuditEvent:
FILE: build_stream/core/jobs/entities/idempotency.py
class IdempotencyRecord (line 24) | class IdempotencyRecord:
method is_expired (line 46) | def is_expired(self, current_time: datetime) -> bool:
method matches_fingerprint (line 57) | def matches_fingerprint(self, fingerprint: RequestFingerprint) -> bool:
FILE: build_stream/core/jobs/entities/job.py
class Job (line 26) | class Job:
method __post_init__ (line 54) | def __post_init__(self) -> None:
method _validate_transition (line 60) | def _validate_transition(
method _update_metadata (line 90) | def _update_metadata(self) -> None:
method start (line 95) | def start(self) -> None:
method complete (line 106) | def complete(self) -> None:
method fail (line 117) | def fail(self) -> None:
method cancel (line 128) | def cancel(self) -> None:
method tombstone (line 144) | def tombstone(self) -> None:
method is_completed (line 152) | def is_completed(self) -> bool:
method is_failed (line 156) | def is_failed(self) -> bool:
method is_cancelled (line 160) | def is_cancelled(self) -> bool:
method is_in_progress (line 164) | def is_in_progress(self) -> bool:
FILE: build_stream/core/jobs/entities/stage.py
class Stage (line 26) | class Stage:
method _initialize_timestamps (line 56) | def _initialize_timestamps(self) -> None:
method _validate_transition (line 62) | def _validate_transition(
method _mark_started (line 92) | def _mark_started(self) -> None:
method _mark_ended (line 97) | def _mark_ended(self) -> None:
method start (line 102) | def start(self) -> None:
method complete (line 113) | def complete(self) -> None:
method fail (line 124) | def fail(self, error_code: str, error_summary: str) -> None:
method skip (line 141) | def skip(self) -> None:
method cancel (line 152) | def cancel(self) -> None:
FILE: build_stream/core/jobs/exceptions.py
class JobDomainError (line 20) | class JobDomainError(Exception):
method __init__ (line 23) | def __init__(self, message: str, correlation_id: Optional[str] = None)...
class JobNotFoundError (line 35) | class JobNotFoundError(JobDomainError):
method __init__ (line 38) | def __init__(self, job_id: str, correlation_id: Optional[str] = None) ...
class JobAlreadyExistsError (line 52) | class JobAlreadyExistsError(JobDomainError):
method __init__ (line 55) | def __init__(self, job_id: str, correlation_id: Optional[str] = None) ...
class InvalidStateTransitionError (line 69) | class InvalidStateTransitionError(JobDomainError):
method __init__ (line 72) | def __init__(
class TerminalStateViolationError (line 100) | class TerminalStateViolationError(JobDomainError):
method __init__ (line 103) | def __init__(
class OptimisticLockError (line 127) | class OptimisticLockError(JobDomainError):
method __init__ (line 130) | def __init__(
class IdempotencyConflictError (line 158) | class IdempotencyConflictError(JobDomainError):
method __init__ (line 161) | def __init__(
class StageAlreadyCompletedError (line 183) | class StageAlreadyCompletedError(JobDomainError):
method __init__ (line 186) | def __init__(
class UpstreamStageNotCompletedError (line 207) | class UpstreamStageNotCompletedError(JobDomainError):
method __init__ (line 210) | def __init__(
class StageNotFoundError (line 235) | class StageNotFoundError(JobDomainError):
method __init__ (line 238) | def __init__(
FILE: build_stream/core/jobs/repositories.py
class JobIdGenerator (line 28) | class JobIdGenerator(Protocol):
method generate (line 31) | def generate(self) -> JobId:
class JobRepository (line 43) | class JobRepository(Protocol):
method save (line 46) | def save(self, job: Job) -> None:
method find_by_id (line 57) | def find_by_id(self, job_id: JobId) -> Optional[Job]:
method exists (line 68) | def exists(self, job_id: JobId) -> bool:
class StageRepository (line 80) | class StageRepository(Protocol):
method save (line 83) | def save(self, stage: Stage) -> None:
method save_all (line 94) | def save_all(self, stages: List[Stage]) -> None:
method find_by_job_and_name (line 105) | def find_by_job_and_name(
method find_all_by_job (line 121) | def find_all_by_job(self, job_id: JobId) -> List[Stage]:
class IdempotencyRepository (line 133) | class IdempotencyRepository(Protocol):
method save (line 136) | def save(self, record: IdempotencyRecord) -> None:
method find_by_key (line 144) | def find_by_key(self, key: IdempotencyKey) -> Optional[IdempotencyReco...
class AuditEventRepository (line 156) | class AuditEventRepository(Protocol):
method save (line 159) | def save(self, event: AuditEvent) -> None:
method find_by_job (line 167) | def find_by_job(self, job_id: JobId) -> List[AuditEvent]:
class UUIDGenerator (line 179) | class UUIDGenerator:
method generate (line 182) | def generate(self) -> uuid.UUID:
FILE: build_stream/core/jobs/services.py
class FingerprintService (line 30) | class FingerprintService:
method compute (line 37) | def compute(request_body: Dict[str, Any]) -> RequestFingerprint:
class JobStateHelper (line 63) | class JobStateHelper:
method handle_stage_failure (line 71) | def handle_stage_failure(
method handle_job_completion (line 154) | def handle_job_completion(
FILE: build_stream/core/jobs/value_objects.py
class JobId (line 28) | class JobId:
method __post_init__ (line 42) | def __post_init__(self) -> None:
method __str__ (line 56) | def __str__(self) -> str:
class CorrelationId (line 62) | class CorrelationId:
method __post_init__ (line 76) | def __post_init__(self) -> None:
method __str__ (line 89) | def __str__(self) -> str:
class StageType (line 94) | class StageType(str, Enum):
class StageName (line 112) | class StageName:
method __post_init__ (line 126) | def __post_init__(self) -> None:
method as_enum (line 141) | def as_enum(self) -> StageType:
method __str__ (line 149) | def __str__(self) -> str:
class IdempotencyKey (line 155) | class IdempotencyKey:
method __post_init__ (line 170) | def __post_init__(self) -> None:
method __str__ (line 179) | def __str__(self) -> str:
class RequestFingerprint (line 185) | class RequestFingerprint:
method __post_init__ (line 200) | def __post_init__(self) -> None:
method __str__ (line 213) | def __str__(self) -> str:
class ClientId (line 219) | class ClientId:
method __post_init__ (line 233) | def __post_init__(self) -> None:
method __str__ (line 243) | def __str__(self) -> str:
class JobState (line 248) | class JobState(str, Enum):
method is_terminal (line 260) | def is_terminal(self) -> bool:
class StageState (line 269) | class StageState(str, Enum):
method is_terminal (line 282) | def is_terminal(self) -> bool:
FILE: build_stream/core/localrepo/entities.py
class PlaybookRequest (line 27) | class PlaybookRequest:
method to_dict (line 52) | def to_dict(self) -> Dict[str, Any]:
method generate_filename (line 65) | def generate_filename(self) -> str:
class PlaybookResult (line 76) | class PlaybookResult:
method is_success (line 114) | def is_success(self) -> bool:
method is_failed (line 119) | def is_failed(self) -> bool:
method from_dict (line 124) | def from_dict(data: Dict[str, Any]) -> "PlaybookResult":
FILE: build_stream/core/localrepo/exceptions.py
class LocalRepoDomainError (line 20) | class LocalRepoDomainError(Exception):
method __init__ (line 23) | def __init__(self, message: str, correlation_id: Optional[str] = None)...
class QueueUnavailableError (line 37) | class QueueUnavailableError(LocalRepoDomainError):
method __init__ (line 40) | def __init__(
class InputFilesMissingError (line 61) | class InputFilesMissingError(LocalRepoDomainError):
method __init__ (line 64) | def __init__(
class InputDirectoryInvalidError (line 86) | class InputDirectoryInvalidError(LocalRepoDomainError):
method __init__ (line 89) | def __init__(
FILE: build_stream/core/localrepo/repositories.py
class PlaybookQueueRequestRepository (line 27) | class PlaybookQueueRequestRepository(Protocol):
method write_request (line 30) | def write_request(self, request: PlaybookRequest) -> Path:
method is_available (line 44) | def is_available(self) -> bool:
class PlaybookQueueResultRepository (line 53) | class PlaybookQueueResultRepository(Protocol):
method get_unprocessed_results (line 56) | def get_unprocessed_results(self) -> List[Path]:
method read_result (line 64) | def read_result(self, result_path: Path) -> PlaybookResult:
method archive_result (line 78) | def archive_result(self, result_path: Path) -> None:
method is_available (line 86) | def is_available(self) -> bool:
class InputDirectoryRepository (line 95) | class InputDirectoryRepository(Protocol):
method get_source_input_repository_path (line 98) | def get_source_input_repository_path(self, job_id: str) -> Path:
method get_destination_input_repository_path (line 109) | def get_destination_input_repository_path(self) -> Path:
method validate_input_directory (line 117) | def validate_input_directory(self, path: Path) -> bool:
FILE: build_stream/core/localrepo/services.py
class InputFileService (line 39) | class InputFileService:
method __init__ (line 46) | def __init__(self, input_repo: InputDirectoryRepository) -> None:
method prepare_playbook_input (line 54) | def prepare_playbook_input(
method _reset_software_csv_files (line 132) | def _reset_software_csv_files(self) -> None:
class PlaybookQueueRequestService (line 181) | class PlaybookQueueRequestService:
method __init__ (line 188) | def __init__(self, request_repo: PlaybookQueueRequestRepository) -> None:
method submit_request (line 196) | def submit_request(
class PlaybookQueueResultService (line 229) | class PlaybookQueueResultService:
method __init__ (line 236) | def __init__(self, result_repo: PlaybookQueueResultRepository) -> None:
method poll_results (line 244) | def poll_results(
FILE: build_stream/core/localrepo/value_objects.py
class PlaybookPath (line 26) | class PlaybookPath:
method __post_init__ (line 42) | def __post_init__(self) -> None:
method __str__ (line 70) | def __str__(self) -> str:
class ExtraVars (line 76) | class ExtraVars:
method __post_init__ (line 93) | def __post_init__(self) -> None:
method to_dict (line 109) | def to_dict(self) -> Dict[str, Any]:
method __str__ (line 113) | def __str__(self) -> str:
class ExecutionTimeout (line 119) | class ExecutionTimeout:
method __post_init__ (line 135) | def __post_init__(self) -> None:
method default (line 148) | def default(cls) -> "ExecutionTimeout":
method to_seconds (line 152) | def to_seconds(self) -> int:
method __str__ (line 156) | def __str__(self) -> str:
FILE: build_stream/core/validate/entities.py
class ValidateImageOnTestRequest (line 25) | class ValidateImageOnTestRequest:
method to_dict (line 51) | def to_dict(self) -> Dict[str, Any]:
method generate_filename (line 64) | def generate_filename(self) -> str:
FILE: build_stream/core/validate/exceptions.py
class ValidateDomainError (line 18) | class ValidateDomainError(Exception):
method __init__ (line 21) | def __init__(self, message: str, correlation_id: str = ""):
class EnvironmentUnavailableError (line 33) | class EnvironmentUnavailableError(ValidateDomainError):
class ValidationExecutionError (line 37) | class ValidationExecutionError(ValidateDomainError):
class StageGuardViolationError (line 41) | class StageGuardViolationError(ValidateDomainError):
FILE: build_stream/core/validate/services.py
class ValidateQueueService (line 25) | class ValidateQueueService:
method __init__ (line 28) | def __init__(self, queue_repo) -> None:
method submit_request (line 36) | def submit_request(
FILE: build_stream/generate_catalog.py
function load_json (line 41) | def load_json(filepath):
function _is_infra_package_name (line 47) | def _is_infra_package_name(pkg_name: str) -> bool:
function load_software_config (line 60) | def load_software_config(config_path):
function _extract_arch_from_pxe_group (line 106) | def _extract_arch_from_pxe_group(pxe_group: str):
function load_pxe_functional_groups (line 114) | def load_pxe_functional_groups(pxe_file):
function _append_unique_source (line 128) | def _append_unique_source(pkg_sources, source):
function _render_templated_url (line 133) | def _render_templated_url(template: str, bundle_name: str, versions_by_n...
function collect_packages_from_config (line 160) | def collect_packages_from_config(config_dir, allowed_bundles_by_arch, ve...
function generate_catalog (line 269) | def generate_catalog(input_dir, software_config_path, pxe_mapping_file):
function build_functional_layers (line 381) | def build_functional_layers(functional_packages, pxe_groups, role_packag...
function map_packages_to_roles (line 418) | def map_packages_to_roles(packages, config_dir, allowed_bundles, bundle_...
function create_package_entry (line 484) | def create_package_entry(pkg_data):
function create_infra_package_entry (line 506) | def create_infra_package_entry(pkg_data):
FILE: build_stream/generate_catalog_examples.py
function resolve_base_and_paths (line 29) | def resolve_base_and_paths(base_dir_arg: str):
function copy_mapping_to_input (line 53) | def copy_mapping_to_input(mapping_dir: Path, input_dir: Path):
function generate_example_catalogs (line 67) | def generate_example_catalogs(base_dir: str):
function main (line 129) | def main():
FILE: build_stream/infra/artifact_store/file_artifact_store.py
class FileArtifactStore (line 39) | class FileArtifactStore:
method __init__ (line 54) | def __init__(
method store (line 82) | def store(
method retrieve (line 137) | def retrieve(
method exists (line 192) | def exists(self, key: ArtifactKey) -> bool:
method delete (line 204) | def delete(self, key: ArtifactKey) -> bool:
method generate_key (line 223) | def generate_key(self, hint: StoreHint, kind: ArtifactKind) -> Artifac...
method _get_artifact_path (line 244) | def _get_artifact_path(self, key: ArtifactKey) -> Path:
method _cleanup_empty_dirs (line 255) | def _cleanup_empty_dirs(self, directory: Path) -> None:
method _resolve_content (line 271) | def _resolve_content(
method _zip_file_map (line 323) | def _zip_file_map(self, file_map: Dict[str, bytes]) -> bytes:
method _zip_directory (line 338) | def _zip_directory(self, directory: Path) -> bytes:
method _validate_content_type (line 360) | def _validate_content_type(self, content_type: str) -> None:
method _validate_size (line 375) | def _validate_size(self, raw_bytes: bytes) -> None:
FILE: build_stream/infra/artifact_store/in_memory_artifact_metadata.py
class InMemoryArtifactMetadataRepository (line 23) | class InMemoryArtifactMetadataRepository:
method __init__ (line 30) | def __init__(self) -> None:
method save (line 34) | def save(self, record: ArtifactRecord) -> None:
method find_by_job_stage_and_label (line 47) | def find_by_job_stage_and_label(
method find_by_job (line 66) | def find_by_job(self, job_id: JobId) -> List[ArtifactRecord]:
method delete_by_job (line 82) | def delete_by_job(self, job_id: JobId) -> int:
FILE: build_stream/infra/artifact_store/in_memory_artifact_store.py
class InMemoryArtifactStore (line 39) | class InMemoryArtifactStore:
method __init__ (line 54) | def __init__(
method store (line 73) | def store(
method retrieve (line 119) | def retrieve(
method exists (line 160) | def exists(self, key: ArtifactKey) -> bool:
method delete (line 171) | def delete(self, key: ArtifactKey) -> bool:
method generate_key (line 185) | def generate_key(self, hint: StoreHint, kind: ArtifactKind) -> Artifac...
method _resolve_content (line 206) | def _resolve_content(
method _zip_file_map (line 258) | def _zip_file_map(self, file_map: Dict[str, bytes]) -> bytes:
method _zip_directory (line 273) | def _zip_directory(self, directory: Path) -> bytes:
method _validate_content_type (line 295) | def _validate_content_type(self, content_type: str) -> None:
method _validate_size (line 310) | def _validate_size(self, raw_bytes: bytes) -> None:
FILE: build_stream/infra/db/alembic/env.py
function run_migrations_offline (line 42) | def run_migrations_offline() -> None:
function run_migrations_online (line 60) | def run_migrations_online() -> None:
FILE: build_stream/infra/db/alembic/versions/20260219_001_create_jobs_table.py
function upgrade (line 35) | def upgrade() -> None:
function downgrade (line 59) | def downgrade() -> None:
FILE: build_stream/infra/db/alembic/versions/20260219_002_create_stages_table.py
function upgrade (line 35) | def upgrade() -> None:
function downgrade (line 65) | def downgrade() -> None:
FILE: build_stream/infra/db/alembic/versions/20260219_003_create_idempotency_keys_table.py
function upgrade (line 35) | def upgrade() -> None:
function downgrade (line 51) | def downgrade() -> None:
FILE: build_stream/infra/db/alembic/versions/20260219_004_create_audit_events_table.py
function upgrade (line 36) | def upgrade() -> None:
function downgrade (line 61) | def downgrade() -> None:
FILE: build_stream/infra/db/alembic/versions/20260219_005_create_artifact_metadata_table.py
function upgrade (line 35) | def upgrade() -> None:
function downgrade (line 57) | def downgrade() -> None:
FILE: build_stream/infra/db/config.py
class DatabaseConfig (line 21) | class DatabaseConfig:
method __init__ (line 24) | def __init__(self):
method validate (line 31) | def validate(self) -> None:
FILE: build_stream/infra/db/mappers.py
class JobMapper (line 40) | class JobMapper:
method to_orm (line 44) | def to_orm(job: Job) -> JobModel:
method to_domain (line 66) | def to_domain(model: JobModel) -> Job:
class StageMapper (line 88) | class StageMapper:
method to_orm (line 92) | def to_orm(stage: Stage) -> StageModel:
method to_domain (line 115) | def to_domain(model: StageModel) -> Stage:
class IdempotencyRecordMapper (line 138) | class IdempotencyRecordMapper:
method to_orm (line 142) | def to_orm(record: IdempotencyRecord) -> IdempotencyKeyModel:
method to_domain (line 161) | def to_domain(model: IdempotencyKeyModel) -> IdempotencyRecord:
class AuditEventMapper (line 180) | class AuditEventMapper:
method to_orm (line 184) | def to_orm(event: AuditEvent) -> AuditEventModel:
method to_domain (line 204) | def to_domain(model: AuditEventModel) -> AuditEvent:
FILE: build_stream/infra/db/models.py
class JobModel (line 39) | class JobModel(Base):
class StageModel (line 81) | class StageModel(Base):
class IdempotencyKeyModel (line 126) | class IdempotencyKeyModel(Base):
class AuditEventModel (line 153) | class AuditEventModel(Base):
class ArtifactMetadata (line 184) | class ArtifactMetadata(Base):
FILE: build_stream/infra/db/repositories.py
class SqlJobRepository (line 45) | class SqlJobRepository:
method __init__ (line 48) | def __init__(self, session: Session) -> None:
method save (line 56) | def save(self, job: Job) -> None:
method find_by_id (line 100) | def find_by_id(self, job_id: JobId) -> Optional[Job]:
method exists (line 114) | def exists(self, job_id: JobId) -> bool:
class SqlStageRepository (line 128) | class SqlStageRepository:
method __init__ (line 131) | def __init__(self, session: Session) -> None:
method save (line 139) | def save(self, stage: Stage) -> None:
method save_all (line 188) | def save_all(self, stages: List[Stage]) -> None:
method find_by_job_and_name (line 200) | def find_by_job_and_name(
method find_all_by_job (line 223) | def find_all_by_job(self, job_id: JobId) -> List[Stage]:
class SqlIdempotencyRepository (line 241) | class SqlIdempotencyRepository:
method __init__ (line 244) | def __init__(self, session: Session) -> None:
method save (line 252) | def save(self, record: IdempotencyRecord) -> None:
method find_by_key (line 262) | def find_by_key(self, key: IdempotencyKey) -> Optional[IdempotencyReco...
class SqlAuditEventRepository (line 277) | class SqlAuditEventRepository:
method __init__ (line 280) | def __init__(self, session: Session) -> None:
method save (line 288) | def save(self, event: AuditEvent) -> None:
method find_by_job (line 298) | def find_by_job(self, job_id: JobId) -> List[AuditEvent]:
class SqlArtifactMetadataRepository (line 316) | class SqlArtifactMetadataRepository(ArtifactMetadataRepository):
method __init__ (line 319) | def __init__(self, session: Session):
method save (line 323) | def save(self, record: ArtifactRecord) -> None:
method get_by_job_id_and_label (line 344) | def get_by_job_id_and_label(
method find_by_job_stage_and_label (line 364) | def find_by_job_stage_and_label(
method list_by_job_id (line 388) | def list_by_job_id(self, job_id: JobId) -> List[ArtifactRecord]:
method _db_record_to_entity (line 400) | def _db_record_to_entity(self, db_record) -> ArtifactRecord:
FILE: build_stream/infra/db/session.py
function _get_engine (line 35) | def _get_engine() -> Engine:
function _get_session_factory (line 54) | def _get_session_factory() -> sessionmaker:
function SessionLocal (line 66) | def SessionLocal() -> Session:
function get_db_session (line 79) | def get_db_session() -> Generator[Session, None, None]:
function get_db (line 99) | def get_db() -> Generator[Session, None, None]:
FILE: build_stream/infra/id_generator.py
class JobUUIDGenerator (line 24) | class JobUUIDGenerator(JobIdGenerator): # pylint: disable=R0903
method generate (line 27) | def generate(self) -> JobId:
class UUIDv4Generator (line 44) | class UUIDv4Generator(UUIDGenerator): # pylint: disable=R0903
method generate (line 47) | def generate(self) -> uuid.UUID:
FILE: build_stream/infra/repositories/in_memory.py
class InMemoryJobRepository (line 23) | class InMemoryJobRepository:
method __init__ (line 26) | def __init__(self) -> None:
method save (line 30) | def save(self, job: Job) -> None:
method find_by_id (line 34) | def find_by_id(self, job_id: JobId) -> Optional[Job]:
method exists (line 38) | def exists(self, job_id: JobId) -> bool:
class InMemoryStageRepository (line 43) | class InMemoryStageRepository:
method __init__ (line 46) | def __init__(self) -> None:
method save (line 50) | def save(self, stage: Stage) -> None:
method save_all (line 65) | def save_all(self, stages: List[Stage]) -> None:
method find_by_job_and_name (line 70) | def find_by_job_and_name(
method find_all_by_job (line 83) | def find_all_by_job(self, job_id: JobId) -> List[Stage]:
class InMemoryIdempotencyRepository (line 88) | class InMemoryIdempotencyRepository:
method __init__ (line 91) | def __init__(self) -> None:
method save (line 95) | def save(self, record: IdempotencyRecord) -> None:
method find_by_key (line 99) | def find_by_key(self, key: IdempotencyKey) -> Optional[IdempotencyReco...
class InMemoryAuditEventRepository (line 104) | class InMemoryAuditEventRepository:
method __init__ (line 107) | def __init__(self) -> None:
method save (line 111) | def save(self, event: AuditEvent) -> None:
method find_by_job (line 118) | def find_by_job(self, job_id: JobId) -> List[AuditEvent]:
FILE: build_stream/infra/repositories/nfs_build_image_inventory_repository.py
class NfsBuildImageInventoryRepository (line 28) | class NfsBuildImageInventoryRepository:
method __init__ (line 34) | def __init__(
method create_inventory_file (line 48) | def create_inventory_file(self, inventory_host: InventoryHost, job_id:...
FILE: build_stream/infra/repositories/nfs_input_repository.py
function _read_project_name (line 44) | def _read_project_name(default_file_path: str = "/opt/omnia/input/defaul...
class NfsInputRepository (line 69) | class NfsInputRepository(BuildStreamConfigRepository, BuildImageInventor...
method __init__ (line 81) | def __init__(
method get_aarch64_inv_host (line 114) | def get_aarch64_inv_host(self, job_id: str) -> Optional[InventoryHost]:
method create_inventory_file (line 171) | def create_inventory_file(self, inventory_host: InventoryHost, job_id:...
method get_source_input_repository_path (line 217) | def get_source_input_repository_path(self, job_id: str) -> Path:
method get_destination_input_repository_path (line 228) | def get_destination_input_repository_path(self) -> Path:
method validate_input_directory (line 236) | def validate_input_directory(self, path: Path) -> bool:
FILE: build_stream/infra/repositories/nfs_playbook_queue_request_repository.py
class NfsPlaybookQueueRequestRepository (line 38) | class NfsPlaybookQueueRequestRepository:
method __init__ (line 45) | def __init__(self, queue_base_path: str = DEFAULT_QUEUE_BASE) -> None:
method write_request (line 54) | def write_request(self, request: PlaybookRequest) -> Path:
method is_available (line 99) | def is_available(self) -> bool:
method ensure_directories (line 109) | def ensure_directories(self) -> None:
FILE: build_stream/infra/repositories/nfs_playbook_queue_result_repository.py
class NfsPlaybookQueueResultRepository (line 35) | class NfsPlaybookQueueResultRepository:
method __init__ (line 42) | def __init__(self, queue_base_path: str = DEFAULT_QUEUE_BASE) -> None:
method get_unprocessed_results (line 56) | def get_unprocessed_results(self) -> List[Path]:
method read_result (line 73) | def read_result(self, result_path: Path) -> PlaybookResult:
method archive_result (line 104) | def archive_result(self, result_path: Path) -> None:
method is_available (line 133) | def is_available(self) -> bool:
method ensure_directories (line 143) | def ensure_directories(self) -> None:
method clear_processed_cache (line 149) | def clear_processed_cache(self) -> None:
FILE: build_stream/main.py
function lifespan (line 54) | async def lifespan(app: FastAPI):
function root (line 100) | async def root() -> dict:
function health_check (line 115) | async def health_check() -> dict:
function global_exception_handler (line 121) | async def global_exception_handler(request, exc): # pylint: disable=unu...
function get_server_config (line 130) | def get_server_config():
FILE: build_stream/orchestrator/build_image/commands/create_build_image.py
class CreateBuildImageCommand (line 24) | class CreateBuildImageCommand:
FILE: build_stream/orchestrator/build_image/dtos/build_image_response.py
class BuildImageResponse (line 22) | class BuildImageResponse:
FILE: build_stream/orchestrator/build_image/use_cases/create_build_image.py
class CreateBuildImageUseCase (line 85) | class CreateBuildImageUseCase:
method __init__ (line 107) | def __init__(
method execute (line 136) | def execute(self, command: CreateBuildImageCommand) -> BuildImageRespo...
method _validate_job (line 182) | def _validate_job(self, command: CreateBuildImageCommand):
method _verify_upstream_stage_completed (line 199) | def _verify_upstream_stage_completed(
method _validate_stage (line 224) | def _validate_stage(self, command: CreateBuildImageCommand, architectu...
method _validate_architecture (line 265) | def _validate_architecture(
method _validate_image_key (line 278) | def _validate_image_key(self, command: CreateBuildImageCommand) -> Ima...
method _validate_functional_groups (line 288) | def _validate_functional_groups(
method _get_inventory_host (line 301) | def _get_inventory_host(
method _create_inventory_file (line 357) | def _create_inventory_file(
method _build_playbook_request (line 422) | def _build_playbook_request(
method _create_request (line 439) | def _create_request(
method _submit_to_queue (line 474) | def _submit_to_queue(
method _emit_stage_started_event (line 501) | def _emit_stage_started_event(
method _to_response (line 525) | def _to_response(
FILE: build_stream/orchestrator/catalog/commands/generate_input_files.py
class GenerateInputFilesCommand (line 25) | class GenerateInputFilesCommand:
FILE: build_stream/orchestrator/catalog/commands/parse_catalog.py
class ParseCatalogCommand (line 24) | class ParseCatalogCommand:
method __post_init__ (line 42) | def __post_init__(self) -> None:
FILE: build_stream/orchestrator/catalog/dtos.py
class ParseCatalogResult (line 24) | class ParseCatalogResult:
class GenerateInputFilesResult (line 38) | class GenerateInputFilesResult:
FILE: build_stream/orchestrator/catalog/use_cases/generate_input_files.py
class GenerateInputFilesUseCase (line 64) | class GenerateInputFilesUseCase:
method __init__ (line 77) | def __init__(
method execute (line 98) | def execute(
method _load_and_guard_stage (line 135) | def _load_and_guard_stage(
method _verify_upstream_stage_completed (line 181) | def _verify_upstream_stage_completed(
method _retrieve_upstream_artifacts (line 207) | def _retrieve_upstream_artifacts(
method _resolve_policy_path (line 233) | def _resolve_policy_path(
method _generate_omnia_configs (line 246) | def _generate_omnia_configs(
method _store_output_artifacts (line 290) | def _store_output_artifacts(
method _copy_configs_to_artifacts_input_dir (line 339) | def _copy_configs_to_artifacts_input_dir(
method _mark_stage_started (line 379) | def _mark_stage_started(
method _mark_stage_completed (line 390) | def _mark_stage_completed(
method _mark_stage_failed (line 401) | def _mark_stage_failed(
method _emit_audit_event (line 435) | def _emit_audit_event(
method _build_success_result (line 463) | def _build_success_result(
FILE: build_stream/orchestrator/catalog/use_cases/parse_catalog.py
class ParseCatalogUseCase (line 68) | class ParseCatalogUseCase: # pylint: disable=too-few-public-methods
method __init__ (line 80) | def __init__(
method execute (line 97) | def execute(self, command: ParseCatalogCommand) -> ParseCatalogResult:
method _load_and_guard_stage (line 143) | def _load_and_guard_stage(
method _check_idempotent_completion (line 189) | def _check_idempotent_completion(
method _validate_file_format (line 201) | def _validate_file_format(self, filename: str) -> None:
method _parse_and_validate_json (line 208) | def _parse_and_validate_json(self, content: bytes) -> dict:
method _store_catalog_artifact (line 227) | def _store_catalog_artifact(
method _generate_and_store_root_jsons (line 268) | def _generate_and_store_root_jsons(
method _mark_stage_started (line 344) | def _mark_stage_started(
method _mark_stage_completed (line 359) | def _mark_stage_completed(
method _mark_stage_failed (line 369) | def _mark_stage_failed(
method _emit_audit_event (line 404) | def _emit_audit_event(
method _build_success_result (line 431) | def _build_success_result(
FILE: build_stream/orchestrator/common/result_poller.py
class ResultPoller (line 44) | class ResultPoller:
method __init__ (line 62) | def __init__(
method start (line 90) | async def start(self) -> None:
method stop (line 100) | async def stop(self) -> None:
method _poll_loop (line 114) | async def _poll_loop(self) -> None:
method _on_result_received (line 128) | def _on_result_received(self, result: PlaybookResult) -> None:
FILE: build_stream/orchestrator/jobs/commands/create_job.py
class CreateJobCommand (line 27) | class CreateJobCommand:
FILE: build_stream/orchestrator/jobs/dtos/job_response.py
class JobResponse (line 22) | class JobResponse:
method from_entity (line 52) | def from_entity(job, is_new: bool = True) -> "JobResponse":
FILE: build_stream/orchestrator/jobs/use_cases/create_job.py
class CreateJobUseCase (line 42) | class CreateJobUseCase:
method __init__ (line 58) | def __init__(
method execute (line 84) | def execute(self, command: CreateJobCommand) -> JobResponse:
method _generate_job_id (line 113) | def _generate_job_id(self, command: CreateJobCommand) -> JobId:
method _check_idempotency (line 123) | def _check_idempotency(
method _build_job (line 142) | def _build_job(self, command: CreateJobCommand, job_id: JobId) -> Job:
method _save_job_and_stages (line 151) | def _save_job_and_stages(self, job: Job, stages: List[Stage]) -> None:
method _save_idempotency_record (line 156) | def _save_idempotency_record(
method _emit_job_created_event (line 174) | def _emit_job_created_event(
method _to_response (line 195) | def _to_response(self, job: Job, is_new: bool = True) -> JobResponse:
method _now_utc (line 199) | def _now_utc(self) -> datetime:
method _compute_fingerprint (line 203) | def _compute_fingerprint(self, command: CreateJobCommand) -> RequestFi...
method _create_initial_stages (line 212) | def _create_initial_stages(self, job_id: JobId) -> List[Stage]:
method _generate_event_id (line 239) | def _generate_event_id(self) -> str:
FILE: build_stream/orchestrator/local_repo/commands/create_local_repo.py
class CreateLocalRepoCommand (line 23) | class CreateLocalRepoCommand:
FILE: build_stream/orchestrator/local_repo/dtos/local_repo_response.py
class LocalRepoResponse (line 21) | class LocalRepoResponse:
FILE: build_stream/orchestrator/local_repo/use_cases/create_local_repo.py
class CreateLocalRepoUseCase (line 64) | class CreateLocalRepoUseCase:
method __init__ (line 83) | def __init__(
method execute (line 109) | def execute(self, command: CreateLocalRepoCommand) -> LocalRepoResponse:
method _validate_job (line 137) | def _validate_job(self, command: CreateLocalRepoCommand):
method _verify_upstream_stage_completed (line 154) | def _verify_upstream_stage_completed(
method _validate_stage (line 179) | def _validate_stage(self, command: CreateLocalRepoCommand) -> Stage:
method _prepare_input_files (line 226) | def _prepare_input_files(
method _build_playbook_request (line 277) | def _build_playbook_request(
method _submit_to_queue (line 293) | def _submit_to_queue(
method _emit_stage_started_event (line 324) | def _emit_stage_started_event(
method _to_response (line 342) | def _to_response(
FILE: build_stream/orchestrator/validate/commands/validate_image_on_test.py
class ValidateImageOnTestCommand (line 23) | class ValidateImageOnTestCommand:
FILE: build_stream/orchestrator/validate/dtos/validate_image_on_test_response.py
class ValidateImageOnTestResponse (line 21) | class ValidateImageOnTestResponse:
FILE: build_stream/orchestrator/validate/use_cases/validate_image_on_test.py
class ValidateImageOnTestUseCase (line 61) | class ValidateImageOnTestUseCase:
method __init__ (line 78) | def __init__(
method execute (line 101) | def execute(self, command: ValidateImageOnTestCommand) -> ValidateImag...
method _validate_job (line 125) | def _validate_job(self, command: ValidateImageOnTestCommand) -> None:
method _validate_stage (line 140) | def _validate_stage(self, command: ValidateImageOnTestCommand) -> Stage:
method _enforce_stage_guard (line 162) | def _enforce_stage_guard(self, command: ValidateImageOnTestCommand) ->...
method _create_request (line 199) | def _create_request(
method _submit_to_queue (line 226) | def _submit_to_queue(
method _emit_stage_started_event (line 293) | def _emit_stage_started_event(
method _to_response (line 311) | def _to_response(
FILE: build_stream/playbook-watcher/playbook_watcher_service.py
function log_secure_info (line 45) | def log_secure_info(level: str, message: str, identifier: Optional[str] ...
function signal_handler (line 110) | def signal_handler(signum, _):
function ensure_directories (line 121) | def ensure_directories():
function validate_playbook_name (line 148) | def validate_playbook_name(playbook_name: str) -> bool:
function map_playbook_name_to_path (line 179) | def map_playbook_name_to_path(playbook_name: str) -> Optional[str]:
function validate_job_id (line 199) | def validate_job_id(job_id: str) -> bool:
function validate_stage_name (line 215) | def validate_stage_name(stage_name: str) -> bool:
function validate_command (line 229) | def validate_command(cmd: list, playbook_path: str) -> bool:
function parse_request_file (line 402) | def parse_request_file(request_path: Path) -> Optional[Dict[str, Any]]:
function extract_playbook_name (line 557) | def extract_playbook_name(full_playbook_path: str) -> str:
function _build_log_paths (line 570) | def _build_log_paths(playbook_path: str, started_at: datetime) -> tuple:
function move_log_to_job_directory (line 599) | def move_log_to_job_directory(host_log_file_path: Path, job_id: str) -> ...
function execute_playbook (line 638) | def execute_playbook(request_data: Dict[str, Any]) -> Dict[str, Any]:
function write_result_file (line 910) | def write_result_file(result_data: Dict[str, Any], original_filename: st...
function archive_request_file (line 945) | def archive_request_file(request_path: Path) -> None:
function process_request (line 966) | def process_request(request_path: Path) -> None:
function process_request_async (line 1045) | def process_request_async(request_path: Path) -> None:
function scan_and_process_requests (line 1054) | def scan_and_process_requests() -> int:
function run_watcher_loop (line 1101) | def run_watcher_loop():
function main (line 1167) | def main():
FILE: build_stream/tests/conftest.py
class ExpiredSignatureError (line 41) | class ExpiredSignatureError(jwt.exceptions.JWTDecodeError):
class InvalidAudienceError (line 45) | class InvalidAudienceError(jwt.exceptions.JWTDecodeError):
class InvalidIssuerError (line 49) | class InvalidIssuerError(jwt.exceptions.JWTDecodeError):
class InvalidSignatureError (line 53) | class InvalidSignatureError(jwt.exceptions.JWTDecodeError):
function _get_app (line 67) | def _get_app():
function _get_auth_service (line 76) | def _get_auth_service():
function _get_auth_routes (line 85) | def _get_auth_routes():
function _get_mock_vault_client (line 94) | def _get_mock_vault_client():
function _get_mock_jwt_handler (line 106) | def _get_mock_jwt_handler():
function mock_vault_client (line 116) | def mock_vault_client():
function mock_vault_with_client (line 127) | def mock_vault_with_client(mock_vault_client): # noqa: W0621
function auth_service (line 141) | def auth_service(mock_vault_client): # noqa: W0621
function mock_jwt_handler (line 155) | def mock_jwt_handler():
function test_client (line 166) | def test_client(mock_vault_client, mock_jwt_handler) -> Generator: # no...
function test_client_with_existing_client (line 198) | def test_client_with_existing_client( # noqa: C0301,W0621
function valid_auth_header (line 232) | def valid_auth_header() -> Dict[str, str]:
function invalid_auth_header (line 248) | def invalid_auth_header() -> Dict[str, str]:
function valid_registration_request (line 259) | def valid_registration_request() -> Dict:
function minimal_registration_request (line 273) | def minimal_registration_request() -> Dict:
function valid_token_request (line 285) | def valid_token_request() -> Dict:
function generate_test_client_secret (line 300) | def generate_test_client_secret() -> str:
function generate_invalid_client_id (line 309) | def generate_invalid_client_id() -> str:
function generate_invalid_client_secret (line 318) | def generate_invalid_client_secret() -> str:
FILE: build_stream/tests/demo/buildstream_demo.py
class ParseCatalogDemo (line 58) | class ParseCatalogDemo:
method __init__ (line 61) | def __init__(self, cleanup=False):
method wait_for_enter (line 91) | def wait_for_enter(self, message="Press ENTER to continue..."):
method load_credentials (line 95) | def load_credentials(self):
method save_credentials (line 117) | def save_credentials(self, client_id, client_secret):
method cleanup_artifacts (line 133) | def cleanup_artifacts(self):
method check_server_health (line 170) | def check_server_health(self):
method register_client (line 192) | def register_client(self):
method get_access_token (line 312) | def get_access_token(self):
method create_job (line 375) | def create_job(self):
method get_job_info (line 430) | def get_job_info(self):
method parse_catalog (line 477) | def parse_catalog(self):
method generate_input_files (line 533) | def generate_input_files(self):
method show_artifacts (line 575) | def show_artifacts(self):
method _fallback_artifact_list (line 650) | def _fallback_artifact_list(self, artifact_path):
method _show_latest_artifacts_preview (line 660) | def _show_latest_artifacts_preview(self, catalog_path, input_files_path):
method create_local_repository (line 713) | def create_local_repository(self):
method _trigger_build_image_stage (line 755) | def _trigger_build_image_stage(self, step_label: str, architecture: st...
method trigger_build_image_x86_64_stage (line 807) | def trigger_build_image_x86_64_stage(self):
method trigger_build_image_aarch64_stage (line 825) | def trigger_build_image_aarch64_stage(self):
method run_demo (line 839) | def run_demo(self):
function main (line 937) | def main():
FILE: build_stream/tests/end_to_end/api/conftest.py
function generate_secure_test_password (line 46) | def generate_secure_test_password(length: int = 24) -> str:
function generate_test_client_secret (line 84) | def generate_test_client_secret(length: int = 32) -> str:
function generate_invalid_client_id (line 103) | def generate_invalid_client_id() -> str:
function generate_invalid_client_secret (line 115) | def generate_invalid_client_secret() -> str:
class IntegrationTestConfig (line 127) | class IntegrationTestConfig:
method get_vault_password (line 137) | def get_vault_password(cls) -> str:
method get_auth_password (line 146) | def get_auth_password(cls) -> str:
class VaultManager (line 155) | class VaultManager: # noqa: R0902 pylint: disable=too-many-instance-att...
method __init__ (line 158) | def __init__(self, base_dir: str):
method setup (line 180) | def setup(self, username: str, password: str) -> None:
method _generate_jwt_keys (line 244) | def _generate_jwt_keys(self) -> None:
method cleanup (line 279) | def cleanup(self) -> None:
class ServerManager (line 287) | class ServerManager:
method __init__ (line 305) | def __init__( # noqa: R0913,R0917 pylint: disable=too-many-arguments,...
method _setup_venv (line 329) | def _setup_venv(self) -> None:
method python_path (line 362) | def python_path(self) -> str:
method _is_port_in_use (line 366) | def _is_port_in_use(self) -> bool:
method _free_port (line 371) | def _free_port(self) -> None:
method start (line 391) | def start(self) -> None:
method _wait_for_server (line 448) | def _wait_for_server(self) -> None:
method stop (line 489) | def stop(self) -> None:
method base_url (line 509) | def base_url(self) -> str:
function integration_test_dir (line 515) | def integration_test_dir() -> Generator[str, None, None]:
function vault_manager (line 527) | def vault_manager(
function project_dir (line 550) | def project_dir() -> str:
function venv_dir (line 560) | def venv_dir(integration_test_dir: str) -> str: # noqa: W0621
function server_manager (line 573) | def server_manager(
function base_url (line 601) | def base_url(server_manager: ServerManager) -> str: # noqa: W0621
function auth_password (line 614) | def auth_password() -> str:
function valid_auth_header (line 624) | def valid_auth_header(auth_password: str) -> Dict[str, str]: # noqa: W0621
function invalid_auth_header (line 640) | def invalid_auth_header() -> Dict[str, str]:
function reset_vault (line 651) | def reset_vault(
FILE: build_stream/tests/end_to_end/api/test_api_flow_e2e.py
class APIFlowContext (line 70) | class APIFlowContext: # noqa: R0902 pylint: disable=too-many-instance-a...
method __init__ (line 85) | def __init__(self):
method has_client_credentials (line 96) | def has_client_credentials(self) -> bool:
method has_access_token (line 100) | def has_access_token(self) -> bool:
method get_auth_header (line 104) | def get_auth_header(self) -> Dict[str, str]:
function api_flow_context (line 119) | def api_flow_context():
class TestCompleteAPIFlow (line 130) | class TestCompleteAPIFlow:
method test_01_health_check (line 148) | def test_01_health_check(
method test_02_register_client (line 165) | def test_02_register_client(
method test_03_request_token (line 203) | def test_03_request_token(
method test_04_token_contains_granted_scopes (line 247) | def test_04_token_contains_granted_scopes(
method test_05_request_token_with_subset_scope (line 264) | def test_05_request_token_with_subset_scope(
method test_06_reject_unauthorized_scope (line 293) | def test_06_reject_unauthorized_scope(
method test_07_reject_invalid_credentials (line 322) | def test_07_reject_invalid_credentials(
method test_08_multiple_tokens_are_unique (line 351) | def test_08_multiple_tokens_are_unique(
class TestAPIFlowErrorHandling (line 384) | class TestAPIFlowErrorHandling:
method test_register_without_auth_fails (line 397) | def test_register_without_auth_fails(
method test_register_with_invalid_auth_fails (line 411) | def test_register_with_invalid_auth_fails(
method test_token_without_registration_fails (line 427) | def test_token_without_registration_fails(
method test_token_with_invalid_grant_type_fails (line 448) | def test_token_with_invalid_grant_type_fails(
class TestAPIFlowSecurityValidation (line 481) | class TestAPIFlowSecurityValidation:
method test_client_credentials_format_validation (line 494) | def test_client_credentials_format_validation(
method test_client_secret_format_validation (line 513) | def test_client_secret_format_validation(
method test_max_clients_limit_enforced (line 531) | def test_max_clients_limit_enforced(
FILE: build_stream/tests/end_to_end/api/test_build_image_e2e.py
class TestBuildImageE2E (line 27) | class TestBuildImageE2E:
method setup_class (line 36) | def setup_class(cls):
method teardown_class (line 59) | def teardown_class(cls):
method get_headers (line 65) | def get_headers(self, correlation_id: str = None) -> Dict[str, str]:
method test_full_build_image_workflow_x86_64 (line 75) | def test_full_build_image_workflow_x86_64(self):
method test_full_build_image_workflow_aarch64 (line 180) | def test_full_build_image_workflow_aarch64(self):
method test_consolidated_repository_functionality (line 262) | def test_consolidated_repository_functionality(self):
method test_build_image_error_cases (line 341) | def test_build_image_error_cases(self):
method test_build_image_concurrent_requests (line 401) | def test_build_image_concurrent_requests(self):
method test_build_image_audit_trail (line 451) | def test_build_image_audit_trail(self):
FILE: build_stream/tests/end_to_end/api/test_generate_input_files_e2e.py
class GenerateInputFilesContext (line 44) | class GenerateInputFilesContext:
method __init__ (line 58) | def __init__(self):
method has_client_credentials (line 71) | def has_client_credentials(self) -> bool:
method has_access_token (line 75) | def has_access_token(self) -> bool:
method has_job_id (line 79) | def has_job_id(self) -> bool:
method get_auth_header (line 83) | def get_auth_header(self) -> Dict[str, str]:
method set_job_id (line 96) | def set_job_id(self, job_id: str) -> None:
method load_catalog_content (line 100) | def load_catalog_content(self) -> str:
method get_catalog_bytes (line 118) | def get_catalog_bytes(self) -> bytes:
function generate_input_files_context (line 124) | def generate_input_files_context():
class TestGenerateInputFilesE2E (line 133) | class TestGenerateInputFilesE2E:
method test_01_health_check (line 150) | def test_01_health_check(self, base_url: str):
method test_02_register_client_for_generate_input_files (line 165) | def test_02_register_client_for_generate_input_files(
method test_03_request_token_for_generate_input_files (line 204) | def test_03_request_token_for_generate_input_files(
method test_04_create_job_for_generate_input_files (line 249) | def test_04_create_job_for_generate_input_files(
method test_05_parse_catalog_prerequisite (line 299) | def test_05_parse_catalog_prerequisite(
method test_06_generate_input_files_success (line 349) | def test_06_generate_input_files_success(
method test_07_generate_input_files_with_custom_policy (line 398) | def test_07_generate_input_files_with_custom_policy(
FILE: build_stream/tests/end_to_end/api/test_parse_catalog_e2e.py
class ParseCatalogContext (line 44) | class ParseCatalogContext: # pylint: disable=too-many-instance-attributes
method __init__ (line 58) | def __init__(self):
method has_client_credentials (line 71) | def has_client_credentials(self) -> bool:
method has_access_token (line 75) | def has_access_token(self) -> bool:
method has_job_id (line 79) | def has_job_id(self) -> bool:
method get_auth_header (line 83) | def get_auth_header(self) -> Dict[str, str]:
method set_job_id (line 96) | def set_job_id(self, job_id: str) -> None:
method load_catalog_content (line 100) | def load_catalog_content(self) -> None:
function parse_catalog_context (line 114) | def parse_catalog_context():
class TestParseCatalogWorkflow (line 125) | class TestParseCatalogWorkflow:
method test_01_health_check (line 139) | def test_01_health_check(
method test_02_register_client_for_parse_catalog (line 156) | def test_02_register_client_for_parse_catalog(
method test_03_request_token_for_parse_catalog (line 194) | def test_03_request_token_for_parse_catalog(
method test_04_create_job_for_parse_catalog (line 238) | def test_04_create_job_for_parse_catalog(
method test_05_parse_catalog_success (line 287) | def test_05_parse_catalog_success(
method test_06_parse_catalog_with_invalid_data (line 337) | def test_06_parse_catalog_with_invalid_data(
method test_07_parse_catalog_with_oversized_file (line 385) | def test_07_parse_catalog_with_oversized_file(
method test_08_parse_catalog_job_status_integration (line 436) | def test_08_parse_catalog_job_status_integration(
method test_09_parse_catalog_with_nonexistent_job_fails (line 471) | def test_09_parse_catalog_with_nonexistent_job_fails(
method test_10_parse_catalog_with_oversized_file_security_check (line 497) | def test_10_parse_catalog_with_oversized_file_security_check(
class TestParseCatalogErrorHandling (line 548) | class TestParseCatalogErrorHandling:
method test_parse_catalog_without_authentication_fails (line 555) | def test_parse_catalog_without_authentication_fails(
method test_parse_catalog_with_invalid_token_fails (line 577) | def test_parse_catalog_with_invalid_token_fails(
class TestParseCatalogSecurityValidation (line 608) | class TestParseCatalogSecurityValidation:
method test_parse_catalog_with_malicious_content (line 620) | def test_parse_catalog_with_malicious_content(
method test_parse_catalog_file_parameter_validation (line 695) | def test_parse_catalog_file_parameter_validation(
FILE: build_stream/tests/end_to_end/api/test_register_e2e.py
class TestRegisterEndpointE2E (line 36) | class TestRegisterEndpointE2E:
method test_register_valid_credentials_returns_201 (line 44) | def test_register_valid_credentials_returns_201(
method test_register_minimal_request_returns_201 (line 80) | def test_register_minimal_request_returns_201(
method test_register_max_clients_reached_returns_409 (line 100) | def test_register_max_clients_reached_returns_409(
method test_register_invalid_auth_returns_401 (line 131) | def test_register_invalid_auth_returns_401(
method test_register_missing_auth_returns_401 (line 150) | def test_register_missing_auth_returns_401(
method test_register_invalid_client_name_returns_422 (line 164) | def test_register_invalid_client_name_returns_422(
method test_register_empty_client_name_returns_422 (line 180) | def test_register_empty_client_name_returns_422(
method test_register_missing_client_name_returns_422 (line 196) | def test_register_missing_client_name_returns_422(
method test_register_invalid_scope_returns_422 (line 212) | def test_register_invalid_scope_returns_422(
method test_register_client_name_too_long_returns_422 (line 231) | def test_register_client_name_too_long_returns_422(
method test_register_response_contains_all_fields (line 247) | def test_register_response_contains_all_fields(
method test_register_client_id_format (line 279) | def test_register_client_id_format(
method test_register_client_secret_format (line 304) | def test_register_client_secret_format(
method test_register_malformed_json_returns_422 (line 326) | def test_register_malformed_json_returns_422(
method test_register_wrong_content_type_returns_422 (line 342) | def test_register_wrong_content_type_returns_422(
method test_register_malformed_basic_auth_returns_401 (line 358) | def test_register_malformed_basic_auth_returns_401(
method test_register_bearer_auth_returns_401 (line 373) | def test_register_bearer_auth_returns_401(
method test_register_special_characters_in_client_name (line 388) | def test_register_special_characters_in_client_name(
method test_register_description_with_unicode (line 405) | def test_register_description_with_unicode(
method test_register_all_valid_scopes (line 424) | def test_register_all_valid_scopes(
FILE: build_stream/tests/end_to_end/api/test_token_e2e.py
function registered_client_e2e (line 45) | def registered_client_e2e( # noqa: W0613
class TestTokenEndpointE2E (line 83) | class TestTokenEndpointE2E:
method test_token_valid_credentials_returns_200 (line 92) | def test_token_valid_credentials_returns_200(
method test_token_response_contains_all_fields (line 122) | def test_token_response_contains_all_fields(
method test_token_jwt_structure (line 145) | def test_token_jwt_structure(
method test_token_with_valid_scope (line 174) | def test_token_with_valid_scope(
method test_token_with_multiple_scopes (line 196) | def test_token_with_multiple_scopes(
method test_token_invalid_client_id_returns_401 (line 219) | def test_token_invalid_client_id_returns_401(
method test_token_invalid_client_secret_returns_401 (line 240) | def test_token_invalid_client_secret_returns_401(
method test_token_missing_client_id_returns_400 (line 262) | def test_token_missing_client_id_returns_400(
method test_token_missing_client_secret_returns_400 (line 282) | def test_token_missing_client_secret_returns_400(
method test_token_missing_grant_type_returns_422 (line 302) | def test_token_missing_grant_type_returns_422(
method test_token_invalid_grant_type_returns_422 (line 319) | def test_token_invalid_grant_type_returns_422(
method test_token_invalid_scope_returns_400 (line 337) | def test_token_invalid_scope_returns_400(
method test_token_invalid_client_id_format_returns_422 (line 359) | def test_token_invalid_client_id_format_returns_422(
method test_token_invalid_client_secret_format_returns_422 (line 378) | def test_token_invalid_client_secret_format_returns_422(
method test_token_expires_in_is_positive (line 397) | def test_token_expires_in_is_positive(
method test_token_type_is_bearer (line 419) | def test_token_type_is_bearer(
method test_token_multiple_requests_return_different_tokens (line 440) | def test_token_multiple_requests_return_different_tokens(
method test_token_default_scope_when_not_specified (line 473) | def test_token_default_scope_when_not_specified(
FILE: build_stream/tests/integration/api/auth/conftest.py
function valid_auth_header (line 26) | def valid_auth_header() -> Dict[str, str]:
function invalid_auth_header (line 35) | def invalid_auth_header() -> Dict[str, str]:
FILE: build_stream/tests/integration/api/auth/test_register.py
class TestRegisterEndpoint (line 25) | class TestRegisterEndpoint:
method test_register_valid_credentials_returns_201 (line 30) | def test_register_valid_credentials_returns_201(
method test_register_minimal_request_returns_201 (line 54) | def test_register_minimal_request_returns_201(
method test_register_invalid_auth_returns_401 (line 73) | def test_register_invalid_auth_returns_401(
method test_register_missing_auth_returns_401 (line 91) | def test_register_missing_auth_returns_401(
method test_register_max_clients_reached_returns_409 (line 104) | def test_register_max_clients_reached_returns_409(
method test_register_duplicate_client_name_returns_409 (line 122) | def test_register_duplicate_client_name_returns_409(
method test_register_invalid_client_name_returns_422 (line 146) | def test_register_invalid_client_name_returns_422(
method test_register_empty_client_name_returns_422 (line 164) | def test_register_empty_client_name_returns_422(
method test_register_missing_client_name_returns_422 (line 182) | def test_register_missing_client_name_returns_422(
method test_register_invalid_scope_returns_422 (line 200) | def test_register_invalid_scope_returns_422(
method test_register_client_name_too_long_returns_422 (line 219) | def test_register_client_name_too_long_returns_422(
method test_register_response_contains_all_fields (line 237) | def test_register_response_contains_all_fields(
method test_register_client_id_format (line 264) | def test_register_client_id_format(
method test_register_client_secret_format (line 288) | def test_register_client_secret_format(
FILE: build_stream/tests/integration/api/auth/test_token.py
function registered_client (line 27) | def registered_client(test_client: TestClient, valid_auth_header: Dict[s...
function valid_token_request (line 52) | def valid_token_request(registered_client: Dict) -> Dict:
class TestTokenEndpoint (line 69) | class TestTokenEndpoint:
method test_token_valid_credentials_returns_200 (line 74) | def test_token_valid_credentials_returns_200(
method test_token_response_contains_all_fields (line 97) | def test_token_response_contains_all_fields(
method test_token_jwt_format (line 119) | def test_token_jwt_format(
method test_token_with_valid_scope (line 143) | def test_token_with_valid_scope(
method test_token_invalid_client_id_returns_401 (line 164) | def test_token_invalid_client_id_returns_401(
method test_token_invalid_client_secret_returns_401 (line 184) | def test_token_invalid_client_secret_returns_401(
method test_token_missing_client_id_returns_400 (line 206) | def test_token_missing_client_id_returns_400(
method test_token_missing_client_secret_returns_400 (line 225) | def test_token_missing_client_secret_returns_400(
method test_token_missing_grant_type_returns_422 (line 244) | def test_token_missing_grant_type_returns_422(
method test_token_invalid_grant_type_returns_422 (line 260) | def test_token_invalid_grant_type_returns_422(
method test_token_invalid_scope_returns_400 (line 277) | def test_token_invalid_scope_returns_400(
method test_token_invalid_client_id_format_returns_422 (line 298) | def test_token_invalid_client_id_format_returns_422(
method test_token_invalid_client_secret_format_returns_422 (line 317) | def test_token_invalid_client_secret_format_returns_422(
method test_token_expires_in_is_positive (line 336) | def test_token_expires_in_is_positive(
method test_token_type_is_bearer (line 357) | def test_token_type_is_bearer(
method test_token_multiple_requests_return_different_tokens (line 377) | def test_token_multiple_requests_return_different_tokens(
method test_token_default_scope_when_not_specified (line 409) | def test_token_default_scope_when_not_specified(
FILE: build_stream/tests/integration/api/build_image/conftest.py
function client (line 25) | def client(tmp_path):
function uuid_generator_fixture (line 71) | def uuid_generator_fixture():
function auth_headers_fixture (line 78) | def auth_headers_fixture(uuid_generator) -> Dict[str, str]:
function unique_correlation_id (line 88) | def unique_correlation_id(uuid_generator) -> str:
function created_job (line 94) | def created_job(client, auth_headers) -> str:
function job_with_completed_parse_catalog (line 103) | def job_with_completed_parse_catalog(client, auth_headers, created_job, ...
FILE: build_stream/tests/integration/api/build_image/test_build_image_api.py
class TestBuildImageAPI (line 28) | class TestBuildImageAPI:
method test_create_build_image_success_x86_64 (line 31) | def test_create_build_image_success_x86_64(self, client, auth_headers,...
method test_create_build_image_success_aarch64 (line 58) | def test_create_build_image_success_aarch64(self, client, auth_headers...
method test_create_build_image_invalid_architecture (line 79) | def test_create_build_image_invalid_architecture(self, client, auth_he...
method test_create_build_image_invalid_image_key (line 98) | def test_create_build_image_invalid_image_key(self, client, auth_heade...
method test_create_build_image_aarch64_missing_inventory_host (line 117) | def test_create_build_image_aarch64_missing_inventory_host(self, clien...
method test_create_build_image_unauthorized (line 136) | def test_create_build_image_unauthorized(self, client):
method test_create_build_image_job_not_found (line 149) | def test_create_build_image_job_not_found(self, client, auth_headers):
method test_create_build_image_queue_submission (line 165) | def test_create_build_image_queue_submission(self, client, auth_header...
FILE: build_stream/tests/integration/api/catalog_roles/conftest.py
function client (line 25) | def client(tmp_path):
function uuid_generator_fixture (line 71) | def uuid_generator_fixture():
function auth_headers_fixture (line 78) | def auth_headers_fixture(uuid_generator) -> Dict[str, str]:
function unique_correlation_id (line 88) | def unique_correlation_id(uuid_generator) -> str:
function created_job (line 94) | def created_job(client, auth_headers) -> str:
function job_with_completed_parse_catalog (line 103) | def job_with_completed_parse_catalog(client, auth_headers, created_job, ...
FILE: build_stream/tests/integration/api/catalog_roles/test_catalog_roles_api.py
class TestGetCatalogRolesAPI (line 38) | class TestGetCatalogRolesAPI: # pylint: disable=too-many-public-methods
method valid_catalog_json (line 43) | def valid_catalog_json(self) -> Dict[str, Any]:
method job_with_parsed_catalog (line 55) | def job_with_parsed_catalog(
method test_get_roles_success (line 86) | def test_get_roles_success(
method test_get_roles_returns_sorted_list (line 110) | def test_get_roles_returns_sorted_list(
method test_get_roles_response_schema (line 128) | def test_get_roles_response_schema(
method test_get_roles_returns_correlation_id (line 148) | def test_get_roles_returns_correlation_id(
method test_get_roles_no_auth_returns_401 (line 171) | def test_get_roles_no_auth_returns_401(
method test_get_roles_invalid_token_returns_401 (line 184) | def test_get_roles_invalid_token_returns_401(
method test_get_roles_requires_job_read_scope (line 200) | def test_get_roles_requires_job_read_scope(
method test_get_roles_nonexistent_job_returns_404 (line 215) | def test_get_roles_nonexistent_job_returns_404(
method test_get_roles_upstream_stage_not_completed (line 232) | def test_get_roles_upstream_stage_not_completed(
method test_get_roles_invalid_job_id_format_returns_400 (line 254) | def test_get_roles_invalid_job_id_format_returns_400(
method test_error_response_does_not_expose_internals (line 273) | def test_error_response_does_not_expose_internals(
FILE: build_stream/tests/integration/api/conftest.py
function client (line 29) | def client() -> TestClient:
function uuid_generator_fixture (line 36) | def uuid_generator_fixture() -> UUIDv4Generator:
function auth_headers (line 42) | def auth_headers(uuid_generator: UUIDv4Generator) -> Dict[str, str]:
function mock_jwt_validation (line 52) | def mock_jwt_validation() -> Generator[None, None, None]:
function auth_headers_with_mock (line 76) | def auth_headers_with_mock(mock_jwt_validation: None, uuid_generator: UU...
FILE: build_stream/tests/integration/api/generate_input_files/conftest.py
function client (line 25) | def client(tmp_path):
function uuid_generator_fixture (line 71) | def uuid_generator_fixture():
function auth_headers_fixture (line 78) | def auth_headers_fixture(uuid_generator) -> Dict[str, str]:
function unique_correlation_id (line 88) | def unique_correlation_id(uuid_generator) -> str:
function created_job (line 94) | def created_job(client, auth_headers) -> str:
FILE: build_stream/tests/integration/api/generate_input_files/test_generate_input_files_api.py
class TestGenerateInputFilesAPI (line 26) | class TestGenerateInputFilesAPI: # pylint: disable=too-many-public-methods
method client (line 30) | def client(self) -> TestClient:
method auth_headers (line 39) | def auth_headers(self, mock_jwt_validation) -> Dict[str, str]: # pyli...
method valid_job_id (line 48) | def valid_job_id(self) -> str:
method valid_request_data (line 53) | def valid_request_data(self) -> Dict[str, Any]:
method custom_policy_request_data (line 58) | def custom_policy_request_data(self) -> Dict[str, Any]:
method created_job (line 65) | def created_job(self, client: TestClient, auth_headers: Dict[str, str]...
method test_endpoint_exists_and_requires_auth (line 79) | def test_endpoint_exists_and_requires_auth(self, client: TestClient, v...
method test_valid_request_structure (line 90) | def test_valid_request_structure(self, client: TestClient, auth_header...
method test_request_with_custom_policy (line 102) | def test_request_with_custom_policy(self, client: TestClient, auth_hea...
method test_missing_correlation_id (line 114) | def test_missing_correlation_id(self, client: TestClient, created_job:...
method test_invalid_job_id_format (line 124) | def test_invalid_job_id_format(self, client: TestClient, auth_headers:...
method test_path_traversal_protection (line 134) | def test_path_traversal_protection(self, client: TestClient, auth_head...
method test_invalid_json_request (line 155) | def test_invalid_json_request(self, client: TestClient, auth_headers: ...
method test_empty_request_body (line 167) | def test_empty_request_body(self, client: TestClient, auth_headers: Di...
method test_concurrent_requests (line 179) | def test_concurrent_requests(self, client: TestClient, auth_headers: D...
method test_response_structure_on_success (line 206) | def test_response_structure_on_success(self, client: TestClient, auth_...
method test_error_response_structure (line 238) | def test_error_response_structure(self, client: TestClient, auth_heade...
method test_job_not_found_error (line 276) | def test_job_not_found_error(self, client: TestClient, auth_headers: D...
method test_dependency_validation (line 289) | def test_dependency_validation(self, client: TestClient, auth_headers:...
method test_policy_file_not_found (line 317) | def test_policy_file_not_found(self, client: TestClient, auth_headers:...
method test_idempotency_key_handling (line 333) | def test_idempotency_key_handling(self, client: TestClient, auth_heade...
method test_large_policy_path (line 355) | def test_large_policy_path(self, client: TestClient, auth_headers: Dic...
method test_special_characters_in_policy_path (line 371) | def test_special_characters_in_policy_path(self, client: TestClient, a...
FILE: build_stream/tests/integration/api/generate_input_files/test_generate_input_files_artifact_integration.py
class TestGenerateInputFilesArtifactStorage (line 35) | class TestGenerateInputFilesArtifactStorage: # pylint: disable=attribut...
method setup_method (line 38) | def setup_method(self) -> None:
method teardown_method (line 62) | def teardown_method(self) -> None:
method test_file_artifact_store_is_used_when_enabled (line 77) | def test_file_artifact_store_is_used_when_enabled(self) -> None:
method test_generate_input_files_creates_artifacts_on_file_store (line 82) | def test_generate_input_files_creates_artifacts_on_file_store(self) ->...
method test_generate_input_files_with_custom_policy_creates_artifacts (line 197) | def test_generate_input_files_with_custom_policy_creates_artifacts(sel...
method test_generate_input_files_handles_missing_prerequisites (line 297) | def test_generate_input_files_handles_missing_prerequisites(self) -> N...
method test_generate_input_files_artifact_metadata (line 329) | def test_generate_input_files_artifact_metadata(self) -> None:
FILE: build_stream/tests/integration/api/generate_input_files/test_generate_input_files_routes.py
class TestGenerateInputFilesRoutes (line 28) | class TestGenerateInputFilesRoutes:
method test_generate_input_files_endpoint_exists (line 32) | def test_generate_input_files_endpoint_exists(self, client: TestClient...
method test_generate_input_files_with_valid_request (line 45) | def test_generate_input_files_with_valid_request(self, client: TestCli...
method test_generate_input_files_with_custom_policy (line 57) | def test_generate_input_files_with_custom_policy(self, client: TestCli...
method test_generate_input_files_requires_authentication (line 73) | def test_generate_input_files_requires_authentication(self, client: Te...
method test_generate_input_files_requires_correlation_id (line 82) | def test_generate_input_files_requires_correlation_id(self, client: Te...
method test_generate_input_files_invalid_job_id_format (line 93) | def test_generate_input_files_invalid_job_id_format(self, client: Test...
method test_generate_input_files_invalid_policy_path (line 103) | def test_generate_input_files_invalid_policy_path(self, client: TestCl...
method test_generate_input_files_empty_policy_path (line 119) | def test_generate_input_files_empty_policy_path(self, client: TestClie...
method test_generate_input_files_openapi_documentation (line 135) | def test_generate_input_files_openapi_documentation(self, client: Test...
method test_generate_input_files_api_docs_accessible (line 144) | def test_generate_input_files_api_docs_accessible(self, client: TestCl...
method test_generate_input_files_response_structure (line 154) | def test_generate_input_files_response_structure(self, client: TestCli...
method test_generate_input_files_error_handling (line 173) | def test_generate_input_files_error_handling(self, client: TestClient,...
method test_generate_input_files_default_policy_usage (line 186) | def test_generate_input_files_default_policy_usage(self, client: TestC...
FILE: build_stream/tests/integration/api/jobs/conftest.py
function _mock_verify_token (line 32) | def _mock_verify_token(
function client (line 52) | def client():
function unauth_client (line 61) | def unauth_client():
function uuid_generator_fixture (line 67) | def uuid_generator_fixture():
function auth_headers (line 73) | def auth_headers(uuid_generator) -> Dict[str, str]:
function unique_idempotency_key (line 83) | def unique_idempotency_key(uuid_generator) -> str:
function unique_correlation_id (line 89) | def unique_correlation_id(uuid_generator) -> str:
FILE: build_stream/tests/integration/api/jobs/test_create_job_api.py
class TestCreateJobSuccess (line 20) | class TestCreateJobSuccess:
method test_create_job_returns_201_with_valid_request (line 23) | def test_create_job_returns_201_with_valid_request(self, client, auth_...
method test_create_job_returns_valid_uuid (line 40) | def test_create_job_returns_valid_uuid(self, client, auth_headers):
method test_create_job_returns_created_state (line 52) | def test_create_job_returns_created_state(self, client, auth_headers):
method test_create_job_creates_all_nine_stages (line 60) | def test_create_job_creates_all_nine_stages(self, client, auth_headers):
method test_create_job_all_stages_pending (line 81) | def test_create_job_all_stages_pending(self, client, auth_headers):
method test_create_job_returns_correlation_id (line 96) | def test_create_job_returns_correlation_id(
class TestCreateJobIdempotency (line 112) | class TestCreateJobIdempotency:
method test_idempotent_request_returns_200_with_same_job (line 115) | def test_idempotent_request_returns_200_with_same_job(
method test_idempotency_with_different_correlation_id (line 135) | def test_idempotency_with_different_correlation_id(
class TestCreateJobValidation (line 181) | class TestCreateJobValidation:
method test_missing_client_id_returns_422 (line 184) | def test_missing_client_id_returns_422(self, client, auth_headers):
method test_missing_client_name_is_allowed (line 192) | def test_missing_client_name_is_allowed(self, client, auth_headers):
method test_empty_client_id_returns_422 (line 200) | def test_empty_client_id_returns_422(self, client, auth_headers):
method test_empty_client_name_returns_400 (line 208) | def test_empty_client_name_returns_400(self, client, auth_headers):
method test_client_id_whitespace_only_returns_422 (line 216) | def test_client_id_whitespace_only_returns_422(self, client, auth_head...
method test_client_name_whitespace_only_returns_400 (line 224) | def test_client_name_whitespace_only_returns_400(self, client, auth_he...
class TestCreateJobAuthentication (line 233) | class TestCreateJobAuthentication:
method test_missing_authorization_header_returns_422 (line 236) | def test_missing_authorization_header_returns_422(self, unauth_client,...
method test_invalid_authorization_format_returns_401 (line 248) | def test_invalid_authorization_format_returns_401(
method test_empty_bearer_token_returns_401 (line 263) | def test_empty_bearer_token_returns_401(self, unauth_client, unique_id...
class TestCreateJobHeaders (line 277) | class TestCreateJobHeaders:
method test_missing_idempotency_key_returns_422 (line 280) | def test_missing_idempotency_key_returns_422(self, client):
method test_auto_generates_correlation_id_if_missing (line 292) | def test_auto_generates_correlation_id_if_missing(
FILE: build_stream/tests/integration/api/jobs/test_delete_job_api.py
class TestDeleteJobSuccess (line 22) | class TestDeleteJobSuccess:
method test_delete_existing_job_returns_204 (line 25) | def test_delete_existing_job_returns_204(self, client, auth_headers):
method test_delete_job_is_idempotent (line 41) | def test_delete_job_is_idempotent(self, client, auth_headers):
method test_deleted_job_not_retrievable (line 58) | def test_deleted_job_not_retrievable(self, client, auth_headers):
class TestDeleteJobNotFound (line 76) | class TestDeleteJobNotFound:
method test_delete_nonexistent_job_returns_404 (line 79) | def test_delete_nonexistent_job_returns_404(self, client, auth_headers):
method test_delete_job_invalid_uuid_format_returns_400 (line 91) | def test_delete_job_invalid_uuid_format_returns_400(self, client, auth...
class TestDeleteJobAuthentication (line 104) | class TestDeleteJobAuthentication:
method test_delete_job_missing_authorization_returns_422 (line 107) | def test_delete_job_missing_authorization_returns_422(self, unauth_cli...
method test_delete_job_invalid_auth_format_returns_401 (line 116) | def test_delete_job_invalid_auth_format_returns_401(
class TestDeleteJobClientIsolation (line 131) | class TestDeleteJobClientIsolation:
method test_different_client_cannot_delete_job (line 134) | def test_different_client_cannot_delete_job(
FILE: build_stream/tests/integration/api/jobs/test_get_job_api.py
class TestGetJobSuccess (line 22) | class TestGetJobSuccess:
method test_get_existing_job_returns_200 (line 25) | def test_get_existing_job_returns_200(self, client, auth_headers):
method test_get_job_returns_all_stages (line 45) | def test_get_job_returns_all_stages(self, client, auth_headers):
method test_get_job_returns_correlation_id (line 61) | def test_get_job_returns_correlation_id(self, client, auth_headers, un...
class TestGetJobNotFound (line 77) | class TestGetJobNotFound:
method test_get_nonexistent_job_returns_404 (line 80) | def test_get_nonexistent_job_returns_404(self, client, auth_headers):
method test_get_job_invalid_uuid_format_returns_400 (line 92) | def test_get_job_invalid_uuid_format_returns_400(self, client, auth_he...
class TestGetJobAuthentication (line 105) | class TestGetJobAuthentication:
method test_get_job_missing_authorization_returns_422 (line 108) | def test_get_job_missing_authorization_returns_422(self, unauth_client...
method test_get_job_invalid_authorization_format_returns_401 (line 117) | def test_get_job_invalid_authorization_format_returns_401(self, unauth...
class TestGetJobClientIsolation (line 130) | class TestGetJobClientIsolation:
method test_different_client_cannot_access_job (line 133) | def test_different_client_cannot_access_job(
class TestGetJobStateMapping (line 156) | class TestGetJobStateMapping:
method test_get_job_returns_mapped_state_names (line 159) | def test_get_job_returns_mapped_state_names(self, client, auth_headers):
method test_get_job_returns_state_timestamps (line 179) | def test_get_job_returns_state_timestamps(self, client, auth_headers):
method test_get_job_returns_step_breakdown (line 204) | def test_get_job_returns_step_breakdown(self, client, auth_headers):
FILE: build_stream/tests/integration/api/local_repo/conftest.py
function client (line 30) | def client():
function unauth_client (line 52) | def unauth_client():
function uuid_generator_fixture (line 59) | def uuid_generator_fixture():
function auth_headers_fixture (line 65) | def auth_headers_fixture(uuid_generator) -> Dict[str, str]:
function unique_correlation_id (line 75) | def unique_correlation_id(uuid_generator) -> str:
function created_job (line 81) | def created_job(client, auth_headers) -> str:
function nfs_queue_dir (line 90) | def nfs_queue_dir(tmp_path):
function input_dir (line 106) | def input_dir(tmp_path):
function setup_input_files (line 112) | def setup_input_files(input_dir_path: Path, job_id: str) -> Path:
FILE: build_stream/tests/integration/api/local_repo/test_create_local_repo_api.py
class TestCreateLocalRepoSuccess (line 22) | class TestCreateLocalRepoSuccess:
method test_returns_202_with_valid_request (line 25) | def test_returns_202_with_valid_request(
method test_returns_correlation_id (line 64) | def test_returns_correlation_id(
class TestCreateLocalRepoValidation (line 104) | class TestCreateLocalRepoValidation:
method test_invalid_job_id_returns_400 (line 107) | def test_invalid_job_id_returns_400(self, client, auth_headers):
method test_nonexistent_job_returns_404 (line 116) | def test_nonexistent_job_returns_404(self, client, auth_headers):
class TestCreateLocalRepoAuthentication (line 127) | class TestCreateLocalRepoAuthentication:
method test_missing_authorization_returns_422 (line 130) | def test_missing_authorization_returns_422(self, unauth_client):
method test_invalid_authorization_format_returns_401 (line 140) | def test_invalid_authorization_format_returns_401(self, unauth_client):
method test_empty_bearer_token_returns_401 (line 151) | def test_empty_bearer_token_returns_401(self, unauth_client):
class TestCreateLocalRepoInputValidation (line 163) | class TestCreateLocalRepoInputValidation:
method test_missing_input_files_returns_400 (line 166) | def test_missing_input_files_returns_400(self, client, auth_headers, c...
FILE: build_stream/tests/integration/api/local_repo/test_create_local_repo_edge_cases.py
class TestCreateLocalRepoEdgeCases (line 27) | class TestCreateLocalRepoEdgeCases:
method test_concurrent_requests_same_job (line 30) | def test_concurrent_requests_same_job(
method test_request_with_very_long_correlation_id (line 57) | def test_request_with_very_long_correlation_id(
method test_request_with_unicode_characters (line 74) | def test_request_with_unicode_characters(
method test_request_when_nfs_queue_full (line 88) | def test_request_when_nfs_queue_full(self, client, auth_headers, creat...
method test_request_with_malformed_authorization_header (line 100) | def test_request_with_malformed_authorization_header(self, unauth_clie...
method test_request_with_expired_job (line 110) | def test_request_with_expired_job(self, client, auth_headers, created_...
method test_request_when_input_directory_has_permissions_issue (line 120) | def test_request_when_input_directory_has_permissions_issue(
method test_request_with_multiple_auth_headers (line 132) | def test_request_with_multiple_auth_headers(self, unauth_client):
method test_request_with_large_request_body (line 147) | def test_request_with_large_request_body(self, client, auth_headers, c...
method test_request_with_content_type_header (line 179) | def test_request_with_content_type_header(self, client, auth_headers, ...
FILE: build_stream/tests/integration/api/parse_catalog/conftest.py
function client (line 25) | def client(tmp_path):
function uuid_generator_fixture (line 71) | def uuid_generator_fixture():
function auth_headers_fixture (line 78) | def auth_headers_fixture(uuid_generator) -> Dict[str, str]:
function unique_correlation_id (line 88) | def unique_correlation_id(uuid_generator) -> str:
function created_job (line 94) | def created_job(client, auth_headers) -> str:
FILE: build_stream/tests/integration/api/parse_catalog/test_parse_catalog_api.py
class TestParseCatalogAPI (line 26) | class TestParseCatalogAPI: # pylint: disable=too-many-public-methods
method valid_catalog_json (line 31) | def valid_catalog_json(self) -> Dict[str, Any]:
method test_parse_catalog_success_happy_path (line 42) | def test_parse_catalog_success_happy_path(
method test_parse_catalog_with_custom_filename (line 70) | def test_parse_catalog_with_custom_filename(
method test_parse_catalog_invalid_json_format (line 96) | def test_parse_catalog_invalid_json_format(
method test_parse_catalog_malformed_json (line 116) | def test_parse_catalog_malformed_json(
method test_parse_catalog_schema_validation_error (line 136) | def test_parse_catalog_schema_validation_error(
method test_parse_catalog_file_too_large (line 163) | def test_parse_catalog_file_too_large(
method test_parse_catalog_job_not_found (line 192) | def test_parse_catalog_job_not_found(
method test_parse_catalog_already_completed (line 211) | def test_parse_catalog_already_completed(
method test_parse_catalog_job_in_terminal_state (line 240) | def test_parse_catalog_job_in_terminal_state(
method test_parse_catalog_no_authentication (line 271) | def test_parse_catalog_no_authentication(
method test_parse_catalog_invalid_token (line 290) | def test_parse_catalog_invalid_token(
method test_parse_catalog_invalid_job_id_format (line 314) | def test_parse_catalog_invalid_job_id_format(
method test_parse_catalog_no_file_uploaded (line 331) | def test_parse_catalog_no_file_uploaded(
method test_parse_catalog_artifact_storage_verification (line 350) | def test_parse_catalog_artifact_storage_verification(
method test_parse_catalog_cross_stage_lookup (line 390) | def test_parse_catalog_cross_stage_lookup(
method test_parse_catalog_error_sanitization (line 427) | def test_parse_catalog_error_sanitization(
method test_parse_catalog_concurrent_requests (line 459) | def test_parse_catalog_concurrent_requests(
FILE: build_stream/tests/integration/api/parse_catalog/test_parse_catalog_artifact_integration.py
class TestFileArtifactStorage (line 34) | class TestFileArtifactStorage: # pylint: disable=attribute-defined-outs...
method setup_method (line 37) | def setup_method(self) -> None:
method teardown_method (line 63) | def teardown_method(self) -> None:
method test_file_artifact_store_is_used_when_enabled (line 78) | def test_file_artifact_store_is_used_when_enabled(self) -> None:
method test_parse_catalog_creates_artifacts_on_file_store (line 83) | def test_parse_catalog_creates_artifacts_on_file_store(self) -> None: ...
method test_artifact_retrieval_from_file_store (line 153) | def test_artifact_retrieval_from_file_store(self) -> None:
method test_artifact_deletion_from_file_store (line 186) | def test_artifact_deletion_from_file_store(self) -> None:
method test_working_dir_is_used_for_temp_files (line 216) | def test_working_dir_is_used_for_temp_files(self) -> None:
method test_archive_artifact_storage_on_file_store (line 231) | def test_archive_artifact_storage_on_file_store(self) -> None:
FILE: build_stream/tests/integration/api/parse_catalog/test_parse_catalog_routes.py
class TestParseCatalogRoutes (line 27) | class TestParseCatalogRoutes:
method setup_method (line 30) | def setup_method(self) -> None:
method test_parse_catalog_endpoint_exists (line 40) | def test_parse_catalog_endpoint_exists(self) -> None:
method test_parse_catalog_with_valid_request_structure (line 54) | def test_parse_catalog_with_valid_request_structure(self, mock_jwt_val...
method test_parse_catalog_requires_authentication (line 90) | def test_parse_catalog_requires_authentication(self) -> None:
method test_parse_catalog_requires_correlation_id (line 100) | def test_parse_catalog_requires_correlation_id(self, mock_jwt_validati...
method test_parse_catalog_invalid_job_id_format (line 111) | def test_parse_catalog_invalid_job_id_format(self, mock_jwt_validation...
method test_parse_catalog_missing_file_parameter (line 122) | def test_parse_catalog_missing_file_parameter(self, mock_jwt_validatio...
method test_parse_catalog_invalid_file_format (line 132) | def test_parse_catalog_invalid_file_format(self, mock_jwt_validation) ...
method test_parse_catalog_invalid_json_content (line 143) | def test_parse_catalog_invalid_json_content(self, mock_jwt_validation)...
method test_parse_catalog_oversized_file (line 154) | def test_parse_catalog_oversized_file(self, mock_jwt_validation) -> None:
method test_parse_catalog_openapi_documentation (line 168) | def test_parse_catalog_openapi_documentation(self) -> None:
method test_parse_catalog_api_docs_accessible (line 192) | def test_parse_catalog_api_docs_accessible(self) -> None:
method test_parse_catalog_service_integration (line 203) | def test_parse_catalog_service_integration(self, mock_service, mock_jw...
FILE: build_stream/tests/integration/api/validate/conftest.py
function client (line 31) | def client(tmp_path):
function uuid_generator_fixture (line 75) | def uuid_generator_fixture():
function auth_headers_fixture (line 81) | def auth_headers_fixture(uuid_generator) -> Dict[str, str]:
function unique_correlation_id (line 91) | def unique_correlation_id(uuid_generator) -> str:
function created_job (line 97) | def created_job(client, auth_headers) -> str:
function job_with_completed_build_image (line 106) | def job_with_completed_build_image(client, auth_headers, created_job, mo...
function nfs_queue_dir (line 146) | def nfs_queue_dir(tmp_path):
FILE: build_stream/tests/integration/api/validate/test_models.py
class Job (line 36) | class Job(Base):
class Stage (line 58) | class Stage(Base):
class AuditEvent (line 89) | class AuditEvent(Base):
class IdempotencyRecord (line 120) | class IdempotencyRecord(Base):
class ArtifactRecord (line 142) | class ArtifactRecord(Base):
class StageLock (line 168) | class StageLock(Base):
FILE: build_stream/tests/integration/api/validate/test_validate_image_on_test_api.py
class TestValidateImageOnTestSuccess (line 22) | class TestValidateImageOnTestSuccess:
method test_returns_202_with_valid_request (line 25) | def test_returns_202_with_valid_request(
method test_returns_correlation_id (line 52) | def test_returns_correlation_id(
method test_queue_submission (line 82) | def test_queue_submission(
class TestValidateImageOnTestValidation (line 123) | class TestValidateImageOnTestValidation:
method test_invalid_job_id_returns_400 (line 126) | def test_invalid_job_id_returns_400(self, client, auth_headers):
method test_nonexistent_job_returns_404 (line 137) | def test_nonexistent_job_returns_404(self, client, auth_headers):
method test_stage_guard_violation_returns_412 (line 149) | def test_stage_guard_violation_returns_412(
class TestValidateImageOnTestAuthentication (line 164) | class TestValidateImageOnTestAuthentication:
method test_missing_authorization_returns_422 (line 167) | def test_missing_authorization_returns_422(
method test_invalid_authorization_format_returns_401 (line 181) | def test_invalid_authorization_format_returns_401(
method test_empty_bearer_token_returns_401 (line 196) | def test_empty_bearer_token_returns_401(
class TestValidateImageOnTestErrorHandling (line 212) | class TestValidateImageOnTestErrorHandling:
method test_queue_unavailable_returns_500 (line 215) | def test_queue_unavailable_returns_500(
FILE: build_stream/tests/integration/conftest.py
function generate_secure_test_password (line 62) | def generate_secure_test_password(length: int = 24) -> str:
function generate_test_client_secret (line 100) | def generate_test_client_secret(length: int = 32) -> str:
function generate_invalid_client_id (line 119) | def generate_invalid_client_id() -> str:
function generate_invalid_client_secret (line 128) | def generate_invalid_client_secret() -> str:
class IntegrationTestConfig (line 137) | class IntegrationTestConfig:
method get_vault_password (line 147) | def get_vault_password(cls) -> str:
method get_auth_password (line 156) | def get_auth_password(cls) -> str:
class VaultManager (line 165) | class VaultManager: # noqa: R0902 pylint: disable=too-many-instance-att...
method __init__ (line 168) | def __init__(self, base_dir: str):
method setup (line 190) | def setup(self, username: str, password: str) -> None:
method _generate_jwt_keys (line 254) | def _generate_jwt_keys(self) -> None:
method cleanup (line 289) | def cleanup(self) -> None:
class ServerManager (line 297) | class ServerManager:
method __init__ (line 315) | def __init__( # noqa: R0913,R0917 pylint: disable=too-many-arguments,...
method _setup_venv (line 339) | def _setup_venv(self) -> None:
method python_path (line 372) | def python_path(self) -> str:
method _is_port_in_use (line 376) | def _is_port_in_use(self) -> bool:
method _free_port (line 381) | def _free_port(self) -> None:
method start (line 401) | def start(self) -> None:
method _wait_for_server (line 458) | def _wait_for_server(self) -> None:
method stop (line 498) | def stop(self) -> None:
method base_url (line 518) | def base_url(self) -> str:
function integration_test_dir (line 524) | def integration_test_dir() -> Generator[str, None, None]:
function vault_manager (line 536) | def vault_manager(
function project_dir (line 559) | def project_dir() -> str:
function venv_dir (line 569) | def venv_dir(integration_test_dir: str) -> str: # noqa: W0621
function server_manager (line 582) | def server_manager(
function base_url (line 610) | def base_url(server_manager: ServerManager) -> str: # noqa: W0621
function auth_password (line 623) | def auth_password() -> str:
function valid_auth_header (line 633) | def valid_auth_header(auth_password: str) -> Dict[str, str]: # noqa: W0621
function invalid_auth_header (line 649) | def invalid_auth_header() -> Dict[str, str]:
function reset_vault (line 660) | def reset_vault(
FILE: build_stream/tests/integration/core/catalog/test_adapter_cli_defaults.py
class TestAdapterDefaults (line 33) | class TestAdapterDefaults(unittest.TestCase):
method test_default_schema_path_points_to_resources (line 34) | def test_default_schema_path_points_to_resources(self):
method test_generate_omnia_json_with_defaults_writes_output (line 39) | def test_generate_omnia_json_with_defaults_writes_output(self):
FILE: build_stream/tests/integration/core/catalog/test_adapter_policy.py
class TestValidatePolicyConfig (line 52) | class TestValidatePolicyConfig(unittest.TestCase):
method setUp (line 55) | def setUp(self):
method test_valid_policy_passes_validation (line 73) | def test_valid_policy_passes_validation(self):
method test_missing_version_raises_error (line 82) | def test_missing_version_raises_error(self):
method test_missing_targets_raises_error (line 95) | def test_missing_targets_raises_error(self):
method test_invalid_target_spec_raises_error (line 108) | def test_invalid_target_spec_raises_error(self):
method test_allowlist_filter_policy_validates (line 125) | def test_allowlist_filter_policy_validates(self):
method test_field_in_filter_policy_validates (line 158) | def test_field_in_filter_policy_validates(self):
method test_any_of_filter_requires_filters (line 191) | def test_any_of_filter_requires_filters(self):
method test_any_of_filter_policy_validates (line 218) | def test_any_of_filter_policy_validates(self):
class TestDiscoverArchitectures (line 253) | class TestDiscoverArchitectures(unittest.TestCase):
method test_discovers_architecture_directories (line 256) | def test_discovers_architecture_directories(self):
method test_returns_empty_for_nonexistent_dir (line 268) | def test_returns_empty_for_nonexistent_dir(self):
method test_returns_empty_for_empty_dir (line 273) | def test_returns_empty_for_empty_dir(self):
class TestDiscoverOsVersions (line 280) | class TestDiscoverOsVersions(unittest.TestCase):
method test_discovers_os_and_versions (line 283) | def test_discovers_os_and_versions(self):
method test_returns_empty_for_nonexistent_arch (line 296) | def test_returns_empty_for_nonexistent_arch(self):
class TestTransformPackage (line 303) | class TestTransformPackage(unittest.TestCase):
method test_no_transform_returns_copy (line 306) | def test_no_transform_returns_copy(self):
method test_exclude_fields (line 313) | def test_exclude_fields(self):
method test_rename_fields (line 320) | def test_rename_fields(self):
method test_exclude_and_rename_combined (line 327) | def test_exclude_and_rename_combined(self):
class TestApplySubstringFilter (line 338) | class TestApplySubstringFilter(unittest.TestCase):
method test_filters_by_substring (line 341) | def test_filters_by_substring(self):
method test_case_insensitive_by_default (line 356) | def test_case_insensitive_by_default(self):
method test_case_sensitive_when_specified (line 369) | def test_case_sensitive_when_specified(self):
method test_empty_values_returns_all (line 384) | def test_empty_values_returns_all(self):
class TestAllowlistAndFieldFilters (line 392) | class TestAllowlistAndFieldFilters(unittest.TestCase):
method test_allowlist_matches_exact_package_names (line 393) | def test_allowlist_matches_exact_package_names(self):
method test_field_in_matches_classification_field (line 409) | def test_field_in_matches_classification_field(self):
method test_any_of_combines_multiple_strategies (line 425) | def test_any_of_combines_multiple_strategies(self):
class TestComputeCommonPackages (line 464) | class TestComputeCommonPackages(unittest.TestCase):
method test_finds_common_packages (line 467) | def test_finds_common_packages(self):
method test_respects_min_occurrences (line 484) | def test_respects_min_occurrences(self):
class TestMergeTransform (line 497) | class TestMergeTransform(unittest.TestCase):
method test_none_inputs_return_none (line 500) | def test_none_inputs_return_none(self):
method test_base_only (line 504) | def test_base_only(self):
method test_override_only (line 509) | def test_override_only(self):
method test_override_wins (line 514) | def test_override_wins(self):
class TestCheckConditions (line 522) | class TestCheckConditions(unittest.TestCase):
method test_no_conditions_returns_true (line 525) | def test_no_conditions_returns_true(self):
method test_architecture_condition (line 529) | def test_architecture_condition(self):
method test_os_family_condition (line 535) | def test_os_family_condition(self):
method test_os_version_condition (line 541) | def test_os_version_condition(self):
method test_multiple_conditions_all_must_pass (line 547) | def test_multiple_conditions_all_must_pass(self):
class TestDeriveCommonRole (line 558) | class TestDeriveCommonRole(unittest.TestCase):
method test_derives_common_packages (line 561) | def test_derives_common_packages(self):
method test_removes_from_sources_when_specified (line 578) | def test_removes_from_sources_when_specified(self):
method test_keeps_sources_when_not_removing (line 594) | def test_keeps_sources_when_not_removing(self):
class TestWriteConfigFile (line 610) | class TestWriteConfigFile(unittest.TestCase):
method test_writes_valid_json (line 613) | def test_writes_valid_json(self):
method test_creates_parent_directories (line 628) | def test_creates_parent_directories(self):
class TestGenerateConfigsFromPolicy (line 637) | class TestGenerateConfigsFromPolicy(unittest.TestCase):
method setUp (line 640) | def setUp(self):
method test_generates_output_files (line 644) | def test_generates_output_files(self):
method test_generates_openldap_with_any_of_filter (line 689) | def test_generates_openldap_with_any_of_filter(self):
method test_invalid_policy_raises_error (line 761) | def test_invalid_policy_raises_error(self):
method test_missing_input_dir_raises_file_not_found (line 783) | def test_missing_input_dir_raises_file_not_found(self):
method test_missing_policy_file_raises_file_not_found (line 797) | def test_missing_policy_file_raises_file_not_found(self):
method test_missing_schema_file_raises_file_not_found (line 814) | def test_missing_schema_file_raises_file_not_found(self):
class TestDefaultPaths (line 832) | class TestDefaultPaths(unittest.TestCase):
method test_default_policy_path_exists (line 835) | def test_default_policy_path_exists(self):
method test_default_schema_path_exists (line 842) | def test_default_schema_path_exists(self):
method test_default_policy_validates_against_schema (line 849) | def test_default_policy_validates_against_schema(self):
class TestProcessTargetSpec (line 865) | class TestProcessTargetSpec(unittest.TestCase):
method test_processes_simple_target (line 868) | def test_processes_simple_target(self):
method test_skips_when_conditions_not_met (line 896) | def test_skips_when_conditions_not_met(self):
method test_applies_transform (line 920) | def test_applies_transform(self):
FILE: build_stream/tests/integration/core/catalog/test_generator_cli_defaults.py
class TestGeneratorDefaults (line 28) | class TestGeneratorDefaults(unittest.TestCase):
method test_default_schema_path_points_to_resources (line 29) | def test_default_schema_path_points_to_resources(self):
method test_generate_root_json_with_defaults_writes_output (line 34) | def test_generate_root_json_with_defaults_writes_output(self):
FILE: build_stream/tests/integration/core/catalog/test_generator_package_list.py
class TestGetPackageList (line 37) | class TestGetPackageList(unittest.TestCase):
method setUp (line 40) | def setUp(self):
method test_get_packages_for_valid_single_role (line 48) | def test_get_packages_for_valid_single_role(self):
method test_get_packages_for_all_roles_when_role_is_none (line 59) | def test_get_packages_for_all_roles_when_role_is_none(self):
method test_invalid_role_raises_value_error (line 76) | def test_invalid_role_raises_value_error(self):
method test_empty_role_raises_value_error (line 83) | def test_empty_role_raises_value_error(self):
method test_file_not_found_raises_error (line 90) | def test_file_not_found_raises_error(self):
method test_malformed_json_raises_error (line 95) | def test_malformed_json_raises_error(self):
method test_schema_validation_failure_raises_error (line 105) | def test_schema_validation_failure_raises_error(self):
method test_empty_feature_list_returns_empty_list (line 128) | def test_empty_feature_list_returns_empty_list(self):
method test_package_attributes_are_complete (line 139) | def test_package_attributes_are_complete(self):
method test_package_with_uri_and_tag (line 153) | def test_package_with_uri_and_tag(self):
method test_role_with_spaces_in_name (line 170) | def test_role_with_spaces_in_name(self):
method test_all_roles_returns_correct_package_counts (line 177) | def test_all_roles_returns_correct_package_counts(self):
method test_case_insensitive_role_matching_lowercase (line 192) | def test_case_insensitive_role_matching_lowercase(self):
method test_case_insensitive_role_matching_uppercase (line 200) | def test_case_insensitive_role_matching_uppercase(self):
method test_case_insensitive_role_matching_mixed_case (line 207) | def test_case_insensitive_role_matching_mixed_case(self):
method test_case_insensitive_role_matching_preserves_original_name (line 214) | def test_case_insensitive_role_matching_preserves_original_name(self):
FILE: build_stream/tests/integration/core/catalog/test_generator_roles.py
class TestGetFunctionalLayerRolesFromFile (line 33) | class TestGetFunctionalLayerRolesFromFile(unittest.TestCase):
method test_returns_all_role_names_from_fixture (line 34) | def test_returns_all_role_names_from_fixture(self):
method test_empty_feature_list_returns_empty_roles (line 52) | def test_empty_feature_list_returns_empty_roles(self):
method test_invalid_functional_layer_json_fails_schema_validation (line 62) | def test_invalid_functional_layer_json_fails_schema_validation(self):
FILE: build_stream/tests/integration/infra/artifact_store/test_file_artifact_store.py
class TestFileArtifactStoreIntegration (line 37) | class TestFileArtifactStoreIntegration:
method setup_method (line 40) | def setup_method(self) -> None:
method teardown_method (line 64) | def teardown_method(self) -> None:
method test_file_artifact_store_is_used_when_enabled_in_config (line 80) | def test_file_artifact_store_is_used_when_enabled_in_config(self) -> N...
method test_file_artifact_store_uses_configured_path (line 85) | def test_file_artifact_store_uses_configured_path(self) -> None:
method test_file_artifact_store_creates_directories (line 94) | def test_file_artifact_store_creates_directories(self) -> None:
method test_store_and_retrieve_file (line 105) | def test_store_and_retrieve_file(self) -> None:
method test_store_and_retrieve_archive_from_file_map (line 124) | def test_store_and_retrieve_archive_from_file_map(self) -> None:
method test_store_and_retrieve_archive_from_directory (line 155) | def test_store_and_retrieve_archive_from_directory(self) -> None:
method test_exists_and_delete (line 181) | def test_exists_and_delete(self) -> None:
method test_duplicate_store_raises_error (line 205) | def test_duplicate_store_raises_error(self) -> None:
method test_retrieve_nonexistent_raises_error (line 219) | def test_retrieve_nonexistent_raises_error(self) -> None:
method test_content_type_validation (line 228) | def test_content_type_validation(self) -> None:
method test_size_validation (line 246) | def test_size_validation(self) -> None:
method test_deterministic_key_generation (line 262) | def test_deterministic_key_generation(self) -> None:
method test_key_format_validation (line 284) | def test_key_format_validation(self) -> None:
method test_file_cleanup_on_delete (line 303) | def test_file_cleanup_on_delete(self) -> None:
method test_concurrent_operations (line 325) | def test_concurrent_operations(self) -> None:
class TestFileArtifactStoreConfiguration (line 366) | class TestFileArtifactStoreConfiguration:
method test_missing_config_fallback (line 369) | def test_missing_config_fallback(self) -> None:
method test_invalid_config_handling (line 391) | def test_invalid_config_handling(self) -> None:
FILE: build_stream/tests/integration/infra/db/conftest.py
function sample_job (line 35) | def sample_job() -> JobId:
function sample_client_id (line 41) | def sample_client_id() -> ClientId:
function sample_idempotency_key (line 47) | def sample_idempotency_key() -> IdempotencyKey:
function sample_correlation_id (line 53) | def sample_correlation_id() -> CorrelationId:
function sample_request_fingerprint (line 59) | def sample_request_fingerprint() -> RequestFingerprint:
function sample_timestamp (line 65) | def sample_timestamp() -> datetime:
function sample_stage_names (line 71) | def sample_stage_names() -> list[StageName]:
function sample_job_states (line 88) | def sample_job_states() -> list[JobState]:
function sample_stage_states (line 94) | def sample_stage_states() -> list[StageState]:
FILE: build_stream/tests/integration/infra/db/test_sql_repositories.py
function pg_url (line 53) | def pg_url() -> str:
function db_engine (line 75) | def db_engine(pg_url: str) -> Generator:
function db_session (line 84) | def db_session(db_engine) -> Generator[Session, None, None]:
function job_repo (line 95) | def job_repo(db_session: Session) -> SqlJobRepository:
function stage_repo (line 101) | def stage_repo(db_session: Session) -> SqlStageRepository:
function idempotency_repo (line 107) | def idempotency_repo(db_session: Session) -> SqlIdempotencyRepository:
function audit_repo (line 113) | def audit_repo(db_session: Session) -> SqlAuditEventRepository:
class TestSqlJobRepository (line 118) | class TestSqlJobRepository:
method test_save_and_find_by_id (line 121) | def test_save_and_find_by_id(self, job_repo: SqlJobRepository) -> None:
method test_exists (line 142) | def test_exists(self, job_repo: SqlJobRepository) -> None:
method test_update_with_optimistic_locking (line 156) | def test_update_with_optimistic_locking(self, job_repo: SqlJobReposito...
method test_find_by_id_not_found (line 186) | def test_find_by_id_not_found(self, job_repo: SqlJobRepository) -> None:
class TestSqlStageRepository (line 192) | class TestSqlStageRepository:
method test_save_and_find_by_job_and_name (line 195) | def test_save_and_find_by_job_and_name(
method test_save_all_and_find_all_by_job (line 223) | def test_save_all_and_find_all_by_job(
method test_update_with_optimistic_locking (line 266) | def test_update_with_optimistic_locking(
class TestSqlIdempotencyRepository (line 304) | class TestSqlIdempotencyRepository:
method test_save_and_find_by_key (line 307) | def test_save_and_find_by_key(
method test_find_by_key_not_found (line 329) | def test_find_by_key_not_found(
class TestSqlAuditEventRepository (line 337) | class TestSqlAuditEventRepository:
method test_save_and_find_by_job (line 340) | def test_save_and_find_by_job(self, audit_repo: SqlAuditEventRepositor...
class TestDatabaseConstraints (line 376) | class TestDatabaseConstraints:
method test_foreign_key_cascade_delete (line 379) | def test_foreign_key_cascade_delete(
method test_unique_constraint_on_stages (line 414) | def test_unique_constraint_on_stages(
FILE: build_stream/tests/mocks/mock_jwt_handler.py
class MockJWTHandler (line 26) | class MockJWTHandler:
method __init__ (line 37) | def __init__(
method create_access_token (line 55) | def create_access_token(
method validate_token (line 121) | def validate_token(self, token: str) -> TokenData:
method reset (line 150) | def reset(self) -> None:
FILE: build_stream/tests/mocks/mock_vault_client.py
class MockVaultClient (line 22) | class MockVaultClient:
method __init__ (line 32) | def __init__(
method get_auth_config (line 54) | def get_auth_config(self) -> Dict[str, Any]:
method get_oauth_clients (line 62) | def get_oauth_clients(self) -> Dict[str, Any]:
method save_oauth_client (line 70) | def save_oauth_client(
method get_active_client_count (line 83) | def get_active_client_count(self) -> int:
method client_exists (line 94) | def client_exists(self, client_name: str) -> bool:
method reset (line 108) | def reset(self) -> None:
method add_test_client (line 112) | def add_test_client(
FILE: build_stream/tests/others/test_dependency_rules.py
function get_python_files (line 29) | def get_python_files(directory: str, pattern: str = "*.py") -> List[Path]:
function check_forbidden_imports (line 37) | def check_forbidden_imports(file_path: Path, forbidden_modules: List[str...
function check_forbidden_calls (line 66) | def check_forbidden_calls(file_path: Path, forbidden_patterns: List[str]...
class TestDesignRules (line 87) | class TestDesignRules:
method test_api_routes_dont_import_container (line 90) | def test_api_routes_dont_import_container(self):
method test_api_routes_dont_call_container_methods (line 119) | def test_api_routes_dont_call_container_methods(self):
method test_use_cases_dont_import_infra_db (line 153) | def test_use_cases_dont_import_infra_db(self):
method test_core_domain_has_no_infra_dependencies (line 180) | def test_core_domain_has_no_infra_dependencies(self):
method test_all_route_files_have_dependency_providers (line 209) | def test_all_route_files_have_dependency_providers(self):
class TestDependencyInjectionPatterns (line 239) | class TestDependencyInjectionPatterns:
method test_routes_use_depends_for_use_cases (line 242) | def test_routes_use_depends_for_use_cases(self):
FILE: build_stream/tests/performance/test_local_repo_performance.py
class TestLocalRepoPerformance (line 30) | class TestLocalRepoPerformance:
method test_response_time_under_threshold (line 34) | def test_response_time_under_threshold(self, client, auth_headers, cre...
method test_concurrent_requests_performance (line 71) | def test_concurrent_requests_performance(self, client, auth_headers, c...
method test_memory_usage_stable (line 136) | def test_memory_usage_stable(self, client, auth_headers, created_job, ...
method test_large_correlation_id_handling (line 182) | def test_large_correlation_id_handling(self, client, auth_headers, cre...
FILE: build_stream/tests/unit/api/auth/test_password_handler.py
function test_password (line 30) | def test_password():
function test_password_pair (line 36) | def test_password_pair():
class TestPasswordHashing (line 42) | class TestPasswordHashing:
method test_hash_password_returns_argon2_hash (line 45) | def test_hash_password_returns_argon2_hash(self, test_password): # no...
method test_hash_password_different_for_same_input (line 52) | def test_hash_password_different_for_same_input(self, test_password): ...
method test_verify_password_correct_password (line 59) | def test_verify_password_correct_password(self, test_password): # noq...
method test_verify_password_incorrect_password (line 65) | def test_verify_password_incorrect_password(self, test_password_pair):...
method test_verify_password_invalid_hash (line 72) | def test_verify_password_invalid_hash(self, test_password): # noqa: W...
method test_generated_password_strength (line 76) | def test_generated_password_strength(self, test_password): # noqa: W0621
class TestCredentialGeneration (line 96) | class TestCredentialGeneration:
method test_generate_client_id_format (line 99) | def test_generate_client_id_format(self):
method test_generate_client_id_unique (line 106) | def test_generate_client_id_unique(self):
method test_generate_client_secret_format (line 112) | def test_generate_client_secret_format(self):
method test_generate_client_secret_unique (line 119) | def test_generate_client_secret_unique(self):
method test_generate_credentials_returns_tuple (line 125) | def test_generate_credentials_returns_tuple(self):
method test_generate_credentials_secret_verifiable (line 133) | def test_generate_credentials_secret_verifiable(self):
FILE: build_stream/tests/unit/api/auth/test_service.py
class TestAuthServiceCredentialVerification (line 29) | class TestAuthServiceCredentialVerification:
method test_verify_valid_credentials (line 32) | def test_verify_valid_credentials(self, auth_service: AuthService):
method test_verify_invalid_username (line 40) | def test_verify_invalid_username(self, auth_service: AuthService):
method test_verify_invalid_password (line 48) | def test_verify_invalid_password(self, auth_service: AuthService):
class TestAuthServiceClientRegistration (line 58) | class TestAuthServiceClientRegistration:
method test_register_client_success (line 61) | def test_register_client_success(self, auth_service: AuthService):
method test_register_client_default_scopes (line 74) | def test_register_client_default_scopes(self, auth_service: AuthService):
method test_register_client_max_clients_reached (line 80) | def test_register_client_max_clients_reached(
method test_register_client_duplicate_name (line 91) | def test_register_client_duplicate_name(self, auth_service: AuthService):
FILE: build_stream/tests/unit/api/auth/test_token_service.py
function mock_jwt_handler (line 32) | def mock_jwt_handler():
function mock_vault_with_active_client (line 38) | def mock_vault_with_active_client():
function mock_vault_with_disabled_client (line 50) | def mock_vault_with_disabled_client():
function test_client_id (line 62) | def test_client_id():
function test_client_secret (line 68) | def test_client_secret():
class TestAuthServiceClientVerification (line 74) | class TestAuthServiceClientVerification:
method test_verify_valid_client_credentials (line 77) | def test_verify_valid_client_credentials(
method test_verify_invalid_client_id (line 95) | def test_verify_invalid_client_id(
method test_verify_invalid_client_secret (line 109) | def test_verify_invalid_client_secret(
method test_verify_disabled_client (line 123) | def test_verify_disabled_client(
method test_verify_empty_vault (line 138) | def test_verify_empty_vault(self, mock_vault_client: MockVaultClient):
class TestAuthServiceTokenGeneration (line 150) | class TestAuthServiceTokenGeneration:
method test_generate_token_success (line 153) | def test_generate_token_success(
method test_generate_token_with_valid_scope (line 178) | def test_generate_token_with_valid_scope(
method test_generate_token_with_invalid_scope (line 200) | def test_generate_token_with_invalid_scope(
method test_generate_token_invalid_client (line 220) | def test_generate_token_invalid_client(
method test_generate_token_disabled_client (line 238) | def test_generate_token_disabled_client(
method test_generate_token_jwt_structure (line 257) | def test_generate_token_jwt_structure(
FILE: build_stream/tests/unit/api/build_image/test_routes.py
function create_test_uuid (line 34) | def create_test_uuid():
class MockCreateBuildImageUseCase (line 40) | class MockCreateBuildImageUseCase:
method __init__ (line 43) | def __init__(self, error_to_raise=None):
method execute (line 48) | def execute(self, command):
class TestBuildImageRoutes (line 66) | class TestBuildImageRoutes:
method test_build_error_response (line 69) | def test_build_error_response(self):
method test_create_build_image_success (line 82) | def test_create_build_image_success(self):
method test_create_build_image_invalid_job_id (line 122) | def test_create_build_image_invalid_job_id(self):
method test_create_build_image_job_not_found (line 146) | def test_create_build_image_job_not_found(self):
method test_create_build_image_invalid_state_transition (line 171) | def test_create_build_image_invalid_state_transition(self):
method test_create_build_image_invalid_architecture (line 196) | def test_create_build_image_invalid_architecture(self):
method test_create_build_image_invalid_image_key (line 221) | def test_create_build_image_invalid_image_key(self):
method test_create_build_image_invalid_functional_groups (line 246) | def test_create_build_image_invalid_functional_groups(self):
method test_create_build_image_missing_inventory_host (line 271) | def test_create_build_image_missing_inventory_host(self):
method test_create_build_image_domain_error (line 296) | def test_create_build_image_domain_error(self):
method test_create_build_image_unexpected_error (line 321) | def test_create_build_image_unexpected_error(self):
FILE: build_stream/tests/unit/api/catalog_roles/test_catalog_roles_service.py
function _make_job_id (line 35) | def _make_job_id() -> JobId:
function _make_artifact_ref (line 39) | def _make_artifact_ref(key_value: str = "catalog/abc123/root-jsons.zip")...
function _make_artifact_record (line 48) | def _make_artifact_record(job_id: JobId, ref: ArtifactRef) -> ArtifactRe...
function _make_zip_with_functional_layer (line 61) | def _make_zip_with_functional_layer(roles_data: dict, path: str = "x86_6...
class TestCatalogRolesServiceGetRoles (line 69) | class TestCatalogRolesServiceGetRoles:
method _make_service (line 72) | def _make_service(self, artifact_store=None, artifact_metadata_repo=No...
method _make_service_with_artifacts (line 87) | def _make_service_with_artifacts(self, roles_data: dict, job_id=None, ...
method test_returns_sorted_roles_from_functional_layer (line 144) | def test_returns_sorted_roles_from_functional_layer(self):
method test_raises_when_no_artifact_record (line 159) | def test_raises_when_no_artifact_record(self):
method test_raises_when_artifact_not_in_store (line 171) | def test_raises_when_artifact_not_in_store(self):
method test_raises_when_no_functional_layer_in_archive (line 188) | def test_raises_when_no_functional_layer_in_archive(self):
method test_raises_when_archive_is_corrupt (line 210) | def test_raises_when_archive_is_corrupt(self):
method test_raises_when_functional_layer_json_is_malformed (line 227) | def test_raises_when_functional_layer_json_is_malformed(self):
method test_raises_when_functional_layer_json_is_not_a_dict (line 249) | def test_raises_when_functional_layer_json_is_not_a_dict(self):
method test_returns_empty_list_for_empty_functional_layer (line 268) | def test_returns_empty_list_for_empty_functional_layer(self):
method test_uses_first_functional_layer_found_in_archive (line 277) | def test_uses_first_functional_layer_found_in_archive(self):
method test_queries_correct_stage_and_label (line 344) | def test_queries_correct_stage_and_label(self):
FILE: build_stream/tests/unit/api/jobs/test_dependencies.py
class TestGetClientId (line 24) | class TestGetClientId:
method test_valid_token_data_returns_client_id (line 27) | def test_valid_token_data_returns_client_id(self):
method test_token_data_with_different_client (line 36) | def test_token_data_with_different_client(self):
method test_missing_client_id_raises_error (line 44) | def test_missing_client_id_raises_error(self):
method test_empty_client_id_raises_value_error (line 51) | def test_empty_client_id_raises_value_error(self):
class TestGetIdempotencyKey (line 59) | class TestGetIdempotencyKey:
method test_valid_idempotency_key_returned (line 62) | def test_valid_idempotency_key_returned(self):
method test_idempotency_key_with_special_chars (line 70) | def test_idempotency_key_with_special_chars(self):
method test_empty_idempotency_key_raises_422 (line 78) | def test_empty_idempotency_key_raises_422(self):
method test_whitespace_only_key_raises_422 (line 87) | def test_whitespace_only_key_raises_422(self):
method test_key_exceeding_max_length_raises_422 (line 96) | def test_key_exceeding_max_length_raises_422(self):
method test_key_at_max_length_accepted (line 106) | def test_key_at_max_length_accepted(self):
FILE: build_stream/tests/unit/api/jobs/test_schemas.py
class TestCreateJobRequest (line 32) | class TestCreateJobRequest:
method test_valid_request_with_required_fields (line 35) | def test_valid_request_with_required_fields(self):
method test_valid_request_with_metadata (line 45) | def test_valid_request_with_metadata(self):
method test_missing_client_id_raises_validation_error (line 59) | def test_missing_client_id_raises_validation_error(self):
method test_missing_client_name_is_allowed (line 69) | def test_missing_client_name_is_allowed(self):
method test_empty_client_id_raises_validation_error (line 78) | def test_empty_client_id_raises_validation_error(self):
method test_empty_client_name_raises_validation_error (line 88) | def test_empty_client_name_raises_validation_error(self):
method test_client_id_max_length_validation (line 98) | def test_client_id_max_length_validation(self):
method test_client_name_max_length_validation (line 105) | def test_client_name_max_length_validation(self):
method test_metadata_can_be_none (line 112) | def test_metadata_can_be_none(self):
class TestCreateJobResponse (line 121) | class TestCreateJobResponse:
method test_valid_response_with_all_fields (line 124) | def test_valid_response_with_all_fields(self):
method test_missing_required_field_raises_validation_error (line 142) | def test_missing_required_field_raises_validation_error(self):
class TestCreateStageResponse (line 153) | class TestCreateStageResponse:
method test_valid_create_stage_response (line 156) | def test_valid_create_stage_response(self):
method test_create_stage_with_timestamps (line 174) | def test_create_stage_with_timestamps(self):
method test_create_stage_with_error (line 190) | def test_create_stage_with_error(self):
class TestGetStageResponse (line 207) | class TestGetStageResponse:
method test_valid_get_stage_response (line 210) | def test_valid_get_stage_response(self):
method test_get_stage_with_log_file_path (line 228) | def test_get_stage_with_log_file_path(self):
method test_get_stage_with_error_and_log_path (line 244) | def test_get_stage_with_error_and_log_path(self):
class TestGetJobResponse (line 262) | class TestGetJobResponse:
method test_valid_get_job_response (line 265) | def test_valid_get_job_response(self):
class TestErrorResponse (line 281) | class TestErrorResponse:
method test_valid_error_response (line 284) | def test_valid_error_response(self):
method test_error_response_missing_required_field (line 299) | def test_error_response_missing_required_field(self):
FILE: build_stream/tests/unit/api/local_repo/test_local_repo_dependencies.py
class TestGetCorrelationId (line 30) | class TestGetCorrelationId:
method test_get_correlation_id_from_header (line 33) | def test_get_correlation_id_from_header(self):
method test_get_correlation_id_generates_new_id (line 42) | def test_get_correlation_id_generates_new_id(self):
method test_get_correlation_id_empty_string (line 50) | def test_get_correlation_id_empty_string(self):
method test_get_correlation_id_whitespace_only (line 58) | def test_get_correlation_id_whitespace_only(self):
class TestGetCreateLocalRepoUseCase (line 67) | class TestGetCreateLocalRepoUseCase:
method test_returns_use_case_instance (line 70) | def test_returns_use_case_instance(self):
method test_use_case_is_factory (line 78) | def test_use_case_is_factory(self):
class TestGetCreateLocalRepoUseCaseFactory (line 88) | class TestGetCreateLocalRepoUseCaseFactory:
method test_returns_callable (line 91) | def test_returns_callable(self):
FILE: build_stream/tests/unit/api/local_repo/test_local_repo_schemas.py
class TestCreateLocalRepoResponse (line 32) | class TestCreateLocalRepoResponse:
method valid_response_data (line 36) | def valid_response_data(self):
method test_valid_response (line 46) | def test_valid_response(self, valid_response_data):
method test_accepts_string_values (line 59) | def test_accepts_string_values(self, valid_response_data):
method test_invalid_datetime_format (line 71) | def test_invalid_datetime_format(self, valid_response_data):
method test_missing_required_fields (line 79) | def test_missing_required_fields(self):
method test_response_serialization (line 89) | def test_response_serialization(self, valid_response_data):
method test_response_deserialization (line 100) | def test_response_deserialization(self, valid_response_data):
class TestLocalRepoErrorResponse (line 114) | class TestLocalRepoErrorResponse:
method test_valid_error_response (line 117) | def test_valid_error_response(self):
method test_error_response_serialization (line 131) | def test_error_response_serialization(self):
method test_error_response_with_special_characters (line 146) | def test_error_response_with_special_characters(self):
FILE: build_stream/tests/unit/api/local_repo/test_routes.py
class TestCreateLocalRepositoryRoute (line 36) | class TestCreateLocalRepositoryRoute:
method mock_use_case (line 40) | def mock_use_case(self):
method job_id (line 47) | def job_id(self):
method test_success_response (line 51) | def test_success_response(self, mock_use_case, job_id):
method test_job_not_found_returns_404 (line 87) | def test_job_not_found_returns_404(self, mock_use_case, job_id):
method test_input_files_missing_returns_400 (line 112) | def test_input_files_missing_returns_400(self, mock_use_case, job_id):
method test_input_directory_invalid_returns_400 (line 141) | def test_input_directory_invalid_returns_400(self, mock_use_case, job_...
method test_queue_unavailable_returns_503 (line 171) | def test_queue_unavailable_returns_503(self, mock_use_case, job_id):
method test_unexpected_exception_returns_500 (line 200) | def test_unexpected_exception_returns_500(self, mock_use_case, job_id):
method test_invalid_job_id_format_returns_400 (line 225) | def test_invalid_job_id_format_returns_400(self, mock_use_case):
method test_missing_authorization_returns_401 (line 247) | def test_missing_authorization_returns_401(self, mock_use_case, job_id):
method test_correlation_id_header_propagated (line 264) | def test_correlation_id_header_propagated(self, mock_use_case, job_id):
FILE: build_stream/tests/unit/api/validate/test_routes.py
function _uuid (line 38) | def _uuid():
class MockValidateUseCase (line 42) | class MockValidateUseCase:
method __init__ (line 46) | def __init__(self, error_to_raise=None):
method execute (line 50) | def execute(self, command):
class TestBuildErrorResponse (line 65) | class TestBuildErrorResponse:
method test_builds_correct_response (line 69) | def test_builds_correct_response(self):
class TestCreateValidateImageOnTest (line 78) | class TestCreateValidateImageOnTest:
method test_success (line 81) | def test_success(self):
method test_invalid_job_id (line 111) | def test_invalid_job_id(self):
method test_job_not_found (line 128) | def test_job_not_found(self):
method test_invalid_state_transition (line 147) | def test_invalid_state_transition(self):
method test_upstream_stage_not_completed (line 171) | def test_upstream_stage_not_completed(self):
method test_validation_execution_error (line 195) | def test_validation_execution_error(self):
method test_unexpected_error (line 216) | def test_unexpected_error(self):
FILE: build_stream/tests/unit/core/artifacts/conftest.py
function valid_artifact_key (line 32) | def valid_artifact_key() -> ArtifactKey:
function valid_digest (line 38) | def valid_digest() -> ArtifactDigest:
function valid_store_hint (line 44) | def valid_store_hint() -> StoreHint:
function valid_artifact_ref (line 54) | def valid_artifact_ref(valid_artifact_key, valid_digest) -> ArtifactRef:
FILE: build_stream/tests/unit/core/artifacts/test_exceptions.py
class TestArtifactDomainError (line 28) | class TestArtifactDomainError:
method test_base_error_with_message_only (line 31) | def test_base_error_with_message_only(self) -> None:
method test_base_error_with_correlation_id (line 37) | def test_base_error_with_correlation_id(self) -> None:
method test_inheritance_from_exception (line 44) | def test_inheritance_from_exception(self) -> None:
class TestArtifactNotFoundError (line 50) | class TestArtifactNotFoundError:
method test_error_with_key_only (line 53) | def test_error_with_key_only(self) -> None:
method test_error_with_correlation_id (line 59) | def test_error_with_correlation_id(self) -> None:
method test_inheritance_from_domain_error (line 66) | def test_inheritance_from_domain_error(self) -> None:
class TestArtifactAlreadyExistsError (line 72) | class TestArtifactAlreadyExistsError:
method test_error_with_key_only (line 75) | def test_error_with_key_only(self) -> None:
method test_error_with_correlation_id (line 81) | def test_error_with_correlation_id(self) -> None:
method test_inheritance_from_domain_error (line 87) | def test_inheritance_from_domain_error(self) -> None:
class TestArtifactStoreError (line 93) | class TestArtifactStoreError:
method test_error_with_message_only (line 96) | def test_error_with_message_only(self) -> None:
method test_error_with_correlation_id (line 102) | def test_error_with_correlation_id(self) -> None:
method test_inheritance_from_domain_error (line 108) | def test_inheritance_from_domain_error(self) -> None:
class TestArtifactValidationError (line 114) | class TestArtifactValidationError:
method test_error_with_message_only (line 117) | def test_error_with_message_only(self) -> None:
method test_error_with_correlation_id (line 123) | def test_error_with_correlation_id(self) -> None:
method test_inheritance_from_domain_error (line 129) | def test_inheritance_from_domain_error(self) -> None:
FILE: build_stream/tests/unit/core/artifacts/test_value_objects.py
class TestSafePath (line 36) | class TestSafePath:
method test_valid_path (line 39) | def test_valid_path(self) -> None:
method test_from_string (line 43) | def test_from_string(self) -> None:
method test_empty_path_raises (line 47) | def test_empty_path_raises(self) -> None:
method test_whitespace_only_raises (line 51) | def test_whitespace_only_raises(self) -> None:
method test_path_too_long_raises (line 55) | def test_path_too_long_raises(self) -> None:
method test_traversal_dot_dot_raises (line 60) | def test_traversal_dot_dot_raises(self) -> None:
method test_relative_path_with_dots_in_name_allowed (line 64) | def test_relative_path_with_dots_in_name_allowed(self) -> None:
method test_traversal_encoded_raises (line 68) | def test_traversal_encoded_raises(self) -> None:
method test_null_byte_raises (line 72) | def test_null_byte_raises(self) -> None:
method test_immutable (line 76) | def test_immutable(self) -> None:
method test_str_representation (line 81) | def test_str_representation(self) -> None:
class TestArtifactKey (line 90) | class TestArtifactKey:
method test_valid_key (line 93) | def test_valid_key(self) -> None:
method test_empty_key_raises (line 97) | def test_empty_key_raises(self) -> None:
method test_whitespace_key_raises (line 101) | def test_whitespace_key_raises(self) -> None:
method test_key_too_long_raises (line 105) | def test_key_too_long_raises(self) -> None:
method test_traversal_dot_dot_raises (line 109) | def test_traversal_dot_dot_raises(self) -> None:
method test_traversal_backslash_raises (line 113) | def test_traversal_backslash_raises(self) -> None:
method test_absolute_path_raises (line 117) | def test_absolute_path_raises(self) -> None:
method test_null_byte_raises (line 121) | def test_null_byte_raises(self) -> None:
method test_immutable (line 125) | def test_immutable(self) -> None:
method test_str_representation (line 130) | def test_str_representation(self) -> None:
class TestArtifactDigest (line 139) | class TestArtifactDigest:
method test_valid_digest (line 142) | def test_valid_digest(self) -> None:
method test_short_digest_raises (line 146) | def test_short_digest_raises(self) -> None:
method test_long_digest_raises (line 150) | def test_long_digest_raises(self) -> None:
method test_uppercase_raises (line 154) | def test_uppercase_raises(self) -> None:
method test_non_hex_raises (line 158) | def test_non_hex_raises(self) -> None:
method test_immutable (line 162) | def test_immutable(self) -> None:
method test_str_representation (line 167) | def test_str_representation(self) -> None:
class TestArtifactRef (line 176) | class TestArtifactRef:
method test_valid_ref (line 179) | def test_valid_ref(self, valid_artifact_key, valid_digest) -> None:
method test_zero_size_allowed (line 188) | def test_zero_size_allowed(self, valid_artifact_key, valid_digest) -> ...
method test_negative_size_raises (line 197) | def test_negative_size_raises(self, valid_artifact_key, valid_digest) ...
method test_empty_uri_raises (line 206) | def test_empty_uri_raises(self, valid_artifact_key, valid_digest) -> N...
method test_uri_too_long_raises (line 215) | def test_uri_too_long_raises(self, valid_artifact_key, valid_digest) -...
method test_immutable (line 224) | def test_immutable(self, valid_artifact_ref) -> None:
class TestArtifactKind (line 233) | class TestArtifactKind:
method test_file_value (line 236) | def test_file_value(self) -> None:
method test_archive_value (line 239) | def test_archive_value(self) -> None:
method test_string_comparison (line 242) | def test_string_comparison(self) -> None:
class TestStoreHint (line 251) | class TestStoreHint:
method test_valid_hint (line 254) | def test_valid_hint(self) -> None:
method test_empty_namespace_raises (line 263) | def test_empty_namespace_raises(self) -> None:
method test_namespace_too_long_raises (line 267) | def test_namespace_too_long_raises(self) -> None:
method test_empty_label_raises (line 271) | def test_empty_label_raises(self) -> None:
method test_label_too_long_raises (line 275) | def test_label_too_long_raises(self) -> None:
method test_too_many_tags_raises (line 279) | def test_too_many_tags_raises(self) -> None:
method test_tag_key_too_long_raises (line 284) | def test_tag_key_too_long_raises(self) -> None:
method test_tag_value_too_long_raises (line 288) | def test_tag_value_too_long_raises(self) -> None:
method test_empty_tags_allowed (line 292) | def test_empty_tags_allowed(self) -> None:
method test_immutable (line 296) | def test_immutable(self) -> None:
FILE: build_stream/tests/unit/core/build_image/test_entities.py
class TestBuildImageRequest (line 27) | class TestBuildImageRequest:
method sample_request (line 31) | def sample_request(self):
method test_to_dict (line 60) | def test_to_dict(self, functional_groups):
method test_to_dict_with_inventory_host (line 97) | def test_to_dict_with_inventory_host(self, image_key_value, inventory_...
method test_generate_filename (line 120) | def test_generate_filename(self, sample_request):
method test_get_playbook_command_x86_64 (line 128) | def test_get_playbook_command_x86_64(self, sample_request):
method test_get_playbook_command_aarch64 (line 148) | def test_get_playbook_command_aarch64(
method test_immutable (line 185) | def test_immutable(self, sample_request):
method test_all_fields_required (line 190) | def test_all_fields_required(self):
FILE: build_stream/tests/unit/core/build_image/test_services.py
class MockBuildImageConfigRepository (line 34) | class MockBuildImageConfigRepository(BuildStreamConfigRepository):
method __init__ (line 37) | def __init__(self, inventory_host=None, should_fail=False):
method get_aarch64_inv_host (line 42) | def get_aarch64_inv_host(self, job_id):
class MockBuildImageQueueRepository (line 49) | class MockBuildImageQueueRepository:
method __init__ (line 52) | def __init__(self, should_fail=False):
method write_request (line 57) | def write_request(self, request):
class TestBuildImageConfigService (line 64) | class TestBuildImageConfigService:
method test_get_inventory_host_for_x86_64 (line 67) | def test_get_inventory_host_for_x86_64(self):
method test_get_inventory_host_for_aarch64_success (line 76) | def test_get_inventory_host_for_aarch64_success(self):
method test_get_inventory_host_for_aarch64_missing (line 86) | def test_get_inventory_host_for_aarch64_missing(self):
method test_get_inventory_host_for_aarch64_config_error (line 97) | def test_get_inventory_host_for_aarch64_config_error(self):
class TestBuildImageQueueService (line 106) | class TestBuildImageQueueService:
method test_submit_request_success (line 109) | def test_submit_request_success(self):
method test_submit_request_failure (line 131) | def test_submit_request_failure(self):
FILE: build_stream/tests/unit/core/build_image/test_value_objects.py
class TestArchitecture (line 27) | class TestArchitecture:
method test_valid_x86_64 (line 30) | def test_valid_x86_64(self):
method test_valid_aarch64 (line 37) | def test_valid_aarch64(self):
method test_invalid_empty (line 44) | def test_invalid_empty(self):
method test_invalid_whitespace (line 49) | def test_invalid_whitespace(self):
method test_unsupported_architecture (line 54) | def test_unsupported_architecture(self):
method test_case_sensitive (line 59) | def test_case_sensitive(self):
class TestImageKey (line 65) | class TestImageKey:
method test_valid_simple_key (line 68) | def test_valid_simple_key(self):
method test_valid_complex_key (line 73) | def test_valid_complex_key(self):
method test_valid_max_length (line 78) | def test_valid_max_length(self):
method test_invalid_empty (line 83) | def test_invalid_empty(self):
method test_invalid_too_long (line 88) | def test_invalid_too_long(self):
method test_invalid_characters (line 93) | def test_invalid_characters(self):
method test_invalid_space (line 98) | def test_invalid_space(self):
class TestFunctionalGroups (line 104) | class TestFunctionalGroups:
method test_valid_single_group (line 107) | def test_valid_single_group(self):
method test_valid_multiple_groups (line 112) | def test_valid_multiple_groups(self):
method test_valid_max_groups (line 117) | def test_valid_max_groups(self):
method test_invalid_empty (line 122) | def test_invalid_empty(self):
method test_invalid_too_many (line 127) | def test_invalid_too_many(self):
method test_invalid_empty_group (line 132) | def test_invalid_empty_group(self):
method test_invalid_group_characters (line 137) | def test_invalid_group_characters(self):
method test_immutable_list (line 142) | def test_immutable_list(self):
class TestInventoryHost (line 150) | class TestInventoryHost:
method test_valid_ip_address (line 153) | def test_valid_ip_address(self):
method test_valid_hostname (line 158) | def test_valid_hostname(self):
method test_valid_max_length (line 163) | def test_valid_max_length(self):
method test_invalid_empty (line 168) | def test_invalid_empty(self):
method test_invalid_too_long (line 173) | def test_invalid_too_long(self):
method test_invalid_characters (line 178) | def test_invalid_characters(self):
method test_invalid_underscore (line 183) | def test_invalid_underscore(self):
FILE: build_stream/tests/unit/core/catalog/test_exceptions.py
class TestCatalogParseError (line 30) | class TestCatalogParseError:
method test_base_error_with_message_only (line 33) | def test_base_error_with_message_only(self) -> None:
method test_base_error_with_correlation_id (line 39) | def test_base_error_with_correlation_id(self) -> None:
method test_inheritance_from_exception (line 46) | def test_inheritance_from_exception(self) -> None:
class TestInvalidFileFormatError (line 52) | class TestInvalidFileFormatError:
method test_error_creation (line 55) | def test_error_creation(self) -> None:
method test_error_with_correlation_id (line 61) | def test_error_with_correlation_id(self) -> None:
class TestInvalidJSONError (line 67) | class TestInvalidJSONError:
method test_error_creation (line 70) | def test_error_creation(self) -> None:
method test_error_with_correlation_id (line 76) | def test_error_with_correlation_id(self) -> None:
class TestCatalogSchemaValidationError (line 82) | class TestCatalogSchemaValidationError:
method test_error_with_message_only (line 85) | def test_error_with_message_only(self) -> None:
method test_error_with_schema_path (line 92) | def test_error_with_schema_path(self) -> None:
method test_error_with_correlation_id (line 102) | def test_error_with_correlation_id(self) -> None:
method test_error_with_all_parameters (line 110) | def test_error_with_all_parameters(self) -> None:
class TestFileTooLargeError (line 123) | class TestFileTooLargeError:
method test_error_creation (line 126) | def test_error_creation(self) -> None:
method test_error_with_correlation_id (line 134) | def test_error_with_correlation_id(self) -> None:
method test_error_message_format (line 143) | def test_error_message_format(self) -> None:
class TestAdapterPolicyValidationError (line 149) | class TestAdapterPolicyValidationError:
method test_error_with_message_only (line 152) | def test_error_with_message_only(self) -> None:
method test_error_with_policy_path (line 159) | def test_error_with_policy_path(self) -> None:
method test_error_with_correlation_id (line 169) | def test_error_with_correlation_id(self) -> None:
method test_error_with_all_parameters (line 177) | def test_error_with_all_parameters(self) -> None:
class TestConfigGenerationError (line 190) | class TestConfigGenerationError:
method test_error_creation (line 193) | def test_error_creation(self) -> None:
method test_error_with_correlation_id (line 199) | def test_error_with_correlation_id(self) -> None:
FILE: build_stream/tests/unit/core/catalog/test_generate_software_config.py
function _read_output (line 31) | def _read_output(output_dir: str) -> dict:
function _software_by_name (line 39) | def _software_by_name(result: dict, name: str) -> dict:
class TestStaticFields (line 50) | class TestStaticFields:
method test_cluster_os_type_from_os_family (line 53) | def test_cluster_os_type_from_os_family(self, tmp_path: str) -> None:
method test_cluster_os_version_from_os_version (line 62) | def test_cluster_os_version_from_os_version(self, tmp_path: str) -> None:
method test_repo_config_is_partial (line 71) | def test_repo_config_is_partial(self, tmp_path: str) -> None:
class TestSoftwaresList (line 85) | class TestSoftwaresList:
method test_single_arch_single_target (line 88) | def test_single_arch_single_target(self, tmp_path: str) -> None:
method test_multi_arch_both_non_empty (line 105) | def test_multi_arch_both_non_empty(self, tmp_path: str) -> None:
method test_target_name_derived_from_filename (line 118) | def test_target_name_derived_from_filename(self, tmp_path: str) -> None:
class TestArchExclusion (line 134) | class TestArchExclusion:
method test_excludes_arch_when_all_subgroups_empty (line 137) | def test_excludes_arch_when_all_subgroups_empty(self, tmp_path: str) -...
method test_excludes_target_entirely_when_empty_on_all_arches (line 153) | def test_excludes_target_entirely_when_empty_on_all_arches(self, tmp_p...
method test_target_missing_from_arch_excluded (line 169) | def test_target_missing_from_arch_excluded(self, tmp_path: str) -> None:
class TestVersionStrings (line 189) | class TestVersionStrings:
method test_service_k8s_gets_version (line 192) | def test_service_k8s_gets_version(self, tmp_path: str) -> None:
method test_csi_target_gets_version (line 204) | def test_csi_target_gets_version(self, tmp_path: str) -> None:
method test_regular_target_has_no_version (line 215) | def test_regular_target_has_no_version(self, tmp_path: str) -> None:
class TestSubgroupSections (line 231) | class TestSubgroupSections:
method test_lists_non_empty_subgroups (line 234) | def test_lists_non_empty_subgroups(self, tmp_path: str) -> None:
method test_target_name_not_in_subgroups (line 250) | def test_target_name_not_in_subgroups(self, tmp_path: str) -> None:
method test_excludes_empty_cluster_subgroups (line 262) | def test_excludes_empty_cluster_subgroups(self, tmp_path: str) -> None:
method test_no_subgroup_section_for_single_role_target (line 276) | def test_no_subgroup_section_for_single_role_target(self, tmp_path: st...
method test_subgroups_merged_across_arches (line 287) | def test_subgroups_merged_across_arches(self, tmp_path: str) -> None:
class TestEdgeCases (line 312) | class TestEdgeCases:
method test_empty_all_arch_configs (line 315) | def test_empty_all_arch_configs(self, tmp_path: str) -> None:
method test_creates_output_directory (line 326) | def test_creates_output_directory(self, tmp_path: str) -> None:
class TestRealisticScenario (line 341) | class TestRealisticScenario:
method test_realistic_multi_target (line 344) | def test_realistic_multi_target(self, tmp_path: str) -> None:
FILE: build_stream/tests/unit/core/catalog/test_parser.py
class TestParseCatalog (line 29) | class TestParseCatalog:
method test_parse_valid_catalog_with_default_schema (line 32) | def test_parse_valid_catalog_with_default_schema(self) -> None:
method test_parse_catalog_with_custom_schema (line 84) | def test_parse_catalog_with_custom_schema(self) -> None:
method test_parse_catalog_validation_error_raises_exception (line 127) | def test_parse_catalog_validation_error_raises_exception(self) -> None:
method test_parse_catalog_with_all_package_types (line 172) | def test_parse_catalog_with_all_package_types(self) -> None:
method test_parse_catalog_missing_optional_sections (line 256) | def test_parse_catalog_missing_optional_sections(self) -> None:
FILE: build_stream/tests/unit/core/catalog/test_parser_defaults.py
class TestParseCatalogDefaults (line 27) | class TestParseCatalogDefaults:
method test_default_schema_path_points_to_resources (line 28) | def test_default_schema_path_points_to_resources(self):
method test_parse_catalog_with_explicit_paths_uses_fixture (line 33) | def test_parse_catalog_with_explicit_paths_uses_fixture(self):
FILE: build_stream/tests/unit/core/jobs/entities/conftest.py
function sample_job_id (line 24) | def sample_job_id():
function sample_client_id (line 30) | def sample_client_id():
function sample_correlation_id (line 36) | def sample_correlation_id():
function sample_timestamp (line 42) | def sample_timestamp():
FILE: build_stream/tests/unit/core/jobs/entities/test_audit.py
class TestAuditEvent (line 25) | class TestAuditEvent:
method test_create_event (line 28) | def test_create_event(self):
method test_event_with_details (line 41) | def test_event_with_details(self):
method test_event_immutability (line 55) | def test_event_immutability(self):
FILE: build_stream/tests/unit/core/jobs/entities/test_idempotency.py
class TestIdempotencyRecord (line 25) | class TestIdempotencyRecord:
method test_create_record (line 28) | def test_create_record(self):
method test_record_immutability (line 42) | def test_record_immutability(self):
method test_is_expired (line 56) | def test_is_expired(self):
method test_matches_fingerprint (line 70) | def test_matches_fingerprint(self):
FILE: build_stream/tests/unit/core/jobs/entities/test_job.py
class TestJob (line 27) | class TestJob:
method test_create_job (line 30) | def test_create_job(self):
method test_start_job (line 42) | def test_start_job(self):
method test_start_job_invalid_state (line 54) | def test_start_job_invalid_state(self):
method test_complete_job (line 66) | def test_complete_job(self):
method test_complete_job_invalid_state (line 79) | def test_complete_job_invalid_state(self):
method test_fail_job (line 90) | def test_fail_job(self):
method test_cancel_job_from_created (line 103) | def test_cancel_job_from_created(self):
method test_cancel_job_from_in_progress (line 115) | def test_cancel_job_from_in_progress(self):
method test_terminal_state_prevents_transitions (line 127) | def test_terminal_state_prevents_transitions(self):
method test_tombstone_job (line 145) | def test_tombstone_job(self):
method test_job_state_predicates (line 158) | def test_job_state_predicates(self):
FILE: build_stream/tests/unit/core/jobs/entities/test_stage.py
class TestStage (line 27) | class TestStage:
method test_create_stage (line 30) | def test_create_stage(self):
method test_start_stage (line 42) | def test_start_stage(self):
method test_start_stage_invalid_state (line 53) | def test_start_stage_invalid_state(self):
method test_complete_stage (line 63) | def test_complete_stage(self):
method test_fail_stage (line 75) | def test_fail_stage(self):
method test_skip_stage (line 89) | def test_skip_stage(self):
method test_cancel_stage_from_pending (line 100) | def test_cancel_stage_from_pending(self):
method test_cancel_stage_from_in_progress (line 110) | def test_cancel_stage_from_in_progress(self):
method test_terminal_state_prevents_transitions (line 120) | def test_terminal_state_prevents_transitions(self):
FILE: build_stream/tests/unit/core/jobs/test_exceptions.py
class TestJobDomainError (line 31) | class TestJobDomainError:
method test_basic_error (line 34) | def test_basic_error(self):
method test_error_with_correlation_id (line 41) | def test_error_with_correlation_id(self):
class TestJobNotFoundError (line 47) | class TestJobNotFoundError:
method test_error_message (line 50) | def test_error_message(self):
method test_with_correlation_id (line 56) | def test_with_correlation_id(self):
class TestJobAlreadyExistsError (line 62) | class TestJobAlreadyExistsError:
method test_error_message (line 65) | def test_error_message(self):
class TestInvalidStateTransitionError (line 72) | class TestInvalidStateTransitionError:
method test_error_message (line 75) | def test_error_message(self):
method test_error_attributes (line 88) | def test_error_attributes(self):
class TestTerminalStateViolationError (line 102) | class TestTerminalStateViolationError:
method test_error_message (line 105) | def test_error_message(self):
method test_error_attributes (line 117) | def test_error_attributes(self):
class TestOptimisticLockError (line 129) | class TestOptimisticLockError:
method test_error_message (line 132) | def test_error_message(self):
method test_error_attributes (line 145) | def test_error_attributes(self):
class TestIdempotencyConflictError (line 159) | class TestIdempotencyConflictError:
method test_error_message (line 162) | def test_error_message(self):
method test_error_attributes (line 172) | def test_error_attributes(self):
class TestStageNotFoundError (line 182) | class TestStageNotFoundError:
method test_error_message (line 185) | def test_error_message(self):
method test_error_attributes (line 194) | def test_error_attributes(self):
FILE: build_stream/tests/unit/core/jobs/test_value_objects.py
class TestJobId (line 34) | class TestJobId:
method _uuid_str (line 38) | def _uuid_str() -> str:
method test_valid_uuid_any_version (line 42) | def test_valid_uuid_any_version(self):
method test_uuid_is_normalized_lowercase (line 48) | def test_uuid_is_normalized_lowercase(self):
method test_invalid_uuid_format (line 55) | def test_invalid_uuid_format(self):
method test_empty_string (line 60) | def test_empty_string(self):
method test_exceeds_maximum_length (line 65) | def test_exceeds_maximum_length(self):
method test_immutability (line 70) | def test_immutability(self):
method test_str_representation (line 76) | def test_str_representation(self):
method test_equality (line 82) | def test_equality(self):
class TestCorrelationId (line 90) | class TestCorrelationId:
method _uuid_str (line 94) | def _uuid_str() -> str:
method test_valid_uuid_any_version (line 98) | def test_valid_uuid_any_version(self):
method test_invalid_uuid_format (line 104) | def test_invalid_uuid_format(self):
method test_exceeds_maximum_length (line 109) | def test_exceeds_maximum_length(self):
method test_immutability (line 114) | def test_immutability(self):
class TestStageName (line 121) | class TestStageName:
method test_valid_stage_names (line 124) | def test_valid_stage_names(self):
method test_invalid_stage_name (line 131) | def test_invalid_stage_name(self):
method test_empty_string (line 136) | def test_empty_string(self):
method test_case_sensitive (line 141) | def test_case_sensitive(self):
method test_exceeds_maximum_length (line 146) | def test_exceeds_maximum_length(self):
method test_immutability (line 151) | def test_immutability(self):
method test_canonical_stages_count (line 157) | def test_canonical_stages_count(self):
class TestIdempotencyKey (line 162) | class TestIdempotencyKey:
method test_valid_key (line 165) | def test_valid_key(self):
method test_minimum_length (line 170) | def test_minimum_length(self):
method test_maximum_length (line 175) | def test_maximum_length(self):
method test_empty_string (line 181) | def test_empty_string(self):
method test_exceeds_maximum_length (line 186) | def test_exceeds_maximum_length(self):
method test_immutability (line 192) | def test_immutability(self):
class TestRequestFingerprint (line 199) | class TestRequestFingerprint:
method test_valid_sha256 (line 202) | def test_valid_sha256(self):
method test_valid_sha256_uppercase (line 209) | def test_valid_sha256_uppercase(self):
method test_invalid_length (line 216) | def test_invalid_length(self):
method test_invalid_characters (line 221) | def test_invalid_characters(self):
method test_empty_string (line 226) | def test_empty_string(self):
method test_immutability (line 231) | def test_immutability(self):
class TestClientId (line 240) | class TestClientId:
method test_valid_client_id (line 243) | def test_valid_client_id(self):
method test_empty_string (line 248) | def test_empty_string(self):
method test_whitespace_only (line 253) | def test_whitespace_only(self):
method test_exceeds_maximum_length (line 258) | def test_exceeds_maximum_length(self):
method test_immutability (line 263) | def test_immutability(self):
class TestJobState (line 270) | class TestJobState:
method test_all_states_exist (line 273) | def test_all_states_exist(self):
method test_terminal_states (line 281) | def test_terminal_states(self):
method test_non_terminal_states (line 287) | def test_non_terminal_states(self):
method test_state_count (line 292) | def test_state_count(self):
class TestStageState (line 297) | class TestStageState:
method test_all_states_exist (line 300) | def test_all_states_exist(self):
method test_terminal_states (line 309) | def test_terminal_states(self):
method test_non_terminal_states (line 316) | def test_non_terminal_states(self):
method test_state_count (line 321) | def test_state_count(self):
FILE: build_stream/tests/unit/core/localrepo/test_entities.py
class TestPlaybookRequest (line 31) | class TestPlaybookRequest:
method _make_request (line 34) | def _make_request(self, **overrides):
method test_to_dict_contains_all_fields (line 49) | def test_to_dict_contains_all_fields(self):
method test_generate_filename_format (line 61) | def test_generate_filename_format(self):
method test_immutability (line 69) | def test_immutability(self):
class TestPlaybookResult (line 76) | class TestPlaybookResult:
method test_success_result (line 79) | def test_success_result(self):
method test_failed_result (line 91) | def test_failed_result(self):
method test_from_dict_success (line 105) | def test_from_dict_success(self):
method test_from_dict_missing_required_field (line 125) | def test_from_dict_missing_required_field(self):
method test_from_dict_with_optional_fields (line 131) | def test_from_dict_with_optional_fields(self):
method test_immutability (line 143) | def test_immutability(self):
FILE: build_stream/tests/unit/core/localrepo/test_exceptions.py
class TestLocalRepoDomainError (line 27) | class TestLocalRepoDomainError:
method test_message_stored (line 30) | def test_message_stored(self):
method test_correlation_id_stored (line 35) | def test_correlation_id_stored(self):
method test_correlation_id_defaults_none (line 40) | def test_correlation_id_defaults_none(self):
class TestQueueUnavailableError (line 48) | class TestQueueUnavailableError:
method test_attributes_stored (line 51) | def test_attributes_stored(self):
class TestInputFilesMissingError (line 58) | class TestInputFilesMissingError:
method test_attributes_stored (line 61) | def test_attributes_stored(self):
method test_message_suggests_generate_api (line 67) | def test_message_suggests_generate_api(self):
class TestInputDirectoryInvalidError (line 73) | class TestInputDirectoryInvalidError:
method test_attributes_stored (line 76) | def test_attributes_stored(self):
FILE: build_stream/tests/unit/core/localrepo/test_services.py
class TestInputFileService (line 41) | class TestInputFileService:
method _make_service (line 44) | def _make_service(self, input_repo=None):
method test_prepare_success (line 50) | def test_prepare_success(self, tmp_path):
method test_prepare_missing_input_raises (line 71) | def test_prepare_missing_input_raises(self):
method test_prepare_copies_only_specific_files (line 82) | def test_prepare_copies_only_specific_files(self, tmp_path):
method test_prepare_handles_missing_specific_files (line 117) | def test_prepare_handles_missing_specific_files(self, tmp_path):
class TestPlaybookQueueRequestService (line 145) | class TestPlaybookQ
Condensed preview — 1073 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,942K chars).
[
{
"path": ".all-contributorsrc",
"chars": 29779,
"preview": "{\n \"files\": [\n \"README.md\"\n ],\n \"imageSize\": 100,\n \"commit\": false,\n \"badgeTemplate\": \"<!-- DO NOT ADD A BADGE -"
},
{
"path": ".ansible-lint",
"chars": 123,
"preview": "skip_list:\n - var-naming[no-role-prefix]\n - unresolved-module\n - fqcn[canonical]\n - internal-error\n - role-name[pat"
},
{
"path": ".config/ansible-lint.yml",
"chars": 826,
"preview": "---\nexclude_paths:\n - .git/\n - .github/\n - accelerator/tests/\n - network/tests/\n - provision/tests/\n - scheduler/t"
},
{
"path": ".config/requirements.yml",
"chars": 572,
"preview": "---\ncollections:\n - name: kubernetes.core\n version: 5.0.0\n - name: ansible.utils\n version: 5.1.1\n - name: commu"
},
{
"path": ".gitattributes",
"chars": 71,
"preview": "*.yml linguist-detectable\n*.tar.gz filter=lfs diff=lfs merge=lfs -text\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 554,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nOmnia Version: ''\nlabels: bug\nassignees: ''\n\n--"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 606,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: 'enhancement'\nassignees: ''\n\n---\n\n**"
},
{
"path": ".github/ISSUE_TEMPLATE/logo_community.md",
"chars": 368,
"preview": "---\nname: Add organization logo to the Omnia community list\nabout: Display your organization's logo on the Omnia website"
},
{
"path": ".github/branch-switcher.yml",
"chars": 163,
"preview": "preferredBranch: devel\nswitchComment: >\n Hey @{{author}}, the base branch of your pull request has been changed\n to {{"
},
{
"path": ".github/pull_request_template.md",
"chars": 566,
"preview": "### Issues Resolved by this Pull Request\nPlease be sure to associate your pull request with one or more open issues. Use"
},
{
"path": ".github/stale.yml",
"chars": 683,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 60\n# Number of days of inactivity before a "
},
{
"path": ".github/workflows/ansible-lint.yml",
"chars": 868,
"preview": "name: Ansible Lint\n\non:\n pull_request:\n branches:\n - main\n - staging\n - release_1.7.1\n - pub/bui"
},
{
"path": ".github/workflows/pylint.yml",
"chars": 2143,
"preview": "name: Pylint\n\non:\n pull_request:\n branches:\n - main\n - staging\n - release_1.7.1\n - pub/build_str"
},
{
"path": ".gitignore",
"chars": 42,
"preview": "/.idea/\n/docs/build/\n**/__pycache__/\n.venv"
},
{
"path": ".metadata/omnia_version",
"chars": 52,
"preview": "omnia_version: 2.0.0.0 \nomnia_installation_path: \"\"\n"
},
{
"path": ".readthedocs.yaml",
"chars": 732,
"preview": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html f"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 3352,
"preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
},
{
"path": "CONTRIBUTING.md",
"chars": 6960,
"preview": "# CONTRIBUTE\n\n## Introduction\nWe encourage everyone to help us improve Omnia by contributing to the project. Contributio"
},
{
"path": "LICENSE",
"chars": 11382,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 50533,
"preview": "<img src=\"docs/logos/omnia-logo-transparent.png\" width=\"500px\">\n<!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or mod"
},
{
"path": "SECURITY.md",
"chars": 1430,
"preview": "# Security Policy\n\n## Supported Versions\n\nOmnia provides security support for Omnia 1.7. All users utilizing older versi"
},
{
"path": "ansible.cfg",
"chars": 608,
"preview": "[defaults]\nlog_path = /opt/omnia/log/core/playbooks/omnia.log\n# Set the remote temporary directory to a shared path to a"
},
{
"path": "build_image_aarch64/ansible.cfg",
"chars": 447,
"preview": "[defaults]\nlog_path = /opt/omnia/log/core/playbooks/build_image_aarch64.log\nremote_tmp = /opt/omnia/tmp/.ansible/tmp/\nho"
},
{
"path": "build_image_aarch64/build_image_aarch64.yml",
"chars": 4976,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/fetch_packages/tasks/aarch64_build_image_completion.yml",
"chars": 762,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_aarch64/roles/fetch_packages/tasks/build_stream_prerequisite.yml",
"chars": 1863,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/fetch_packages/tasks/check_aarch64_fg.yml",
"chars": 1202,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/fetch_packages/tasks/fetch_packages.yml",
"chars": 2833,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/fetch_packages/tasks/fetch_pulp_repos.yml",
"chars": 1493,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/fetch_packages/tasks/main.yml",
"chars": 2745,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_aarch64/roles/fetch_packages/vars/main.yml",
"chars": 1795,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_aarch64/roles/image_creation/tasks/build_base_image.yml",
"chars": 3512,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_aarch64/roles/image_creation/tasks/build_compute_image.yml",
"chars": 6326,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_aarch64/roles/image_creation/tasks/main.yml",
"chars": 1213,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_aarch64/roles/image_creation/templates/base_image_template.j2",
"chars": 804,
"preview": "openchami_work_dir: \"{{ openchami_work_dir }}\"\nrhel_tag: \"{{ rhel_tag }}\"\nrhel_base_image_name: \"{{ rhel_aarch64_base_im"
},
{
"path": "build_image_aarch64/roles/image_creation/templates/compute_images_templates.j2",
"chars": 1920,
"preview": "openchami_work_dir: \"{{ openchami_work_dir }}\"\nrhel_tag: \"{{ rhel_tag }}\"\nrhel_base_image: \"{{ oim_node_name }}/{{ rhel_"
},
{
"path": "build_image_aarch64/roles/image_creation/vars/main.yml",
"chars": 2815,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/prepare_arm_node/tasks/gather_oim_data.yml",
"chars": 3786,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/prepare_arm_node/tasks/main.yml",
"chars": 7058,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_aarch64/roles/prepare_arm_node/vars/main.yml",
"chars": 2594,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_x86_64/ansible.cfg",
"chars": 446,
"preview": "[defaults]\nlog_path = /opt/omnia/log/core/playbooks/build_image_x86_64.yml\nremote_tmp = /opt/omnia/tmp/.ansible/tmp/\nhos"
},
{
"path": "build_image_x86_64/build_image_x86_64.yml",
"chars": 4815,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_x86_64/roles/fetch_packages/tasks/build_stream_prerequisite.yml",
"chars": 1863,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_x86_64/roles/fetch_packages/tasks/check_x86_64_fg.yml",
"chars": 1197,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_x86_64/roles/fetch_packages/tasks/fetch_packages.yml",
"chars": 2835,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/fetch_packages/tasks/fetch_pulp_repos.yml",
"chars": 1478,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_image_x86_64/roles/fetch_packages/tasks/main.yml",
"chars": 2711,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/fetch_packages/tasks/x86_64_build_image_completion.yml",
"chars": 761,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/fetch_packages/vars/main.yml",
"chars": 1872,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/image_creation/tasks/build_base_image.yml",
"chars": 3272,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/image_creation/tasks/build_compute_image.yml",
"chars": 6021,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/image_creation/tasks/main.yml",
"chars": 1211,
"preview": "# Copyright 2025 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/image_creation/tasks/prepare_pulp_image.yml",
"chars": 2568,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_image_x86_64/roles/image_creation/templates/base_image_template.j2",
"chars": 858,
"preview": "openchami_work_dir: \"{{ openchami_work_dir }}\"\nrhel_base_image_name: \"{{ rhel_x86_64_base_image_name }}\"\nrhel_base_image"
},
{
"path": "build_image_x86_64/roles/image_creation/templates/compute_images_templates.j2",
"chars": 1889,
"preview": "openchami_work_dir: \"{{ openchami_work_dir }}\"\nrhel_base_image: \"{{ oim_node_name }}/{{ rhel_x86_64_base_image_name }}\"\n"
},
{
"path": "build_image_x86_64/roles/image_creation/vars/main.yml",
"chars": 3136,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/.gitignore",
"chars": 51,
"preview": ".venv\n.vscode\n\n/.idea/\n/docs/build/\n**/__pycache__/"
},
{
"path": "build_stream/README.md",
"chars": 4617,
"preview": "# Build Stream\n\n**Build Stream** is a **RESTful API** (Representational State Transfer Application Programming Interface"
},
{
"path": "build_stream/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/auth/__init__.py",
"chars": 714,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/auth/jwt_handler.py",
"chars": 9099,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/auth/password_handler.py",
"chars": 3279,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/auth/routes.py",
"chars": 13822,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/auth/schemas.py",
"chars": 7456,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/auth/service.py",
"chars": 10183,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/build_image/__init__.py",
"chars": 711,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/build_image/dependencies.py",
"chars": 2599,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/build_image/routes.py",
"chars": 11785,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/build_image/schemas.py",
"chars": 2381,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/catalog_roles/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/catalog_roles/dependencies.py",
"chars": 2215,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/catalog_roles/routes.py",
"chars": 7232,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/catalog_roles/schemas.py",
"chars": 2263,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/catalog_roles/service.py",
"chars": 14116,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/dependencies.py",
"chars": 15551,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/generate_input_files/__init__.py",
"chars": 727,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/generate_input_files/dependencies.py",
"chars": 2227,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/generate_input_files/routes.py",
"chars": 9064,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/generate_input_files/schemas.py",
"chars": 1978,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/jobs/__init__.py",
"chars": 629,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/jobs/dependencies.py",
"chars": 1032,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/jobs/routes.py",
"chars": 21208,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/jobs/schemas.py",
"chars": 6875,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/local_repo/__init__.py",
"chars": 679,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/local_repo/dependencies.py",
"chars": 2562,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/local_repo/routes.py",
"chars": 10098,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/local_repo/schemas.py",
"chars": 1567,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/logging_utils.py",
"chars": 9098,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/parse_catalog/__init__.py",
"chars": 714,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/parse_catalog/dependencies.py",
"chars": 2033,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/parse_catalog/routes.py",
"chars": 9999,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/parse_catalog/schemas.py",
"chars": 2104,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/parse_catalog/service.py",
"chars": 8140,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/router.py",
"chars": 1606,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/validate/__init__.py",
"chars": 668,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/validate/dependencies.py",
"chars": 2457,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/validate/routes.py",
"chars": 8058,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/validate/schemas.py",
"chars": 1771,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/api/vault_client.py",
"chars": 9818,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/build_stream.ini",
"chars": 228,
"preview": "# BuildStream Configuration\n\n[paths]\nbuild_stream_base_path = /opt/omnia/build_stream_root\n\n[artifact_store]\nbackend = f"
},
{
"path": "build_stream/common/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/common/config.py",
"chars": 4478,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/common/constants.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/common/logging.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/common/user_messages.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/container.py",
"chars": 15930,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/artifacts/__init__.py",
"chars": 1411,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/artifacts/entities.py",
"chars": 2774,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/artifacts/exceptions.py",
"chars": 3313,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/artifacts/interfaces.py",
"chars": 5473,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/artifacts/ports.py",
"chars": 5478,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/artifacts/value_objects.py",
"chars": 8974,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/build/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/build_image/__init__.py",
"chars": 1297,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/build_image/entities.py",
"chars": 3739,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/build_image/exceptions.py",
"chars": 1545,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/build_image/repositories.py",
"chars": 1888,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/build_image/services.py",
"chars": 3255,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/build_image/value_objects.py",
"chars": 5475,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/ADAPTER_POLICY_GUIDE.md",
"chars": 9674,
"preview": "# Adapter Policy Guide\n\nThis guide explains how to write the **adapter policy file** (`adapter_policy_default.json`) to "
},
{
"path": "build_stream/core/catalog/README.md",
"chars": 4944,
"preview": "| Code | Name | When it happens |\n|"
},
{
"path": "build_stream/core/catalog/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/adapter.py",
"chars": 16485,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/adapter_policy.py",
"chars": 30602,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/adapter_policy_schema_consts.py",
"chars": 1519,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/exceptions.py",
"chars": 2505,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/generator.py",
"chars": 26761,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/models.py",
"chars": 2791,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/parser.py",
"chars": 4558,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/resources/AdapterPolicySchema.json",
"chars": 7349,
"preview": "{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"AdapterPolicySchema.json\",\n \"title\": \"Target-Centri"
},
{
"path": "build_stream/core/catalog/resources/CatalogSchema.json",
"chars": 7047,
"preview": "{\n \"$schema\": \"https://json-schema.org/draft-07/schema#\",\n \"schemaVersion\": \"1.0\",\n \"title\": \"Catalog\",\n \"type\": \"ob"
},
{
"path": "build_stream/core/catalog/resources/RootLevelSchema.json",
"chars": 1719,
"preview": "{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"title\": \"Root Feature List\",\n \"type\": \"object\",\n \"descrip"
},
{
"path": "build_stream/core/catalog/resources/adapter_policy_default.json",
"chars": 9730,
"preview": "{\n \"version\": \"2.0.0\",\n \"description\": \"Target-centric mapping spec: pull roles into each target file, then derive com"
},
{
"path": "build_stream/core/catalog/test_fixtures/adapter_policy_test.json",
"chars": 7977,
"preview": "{\n \"version\": \"2.0.0\",\n \"description\": \"Target-centric mapping spec: pull roles into each target file, then derive com"
},
{
"path": "build_stream/core/catalog/test_fixtures/catalog_rhel.json",
"chars": 87136,
"preview": "{\n \"Catalog\": {\n \"Name\": \"Catalog\",\n \"Version\": \"1.0\",\n \"Identifier\": \"image-build\",\n \"FunctionalLayer\": [\n"
},
{
"path": "build_stream/core/catalog/test_fixtures/functional_layer.json",
"chars": 6857,
"preview": "{\n \"service_kube_control_plane_x86_64\": {\n \"packages\": [\n {\"package\": \"ghcr.io/kube-vip/kube-vip\", \"type\": \"ima"
},
{
"path": "build_stream/core/catalog/tests/sample.py",
"chars": 3179,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/tests/test_adapter_cli_defaults.py",
"chars": 2188,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/tests/test_adapter_policy.py",
"chars": 36348,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/tests/test_generator_cli_defaults.py",
"chars": 2193,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/tests/test_generator_package_list.py",
"chars": 8982,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/tests/test_generator_roles.py",
"chars": 2978,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/tests/test_parser_defaults.py",
"chars": 1794,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/catalog/utils.py",
"chars": 2363,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/common/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/exceptions.py",
"chars": 1062,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/__init__.py",
"chars": 1859,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/entities/__init__.py",
"chars": 826,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/entities/audit.py",
"chars": 1503,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/entities/idempotency.py",
"chars": 2154,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/entities/job.py",
"chars": 5640,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/entities/stage.py",
"chars": 5930,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/exceptions.py",
"chars": 8168,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/repositories.py",
"chars": 4707,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/services.py",
"chars": 7758,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/jobs/value_objects.py",
"chars": 8420,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/localrepo/__init__.py",
"chars": 1548,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/localrepo/entities.py",
"chars": 5237,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/localrepo/exceptions.py",
"chars": 3508,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/localrepo/repositories.py",
"chars": 3731,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/localrepo/services.py",
"chars": 9876,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/localrepo/value_objects.py",
"chars": 5075,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/utils/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/validate/__init__.py",
"chars": 1067,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/validate/entities.py",
"chars": 2628,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/validate/exceptions.py",
"chars": 1470,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/core/validate/services.py",
"chars": 2094,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/doc/README.md",
"chars": 2433,
"preview": "# Build Stream Documentation\n\nThis directory contains comprehensive documentation for the Build Stream module and its wo"
},
{
"path": "build_stream/doc/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/doc/build_image.md",
"chars": 3359,
"preview": "# OS Image Building\n\nThe OS Image Building workflow orchestrates operating system image creation for functional roles in"
},
{
"path": "build_stream/doc/catalog.md",
"chars": 2697,
"preview": "# Catalog Processing\n\nThe Catalog workflow handles software catalog parsing and role generation for the Omnia platform.\n"
},
{
"path": "build_stream/doc/jobs.md",
"chars": 3049,
"preview": "# Jobs Management\n\nThe Jobs workflow manages the complete lifecycle of build jobs in Build Stream, from creation through"
},
{
"path": "build_stream/doc/local_repo.md",
"chars": 3553,
"preview": "# Local Repository\n\nThe Local Repository workflow manages the creation and configuration of local package repositories f"
},
{
"path": "build_stream/doc/validation.md",
"chars": 7446,
"preview": "# Validation\n\nThe Validation workflow provides comprehensive validation for built images on provided testbeds specified "
},
{
"path": "build_stream/generate_catalog.py",
"chars": 22166,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/generate_catalog_examples.py",
"chars": 5227,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/__init__.py",
"chars": 615,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/artifact_store/__init__.py",
"chars": 968,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/artifact_store/file_artifact_store.py",
"chars": 12791,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/artifact_store/in_memory_artifact_metadata.py",
"chars": 3010,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/artifact_store/in_memory_artifact_store.py",
"chars": 10558,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/db/__init__.py",
"chars": 1621,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/db/alembic/env.py",
"chars": 2494,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/db/alembic/script.py.mako",
"chars": 635,
"preview": "\"\"\"${message}\n\nRevision ID: ${up_revision}\nRevises: ${down_revision | comma,n}\nCreate Date: ${create_date}\n\n\"\"\"\nfrom typ"
},
{
"path": "build_stream/infra/db/alembic/versions/20260219_001_create_jobs_table.py",
"chars": 2454,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_stream/infra/db/alembic/versions/20260219_002_create_stages_table.py",
"chars": 2597,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_stream/infra/db/alembic/versions/20260219_003_create_idempotency_keys_table.py",
"chars": 2070,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_stream/infra/db/alembic/versions/20260219_004_create_audit_events_table.py",
"chars": 2723,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_stream/infra/db/alembic/versions/20260219_005_create_artifact_metadata_table.py",
"chars": 2397,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0"
},
{
"path": "build_stream/infra/db/alembic.ini",
"chars": 599,
"preview": "[alembic]\nscript_location = %(here)s/alembic\nsqlalchemy.url = postgresql://%(DB_USER)s:%(DB_PASSWORD)s@%(DB_HOST)s:5432/"
},
{
"path": "build_stream/infra/db/config.py",
"chars": 1402,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/db/mappers.py",
"chars": 6832,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/db/models.py",
"chars": 6384,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/db/repositories.py",
"chars": 13776,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/db/session.py",
"chars": 2850,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/id_generator.py",
"chars": 1742,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/repositories/__init__.py",
"chars": 1316,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
},
{
"path": "build_stream/infra/repositories/in_memory.py",
"chars": 4415,
"preview": "# Copyright 2026 Dell Inc. or its subsidiaries. All Rights Reserved.\n#\n# Licensed under the Apache License, Version 2.0 "
}
]
// ... and 873 more files (download for full content)
About this extraction
This page contains the full source code of the dellhpc/omnia GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1073 files (5.3 MB), approximately 1.4M tokens, and a symbol index with 3013 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.