atraxis 1.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- atraxis-1.0.2/.dockerignore +15 -0
- atraxis-1.0.2/.github/workflows/browser-engine.yml +71 -0
- atraxis-1.0.2/.github/workflows/chain.yml +86 -0
- atraxis-1.0.2/.github/workflows/dockerhub.yml +83 -0
- atraxis-1.0.2/.github/workflows/endurance.yml +62 -0
- atraxis-1.0.2/.github/workflows/guided-deployment.yml +24 -0
- atraxis-1.0.2/.github/workflows/memory.yml +60 -0
- atraxis-1.0.2/.github/workflows/operator-compose.yml +170 -0
- atraxis-1.0.2/.github/workflows/operator-registry.yml +187 -0
- atraxis-1.0.2/.github/workflows/package.yml +136 -0
- atraxis-1.0.2/.github/workflows/prometheus.yml +61 -0
- atraxis-1.0.2/.github/workflows/release-candidate.yml +93 -0
- atraxis-1.0.2/.github/workflows/release-stable.yml +108 -0
- atraxis-1.0.2/.github/workflows/tests.yml +42 -0
- atraxis-1.0.2/.github/workflows/textual.yml +20 -0
- atraxis-1.0.2/.github/workflows/web.yml +43 -0
- atraxis-1.0.2/.gitignore +7 -0
- atraxis-1.0.2/.readthedocs.yaml +15 -0
- atraxis-1.0.2/AGENTS.md +130 -0
- atraxis-1.0.2/CONTRIBUTING.md +9 -0
- atraxis-1.0.2/Dockerfile +14 -0
- atraxis-1.0.2/LICENSE +232 -0
- atraxis-1.0.2/MANIFEST.in +26 -0
- atraxis-1.0.2/PKG-INFO +507 -0
- atraxis-1.0.2/README.md +254 -0
- atraxis-1.0.2/ROADMAP.md +134 -0
- atraxis-1.0.2/_templates/documentation-tracks.html +6 -0
- atraxis-1.0.2/assets/brand/README.md +70 -0
- atraxis-1.0.2/assets/brand/favicon/android-chrome-192x192.png +0 -0
- atraxis-1.0.2/assets/brand/favicon/android-chrome-512x512.png +0 -0
- atraxis-1.0.2/assets/brand/favicon/apple-touch-icon.png +0 -0
- atraxis-1.0.2/assets/brand/favicon/favicon-16x16.png +0 -0
- atraxis-1.0.2/assets/brand/favicon/favicon-32x32.png +0 -0
- atraxis-1.0.2/assets/brand/favicon/favicon-48x48.png +0 -0
- atraxis-1.0.2/assets/brand/favicon/favicon-64x64.png +0 -0
- atraxis-1.0.2/assets/brand/favicon/favicon.ico +0 -0
- atraxis-1.0.2/assets/brand/favicon/favicon.svg +8 -0
- atraxis-1.0.2/assets/brand/favicon/safari-pinned-tab.svg +4 -0
- atraxis-1.0.2/assets/brand/favicon/site.webmanifest +21 -0
- atraxis-1.0.2/assets/brand/pdf/atraxis-logo-horizontal.pdf +0 -0
- atraxis-1.0.2/assets/brand/pdf/atraxis-logo-stacked.pdf +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-horizontal-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-horizontal-2048.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-horizontal-512.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-horizontal-dark-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-horizontal-light-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-mono-navy-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-mono-white-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-stacked-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-stacked-2048.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-stacked-512.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-stacked-dark-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-logo-stacked-light-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-symbol-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-symbol-128.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-symbol-256.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-symbol-512.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-symbol-dark-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-symbol-light-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-wordmark-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-wordmark-2048.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-wordmark-512.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-wordmark-dark-1024.png +0 -0
- atraxis-1.0.2/assets/brand/png/atraxis-wordmark-light-1024.png +0 -0
- atraxis-1.0.2/assets/brand/preview/atraxis-brand-overview.jpg +0 -0
- atraxis-1.0.2/assets/brand/social/atraxis-avatar-1024.png +0 -0
- atraxis-1.0.2/assets/brand/social/atraxis-open-graph-1200x630.png +0 -0
- atraxis-1.0.2/assets/brand/source/atraxis-approved.png +0 -0
- atraxis-1.0.2/assets/brand/source/atraxis-symbol-master.svg +60 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-logo-horizontal-dark.svg +66 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-logo-horizontal.svg +66 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-logo-mono-navy.svg +11 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-logo-mono-white.svg +11 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-logo-stacked-dark.svg +66 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-logo-stacked.svg +66 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-symbol-dark.svg +59 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-symbol-mono-navy.svg +4 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-symbol-mono-white.svg +4 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-symbol-small.svg +8 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-symbol.svg +59 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-wordmark-dark.svg +8 -0
- atraxis-1.0.2/assets/brand/svg/atraxis-wordmark.svg +8 -0
- atraxis-1.0.2/assets/brand/webp/atraxis-logo-horizontal-1024.webp +0 -0
- atraxis-1.0.2/assets/brand/webp/atraxis-logo-stacked-1024.webp +0 -0
- atraxis-1.0.2/assets/diagrams/atraxis-architecture.svg +111 -0
- atraxis-1.0.2/assets/diagrams/logos/LICENSE-prometheus.txt +202 -0
- atraxis-1.0.2/assets/diagrams/logos/README.md +15 -0
- atraxis-1.0.2/assets/diagrams/logos/alertmanager.svg +51 -0
- atraxis-1.0.2/assets/diagrams/logos/atraxis.svg +59 -0
- atraxis-1.0.2/assets/diagrams/logos/atropos.svg +25 -0
- atraxis-1.0.2/assets/diagrams/logos/auton.svg +7 -0
- atraxis-1.0.2/assets/diagrams/logos/certlord.svg +10 -0
- atraxis-1.0.2/assets/diagrams/logos/covenant.svg +8 -0
- atraxis-1.0.2/assets/diagrams/logos/monit-docker.svg +7 -0
- atraxis-1.0.2/assets/diagrams/logos/prometheus.svg +51 -0
- atraxis-1.0.2/atraxis/__init__.py +1 -0
- atraxis-1.0.2/atraxis/__main__.py +3 -0
- atraxis-1.0.2/atraxis/account_admin.py +140 -0
- atraxis-1.0.2/atraxis/account_admin_commands.py +56 -0
- atraxis-1.0.2/atraxis/account_backup.py +128 -0
- atraxis-1.0.2/atraxis/account_commands.py +98 -0
- atraxis-1.0.2/atraxis/account_delegation.py +182 -0
- atraxis-1.0.2/atraxis/account_entities.py +223 -0
- atraxis-1.0.2/atraxis/account_forms.py +23 -0
- atraxis-1.0.2/atraxis/account_json.py +88 -0
- atraxis-1.0.2/atraxis/account_lock.py +24 -0
- atraxis-1.0.2/atraxis/account_schema.py +56 -0
- atraxis-1.0.2/atraxis/account_search.py +68 -0
- atraxis-1.0.2/atraxis/account_search_textual.py +86 -0
- atraxis-1.0.2/atraxis/account_sqlite.py +220 -0
- atraxis-1.0.2/atraxis/account_storage.py +78 -0
- atraxis-1.0.2/atraxis/account_store.py +130 -0
- atraxis-1.0.2/atraxis/account_textual.py +114 -0
- atraxis-1.0.2/atraxis/accounts.py +147 -0
- atraxis-1.0.2/atraxis/administration_cli.py +43 -0
- atraxis-1.0.2/atraxis/cli.py +151 -0
- atraxis-1.0.2/atraxis/client.py +231 -0
- atraxis-1.0.2/atraxis/client_config.py +36 -0
- atraxis-1.0.2/atraxis/collection.py +77 -0
- atraxis-1.0.2/atraxis/config.py +194 -0
- atraxis-1.0.2/atraxis/configuration_admin.py +208 -0
- atraxis-1.0.2/atraxis/configuration_commands.py +43 -0
- atraxis-1.0.2/atraxis/doctor.py +199 -0
- atraxis-1.0.2/atraxis/installation/__init__.py +1 -0
- atraxis-1.0.2/atraxis/installation/deployment.py +208 -0
- atraxis-1.0.2/atraxis/installation/engine.py +86 -0
- atraxis-1.0.2/atraxis/installation/filesystem.py +124 -0
- atraxis-1.0.2/atraxis/installation/host.py +60 -0
- atraxis-1.0.2/atraxis/installation/material.py +26 -0
- atraxis-1.0.2/atraxis/installation/probe.py +128 -0
- atraxis-1.0.2/atraxis/installation/tls.py +50 -0
- atraxis-1.0.2/atraxis/installation/validation.py +224 -0
- atraxis-1.0.2/atraxis/installation/wizard.py +178 -0
- atraxis-1.0.2/atraxis/installation/worker.py +33 -0
- atraxis-1.0.2/atraxis/intervention_search.py +112 -0
- atraxis-1.0.2/atraxis/intervention_search_textual.py +58 -0
- atraxis-1.0.2/atraxis/inventory_access.py +164 -0
- atraxis-1.0.2/atraxis/inventory_admin.py +165 -0
- atraxis-1.0.2/atraxis/inventory_commands.py +41 -0
- atraxis-1.0.2/atraxis/inventory_search.py +119 -0
- atraxis-1.0.2/atraxis/inventory_textual.py +122 -0
- atraxis-1.0.2/atraxis/models.py +85 -0
- atraxis-1.0.2/atraxis/observation_codec.py +184 -0
- atraxis-1.0.2/atraxis/organization_context.py +36 -0
- atraxis-1.0.2/atraxis/parsing.py +264 -0
- atraxis-1.0.2/atraxis/prometheus.py +140 -0
- atraxis-1.0.2/atraxis/prometheus_certlord.py +21 -0
- atraxis-1.0.2/atraxis/prometheus_monit.py +21 -0
- atraxis-1.0.2/atraxis/prometheus_observation.py +254 -0
- atraxis-1.0.2/atraxis/read_request.py +22 -0
- atraxis-1.0.2/atraxis/resource_scopes.py +130 -0
- atraxis-1.0.2/atraxis/retention.py +59 -0
- atraxis-1.0.2/atraxis/rule_commands.py +247 -0
- atraxis-1.0.2/atraxis/rule_files.py +18 -0
- atraxis-1.0.2/atraxis/rule_inputs.py +26 -0
- atraxis-1.0.2/atraxis/rule_observation_config.py +37 -0
- atraxis-1.0.2/atraxis/rule_observation_dispatch.py +34 -0
- atraxis-1.0.2/atraxis/rule_observations.py +134 -0
- atraxis-1.0.2/atraxis/rule_operator.py +160 -0
- atraxis-1.0.2/atraxis/rule_protocol.py +3 -0
- atraxis-1.0.2/atraxis/rule_remote.py +23 -0
- atraxis-1.0.2/atraxis/rule_remote_worker.py +5 -0
- atraxis-1.0.2/atraxis/rule_server.py +162 -0
- atraxis-1.0.2/atraxis/rule_textual.py +305 -0
- atraxis-1.0.2/atraxis/rule_tui.py +153 -0
- atraxis-1.0.2/atraxis/rule_workbench.py +283 -0
- atraxis-1.0.2/atraxis/rules.py +2 -0
- atraxis-1.0.2/atraxis/search_client.py +66 -0
- atraxis-1.0.2/atraxis/search_commands.py +55 -0
- atraxis-1.0.2/atraxis/search_textual.py +107 -0
- atraxis-1.0.2/atraxis/server.py +331 -0
- atraxis-1.0.2/atraxis/service.py +101 -0
- atraxis-1.0.2/atraxis/setup.py +117 -0
- atraxis-1.0.2/atraxis/source_adapters/__init__.py +20 -0
- atraxis-1.0.2/atraxis/source_adapters/certlord.py +16 -0
- atraxis-1.0.2/atraxis/source_adapters/contracts.py +40 -0
- atraxis-1.0.2/atraxis/source_adapters/monit_docker.py +16 -0
- atraxis-1.0.2/atraxis/source_adapters/prometheus.py +24 -0
- atraxis-1.0.2/atraxis/source_adapters/prometheus_certlord.py +41 -0
- atraxis-1.0.2/atraxis/source_adapters/prometheus_monit.py +42 -0
- atraxis-1.0.2/atraxis/source_config.py +181 -0
- atraxis-1.0.2/atraxis/transport.py +119 -0
- atraxis-1.0.2/atraxis/transport_worker.py +143 -0
- atraxis-1.0.2/atraxis/web.py +166 -0
- atraxis-1.0.2/atraxis/web_account_search.py +23 -0
- atraxis-1.0.2/atraxis/web_accounts.py +134 -0
- atraxis-1.0.2/atraxis/web_configuration.py +115 -0
- atraxis-1.0.2/atraxis/web_dispatch.py +171 -0
- atraxis-1.0.2/atraxis/web_intervention_detail.py +180 -0
- atraxis-1.0.2/atraxis/web_intervention_search.py +59 -0
- atraxis-1.0.2/atraxis/web_inventory_admin.py +108 -0
- atraxis-1.0.2/atraxis/web_inventory_search.py +65 -0
- atraxis-1.0.2/atraxis/web_observations.py +100 -0
- atraxis-1.0.2/atraxis/web_organization_context.py +94 -0
- atraxis-1.0.2/atraxis/web_reconciliation.py +146 -0
- atraxis-1.0.2/atraxis/web_rule_activation.py +195 -0
- atraxis-1.0.2/atraxis/web_rule_audit.py +177 -0
- atraxis-1.0.2/atraxis/web_rule_creation.py +142 -0
- atraxis-1.0.2/atraxis/web_rule_editor.py +291 -0
- atraxis-1.0.2/atraxis/web_rule_retirement.py +88 -0
- atraxis-1.0.2/atraxis/web_rules.py +225 -0
- atraxis-1.0.2/atraxis/web_simulation.py +191 -0
- atraxis-1.0.2/atraxis.egg-info/PKG-INFO +507 -0
- atraxis-1.0.2/atraxis.egg-info/SOURCES.txt +480 -0
- atraxis-1.0.2/atraxis.egg-info/dependency_links.txt +1 -0
- atraxis-1.0.2/atraxis.egg-info/entry_points.txt +2 -0
- atraxis-1.0.2/atraxis.egg-info/requires.txt +13 -0
- atraxis-1.0.2/atraxis.egg-info/top_level.txt +1 -0
- atraxis-1.0.2/browser_engine_tests/test_browser_administration.py +498 -0
- atraxis-1.0.2/browser_engine_tests/test_browser_creation.py +172 -0
- atraxis-1.0.2/browser_engine_tests/test_browser_dispatch.py +105 -0
- atraxis-1.0.2/browser_engine_tests/test_browser_engine.py +317 -0
- atraxis-1.0.2/browser_engine_tests/test_browser_interventions.py +172 -0
- atraxis-1.0.2/browser_engine_tests/test_browser_reconciliation.py +102 -0
- atraxis-1.0.2/browser_engine_tests/test_browser_simulation.py +95 -0
- atraxis-1.0.2/client_tests/test_account_operator.py +51 -0
- atraxis-1.0.2/client_tests/test_environment_cli.py +43 -0
- atraxis-1.0.2/client_tests/test_organization_gateway.py +40 -0
- atraxis-1.0.2/client_tests/test_rule_remote_transport.py +198 -0
- atraxis-1.0.2/client_tests/test_rules_application.py +63 -0
- atraxis-1.0.2/client_tests/test_setup_connections.py +33 -0
- atraxis-1.0.2/client_tests/test_web_rule_client.py +140 -0
- atraxis-1.0.2/compose_tests/cold_volume.py +86 -0
- atraxis-1.0.2/compose_tests/inventory_recovery.py +264 -0
- atraxis-1.0.2/compose_tests/operator_access.py +259 -0
- atraxis-1.0.2/compose_tests/recovery_transfer.py +152 -0
- atraxis-1.0.2/compose_tests/test_installation.py +319 -0
- atraxis-1.0.2/compose_tests/uncertain_recovery.py +168 -0
- atraxis-1.0.2/compose_tests/uncertain_target.py +111 -0
- atraxis-1.0.2/compose_tests/worker_profiles.py +204 -0
- atraxis-1.0.2/conf.py +22 -0
- atraxis-1.0.2/container_tests/test_chain.py +841 -0
- atraxis-1.0.2/container_tests/test_load.py +267 -0
- atraxis-1.0.2/correspondence_tests/certlord_support.py +232 -0
- atraxis-1.0.2/correspondence_tests/fixtures/covenant-monit-legacy.yml +269 -0
- atraxis-1.0.2/correspondence_tests/support.py +425 -0
- atraxis-1.0.2/correspondence_tests/test_certlord_correspondence.py +236 -0
- atraxis-1.0.2/correspondence_tests/test_correspondence.py +224 -0
- atraxis-1.0.2/correspondence_tests/test_guarded_correspondence.py +203 -0
- atraxis-1.0.2/deploy/compose/Dockerfile +77 -0
- atraxis-1.0.2/deploy/compose/atraxis.yml.example +8 -0
- atraxis-1.0.2/deploy/compose/compose.source.yml +25 -0
- atraxis-1.0.2/deploy/compose/compose.yml +102 -0
- atraxis-1.0.2/deploy/compose/engine-client.yml.example +5 -0
- atraxis-1.0.2/deploy/compose/engine.nginx.conf +25 -0
- atraxis-1.0.2/deploy/compose/engine.yml.example +14 -0
- atraxis-1.0.2/deploy/compose/images.json +21 -0
- atraxis-1.0.2/deploy/compose/locks/build.txt +11 -0
- atraxis-1.0.2/deploy/compose/locks/debian.sources +13 -0
- atraxis-1.0.2/deploy/compose/locks/engine.txt +674 -0
- atraxis-1.0.2/deploy/compose/locks/record-environment.py +121 -0
- atraxis-1.0.2/deploy/compose/locks/versions.json +83 -0
- atraxis-1.0.2/deploy/compose/locks/web.txt +726 -0
- atraxis-1.0.2/deploy/compose/site.env.example +5 -0
- atraxis-1.0.2/deploy/compose/web-rules.yml.example +6 -0
- atraxis-1.0.2/deploy/compose/web.nginx.conf +25 -0
- atraxis-1.0.2/deploy/docker/Dockerfile +46 -0
- atraxis-1.0.2/deploy/docker/check-image.py +38 -0
- atraxis-1.0.2/deploy/docker/client.txt +1 -0
- atraxis-1.0.2/deploy/docker/compose.yml +24 -0
- atraxis-1.0.2/deploy/docker/release.py +102 -0
- atraxis-1.0.2/deploy/docker/tests/test_release.py +51 -0
- atraxis-1.0.2/docs/README.md +53 -0
- atraxis-1.0.2/docs/accounts.md +493 -0
- atraxis-1.0.2/docs/certlord-correspondence.md +15 -0
- atraxis-1.0.2/docs/cli.md +115 -0
- atraxis-1.0.2/docs/collection-inventory.md +110 -0
- atraxis-1.0.2/docs/contributing.md +323 -0
- atraxis-1.0.2/docs/contributors.rst +27 -0
- atraxis-1.0.2/docs/docker-compose.md +248 -0
- atraxis-1.0.2/docs/docker-image.md +51 -0
- atraxis-1.0.2/docs/docker-publication.md +35 -0
- atraxis-1.0.2/docs/evidence/observation-capacity-2026-10-31.json +990 -0
- atraxis-1.0.2/docs/http-transport.md +90 -0
- atraxis-1.0.2/docs/images/account-search-desktop.png +0 -0
- atraxis-1.0.2/docs/images/account-search-mobile.png +0 -0
- atraxis-1.0.2/docs/images/accounts-textual.png +0 -0
- atraxis-1.0.2/docs/images/accounts-web-review.png +0 -0
- atraxis-1.0.2/docs/images/accounts-web.png +0 -0
- atraxis-1.0.2/docs/images/installation-access.png +0 -0
- atraxis-1.0.2/docs/images/installation-review.png +0 -0
- atraxis-1.0.2/docs/images/intervention-search-desktop.png +0 -0
- atraxis-1.0.2/docs/images/intervention-search-mobile.png +0 -0
- atraxis-1.0.2/docs/images/inventory-admin-desktop.png +0 -0
- atraxis-1.0.2/docs/images/inventory-admin-mobile.png +0 -0
- atraxis-1.0.2/docs/images/inventory-admin-review-desktop.png +0 -0
- atraxis-1.0.2/docs/images/inventory-context-desktop.png +0 -0
- atraxis-1.0.2/docs/images/inventory-context-mobile.png +0 -0
- atraxis-1.0.2/docs/images/inventory-resources-desktop.png +0 -0
- atraxis-1.0.2/docs/images/inventory-resources-mobile.png +0 -0
- atraxis-1.0.2/docs/images/inventory-search-desktop.png +0 -0
- atraxis-1.0.2/docs/images/inventory-search-mobile.png +0 -0
- atraxis-1.0.2/docs/images/textual-account-search.png +0 -0
- atraxis-1.0.2/docs/images/textual-intervention-search.png +0 -0
- atraxis-1.0.2/docs/images/textual-inventory-admin-review.png +0 -0
- atraxis-1.0.2/docs/images/textual-inventory-admin.png +0 -0
- atraxis-1.0.2/docs/images/textual-inventory-search.png +0 -0
- atraxis-1.0.2/docs/images/textual-review.png +0 -0
- atraxis-1.0.2/docs/images/textual-rules.png +0 -0
- atraxis-1.0.2/docs/images/textual-test-bindings.png +0 -0
- atraxis-1.0.2/docs/images/textual-test-queued.png +0 -0
- atraxis-1.0.2/docs/images/textual-test-result.png +0 -0
- atraxis-1.0.2/docs/images/textual-test-review.png +0 -0
- atraxis-1.0.2/docs/images/web-activation-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-activation-mobile.png +0 -0
- atraxis-1.0.2/docs/images/web-audit-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-audit-mobile.png +0 -0
- atraxis-1.0.2/docs/images/web-deactivation-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-deactivation-mobile.png +0 -0
- atraxis-1.0.2/docs/images/web-editor-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-editor-mobile.png +0 -0
- atraxis-1.0.2/docs/images/web-inventory-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-inventory-historical.png +0 -0
- atraxis-1.0.2/docs/images/web-inventory-mobile.png +0 -0
- atraxis-1.0.2/docs/images/web-rollback-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-rollback-mobile.png +0 -0
- atraxis-1.0.2/docs/images/web-rules-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-rules-mobile.png +0 -0
- atraxis-1.0.2/docs/images/web-test-report-desktop.png +0 -0
- atraxis-1.0.2/docs/images/web-test-report-mobile.png +0 -0
- atraxis-1.0.2/docs/installation-core.md +165 -0
- atraxis-1.0.2/docs/inventory-administration.md +170 -0
- atraxis-1.0.2/docs/inventory-search.md +109 -0
- atraxis-1.0.2/docs/local-administration.md +145 -0
- atraxis-1.0.2/docs/observation-capacity.md +129 -0
- atraxis-1.0.2/docs/observations-and-tests.md +82 -0
- atraxis-1.0.2/docs/operator-journey.md +231 -0
- atraxis-1.0.2/docs/prometheus-acceptance.md +61 -0
- atraxis-1.0.2/docs/prometheus-alerting.md +142 -0
- atraxis-1.0.2/docs/prometheus-certlord.md +96 -0
- atraxis-1.0.2/docs/prometheus-monit.md +121 -0
- atraxis-1.0.2/docs/prometheus.md +153 -0
- atraxis-1.0.2/docs/read-only-adapters.md +127 -0
- atraxis-1.0.2/docs/release-candidate.md +34 -0
- atraxis-1.0.2/docs/release-stable.md +39 -0
- atraxis-1.0.2/docs/releases/1.0.0-qualification.json +121 -0
- atraxis-1.0.2/docs/releases/1.0.0.md +46 -0
- atraxis-1.0.2/docs/releases/1.0.0rc1.md +63 -0
- atraxis-1.0.2/docs/releases/1.0.1-integration.json +24 -0
- atraxis-1.0.2/docs/releases/1.0.1-qualification.json +125 -0
- atraxis-1.0.2/docs/releases/1.0.1.md +34 -0
- atraxis-1.0.2/docs/releases/1.0.2-qualification.json +132 -0
- atraxis-1.0.2/docs/releases/1.0.2.md +23 -0
- atraxis-1.0.2/docs/requirements.txt +4 -0
- atraxis-1.0.2/docs/retention.md +59 -0
- atraxis-1.0.2/docs/rule-console.md +222 -0
- atraxis-1.0.2/docs/rule-dispatch.md +195 -0
- atraxis-1.0.2/docs/rule-lifecycle.md +43 -0
- atraxis-1.0.2/docs/rule-remote.md +302 -0
- atraxis-1.0.2/docs/setup.md +269 -0
- atraxis-1.0.2/docs/source-configuration.md +144 -0
- atraxis-1.0.2/docs/source-correspondence.md +71 -0
- atraxis-1.0.2/docs/textual.md +114 -0
- atraxis-1.0.2/docs/v1-candidate.md +87 -0
- atraxis-1.0.2/docs/v1-delivery.md +101 -0
- atraxis-1.0.2/docs/v1.0.md +102 -0
- atraxis-1.0.2/docs/web-configuration.md +91 -0
- atraxis-1.0.2/docs/web-inventory.md +209 -0
- atraxis-1.0.2/docs/web-rules.md +408 -0
- atraxis-1.0.2/docs-core.md +57 -0
- atraxis-1.0.2/docs-runtime.md +101 -0
- atraxis-1.0.2/engine_tests/journey_fixture.py +99 -0
- atraxis-1.0.2/engine_tests/test_https_journey.py +116 -0
- atraxis-1.0.2/engine_tests/test_source_journey.py +157 -0
- atraxis-1.0.2/engine_tests/test_web_engine.py +540 -0
- atraxis-1.0.2/engine_tests/tls_fixture.py +80 -0
- atraxis-1.0.2/examples/atraxis.yml +10 -0
- atraxis-1.0.2/examples/client.yml +6 -0
- atraxis-1.0.2/examples/covenant-certlord.yml +15 -0
- atraxis-1.0.2/examples/covenant-monit.yml +15 -0
- atraxis-1.0.2/examples/rules/atropos-client.yml +7 -0
- atraxis-1.0.2/examples/rules/cpu-cases.json +5 -0
- atraxis-1.0.2/examples/rules/operator.yml +14 -0
- atraxis-1.0.2/examples/rules/remote.yml +6 -0
- atraxis-1.0.2/examples/rules/service.yml +20 -0
- atraxis-1.0.2/index.rst +53 -0
- atraxis-1.0.2/installed_tests/test_package.py +201 -0
- atraxis-1.0.2/integration_tests/test_rule_operator.py +91 -0
- atraxis-1.0.2/integration_tests/test_rule_remote.py +711 -0
- atraxis-1.0.2/integration_tests/test_rules_atropos.py +8 -0
- atraxis-1.0.2/pyproject.toml +24 -0
- atraxis-1.0.2/recovery_tests/test_host_recovery.py +253 -0
- atraxis-1.0.2/scripts/build_architecture.py +112 -0
- atraxis-1.0.2/scripts/capture_textual.py +195 -0
- atraxis-1.0.2/scripts/chain/atraxis.Dockerfile +6 -0
- atraxis-1.0.2/scripts/chain/atraxis.Dockerfile.dockerignore +7 -0
- atraxis-1.0.2/scripts/chain/auton-oidc-deadline.patch +190 -0
- atraxis-1.0.2/scripts/chain/auton.Dockerfile +8 -0
- atraxis-1.0.2/scripts/chain/auton.Dockerfile.dockerignore +5 -0
- atraxis-1.0.2/scripts/chain/engine.Dockerfile +9 -0
- atraxis-1.0.2/scripts/chain/engine.Dockerfile.dockerignore +6 -0
- atraxis-1.0.2/scripts/chain/image-identities.py +138 -0
- atraxis-1.0.2/scripts/chain/image-inputs.json +28 -0
- atraxis-1.0.2/scripts/chain/load.py +248 -0
- atraxis-1.0.2/scripts/chain/node.py +203 -0
- atraxis-1.0.2/scripts/chain/prepare-public-inputs.py +46 -0
- atraxis-1.0.2/scripts/chain/public-inputs.json +12 -0
- atraxis-1.0.2/scripts/chain/recovery.py +103 -0
- atraxis-1.0.2/scripts/chain/verify-installed-candidates.py +54 -0
- atraxis-1.0.2/scripts/check-guided-deployment.py +54 -0
- atraxis-1.0.2/scripts/check-observation-capacity.py +275 -0
- atraxis-1.0.2/scripts/check-source-archive.py +47 -0
- atraxis-1.0.2/scripts/check-test-collection.py +148 -0
- atraxis-1.0.2/scripts/check_configuration_browser.py +74 -0
- atraxis-1.0.2/scripts/check_prometheus_chain.py +149 -0
- atraxis-1.0.2/scripts/check_web_browser.py +543 -0
- atraxis-1.0.2/scripts/docker-acceptance.py +111 -0
- atraxis-1.0.2/scripts/docker-network-acceptance.py +234 -0
- atraxis-1.0.2/scripts/network/Dockerfile +7 -0
- atraxis-1.0.2/scripts/network/fixture.py +178 -0
- atraxis-1.0.2/scripts/prepare-candidate-release.py +50 -0
- atraxis-1.0.2/scripts/prepare-stable-release.py +96 -0
- atraxis-1.0.2/setup.cfg +4 -0
- atraxis-1.0.2/tests/observation_support.py +152 -0
- atraxis-1.0.2/tests/test_account_backup.py +88 -0
- atraxis-1.0.2/tests/test_account_delegation.py +168 -0
- atraxis-1.0.2/tests/test_account_entities.py +178 -0
- atraxis-1.0.2/tests/test_account_search.py +93 -0
- atraxis-1.0.2/tests/test_account_storage.py +248 -0
- atraxis-1.0.2/tests/test_accounts.py +219 -0
- atraxis-1.0.2/tests/test_administration_cli.py +254 -0
- atraxis-1.0.2/tests/test_candidate_release.py +91 -0
- atraxis-1.0.2/tests/test_client.py +167 -0
- atraxis-1.0.2/tests/test_collection.py +226 -0
- atraxis-1.0.2/tests/test_collection_guard.py +29 -0
- atraxis-1.0.2/tests/test_compose_environment.py +68 -0
- atraxis-1.0.2/tests/test_configuration_admin.py +267 -0
- atraxis-1.0.2/tests/test_doctor.py +208 -0
- atraxis-1.0.2/tests/test_guided_deployment.py +79 -0
- atraxis-1.0.2/tests/test_installation.py +472 -0
- atraxis-1.0.2/tests/test_integration_images.py +88 -0
- atraxis-1.0.2/tests/test_intervention_search.py +76 -0
- atraxis-1.0.2/tests/test_inventory_access.py +174 -0
- atraxis-1.0.2/tests/test_inventory_admin.py +209 -0
- atraxis-1.0.2/tests/test_inventory_runtime.py +245 -0
- atraxis-1.0.2/tests/test_inventory_search.py +130 -0
- atraxis-1.0.2/tests/test_load_diagnostics.py +248 -0
- atraxis-1.0.2/tests/test_observations.py +212 -0
- atraxis-1.0.2/tests/test_organization_context.py +97 -0
- atraxis-1.0.2/tests/test_projection_details.py +133 -0
- atraxis-1.0.2/tests/test_prometheus.py +238 -0
- atraxis-1.0.2/tests/test_prometheus_certlord.py +147 -0
- atraxis-1.0.2/tests/test_prometheus_monit.py +134 -0
- atraxis-1.0.2/tests/test_prometheus_observation.py +219 -0
- atraxis-1.0.2/tests/test_recovery_transfer.py +104 -0
- atraxis-1.0.2/tests/test_resource_scopes.py +178 -0
- atraxis-1.0.2/tests/test_retention.py +74 -0
- atraxis-1.0.2/tests/test_rule_observations.py +115 -0
- atraxis-1.0.2/tests/test_rule_terminal.py +103 -0
- atraxis-1.0.2/tests/test_rule_test_workbench.py +126 -0
- atraxis-1.0.2/tests/test_runtime.py +249 -0
- atraxis-1.0.2/tests/test_setup.py +115 -0
- atraxis-1.0.2/tests/test_source_adapters.py +123 -0
- atraxis-1.0.2/tests/test_source_archive.py +93 -0
- atraxis-1.0.2/tests/test_source_config.py +129 -0
- atraxis-1.0.2/tests/test_stable_release.py +175 -0
- atraxis-1.0.2/tests/test_terminal_inventory.py +101 -0
- atraxis-1.0.2/tests/test_transport.py +280 -0
- atraxis-1.0.2/tests/test_uncertain_target.py +62 -0
- atraxis-1.0.2/tests/test_web.py +107 -0
- atraxis-1.0.2/tests/test_web_accounts.py +152 -0
- atraxis-1.0.2/tests/test_web_dispatch.py +183 -0
- atraxis-1.0.2/tests/test_web_intervention_detail.py +141 -0
- atraxis-1.0.2/tests/test_web_reconciliation.py +116 -0
- atraxis-1.0.2/tests/test_web_rule_activation.py +148 -0
- atraxis-1.0.2/tests/test_web_rule_creation.py +130 -0
- atraxis-1.0.2/tests/test_web_rule_editor.py +213 -0
- atraxis-1.0.2/tests/test_web_rule_lifecycle.py +239 -0
- atraxis-1.0.2/tests/test_web_rule_retirement.py +76 -0
- atraxis-1.0.2/tests/test_web_rules.py +241 -0
- atraxis-1.0.2/tests/test_web_simulation.py +138 -0
- atraxis-1.0.2/tests/web_editor_fixture.py +159 -0
- atraxis-1.0.2/tests/web_simulation_fixture.py +25 -0
- atraxis-1.0.2/textual_tests/test_account_search.py +41 -0
- atraxis-1.0.2/textual_tests/test_accounts.py +67 -0
- atraxis-1.0.2/textual_tests/test_install_wizard.py +61 -0
- atraxis-1.0.2/textual_tests/test_intervention_search_ui.py +36 -0
- atraxis-1.0.2/textual_tests/test_inventory.py +80 -0
- atraxis-1.0.2/textual_tests/test_rules.py +168 -0
- atraxis-1.0.2/textual_tests/test_search.py +63 -0
- atraxis-1.0.2/tools/brand/build.py +168 -0
- atraxis-1.0.2/tools/brand/requirements.txt +4 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: native browser engine acceptance
|
|
2
|
+
on: [push, pull_request, workflow_dispatch]
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
jobs:
|
|
6
|
+
browser-engine:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
timeout-minutes: 15
|
|
9
|
+
container:
|
|
10
|
+
image: mcr.microsoft.com/playwright/python:v1.55.0-noble@sha256:640d578aae63cfb632461d1b0aecb01414e4e020864ac3dd45a868dc0eff3078
|
|
11
|
+
options: --init --ipc=host
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
with:
|
|
15
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
16
|
+
persist-credentials: false
|
|
17
|
+
- name: Verify running browser image identity
|
|
18
|
+
env:
|
|
19
|
+
CI_JOB_CONTAINER_ID: ${{ job.container.id }}
|
|
20
|
+
run: python scripts/chain/image-identities.py browser-engine image-evidence/browser-engine.json
|
|
21
|
+
- name: Install native daemon dependency
|
|
22
|
+
timeout-minutes: 3
|
|
23
|
+
run: |
|
|
24
|
+
sed -i 's|http://archive.ubuntu.com|https://archive.ubuntu.com|g; s|http://security.ubuntu.com|https://security.ubuntu.com|g' /etc/apt/sources.list.d/ubuntu.sources
|
|
25
|
+
apt-get -o Acquire::http::Timeout=30 -o Acquire::https::Timeout=30 -o Acquire::Retries=1 update
|
|
26
|
+
apt-get -o Acquire::http::Timeout=30 -o Acquire::https::Timeout=30 -o Acquire::Retries=1 install --yes --no-install-recommends libmagic1t64 python3.12-venv libnss3-tools
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
repository: decryptus/atropos
|
|
30
|
+
ref: 613856430e87cd5abac0ea346d8d60a63b73cc57
|
|
31
|
+
path: .acceptance/engine
|
|
32
|
+
persist-credentials: false
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
with:
|
|
35
|
+
repository: decryptus/auton
|
|
36
|
+
ref: 7f57348b144fa62400bad31160d4b4ad5c00f53c
|
|
37
|
+
path: .auton-source
|
|
38
|
+
persist-credentials: false
|
|
39
|
+
- name: Verify public inputs and prepare the bounded Auton fixture
|
|
40
|
+
run: |
|
|
41
|
+
# The job container and host checkout use different UIDs.
|
|
42
|
+
# Trust only this job's explicit checkout for provenance inspection.
|
|
43
|
+
git config --global --add safe.directory "$GITHUB_WORKSPACE"
|
|
44
|
+
python scripts/chain/prepare-public-inputs.py
|
|
45
|
+
- name: Install independent service environments
|
|
46
|
+
run: |
|
|
47
|
+
python -m venv "$RUNNER_TEMP/browser-web"
|
|
48
|
+
python -m venv "$RUNNER_TEMP/browser-engine"
|
|
49
|
+
python -m venv "$RUNNER_TEMP/browser-auton"
|
|
50
|
+
AUTON_PACKAGE=autond "$RUNNER_TEMP/browser-auton/bin/python" -m pip install .auton-source
|
|
51
|
+
"$RUNNER_TEMP/browser-engine/bin/python" -m pip install '.acceptance/engine[service,redis,auton]' .acceptance/engine/client redislite==6.2.912183
|
|
52
|
+
"$RUNNER_TEMP/browser-web/bin/python" -m pip install . '.acceptance/engine/client[observations]' playwright==1.55.0
|
|
53
|
+
"$RUNNER_TEMP/browser-engine/bin/python" -m pip check
|
|
54
|
+
"$RUNNER_TEMP/browser-web/bin/python" -m pip check
|
|
55
|
+
"$RUNNER_TEMP/browser-auton/bin/python" -m pip check
|
|
56
|
+
- name: Collect every browser acceptance case
|
|
57
|
+
run: '"$RUNNER_TEMP/browser-web/bin/python" scripts/check-test-collection.py --runner unittest browser_engine_tests'
|
|
58
|
+
- name: Execute native forms against actual SQLite engine and Redis delivery
|
|
59
|
+
run: |
|
|
60
|
+
ATROPOS_TEST_PYTHON="$RUNNER_TEMP/browser-engine/bin/python" \
|
|
61
|
+
AUTON_TEST_SOURCE="$GITHUB_WORKSPACE/.auton-source" \
|
|
62
|
+
AUTON_TEST_DAEMON="$RUNNER_TEMP/browser-auton/bin/autond" \
|
|
63
|
+
"$RUNNER_TEMP/browser-web/bin/python" -m unittest discover -s browser_engine_tests -v
|
|
64
|
+
- name: Retain browser image identity
|
|
65
|
+
if: always()
|
|
66
|
+
uses: actions/upload-artifact@v4
|
|
67
|
+
with:
|
|
68
|
+
name: image-identity-browser-engine
|
|
69
|
+
path: image-evidence/browser-engine.json
|
|
70
|
+
retention-days: 14
|
|
71
|
+
if-no-files-found: error
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
name: container chain acceptance
|
|
2
|
+
on: [push, pull_request, workflow_dispatch]
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
jobs:
|
|
6
|
+
chain:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
timeout-minutes: 20
|
|
9
|
+
steps:
|
|
10
|
+
- uses: actions/checkout@v4
|
|
11
|
+
with:
|
|
12
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
13
|
+
persist-credentials: false
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: '3.12'
|
|
17
|
+
- run: python -m pip install cryptography==50.0.2 PyYAML==6.0.3
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
repository: decryptus/atropos
|
|
21
|
+
ref: 613856430e87cd5abac0ea346d8d60a63b73cc57
|
|
22
|
+
path: .acceptance/engine
|
|
23
|
+
persist-credentials: false
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
repository: decryptus/auton
|
|
27
|
+
ref: 7f57348b144fa62400bad31160d4b4ad5c00f53c
|
|
28
|
+
path: .auton-source
|
|
29
|
+
persist-credentials: false
|
|
30
|
+
- name: Verify public inputs and prepare the bounded Auton fixture
|
|
31
|
+
run: python scripts/chain/prepare-public-inputs.py
|
|
32
|
+
- name: Build separate installed service images (no publication)
|
|
33
|
+
run: |
|
|
34
|
+
docker build --tag atraxis-acceptance:ci .
|
|
35
|
+
docker build --tag atraxis-ingress:ci --file scripts/network/Dockerfile .
|
|
36
|
+
docker build --tag atraxis-chain:ci --file scripts/chain/atraxis.Dockerfile .
|
|
37
|
+
docker build --tag atropos-chain:ci --file scripts/chain/engine.Dockerfile .
|
|
38
|
+
docker build --tag auton-chain:ci --file scripts/chain/auton.Dockerfile .
|
|
39
|
+
- name: Verify built image identities and locked base layers
|
|
40
|
+
run: python scripts/chain/image-identities.py chain acceptance-artifacts/image-identities.json
|
|
41
|
+
- name: Verify installed candidates match pinned sources
|
|
42
|
+
run: python scripts/chain/verify-installed-candidates.py
|
|
43
|
+
- name: Collect every container acceptance case
|
|
44
|
+
run: python scripts/check-test-collection.py --runner unittest container_tests
|
|
45
|
+
- name: Run complete HTTPS chain with disposable effects and failure injection
|
|
46
|
+
env:
|
|
47
|
+
AUTON_TEST_SOURCE: ${{ github.workspace }}/.auton-source
|
|
48
|
+
shell: bash
|
|
49
|
+
run: python -m unittest discover -s container_tests -v 2>&1 | tee acceptance-artifacts/short-chain.log
|
|
50
|
+
- name: Preserve synthetic provenance and short-chain evidence
|
|
51
|
+
if: always()
|
|
52
|
+
uses: actions/upload-artifact@v4
|
|
53
|
+
with:
|
|
54
|
+
name: chain-evidence
|
|
55
|
+
path: acceptance-artifacts/*
|
|
56
|
+
retention-days: 7
|
|
57
|
+
if-no-files-found: error
|
|
58
|
+
compose:
|
|
59
|
+
runs-on: ubuntu-latest
|
|
60
|
+
timeout-minutes: 15
|
|
61
|
+
steps:
|
|
62
|
+
- uses: actions/checkout@v4
|
|
63
|
+
- uses: actions/setup-python@v5
|
|
64
|
+
with:
|
|
65
|
+
python-version: '3.12'
|
|
66
|
+
- run: python -m pip install cryptography==50.0.2 PyYAML==6.0.3
|
|
67
|
+
- uses: actions/checkout@v4
|
|
68
|
+
with:
|
|
69
|
+
repository: decryptus/atropos
|
|
70
|
+
ref: 613856430e87cd5abac0ea346d8d60a63b73cc57
|
|
71
|
+
path: .acceptance/engine
|
|
72
|
+
persist-credentials: false
|
|
73
|
+
- uses: actions/checkout@v4
|
|
74
|
+
with:
|
|
75
|
+
repository: decryptus/auton
|
|
76
|
+
ref: 7f57348b144fa62400bad31160d4b4ad5c00f53c
|
|
77
|
+
path: .auton-source
|
|
78
|
+
persist-credentials: false
|
|
79
|
+
- name: Verify public inputs and prepare the bounded Auton fixture
|
|
80
|
+
run: python scripts/chain/prepare-public-inputs.py
|
|
81
|
+
- name: Collect operator Compose acceptance
|
|
82
|
+
run: python scripts/check-test-collection.py --runner unittest compose_tests
|
|
83
|
+
- name: Build and verify operator Compose with disposable pinned inputs
|
|
84
|
+
# Root prepares test-owned UID 10001 files on this disposable runner only.
|
|
85
|
+
# All four long-running Compose services retain their non-root protections.
|
|
86
|
+
run: sudo "$(command -v python)" -m unittest discover -s compose_tests -v
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
name: Docker Hub image
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, release/dockerhub]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
publish:
|
|
9
|
+
description: Publish the tested stable image to Docker Hub
|
|
10
|
+
type: boolean
|
|
11
|
+
default: false
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
concurrency:
|
|
15
|
+
group: dockerhub-atraxis
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
jobs:
|
|
18
|
+
image:
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
timeout-minutes: 20
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
25
|
+
fetch-depth: 0
|
|
26
|
+
persist-credentials: false
|
|
27
|
+
- uses: actions/setup-python@v5
|
|
28
|
+
with:
|
|
29
|
+
python-version: '3.12'
|
|
30
|
+
- name: Check publication guards
|
|
31
|
+
run: |
|
|
32
|
+
python scripts/check-test-collection.py --runner unittest deploy/docker/tests
|
|
33
|
+
python -m unittest discover -s deploy/docker/tests -v
|
|
34
|
+
- name: Read package identity
|
|
35
|
+
id: identity
|
|
36
|
+
run: |
|
|
37
|
+
python - <<'PY'
|
|
38
|
+
import os, tomllib
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
version = tomllib.loads(Path('pyproject.toml').read_text())['project']['version']
|
|
41
|
+
with open(os.environ['GITHUB_OUTPUT'], 'a') as output:
|
|
42
|
+
print('version=' + version, file=output)
|
|
43
|
+
PY
|
|
44
|
+
- uses: docker/setup-buildx-action@v4
|
|
45
|
+
- name: Build the Linux amd64 image
|
|
46
|
+
uses: docker/build-push-action@v7
|
|
47
|
+
with:
|
|
48
|
+
context: .
|
|
49
|
+
file: deploy/docker/Dockerfile
|
|
50
|
+
platforms: linux/amd64
|
|
51
|
+
load: true
|
|
52
|
+
tags: atraxis:test
|
|
53
|
+
build-args: |
|
|
54
|
+
VERSION=${{ steps.identity.outputs.version }}
|
|
55
|
+
REVISION=${{ github.event.pull_request.head.sha || github.sha }}
|
|
56
|
+
cache-from: type=gha,scope=atraxis
|
|
57
|
+
cache-to: type=gha,mode=max,scope=atraxis
|
|
58
|
+
- name: Test the installed image and durable state
|
|
59
|
+
run: python deploy/docker/check-image.py
|
|
60
|
+
- name: Record tested image identity
|
|
61
|
+
run: |
|
|
62
|
+
mkdir -p image-evidence
|
|
63
|
+
docker image inspect atraxis:test > image-evidence/image.json
|
|
64
|
+
docker run --rm --network none --read-only --entrypoint cat atraxis:test /usr/local/share/atraxis/environment.json > image-evidence/environment.json
|
|
65
|
+
- uses: actions/upload-artifact@v4
|
|
66
|
+
with:
|
|
67
|
+
name: docker-image-evidence
|
|
68
|
+
path: image-evidence/
|
|
69
|
+
retention-days: 14
|
|
70
|
+
- name: Check Docker Hub credential availability
|
|
71
|
+
if: (github.event_name == 'workflow_dispatch' && inputs.publish && github.ref == 'refs/heads/main') || (github.event_name == 'push' && github.ref == 'refs/heads/release/dockerhub')
|
|
72
|
+
env:
|
|
73
|
+
TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
74
|
+
run: test -n "$TOKEN" || { echo 'Configure DOCKERHUB_TOKEN for this repository.'; exit 1; }
|
|
75
|
+
- name: Log in to Docker Hub
|
|
76
|
+
if: (github.event_name == 'workflow_dispatch' && inputs.publish && github.ref == 'refs/heads/main') || (github.event_name == 'push' && github.ref == 'refs/heads/release/dockerhub')
|
|
77
|
+
uses: docker/login-action@v4
|
|
78
|
+
with:
|
|
79
|
+
username: decryptus
|
|
80
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
81
|
+
- name: Publish the exact tested image
|
|
82
|
+
if: (github.event_name == 'workflow_dispatch' && inputs.publish && github.ref == 'refs/heads/main') || (github.event_name == 'push' && github.ref == 'refs/heads/release/dockerhub')
|
|
83
|
+
run: python deploy/docker/release.py atraxis --image atraxis:test
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: two-hour container endurance
|
|
2
|
+
on:
|
|
3
|
+
workflow_dispatch:
|
|
4
|
+
push:
|
|
5
|
+
branches: [qualification/endurance]
|
|
6
|
+
permissions:
|
|
7
|
+
contents: read
|
|
8
|
+
jobs:
|
|
9
|
+
endurance:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
timeout-minutes: 165
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- uses: actions/setup-python@v5
|
|
15
|
+
with:
|
|
16
|
+
python-version: '3.12'
|
|
17
|
+
- run: python -m pip install cryptography==50.0.2 PyYAML==6.0.3
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
repository: decryptus/atropos
|
|
21
|
+
ref: 613856430e87cd5abac0ea346d8d60a63b73cc57
|
|
22
|
+
path: .acceptance/engine
|
|
23
|
+
persist-credentials: false
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
with:
|
|
26
|
+
repository: decryptus/auton
|
|
27
|
+
ref: 7f57348b144fa62400bad31160d4b4ad5c00f53c
|
|
28
|
+
path: .auton-source
|
|
29
|
+
persist-credentials: false
|
|
30
|
+
- name: Verify public inputs and prepare the bounded Auton fixture
|
|
31
|
+
run: python scripts/chain/prepare-public-inputs.py
|
|
32
|
+
- name: Build separate installed service images (no publication)
|
|
33
|
+
run: |
|
|
34
|
+
docker build --tag atraxis-acceptance:ci .
|
|
35
|
+
docker build --tag atraxis-ingress:ci --file scripts/network/Dockerfile .
|
|
36
|
+
docker build --tag atraxis-chain:ci --file scripts/chain/atraxis.Dockerfile .
|
|
37
|
+
docker build --tag atropos-chain:ci --file scripts/chain/engine.Dockerfile .
|
|
38
|
+
docker build --tag auton-chain:ci --file scripts/chain/auton.Dockerfile .
|
|
39
|
+
- name: Verify installed candidates match pinned sources
|
|
40
|
+
run: python scripts/chain/verify-installed-candidates.py
|
|
41
|
+
- name: Collect every container acceptance case
|
|
42
|
+
run: python scripts/check-test-collection.py --runner unittest container_tests
|
|
43
|
+
- name: Run complete HTTPS chain with disposable effects and failure injection
|
|
44
|
+
env:
|
|
45
|
+
AUTON_TEST_SOURCE: ${{ github.workspace }}/.auton-source
|
|
46
|
+
shell: bash
|
|
47
|
+
run: python -m unittest discover -s container_tests -v 2>&1 | tee acceptance-artifacts/short-chain.log
|
|
48
|
+
- name: Run two-hour saturation and recovery after the complete short gate
|
|
49
|
+
timeout-minutes: 145
|
|
50
|
+
env:
|
|
51
|
+
AUTON_TEST_SOURCE: ${{ github.workspace }}/.auton-source
|
|
52
|
+
CHAIN_ENDURANCE_SECONDS: '7200'
|
|
53
|
+
shell: bash
|
|
54
|
+
run: python -m unittest discover -s container_tests -p test_load.py -v 2>&1 | tee acceptance-artifacts/endurance.log
|
|
55
|
+
- name: Preserve synthetic progress including failed runs
|
|
56
|
+
if: always()
|
|
57
|
+
uses: actions/upload-artifact@v4
|
|
58
|
+
with:
|
|
59
|
+
name: endurance-progress
|
|
60
|
+
path: acceptance-artifacts/*
|
|
61
|
+
retention-days: 7
|
|
62
|
+
if-no-files-found: warn
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name: Guided inventory deployment
|
|
2
|
+
on: [push, pull_request]
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
jobs:
|
|
6
|
+
qualify:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
timeout-minutes: 12
|
|
9
|
+
strategy:
|
|
10
|
+
fail-fast: false
|
|
11
|
+
matrix:
|
|
12
|
+
mode: [systemd, compose]
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: actions/setup-python@v5
|
|
16
|
+
with:
|
|
17
|
+
python-version: '3.12'
|
|
18
|
+
- run: python -m pip install '.[installer,textual]'
|
|
19
|
+
- if: matrix.mode == 'systemd'
|
|
20
|
+
run: |
|
|
21
|
+
sudo loginctl enable-linger "$(id -un)"
|
|
22
|
+
sudo systemctl start "user@$(id -u).service"
|
|
23
|
+
echo "XDG_RUNTIME_DIR=/run/user/$(id -u)" >> "$GITHUB_ENV"
|
|
24
|
+
- run: python scripts/check-guided-deployment.py "${{ matrix.mode }}"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
name: four-hour memory qualification
|
|
2
|
+
on:
|
|
3
|
+
workflow_dispatch:
|
|
4
|
+
permissions:
|
|
5
|
+
contents: read
|
|
6
|
+
jobs:
|
|
7
|
+
endurance:
|
|
8
|
+
runs-on: ubuntu-latest
|
|
9
|
+
timeout-minutes: 300
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
- uses: actions/setup-python@v5
|
|
13
|
+
with:
|
|
14
|
+
python-version: '3.12'
|
|
15
|
+
- run: python -m pip install cryptography==50.0.2 PyYAML==6.0.3
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
repository: decryptus/atropos
|
|
19
|
+
ref: 613856430e87cd5abac0ea346d8d60a63b73cc57
|
|
20
|
+
path: .acceptance/engine
|
|
21
|
+
persist-credentials: false
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
repository: decryptus/auton
|
|
25
|
+
ref: 7f57348b144fa62400bad31160d4b4ad5c00f53c
|
|
26
|
+
path: .auton-source
|
|
27
|
+
persist-credentials: false
|
|
28
|
+
- name: Verify public inputs and prepare the bounded Auton fixture
|
|
29
|
+
run: python scripts/chain/prepare-public-inputs.py
|
|
30
|
+
- name: Build separate installed service images (no publication)
|
|
31
|
+
run: |
|
|
32
|
+
docker build --tag atraxis-acceptance:ci .
|
|
33
|
+
docker build --tag atraxis-ingress:ci --file scripts/network/Dockerfile .
|
|
34
|
+
docker build --tag atraxis-chain:ci --file scripts/chain/atraxis.Dockerfile .
|
|
35
|
+
docker build --tag atropos-chain:ci --file scripts/chain/engine.Dockerfile .
|
|
36
|
+
docker build --tag auton-chain:ci --file scripts/chain/auton.Dockerfile .
|
|
37
|
+
- name: Verify installed candidates match pinned sources
|
|
38
|
+
run: python scripts/chain/verify-installed-candidates.py
|
|
39
|
+
- name: Collect every container acceptance case
|
|
40
|
+
run: python scripts/check-test-collection.py --runner unittest container_tests
|
|
41
|
+
- name: Run complete HTTPS chain with disposable effects and failure injection
|
|
42
|
+
env:
|
|
43
|
+
AUTON_TEST_SOURCE: ${{ github.workspace }}/.auton-source
|
|
44
|
+
shell: bash
|
|
45
|
+
run: python -m unittest discover -s container_tests -v 2>&1 | tee acceptance-artifacts/short-chain.log
|
|
46
|
+
- name: Run four-hour saturation, quiescence and recovery after the complete short gate
|
|
47
|
+
timeout-minutes: 280
|
|
48
|
+
env:
|
|
49
|
+
AUTON_TEST_SOURCE: ${{ github.workspace }}/.auton-source
|
|
50
|
+
CHAIN_ENDURANCE_SECONDS: '14400'
|
|
51
|
+
shell: bash
|
|
52
|
+
run: python -m unittest discover -s container_tests -p test_load.py -v 2>&1 | tee acceptance-artifacts/endurance.log
|
|
53
|
+
- name: Preserve synthetic progress including failed runs
|
|
54
|
+
if: always()
|
|
55
|
+
uses: actions/upload-artifact@v4
|
|
56
|
+
with:
|
|
57
|
+
name: memory-progress
|
|
58
|
+
path: acceptance-artifacts/*
|
|
59
|
+
retention-days: 7
|
|
60
|
+
if-no-files-found: warn
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
name: operator Compose acceptance
|
|
2
|
+
on: [push, pull_request, workflow_dispatch]
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
jobs:
|
|
6
|
+
compose:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
timeout-minutes: 20
|
|
9
|
+
outputs:
|
|
10
|
+
transfer_sha256: ${{ steps.transfer.outputs.sha256 }}
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
with:
|
|
14
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
15
|
+
persist-credentials: false
|
|
16
|
+
- uses: actions/setup-python@v5
|
|
17
|
+
with:
|
|
18
|
+
python-version: '3.12'
|
|
19
|
+
- run: python -m pip install cryptography==50.0.2 PyYAML==6.0.3
|
|
20
|
+
- uses: actions/checkout@v4
|
|
21
|
+
with:
|
|
22
|
+
repository: decryptus/atropos
|
|
23
|
+
ref: 613856430e87cd5abac0ea346d8d60a63b73cc57
|
|
24
|
+
path: .acceptance/engine
|
|
25
|
+
persist-credentials: false
|
|
26
|
+
- uses: actions/checkout@v4
|
|
27
|
+
with:
|
|
28
|
+
repository: decryptus/auton
|
|
29
|
+
ref: 7f57348b144fa62400bad31160d4b4ad5c00f53c
|
|
30
|
+
path: .auton-source
|
|
31
|
+
persist-credentials: false
|
|
32
|
+
- name: Verify public inputs and prepare the bounded Auton fixture
|
|
33
|
+
run: python scripts/chain/prepare-public-inputs.py
|
|
34
|
+
- name: Collect operator Compose acceptance
|
|
35
|
+
run: python scripts/check-test-collection.py --runner unittest compose_tests
|
|
36
|
+
- name: Build and verify worker profiles, recreation and cold restoration
|
|
37
|
+
shell: bash
|
|
38
|
+
run: sudo env ATRAXIS_EXPORT_RECOVERY=1 "$(command -v python)" -m unittest discover -s compose_tests -v 2>&1 | tee acceptance-artifacts/compose.log
|
|
39
|
+
- name: Verify installed packages match both source candidates
|
|
40
|
+
run: |
|
|
41
|
+
python - <<'PY'
|
|
42
|
+
import hashlib
|
|
43
|
+
import json
|
|
44
|
+
from pathlib import Path
|
|
45
|
+
import subprocess
|
|
46
|
+
source = Path('.acceptance/engine')
|
|
47
|
+
expected = {str(p.relative_to(source)): hashlib.sha256(p.read_bytes()).hexdigest()
|
|
48
|
+
for p in sorted((source / 'atropos').rglob('*.py'))}
|
|
49
|
+
expected.update({str(p.relative_to(source / 'client')): hashlib.sha256(p.read_bytes()).hexdigest()
|
|
50
|
+
for p in sorted((source / 'client/atropos_client').rglob('*.py'))})
|
|
51
|
+
web_files = {str(p): hashlib.sha256(p.read_bytes()).hexdigest()
|
|
52
|
+
for p in sorted(Path('atraxis').rglob('*.py'))}
|
|
53
|
+
web_files.update({name: digest for name, digest in expected.items() if name.startswith('atropos_client/')})
|
|
54
|
+
verifier = '''import hashlib, importlib.util, json
|
|
55
|
+
from importlib.metadata import version
|
|
56
|
+
from pathlib import Path
|
|
57
|
+
project, release = json.loads(%r)
|
|
58
|
+
assert version(project) == release
|
|
59
|
+
assert version('sonicprobe') == '0.3.62'
|
|
60
|
+
assert version('atropos-client') == '1.0.0'
|
|
61
|
+
if project == 'atraxis-atropos':
|
|
62
|
+
from atropos import __version__ as engine_version
|
|
63
|
+
assert engine_version == release, 'engine_runtime_version_mismatch'
|
|
64
|
+
for name, digest in json.loads(%r).items():
|
|
65
|
+
package, relative = name.split('/', 1)
|
|
66
|
+
spec = importlib.util.find_spec(package)
|
|
67
|
+
path = Path(spec.origin).parent / relative
|
|
68
|
+
assert str(path).startswith('/usr/local/lib/python3.12/site-packages/')
|
|
69
|
+
assert hashlib.sha256(path.read_bytes()).hexdigest() == digest, name
|
|
70
|
+
print('Installed package bytes verified:', project)
|
|
71
|
+
'''
|
|
72
|
+
images = {}
|
|
73
|
+
for image, project, release, files in (
|
|
74
|
+
('atraxis-install-engine:local', 'atraxis-atropos', '1.0.0', expected),
|
|
75
|
+
('atraxis-install-web:local', 'atraxis', '1.0.2', web_files)):
|
|
76
|
+
subprocess.run(['docker', 'run', '--rm', '-i', '--network', 'none', '--read-only',
|
|
77
|
+
'--cap-drop', 'ALL', '--security-opt', 'no-new-privileges', '--memory', '512m',
|
|
78
|
+
'--cpus', '2', '--pids-limit', '128', '--entrypoint', 'python', image, '-'],
|
|
79
|
+
input=verifier % (json.dumps([project, release]), json.dumps(files)),
|
|
80
|
+
text=True, check=True, timeout=60)
|
|
81
|
+
images[image] = dict(files=files, image=subprocess.check_output(
|
|
82
|
+
['docker', 'image', 'inspect', '--format', '{{.Id}}', image], text=True).strip())
|
|
83
|
+
Path('acceptance-artifacts/installed-packages.json').write_text(json.dumps(images, indent=2) + '\n')
|
|
84
|
+
PY
|
|
85
|
+
- name: Retain the locked Python and native environments
|
|
86
|
+
run: |
|
|
87
|
+
python - <<'PY'
|
|
88
|
+
import json
|
|
89
|
+
from pathlib import Path
|
|
90
|
+
import subprocess
|
|
91
|
+
specification = json.loads(Path('deploy/compose/locks/versions.json').read_text())
|
|
92
|
+
environments = {}
|
|
93
|
+
for profile in ('web', 'engine', 'proxy'):
|
|
94
|
+
image = 'atraxis-install-' + profile + ':local'
|
|
95
|
+
output = subprocess.check_output(['docker', 'run', '--rm', '--network', 'none',
|
|
96
|
+
'--read-only', '--cap-drop', 'ALL', '--security-opt', 'no-new-privileges',
|
|
97
|
+
'--memory', '128m', '--cpus', '1', '--pids-limit', '32', '--entrypoint', 'cat',
|
|
98
|
+
image, '/usr/local/share/atraxis/environment.json'], timeout=30)
|
|
99
|
+
assert len(output) <= 1024 * 1024
|
|
100
|
+
environment = json.loads(output)
|
|
101
|
+
assert environment['profile'] == profile
|
|
102
|
+
assert environment['base_image'] == specification['base_image']
|
|
103
|
+
assert environment['python'] == specification['python']
|
|
104
|
+
environments[profile] = dict(environment=environment, image_id=subprocess.check_output(
|
|
105
|
+
['docker', 'image', 'inspect', '--format', '{{.Id}}', image],
|
|
106
|
+
text=True, timeout=30).strip())
|
|
107
|
+
Path('acceptance-artifacts/locked-environments.json').write_text(
|
|
108
|
+
json.dumps(environments, indent=2) + '\n')
|
|
109
|
+
PY
|
|
110
|
+
- name: Bind transferred images and manifest to the verified source job
|
|
111
|
+
id: transfer
|
|
112
|
+
run: |
|
|
113
|
+
python - <<'PY'
|
|
114
|
+
import json, os, sys
|
|
115
|
+
sys.path.insert(0, 'compose_tests')
|
|
116
|
+
from recovery_transfer import TRANSFER, MANIFEST, MAX_MANIFEST_BYTES, confirm_images, digest
|
|
117
|
+
confirm_images(json.loads((TRANSFER / MANIFEST).read_text()))
|
|
118
|
+
with open(os.environ['GITHUB_OUTPUT'], 'a') as output:
|
|
119
|
+
output.write('sha256=' + digest(TRANSFER / MANIFEST, MAX_MANIFEST_BYTES) + '\n')
|
|
120
|
+
PY
|
|
121
|
+
- name: Transfer disposable recovery fixture to a separate runner
|
|
122
|
+
uses: actions/upload-artifact@v4
|
|
123
|
+
with:
|
|
124
|
+
name: operator-recovery-transfer-${{ github.run_id }}-${{ github.run_attempt }}
|
|
125
|
+
path: acceptance-transfer/*
|
|
126
|
+
retention-days: 1
|
|
127
|
+
compression-level: 1
|
|
128
|
+
if-no-files-found: error
|
|
129
|
+
- name: Retain synthetic acceptance evidence
|
|
130
|
+
if: always()
|
|
131
|
+
uses: actions/upload-artifact@v4
|
|
132
|
+
with:
|
|
133
|
+
name: operator-compose-evidence
|
|
134
|
+
path: acceptance-artifacts/*
|
|
135
|
+
retention-days: 30
|
|
136
|
+
if-no-files-found: error
|
|
137
|
+
recover:
|
|
138
|
+
needs: compose
|
|
139
|
+
runs-on: ubuntu-latest
|
|
140
|
+
timeout-minutes: 10
|
|
141
|
+
steps:
|
|
142
|
+
- uses: actions/checkout@v4
|
|
143
|
+
with:
|
|
144
|
+
ref: ${{ github.event.pull_request.head.sha || github.sha }}
|
|
145
|
+
persist-credentials: false
|
|
146
|
+
- uses: actions/setup-python@v5
|
|
147
|
+
with:
|
|
148
|
+
python-version: '3.12'
|
|
149
|
+
- run: python -m pip install PyYAML==6.0.3
|
|
150
|
+
- uses: actions/download-artifact@v4
|
|
151
|
+
with:
|
|
152
|
+
name: operator-recovery-transfer-${{ github.run_id }}-${{ github.run_attempt }}
|
|
153
|
+
path: acceptance-transfer
|
|
154
|
+
- name: Collect separate-host recovery acceptance
|
|
155
|
+
run: python scripts/check-test-collection.py --runner unittest recovery_tests
|
|
156
|
+
- name: Restore verified archives on a fresh host without rebuilding
|
|
157
|
+
shell: bash
|
|
158
|
+
env:
|
|
159
|
+
TRANSFER_SHA256: ${{ needs.compose.outputs.transfer_sha256 }}
|
|
160
|
+
run: |
|
|
161
|
+
mkdir -p acceptance-artifacts
|
|
162
|
+
sudo env ATRAXIS_TRANSFER_SHA256="$TRANSFER_SHA256" "$(command -v python)" -m unittest discover -s recovery_tests -v 2>&1 | tee acceptance-artifacts/recovery.log
|
|
163
|
+
- name: Retain recovery results without fixture credentials or keys
|
|
164
|
+
if: always()
|
|
165
|
+
uses: actions/upload-artifact@v4
|
|
166
|
+
with:
|
|
167
|
+
name: operator-host-recovery-evidence
|
|
168
|
+
path: acceptance-artifacts/*
|
|
169
|
+
retention-days: 30
|
|
170
|
+
if-no-files-found: error
|