argus-alm 0.15.10__tar.gz → 0.15.12__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.
- argus_alm-0.15.12/.github/workflows/call_jira_sync.yml +42 -0
- argus_alm-0.15.12/.github/workflows/close_issue_for_scylla_employee.yml +62 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/test.yml +1 -1
- {argus_alm-0.15.10 → argus_alm-0.15.12}/PKG-INFO +6 -2
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/_version.py +3 -3
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/sct/client.py +37 -1
- argus_alm-0.15.12/argusAI/README.md +149 -0
- argus_alm-0.15.12/argusAI/event_similarity_processor_v2.py +237 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/utils/event_message_sanitizer.py +2 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/PKG-INFO +6 -2
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/SOURCES.txt +12 -2
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/requires.txt +6 -1
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_backend.py +19 -1
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_web.example.yaml +6 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-config/scylla.yaml +1 -0
- argus_alm-0.15.12/dev-db/docker-compose.yaml +42 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/UserManager.svelte +5 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Github/GithubIssue.svelte +15 -11
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Jira/JiraIssue.svelte +31 -26
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/Login.svelte +18 -1
- argus_alm-0.15.12/frontend/TestRun/MiscConfig.svelte +15 -0
- argus_alm-0.15.12/frontend/TestRun/RuntimeConfig.svelte +126 -0
- argus_alm-0.15.12/frontend/TestRun/SCT/SctConfig.svelte +79 -0
- argus_alm-0.15.12/frontend/TestRun/SCT/SctEvent.svelte +390 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCT/SctEvents.svelte +5 -3
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCT/SctNemesis.svelte +5 -3
- argus_alm-0.15.12/frontend/TestRun/SCT/SctSetup.svelte +64 -0
- argus_alm-0.15.12/frontend/TestRun/SCT/SctSimilarEvents.svelte +289 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/TestRun.svelte +32 -1
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/login.js +1 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pyproject.toml +6 -1
- argus_alm-0.15.12/scripts/migration/migration_2026-01-20-1.py +29 -0
- argus_alm-0.15.12/scripts/migration/migration_2026-01-20.py +106 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/auth/login.html.j2 +1 -0
- argus_alm-0.15.12/templates/auth/user_switch.html.j2 +39 -0
- argus_alm-0.15.12/templates/create_user.html.j2 +61 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/partials/nav_bar.html.j2 +10 -1
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile.html.j2 +23 -4
- argus_alm-0.15.12/uv.lock +3043 -0
- argus_alm-0.15.10/argusAI/README.md +0 -5
- argus_alm-0.15.10/argusAI/pyproject.toml +0 -11
- argus_alm-0.15.10/argusAI/uv.lock +0 -1636
- argus_alm-0.15.10/dev-db/docker-compose.yaml +0 -19
- argus_alm-0.15.10/frontend/TestRun/SCT/SctEvent.svelte +0 -209
- argus_alm-0.15.10/uv.lock +0 -1402
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.dockerignore +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.envrc +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.eslintrc.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/.gitkeep +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/lint.yml +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.github/workflows/release.yml +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.gitignore +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.pre-commit-config.yaml +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/.prettierrc.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/AGENTS.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/Dockerfile +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/LICENSE +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/MANIFEST.in +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/README.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/__init__.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/__init__.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/base.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/driver_matrix_tests/cli.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/driver_matrix_tests/client.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/generic/cli.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/generic/client.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/generic_result.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/sct/types.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/client/sirenada/client.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/__init__.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/email.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/enums.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/sct_types.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus/common/sirenada_types.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus.yaml +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/deployment/argusai_event_similarity_processor.service +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/event_similarity_processor.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/logs/.gitignore +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/utils/__init__.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argusAI/utils/scylla_connection.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/dependency_links.txt +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/entry_points.txt +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/argus_alm.egg-info/top_level.txt +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/commitlint.config.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/.gitignore +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-config/cassandra-rackdc.properties +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-config/machine_image_configured +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/alpha-data/.gitignore +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/export_data.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/dev-db/import_data.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docker/config/nginx-docker.conf +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docker/config/supervisord.conf +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docker-entrypoint.sh +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/api_usage.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/argus_status_page.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/argus_status_page_diagram.jpg +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/config/argus.nginx.conf +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/config/argus.service +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/dev-setup.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/generic_results.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/docs/pypi-guide.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/AdminPanel.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/AdminPanelWelcome.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/BatchTestMover.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/GroupCreator.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseCreator.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseDeletionConfirmationPopup.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseEditor.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseManager.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseManagerGroup.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ReleaseManagerTest.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/TestCreator.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewListItem.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewSelectItem.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewWidget.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/AdminPanel/ViewsManager.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Alert.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Alerts/AlertMessage.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Alerts/AlertWidget.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ApiUtils.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ArgusNotification.ts +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/AssigneeSelector.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/AssigneeUtils.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/DateUtils.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/DriverMatrixTypes.ts +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/IssueDestinations.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/JenkinsSettingsHelp.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ModalWindow.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/PluginDispatch.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/PluginNames.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/RunUtils.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/SelectUtils.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/StateManagement.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/TestStatus.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/TextUtils.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/UserTypes.ts +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/UserUtils.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Common/ViewTypes.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Debug/FlashDebugComponent.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/Comment.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/CommentEditor.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/MarkedMentionExtension.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/MentionSelector.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Discussion/UserProfile.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Github/Issues.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Github/IssuesCopyModal.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/JobsList.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/Notification.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationCommentWrapper.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationCounter.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationSender.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationTestRunWrapper.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/NotificationsReader.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/PlannedJob.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/PlannedJobs.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileJob.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileJobs.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileJobsTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ProfileSchedules.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/User.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/UserSelection.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Profile/ViewUserResolver.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/AssigneeFilter.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/FlatViewHelper.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/GroupedViewHelper.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/ReleaseActivity.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/ReleaseDashboard.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/ReleaseGithubIssues.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboard.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboardFlatView.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboardGroup.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestDashboardTest.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestPopoutSelector.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleaseDashboard/TestWithIssuesCard.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/CommentTableRow.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/DutyPlanner.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/EntityReplacer.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlan.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanCopyForm.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanCreator.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanEditor.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanTable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlanner.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleasePlannerGridView.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ReleaseScheduler.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/Schedule.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/ScheduleTable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/ReleasePlanner/SearchBar.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/ChartStats.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/NumberStats.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/ProgressBarStats.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/ReleaseStats.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stats/StatsFetcher.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/AlertStore.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/AssigneeSubscriber.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/SingleTestRunSubscriber.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/TestRunsSubscriber.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/UserlistSubscriber.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Stores/WorkspaceStore.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamCreateForm.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamDetail.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamList.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamManager.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamMember.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamShort.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Teams/TeamUtils.ts +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ActivityTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ArtifactRow.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ArtifactTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/Cell.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/Filters.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/GraphFilters.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/ResultTable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Components/ScreenshotModal.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixBreakdown.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixRunInfo.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixTestCollection.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixTestRun.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/DriverMatrixTestSuites.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/EventsTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Generic/GenericTestRun.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Generic/GenericTestRunInfo.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Generic/Subtest.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/HeartbeatIndicator.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/IssueTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/IssueTemplate.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/Build.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/BuildConfirmationDialog.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/BuildStartPlaceholder.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/BuildSuccessPlaceholder.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CheckParam.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CloneCreatePlaceholder.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CloneSuccess.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/CloneTargetSelector.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/DummyCheckParam.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/DummySelectParam.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/JenkinsBuildModal.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/JenkinsCloneModal.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/LoadTargetsPlaceholder.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/ModalError.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/ParamFetchPlaceholder.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/ParameterEditor.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/SCTParameterWizard.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/SelectParam.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/StringParam.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/TextParam.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Jenkins/WizardUnavailable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/NemesisData.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/NemesisReason.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/NemesisTable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/PackagesInfo.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/DtestTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/PytestItem.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/PytestRun.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/PytestTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/index.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Pytest/types.ts +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RawEvent.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResourcesInfo.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResultsGraph.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResultsGraphs.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/ResultsTab.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RunAssigneeSelector.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RunInvestigationStatusButton.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/RunStatusButton.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Gemini/GeminiTabBodyComponent.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Gemini/GeminiTabComponent.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Performance/PerformanceTabBodyComponent.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Performance/PerformanceTabComponent.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/SCTSubTests/Subtest.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Screenshots.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaIssueTemplate.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaRunInfo.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaTestBreakdown.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/Sirenada/SirenadaTestRun.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/StructuredEvent.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/TestRunComments.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/TestRunInfo.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/jUnitChart.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/TestRun/jUnitResults.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Utils/IntersectionObserver.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/ViewDashboard.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/ViewSelect.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/CheckValue.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/IntegerValue.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/MultiSelectValue.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/MultiStringValue.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/WidgetSettingTypes/StringValue.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/GraphsWidget/GraphsWidget.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestCalendarSelector.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestCollapseHelper.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestFlatHelper.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestOverviewWidget.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestResultRow.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/PytestTableWidget.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/PytestWidget/ViewPytestOverview.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/SummaryWidget/RunIssues.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/SummaryWidget/SummaryWidget.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGithubIssues.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/AssigneeCell.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/Filters.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/Interfaces.ts +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/InvestigationStatusCell.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/IssuesCell.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/NemesisTable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/PaginatedTable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/StackTracePreview.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/StatusBadge.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/StatusCell.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats/TestRunTable.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewGraphedStats.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/ActionItem.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/Comment.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/HighlightItem.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewHighlights/ViewHighlights.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewNemesisStats.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewReleaseStats.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewTestDashboard.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/Views/Widgets/ViewUnsupportedPlaceholder.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/AssigneeList.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/JobConfigureModal.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/RunGroup.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/RunRelease.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/Test.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunDispatcher.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRuns.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunsMessage.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunsPanel.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/TestRunsSelector.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/UnknownTest.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/WorkArea/WorkArea.svelte +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/admin-panel.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/argus.css +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/argus.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/duty-planner.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/flashDebug.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/font-awesome.css +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/font-awesome.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-Bold.ttf +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-BoldItalic.ttf +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-Italic.ttf +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/NotoSans-Regular.ttf +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/OFL.txt +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/fonts/noto.css +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/markdownOptions.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/notification-counter.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/plan.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/profile-jobs.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/profile-notifications.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/profile-schedules.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-dashboard.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-page.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-planner.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/release-scheduler.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/run-by-plugin.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/teams.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/test-run-details.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/test-runs-breakout.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/test-runs-standalone.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/view-dashboard.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/view-user-resolver.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/frontend/work-area.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/package.json +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/profile/.gitkeep +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/public/argus.png +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/public/no-user-picture.png +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/.envrc +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/LICENSE +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/MANIFEST.in +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/README.md +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/noxfile.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/pyproject.toml +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/pytest-argus-reporter/pytest_argus_reporter.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/rollup.config.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/run_with_profiler.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/index.html +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/js/status.js +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/static/app.css +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/static/argus.png +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/static/scylla.png +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/argus-status-page/status.json +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/migration/migration_2023-04-07.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/migration/migration_2024-04-14.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/scripts/migration/migration_2025-07-18.py +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/setup.cfg +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/start_argus.sh +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/storage/profile_pictures/.gitignore +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/admin/base.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/admin/index.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/auth/register.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/base.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/dashboard.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/duty_planner.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/base.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/css/styles.css +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/cloud.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/custom_html.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/custom_table.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/events.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/generic_results.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/header.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/logs.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/main.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/nemesis.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/packages.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/screenshots.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/email/partials/unsupported.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/error.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/flash_debug.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/groups.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/home.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/assigned.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/assigned_email.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/email_mention.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/mention.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_action_item_assigned.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_action_item_assigned_email.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_highlight_mention.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/notifications/view_highlight_mention_email.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/plan_dashboard.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile_jobs.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile_notifications.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/profile_schedules.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/release_dashboard.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/release_planner.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/release_schedule.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/releases.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/run_view_by_plugin.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/runs.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/standalone_test_with_runs.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/teams.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/test_run.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/test_runs.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/tests.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/view_dashboard.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/templates/views.html.j2 +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/tsconfig.json +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/uwsgi.ini +0 -0
- {argus_alm-0.15.10 → argus_alm-0.15.12}/yarn.lock +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
name: Sync Jira Based on PR Events
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request_target:
|
|
5
|
+
types:
|
|
6
|
+
[opened, ready_for_review, review_requested, labeled, unlabeled, closed]
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
pull-requests: write
|
|
11
|
+
issues: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
jira-sync-pr-opened:
|
|
15
|
+
if: github.event.action == 'opened'
|
|
16
|
+
uses: scylladb/github-automation/.github/workflows/main_jira_sync_pr_opened.yml@main
|
|
17
|
+
secrets:
|
|
18
|
+
caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
|
|
19
|
+
|
|
20
|
+
jira-sync-in-review:
|
|
21
|
+
if: github.event.action == 'ready_for_review' || github.event.action == 'review_requested'
|
|
22
|
+
uses: scylladb/github-automation/.github/workflows/main_jira_sync_in_review.yml@main
|
|
23
|
+
secrets:
|
|
24
|
+
caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
|
|
25
|
+
|
|
26
|
+
jira-sync-add-label:
|
|
27
|
+
if: github.event.action == 'labeled'
|
|
28
|
+
uses: scylladb/github-automation/.github/workflows/main_jira_sync_add_label.yml@main
|
|
29
|
+
secrets:
|
|
30
|
+
caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
|
|
31
|
+
|
|
32
|
+
jira-status-remove-label:
|
|
33
|
+
if: github.event.action == 'unlabeled'
|
|
34
|
+
uses: scylladb/github-automation/.github/workflows/main_jira_sync_remove_label.yml@main
|
|
35
|
+
secrets:
|
|
36
|
+
caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
|
|
37
|
+
|
|
38
|
+
jira-status-pr-closed:
|
|
39
|
+
if: github.event.action == 'closed'
|
|
40
|
+
uses: scylladb/github-automation/.github/workflows/main_jira_sync_pr_closed.yml@main
|
|
41
|
+
secrets:
|
|
42
|
+
caller_jira_auth: ${{ secrets.USER_AND_KEY_FOR_JIRA_AUTOMATION }}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: Close issues created by Scylla employees
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issues:
|
|
5
|
+
types: [opened, reopened]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
issues: write
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
comment-and-close:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- name: Comment and close if author email is scylladb.com
|
|
16
|
+
uses: actions/github-script@v7
|
|
17
|
+
with:
|
|
18
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
19
|
+
script: |
|
|
20
|
+
const issue = context.payload.issue;
|
|
21
|
+
const actor = context.actor;
|
|
22
|
+
|
|
23
|
+
// Get user data (only public email is available)
|
|
24
|
+
const { data: user } = await github.rest.users.getByUsername({
|
|
25
|
+
username: actor,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
const email = user.email || "";
|
|
29
|
+
console.log(`Actor: ${actor}, public email: ${email || "<none>"}`);
|
|
30
|
+
|
|
31
|
+
// Only continue if email exists and ends with @scylladb.com
|
|
32
|
+
if (!email || !email.toLowerCase().endsWith("@scylladb.com")) {
|
|
33
|
+
console.log("User is not a scylladb.com email (or email not public); skipping.");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const owner = context.repo.owner;
|
|
38
|
+
const repo = context.repo.repo;
|
|
39
|
+
const issue_number = issue.number;
|
|
40
|
+
|
|
41
|
+
const body = "Issues in this repository are closed automatically. Scylla employees should use Jira to manage issues.\nPlease move this issue to Jira https://scylladb.atlassian.net/jira/software/c/projects/ARGUS/list";
|
|
42
|
+
|
|
43
|
+
// Add the comment
|
|
44
|
+
await github.rest.issues.createComment({
|
|
45
|
+
owner,
|
|
46
|
+
repo,
|
|
47
|
+
issue_number,
|
|
48
|
+
body,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
console.log(`Comment added to #${issue_number}`);
|
|
52
|
+
|
|
53
|
+
// Close the issue
|
|
54
|
+
await github.rest.issues.update({
|
|
55
|
+
owner,
|
|
56
|
+
repo,
|
|
57
|
+
issue_number,
|
|
58
|
+
state: "closed",
|
|
59
|
+
state_reason: "not_planned"
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
console.log(`Issue #${issue_number} closed.`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: argus-alm
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.12
|
|
4
4
|
Summary: Argus
|
|
5
5
|
Author-email: Alexey Kartashov <alexey.kartashov@scylladb.com>, Łukasz Sójka <lukasz.sojka@scylladb.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -11,13 +11,15 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
Requires-Dist: requests>=2.26.0
|
|
13
13
|
Requires-Dist: click>=8.1.3
|
|
14
|
+
Requires-Dist: lz4>=4.4.4
|
|
14
15
|
Provides-Extra: web-backend
|
|
15
16
|
Requires-Dist: PyYAML~=6.0.0; extra == "web-backend"
|
|
16
|
-
Requires-Dist: scylla-driver>=3.
|
|
17
|
+
Requires-Dist: scylla-driver>=3.29.4; extra == "web-backend"
|
|
17
18
|
Requires-Dist: Flask~=3.0.0; extra == "web-backend"
|
|
18
19
|
Requires-Dist: Flask-WTF~=1.0.0; extra == "web-backend"
|
|
19
20
|
Requires-Dist: Flask-Login~=0.5.0; extra == "web-backend"
|
|
20
21
|
Requires-Dist: humanize~=3.13.1; extra == "web-backend"
|
|
22
|
+
Requires-Dist: PyJWT[crypto]>=2.10.0; extra == "web-backend"
|
|
21
23
|
Requires-Dist: python-magic~=0.4.24; extra == "web-backend"
|
|
22
24
|
Requires-Dist: uwsgi~=2.0.20; extra == "web-backend"
|
|
23
25
|
Requires-Dist: python-jenkins>=1.7.0; extra == "web-backend"
|
|
@@ -43,6 +45,8 @@ Requires-Dist: nox~=2025.5.1; extra == "dev"
|
|
|
43
45
|
Requires-Dist: pytest-xdist~=3.7.0; extra == "dev"
|
|
44
46
|
Requires-Dist: pytest-subtests~=0.14.1; extra == "dev"
|
|
45
47
|
Requires-Dist: boto3-stubs~=1.38.9; extra == "dev"
|
|
48
|
+
Provides-Extra: ai
|
|
49
|
+
Requires-Dist: chromadb>=1.0.15; extra == "ai"
|
|
46
50
|
Dynamic: license-file
|
|
47
51
|
|
|
48
52
|
# Argus
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '0.15.
|
|
32
|
-
__version_tuple__ = version_tuple = (0, 15,
|
|
31
|
+
__version__ = version = '0.15.12'
|
|
32
|
+
__version_tuple__ = version_tuple = (0, 15, 12)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g11df55d0a'
|
|
@@ -28,7 +28,9 @@ class ArgusSCTClient(ArgusClient):
|
|
|
28
28
|
SUBMIT_EVENTS = "/sct/$id/events/submit"
|
|
29
29
|
SUBMIT_EVENT = "/sct/$id/event/submit"
|
|
30
30
|
SUBMIT_JUNIT_REPORT = "/sct/$id/junit/submit"
|
|
31
|
+
SUBMIT_STRESS_CMD = "/sct/$id//stress_cmd/submit"
|
|
31
32
|
SUBMIT_EMAIL = "/testrun/report/email"
|
|
33
|
+
SUBMIT_CONFIG = "/$id/config/submit"
|
|
32
34
|
|
|
33
35
|
def __init__(self, run_id: UUID, auth_token: str, base_url: str, api_version="v1", extra_headers: dict | None = None,
|
|
34
36
|
timeout: int = 60, max_retries: int = 3) -> None:
|
|
@@ -126,6 +128,22 @@ class ArgusSCTClient(ArgusClient):
|
|
|
126
128
|
)
|
|
127
129
|
self.check_response(response)
|
|
128
130
|
|
|
131
|
+
def add_stress_command(self, command: str, log_name: str, loader_name: str) -> None:
|
|
132
|
+
"""
|
|
133
|
+
Submits stress command information to be viewed inside Argus.
|
|
134
|
+
"""
|
|
135
|
+
response = self.post(
|
|
136
|
+
endpoint=self.Routes.SUBMIT_STRESS_CMD,
|
|
137
|
+
location_params={"id": str(self.run_id)},
|
|
138
|
+
body={
|
|
139
|
+
**self.generic_body,
|
|
140
|
+
"cmd": command,
|
|
141
|
+
"log_name": log_name,
|
|
142
|
+
"loader_name": loader_name,
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
self.check_response(response)
|
|
146
|
+
|
|
129
147
|
def submit_screenshots(self, screenshot_links: list[str]) -> None:
|
|
130
148
|
"""
|
|
131
149
|
Submits links to the screenshots from grafana, taken at the end of the test.
|
|
@@ -260,7 +278,8 @@ class ArgusSCTClient(ArgusClient):
|
|
|
260
278
|
self.check_response(response)
|
|
261
279
|
|
|
262
280
|
def submit_nemesis(self, name: str, class_name: str, start_time: int,
|
|
263
|
-
target_name: str, target_ip: str, target_shards: int
|
|
281
|
+
target_name: str, target_ip: str, target_shards: int,
|
|
282
|
+
description: str | None = None) -> None:
|
|
264
283
|
"""
|
|
265
284
|
Submits a nemesis record. Should then be finalized by
|
|
266
285
|
.finalize_nemesis method on nemesis completion.
|
|
@@ -277,6 +296,7 @@ class ArgusSCTClient(ArgusClient):
|
|
|
277
296
|
"node_name": target_name,
|
|
278
297
|
"node_ip": target_ip,
|
|
279
298
|
"node_shards": target_shards,
|
|
299
|
+
"description": description,
|
|
280
300
|
}
|
|
281
301
|
}
|
|
282
302
|
)
|
|
@@ -334,3 +354,19 @@ class ArgusSCTClient(ArgusClient):
|
|
|
334
354
|
"content": str(base64.encodebytes(bytes(raw_content, encoding="utf-8")), encoding="utf-8")
|
|
335
355
|
}
|
|
336
356
|
)
|
|
357
|
+
self.check_response(response)
|
|
358
|
+
|
|
359
|
+
def sct_submit_config(self, name: str, content: str) -> None:
|
|
360
|
+
"""
|
|
361
|
+
Submit a config file.
|
|
362
|
+
"""
|
|
363
|
+
response = self.post(
|
|
364
|
+
endpoint=self.Routes.SUBMIT_CONFIG,
|
|
365
|
+
location_params={"id": str(self.run_id)},
|
|
366
|
+
body={
|
|
367
|
+
**self.generic_body,
|
|
368
|
+
"name": name,
|
|
369
|
+
"content": str(base64.encodebytes(bytes(content, encoding="utf-8")), encoding="utf-8")
|
|
370
|
+
}
|
|
371
|
+
)
|
|
372
|
+
self.check_response(response)
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Event Similarity Processor V2
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This directory contains the Event Similarity Processor V2 — the new system that generates and stores embeddings for SCT events. It supersedes the legacy `event_similarity_processor.py` that worked with the deprecated `sct_run` table, but for now both systems are allowed to run in parallel (see "Co‑existence with V1").
|
|
6
|
+
|
|
7
|
+
## Architecture
|
|
8
|
+
|
|
9
|
+
The processor follows a clean, decoupled flow:
|
|
10
|
+
|
|
11
|
+
1. Event creation → SCT events are submitted via `SCTService.submit_event()`
|
|
12
|
+
2. Queue → ERROR and CRITICAL events are added to `sct_unprocessed_events`
|
|
13
|
+
3. Processing loop → `event_similarity_processor_v2.py` continuously reads from the queue
|
|
14
|
+
4. Embedding generation → Message is sanitized, then embedded via the BGE‑Small‑EN model
|
|
15
|
+
5. Storage → Embeddings are written into severity‑specific tables
|
|
16
|
+
6. Cleanup → Processed events are removed from the queue
|
|
17
|
+
|
|
18
|
+
## Database Tables
|
|
19
|
+
|
|
20
|
+
### sct_unprocessed_events
|
|
21
|
+
Tracks events that need embedding generation:
|
|
22
|
+
- `run_id` (UUID, partition key)
|
|
23
|
+
- `severity` (text, clustering key)
|
|
24
|
+
- `ts` (timestamp, clustering key)
|
|
25
|
+
|
|
26
|
+
### sct_error_event_embedding
|
|
27
|
+
Stores ERROR event embeddings (separate table for performance):
|
|
28
|
+
- `run_id` (UUID, partition key)
|
|
29
|
+
- `ts` (timestamp, clustering key)
|
|
30
|
+
- `embedding` (list<float>)
|
|
31
|
+
|
|
32
|
+
### sct_critical_event_embedding
|
|
33
|
+
Stores CRITICAL event embeddings (separate table for performance):
|
|
34
|
+
- `run_id` (UUID, partition key)
|
|
35
|
+
- `ts` (timestamp, clustering key)
|
|
36
|
+
- `embedding` (list<float>)
|
|
37
|
+
|
|
38
|
+
Note: Using separate tables for ERROR and CRITICAL events keeps similarity searches scoped to a single severity class and improves query performance by avoiding mixed‑severity comparisons.
|
|
39
|
+
|
|
40
|
+
## Running the Processor
|
|
41
|
+
|
|
42
|
+
### Standalone
|
|
43
|
+
```bash
|
|
44
|
+
cd argusAI
|
|
45
|
+
PYTHONPATH=.. uv run event_similarity_processor_v2.py
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### As a Service
|
|
49
|
+
The processor runs in an infinite loop and every ~1s:
|
|
50
|
+
- Reads up to 100 unprocessed events per batch
|
|
51
|
+
- Routes embeddings to the table matching the event severity
|
|
52
|
+
- Handles errors gracefully (logs and continues)
|
|
53
|
+
- Can be stopped with Ctrl+C
|
|
54
|
+
|
|
55
|
+
## Key Features
|
|
56
|
+
|
|
57
|
+
### Severity‑specific storage
|
|
58
|
+
- ERROR → `sct_error_event_embedding`
|
|
59
|
+
- CRITICAL → `sct_critical_event_embedding`
|
|
60
|
+
- Faster similarity searches within the same severity
|
|
61
|
+
|
|
62
|
+
### Message sanitization
|
|
63
|
+
Uses `MessageSanitizer` from `argusAI/utils/event_message_sanitizer.py` to:
|
|
64
|
+
- Remove IPs, URLs, file paths
|
|
65
|
+
- Normalize timestamps and memory addresses
|
|
66
|
+
- Clean up stack traces and backtraces
|
|
67
|
+
- Remove redundant/noisy details
|
|
68
|
+
|
|
69
|
+
### Embedding model
|
|
70
|
+
`BgeSmallEnEmbeddingModel` (BGE‑Small‑EN‑v1.5):
|
|
71
|
+
- 384‑dimensional embeddings
|
|
72
|
+
- Optimized for semantic similarity search
|
|
73
|
+
- Same model family used by the legacy processor for consistency
|
|
74
|
+
|
|
75
|
+
### Error handling
|
|
76
|
+
- Event not found → logged and skipped
|
|
77
|
+
- Empty message → logged and skipped
|
|
78
|
+
- Sanitization failure → logged and removed from queue
|
|
79
|
+
- Embedding failure → logged and removed from queue
|
|
80
|
+
- Failures are removed from the queue to avoid infinite retries
|
|
81
|
+
|
|
82
|
+
## Testing
|
|
83
|
+
|
|
84
|
+
### Unit tests
|
|
85
|
+
```bash
|
|
86
|
+
PYTHONPATH=. uv run pytest argusAI
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Covers initialization, single/batch processing, error handling, and shutdown behavior.
|
|
90
|
+
|
|
91
|
+
### Integration tests
|
|
92
|
+
```bash
|
|
93
|
+
uv run pytest argus/backend/tests/sct_events/test_event_embedding_integration.py -v
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Covers the end‑to‑end flow from event creation to storage, proper routing to severity tables, verifying that non‑ERROR/CRITICAL events don’t create queue entries, multi‑event processing, and error recovery.
|
|
97
|
+
|
|
98
|
+
## Monitoring & Metrics
|
|
99
|
+
|
|
100
|
+
Logging:
|
|
101
|
+
- INFO: processing cycles, batch counts, startup/shutdown, table routing
|
|
102
|
+
- DEBUG: per‑event processing, chosen table names
|
|
103
|
+
- WARNING: missing events, empty messages
|
|
104
|
+
- ERROR: processing/database failures
|
|
105
|
+
|
|
106
|
+
Metrics:
|
|
107
|
+
- `processed_count`: total successfully processed events
|
|
108
|
+
- `error_count`: total errors encountered
|
|
109
|
+
|
|
110
|
+
## Differences from V1
|
|
111
|
+
|
|
112
|
+
Improvements in V2:
|
|
113
|
+
1. Cleaner architecture: no Vector DB dependency for processing
|
|
114
|
+
2. Better error handling: failures don’t block processing
|
|
115
|
+
3. Simpler flow: queue → process → store
|
|
116
|
+
4. Severity‑specific tables for similarity performance
|
|
117
|
+
5. Comprehensive unit and integration tests
|
|
118
|
+
|
|
119
|
+
What’s not included in V2:
|
|
120
|
+
- Similarity search (removed from the processor itself)
|
|
121
|
+
- ChromaDB collections (not required for embedding storage)
|
|
122
|
+
- Historical event backfill (processes only new events)
|
|
123
|
+
|
|
124
|
+
## Performance Benefits
|
|
125
|
+
|
|
126
|
+
By separating ERROR and CRITICAL embeddings:
|
|
127
|
+
- Faster similarity searches (smaller, severity‑scoped sets)
|
|
128
|
+
- Better data locality
|
|
129
|
+
- Reduced query complexity (no severity filters inside similarity search)
|
|
130
|
+
- Improved scalability (per‑table tuning)
|
|
131
|
+
|
|
132
|
+
## Configuration
|
|
133
|
+
|
|
134
|
+
No dedicated config file is required for the processor itself. It uses the standard Argus configuration for database connectivity (e.g., ScyllaDB settings from your environment or YAML config such as `argus.yaml`/`argus.local.yaml`, depending on your deployment). The embedding model is auto‑downloaded to `~/.cache/chroma/onnx_models/`.
|
|
135
|
+
|
|
136
|
+
## Co‑existence with V1 (temporary)
|
|
137
|
+
|
|
138
|
+
- For now, both V1 (`event_similarity_processor.py`) and V2 (`event_similarity_processor_v2.py`) may run in parallel.
|
|
139
|
+
- There is no data migration at this time; V1 will be disabled once the team fully moves to V2.
|
|
140
|
+
- If you still need to run V1 locally for comparison or fallback:
|
|
141
|
+
```bash
|
|
142
|
+
cd argusAI
|
|
143
|
+
PYTHONPATH=.. uv run event_similarity_processor.py
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Notes
|
|
147
|
+
|
|
148
|
+
- Avoid mixing severities in similarity queries; use the dedicated tables for the best performance.
|
|
149
|
+
- If you encounter repeated failures for the same event, verify the event content after sanitization and check connectivity to the database and model files.
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Event Similarity Processor V2
|
|
3
|
+
|
|
4
|
+
This module processes SCT events by:
|
|
5
|
+
1. Reading unprocessed events from SCTUnprocessedEvent table
|
|
6
|
+
2. Sanitizing event messages
|
|
7
|
+
3. Generating embeddings using BGE-Small-EN model
|
|
8
|
+
4. Storing embeddings in separate tables (sct_error_event_embedding or sct_critical_event_embedding)
|
|
9
|
+
5. Removing processed events from unprocessed queue
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import logging
|
|
13
|
+
import time
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from threading import Event
|
|
16
|
+
from uuid import UUID
|
|
17
|
+
from datetime import datetime
|
|
18
|
+
|
|
19
|
+
from chromadb.utils.embedding_functions.onnx_mini_lm_l6_v2 import ONNXMiniLM_L6_V2
|
|
20
|
+
|
|
21
|
+
from argus.backend.models.argus_ai import SCTCriticalEventEmbedding, SCTErrorEventEmbedding
|
|
22
|
+
from argus.backend.plugins.sct.testrun import SCTUnprocessedEvent, SCTEvent
|
|
23
|
+
from argus.backend.util.logsetup import setup_application_logging
|
|
24
|
+
from argusAI.utils.scylla_connection import ScyllaConnection
|
|
25
|
+
from argusAI.utils.event_message_sanitizer import MessageSanitizer
|
|
26
|
+
|
|
27
|
+
LOGGER = logging.getLogger(__name__)
|
|
28
|
+
SLEEP_INTERVAL = 1 # Sleep for 1 second between processing cycles
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class BgeSmallEnEmbeddingModel(ONNXMiniLM_L6_V2):
|
|
32
|
+
"""
|
|
33
|
+
Compact English text embedding model by BAAI, released Sep 2023.
|
|
34
|
+
Trained on large-scale paired data with RetroMAE and contrastive learning.
|
|
35
|
+
Produces high-quality 384-dim embeddings, optimized for efficiency in semantic search, classification, and clustering.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
MODEL_NAME: str = "bge-small-en-v1.5"
|
|
39
|
+
DOWNLOAD_PATH: Path = Path.home() / ".cache" / "chroma" / "onnx_models" / MODEL_NAME
|
|
40
|
+
EXTRACTED_FOLDER_NAME: str = "onnx"
|
|
41
|
+
ARCHIVE_FILENAME: str = "onnx.tar.gz"
|
|
42
|
+
MODEL_DOWNLOAD_URL: str = (
|
|
43
|
+
"https://scylla-qa-public.s3.us-east-1.amazonaws.com/ArgusAI/bge-small-en-v1.5/onnx.tar.gz"
|
|
44
|
+
)
|
|
45
|
+
_MODEL_SHA256: str = "e7d1743b0c08f55c687cff6af696683398682f9ab4fb3cad1be644ee5553a72d"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
class EventSimilarityProcessorV2:
|
|
49
|
+
"""
|
|
50
|
+
Processes unprocessed SCT events by generating embeddings and storing them in severity-specific tables.
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def __init__(self, stop_event: Event | None = None) -> None:
|
|
54
|
+
"""
|
|
55
|
+
Initialize the processor with embedding model and sanitizer.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
stop_event: Optional threading.Event to signal shutdown
|
|
59
|
+
"""
|
|
60
|
+
self.embedding_model = BgeSmallEnEmbeddingModel()
|
|
61
|
+
self.sanitizer = MessageSanitizer()
|
|
62
|
+
self.stop_event = stop_event or Event()
|
|
63
|
+
self.db = ScyllaConnection()
|
|
64
|
+
self.processed_count = 0
|
|
65
|
+
self.error_count = 0
|
|
66
|
+
LOGGER.info("EventSimilarityProcessorV2 initialized")
|
|
67
|
+
|
|
68
|
+
def process_unprocessed_events(self) -> None:
|
|
69
|
+
"""
|
|
70
|
+
Main processing loop that continuously reads and processes unprocessed events.
|
|
71
|
+
"""
|
|
72
|
+
LOGGER.info("Starting event processing loop")
|
|
73
|
+
|
|
74
|
+
while not self.stop_event.is_set():
|
|
75
|
+
try:
|
|
76
|
+
batch_processed = self._process_batch()
|
|
77
|
+
if batch_processed == 0:
|
|
78
|
+
# No events to process, sleep before next iteration
|
|
79
|
+
time.sleep(SLEEP_INTERVAL)
|
|
80
|
+
else:
|
|
81
|
+
LOGGER.info(f"Processed {batch_processed} events in this batch")
|
|
82
|
+
except Exception as e:
|
|
83
|
+
LOGGER.error(f"Error in processing loop: {e}", exc_info=True)
|
|
84
|
+
self.error_count += 1
|
|
85
|
+
time.sleep(SLEEP_INTERVAL)
|
|
86
|
+
|
|
87
|
+
LOGGER.info(f"Processing loop stopped. Total processed: {self.processed_count}, Errors: {self.error_count}")
|
|
88
|
+
|
|
89
|
+
def _process_batch(self, batch_size: int = 100) -> int:
|
|
90
|
+
"""
|
|
91
|
+
Process a batch of unprocessed events.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
batch_size: Maximum number of events to process in one batch
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
Number of events processed in this batch
|
|
98
|
+
"""
|
|
99
|
+
# Fetch unprocessed events using raw query
|
|
100
|
+
query = f"SELECT run_id, severity, ts FROM {SCTUnprocessedEvent.__table_name__} LIMIT {batch_size}"
|
|
101
|
+
try:
|
|
102
|
+
rows = self.db.execute(query)
|
|
103
|
+
unprocessed_events = list(rows)
|
|
104
|
+
except Exception as e:
|
|
105
|
+
LOGGER.error(f"Failed to fetch unprocessed events: {e}", exc_info=True)
|
|
106
|
+
return 0
|
|
107
|
+
|
|
108
|
+
if not unprocessed_events:
|
|
109
|
+
return 0
|
|
110
|
+
|
|
111
|
+
processed_in_batch = 0
|
|
112
|
+
|
|
113
|
+
for event_row in unprocessed_events:
|
|
114
|
+
try:
|
|
115
|
+
self._process_single_event(run_id=event_row.run_id, severity=event_row.severity, ts=event_row.ts)
|
|
116
|
+
processed_in_batch += 1
|
|
117
|
+
self.processed_count += 1
|
|
118
|
+
except Exception as e:
|
|
119
|
+
LOGGER.error(
|
|
120
|
+
f"Failed to process event (run_id={event_row.run_id}, "
|
|
121
|
+
f"severity={event_row.severity}, ts={event_row.ts}): {e}",
|
|
122
|
+
exc_info=True,
|
|
123
|
+
)
|
|
124
|
+
self.error_count += 1
|
|
125
|
+
# Still delete the unprocessed event to avoid infinite retries
|
|
126
|
+
delete_query = (
|
|
127
|
+
f"DELETE FROM {SCTUnprocessedEvent.__table_name__} WHERE run_id = ? AND severity = ? AND ts = ?"
|
|
128
|
+
)
|
|
129
|
+
self.db.execute(delete_query, (event_row.run_id, event_row.severity, event_row.ts))
|
|
130
|
+
|
|
131
|
+
return processed_in_batch
|
|
132
|
+
|
|
133
|
+
def _process_single_event(self, run_id: UUID, severity: str, ts: datetime) -> None:
|
|
134
|
+
"""
|
|
135
|
+
Process a single event: read, sanitize, embed, store, and cleanup.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
run_id: Test run UUID
|
|
139
|
+
severity: Event severity (ERROR or CRITICAL)
|
|
140
|
+
ts: Event timestamp
|
|
141
|
+
|
|
142
|
+
Raises:
|
|
143
|
+
Exception: If event not found or embedding generation fails
|
|
144
|
+
"""
|
|
145
|
+
LOGGER.debug(f"Processing event: run_id={run_id}, severity={severity}, ts={ts}")
|
|
146
|
+
|
|
147
|
+
# Step 1: Read event message from SCTEvent table
|
|
148
|
+
try:
|
|
149
|
+
query = f"SELECT message FROM {SCTEvent.__table_name__} WHERE run_id = ? AND severity = ? AND ts = ?"
|
|
150
|
+
result = self.db.execute(query, (run_id, severity, ts))
|
|
151
|
+
event = result.one()
|
|
152
|
+
if not event:
|
|
153
|
+
raise ValueError("Event not found")
|
|
154
|
+
except Exception:
|
|
155
|
+
LOGGER.warning(f"Event not found in SCTEvent table: run_id={run_id}, severity={severity}, ts={ts}")
|
|
156
|
+
raise
|
|
157
|
+
|
|
158
|
+
message = event.message
|
|
159
|
+
if not message:
|
|
160
|
+
LOGGER.warning(f"Event has no message: run_id={run_id}, severity={severity}, ts={ts}")
|
|
161
|
+
raise ValueError("Event message is empty")
|
|
162
|
+
|
|
163
|
+
# Step 2: Sanitize event message
|
|
164
|
+
try:
|
|
165
|
+
sanitized_message = self.sanitizer.sanitize(run_id, message)
|
|
166
|
+
except Exception as e:
|
|
167
|
+
LOGGER.error(f"Failed to sanitize message for event (run_id={run_id}): {e}", exc_info=True)
|
|
168
|
+
raise
|
|
169
|
+
|
|
170
|
+
if not sanitized_message or not sanitized_message.strip():
|
|
171
|
+
LOGGER.warning(f"Sanitized message is empty for event: run_id={run_id}, severity={severity}, ts={ts}")
|
|
172
|
+
raise ValueError("Sanitized message is empty")
|
|
173
|
+
|
|
174
|
+
# Step 3: Generate embedding
|
|
175
|
+
try:
|
|
176
|
+
embeddings = self.embedding_model([sanitized_message])
|
|
177
|
+
if not embeddings or len(embeddings) == 0:
|
|
178
|
+
raise ValueError("Embedding generation returned empty result")
|
|
179
|
+
embedding = embeddings[0]
|
|
180
|
+
except Exception as e:
|
|
181
|
+
LOGGER.error(f"Failed to generate embedding for event (run_id={run_id}): {e}", exc_info=True)
|
|
182
|
+
raise
|
|
183
|
+
|
|
184
|
+
# Step 4: Store embedding in severity-specific table
|
|
185
|
+
try:
|
|
186
|
+
if severity == "ERROR":
|
|
187
|
+
table_name = SCTErrorEventEmbedding.__table_name__
|
|
188
|
+
elif severity == "CRITICAL":
|
|
189
|
+
table_name = SCTCriticalEventEmbedding.__table_name__
|
|
190
|
+
else:
|
|
191
|
+
raise ValueError(f"Unsupported severity: {severity}")
|
|
192
|
+
|
|
193
|
+
insert_query = f"INSERT INTO {table_name} (run_id, ts, embedding) VALUES (?, ?, ?)"
|
|
194
|
+
self.db.execute(insert_query, (run_id, ts, embedding))
|
|
195
|
+
LOGGER.debug(f"Stored embedding in {table_name} for event: run_id={run_id}, ts={ts}")
|
|
196
|
+
except Exception as e:
|
|
197
|
+
LOGGER.error(f"Failed to store embedding for event (run_id={run_id}): {e}", exc_info=True)
|
|
198
|
+
raise
|
|
199
|
+
|
|
200
|
+
# Step 5: Remove entry from unprocessed_events table
|
|
201
|
+
try:
|
|
202
|
+
delete_query = (
|
|
203
|
+
f"DELETE FROM {SCTUnprocessedEvent.__table_name__} WHERE run_id = ? AND severity = ? AND ts = ?"
|
|
204
|
+
)
|
|
205
|
+
self.db.execute(delete_query, (run_id, severity, ts))
|
|
206
|
+
LOGGER.debug(f"Removed unprocessed event: run_id={run_id}, severity={severity}, ts={ts}")
|
|
207
|
+
except Exception as e:
|
|
208
|
+
LOGGER.error(f"Failed to delete unprocessed event (run_id={run_id}): {e}", exc_info=True)
|
|
209
|
+
raise
|
|
210
|
+
|
|
211
|
+
def shutdown(self) -> None:
|
|
212
|
+
"""Shutdown the processor and cleanup resources."""
|
|
213
|
+
self.stop_event.set()
|
|
214
|
+
self.db.shutdown()
|
|
215
|
+
LOGGER.info("EventSimilarityProcessorV2 shutdown complete")
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def main():
|
|
219
|
+
"""Main entry point for the event similarity processor."""
|
|
220
|
+
setup_application_logging(log_level=logging.INFO)
|
|
221
|
+
|
|
222
|
+
LOGGER.info("Starting Event Similarity Processor V2...")
|
|
223
|
+
|
|
224
|
+
stop_event = Event()
|
|
225
|
+
processor = EventSimilarityProcessorV2(stop_event=stop_event)
|
|
226
|
+
|
|
227
|
+
try:
|
|
228
|
+
processor.process_unprocessed_events()
|
|
229
|
+
except KeyboardInterrupt:
|
|
230
|
+
LOGGER.info("Received keyboard interrupt, shutting down...")
|
|
231
|
+
finally:
|
|
232
|
+
processor.shutdown()
|
|
233
|
+
LOGGER.info("Event Similarity Processor V2 stopped")
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
if __name__ == "__main__":
|
|
237
|
+
main()
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import os
|
|
1
2
|
import re
|
|
2
3
|
from datetime import datetime
|
|
3
4
|
|
|
@@ -107,6 +108,7 @@ class MessageSanitizer:
|
|
|
107
108
|
self.remove_special_chars,
|
|
108
109
|
self.normalize_whitespace,
|
|
109
110
|
]
|
|
111
|
+
os.makedirs("logs", exist_ok=True)
|
|
110
112
|
self.sanitized_messages_fp = open(
|
|
111
113
|
"logs/sanitized_messages_" + datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + ".log", "w"
|
|
112
114
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: argus-alm
|
|
3
|
-
Version: 0.15.
|
|
3
|
+
Version: 0.15.12
|
|
4
4
|
Summary: Argus
|
|
5
5
|
Author-email: Alexey Kartashov <alexey.kartashov@scylladb.com>, Łukasz Sójka <lukasz.sojka@scylladb.com>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -11,13 +11,15 @@ Description-Content-Type: text/markdown
|
|
|
11
11
|
License-File: LICENSE
|
|
12
12
|
Requires-Dist: requests>=2.26.0
|
|
13
13
|
Requires-Dist: click>=8.1.3
|
|
14
|
+
Requires-Dist: lz4>=4.4.4
|
|
14
15
|
Provides-Extra: web-backend
|
|
15
16
|
Requires-Dist: PyYAML~=6.0.0; extra == "web-backend"
|
|
16
|
-
Requires-Dist: scylla-driver>=3.
|
|
17
|
+
Requires-Dist: scylla-driver>=3.29.4; extra == "web-backend"
|
|
17
18
|
Requires-Dist: Flask~=3.0.0; extra == "web-backend"
|
|
18
19
|
Requires-Dist: Flask-WTF~=1.0.0; extra == "web-backend"
|
|
19
20
|
Requires-Dist: Flask-Login~=0.5.0; extra == "web-backend"
|
|
20
21
|
Requires-Dist: humanize~=3.13.1; extra == "web-backend"
|
|
22
|
+
Requires-Dist: PyJWT[crypto]>=2.10.0; extra == "web-backend"
|
|
21
23
|
Requires-Dist: python-magic~=0.4.24; extra == "web-backend"
|
|
22
24
|
Requires-Dist: uwsgi~=2.0.20; extra == "web-backend"
|
|
23
25
|
Requires-Dist: python-jenkins>=1.7.0; extra == "web-backend"
|
|
@@ -43,6 +45,8 @@ Requires-Dist: nox~=2025.5.1; extra == "dev"
|
|
|
43
45
|
Requires-Dist: pytest-xdist~=3.7.0; extra == "dev"
|
|
44
46
|
Requires-Dist: pytest-subtests~=0.14.1; extra == "dev"
|
|
45
47
|
Requires-Dist: boto3-stubs~=1.38.9; extra == "dev"
|
|
48
|
+
Provides-Extra: ai
|
|
49
|
+
Requires-Dist: chromadb>=1.0.15; extra == "ai"
|
|
46
50
|
Dynamic: license-file
|
|
47
51
|
|
|
48
52
|
# Argus
|