robusta-api 0.48.0__tar.gz → 0.49.0__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.
Files changed (306) hide show
  1. {robusta_api-0.48.0 → robusta_api-0.49.0}/PKG-INFO +4 -4
  2. {robusta_api-0.48.0 → robusta_api-0.49.0}/pyproject.toml +5 -4
  3. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/_version.py +1 -1
  4. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/discovery/discovery.py +1 -1
  5. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/discovery/resource_names.py +1 -1
  6. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/discovery/top_service_resolver.py +1 -1
  7. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/base_params.py +5 -1
  8. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/cluster_status.py +3 -1
  9. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/env_vars.py +2 -0
  10. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/events.py +1 -1
  11. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/helm_release.py +1 -1
  12. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/jobs.py +1 -1
  13. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/namespaces.py +1 -1
  14. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/nodes.py +1 -1
  15. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/openshift_group.py +1 -1
  16. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/pods.py +1 -1
  17. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/runner_config.py +1 -1
  18. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/services.py +1 -1
  19. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/persistency/in_memory.py +1 -1
  20. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/actions_registry.py +1 -1
  21. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/base_trigger.py +1 -1
  22. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/playbook_utils.py +2 -2
  23. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/prometheus_enrichment_utils.py +1 -1
  24. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/trigger.py +1 -1
  25. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/action_requests.py +1 -1
  26. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/base.py +1 -1
  27. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/blocks.py +1 -1
  28. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/callbacks.py +1 -1
  29. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/custom_rendering.py +12 -3
  30. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/holmes.py +5 -1
  31. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/schedule/model.py +1 -1
  32. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/google_chat/google_chat_params.py +1 -1
  33. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/incidentio/incidentio_sink_params.py +1 -1
  34. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/mail/mail_sink_params.py +1 -1
  35. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/mattermost/mattermost_sink_params.py +1 -1
  36. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/msteams/msteams_sink_params.py +1 -1
  37. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/dal/supabase_dal.py +57 -9
  38. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/prometheus_discovery_utils.py +1 -1
  39. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/robusta_sink_params.py +1 -1
  40. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/rrm/types.py +1 -1
  41. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/rocketchat/rocketchat_sink_params.py +1 -1
  42. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/servicenow/servicenow_sink_params.py +1 -1
  43. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/sink_base.py +1 -1
  44. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/sink_base_params.py +2 -2
  45. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/sink_config.py +1 -1
  46. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/slack/preview/slack_sink_preview_params.py +1 -1
  47. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/slack/slack_sink_params.py +1 -1
  48. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/webex/webex_sink_params.py +1 -1
  49. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/webhook/webhook_sink_params.py +1 -1
  50. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/yamessenger/yamessenger_sink_params.py +1 -1
  51. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/zulip/zulip_sink_params.py +1 -1
  52. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/custom_triggers.py +1 -1
  53. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/helm_releases_triggers.py +1 -1
  54. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/oom_killed_trigger_base.py +1 -1
  55. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/autogenerated/events.py +1 -1
  56. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/autogenerated/triggers.py +1 -1
  57. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/base_triggers.py +1 -1
  58. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/custom_crds.py +1 -1
  59. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/custom_models.py +1 -1
  60. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/prometheus/models.py +1 -1
  61. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/prometheus/trigger.py +27 -8
  62. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/receiver.py +1 -1
  63. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/scheduled/models.py +1 -1
  64. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/scheduled/playbook_scheduler_manager_impl.py +1 -1
  65. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/scheduled/trigger.py +1 -1
  66. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/model/alert_relabel_config.py +1 -1
  67. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/model/playbook_action.py +1 -1
  68. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/model/playbook_definition.py +1 -1
  69. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/telemetry.py +2 -2
  70. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/documented_pydantic.py +2 -2
  71. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/function_hashes.py +1 -1
  72. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/scope.py +1 -1
  73. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/silence_utils.py +1 -1
  74. {robusta_api-0.48.0 → robusta_api-0.49.0}/LICENSE +0 -0
  75. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/__init__.py +0 -0
  76. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/api/__init__.py +0 -0
  77. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/clients/robusta_client.py +0 -0
  78. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/__init__.py +0 -0
  79. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/discovery/__init__.py +0 -0
  80. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/discovery/utils.py +0 -0
  81. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/exceptions.py +0 -0
  82. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/__init__.py +0 -0
  83. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/model/k8s_operation_type.py +0 -0
  84. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/persistency/__init__.py +0 -0
  85. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/persistency/scheduled_jobs_states_dal.py +0 -0
  86. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/__init__.py +0 -0
  87. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/common.py +0 -0
  88. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/container_playbook_utils.py +0 -0
  89. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/crash_reporter.py +0 -0
  90. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/generation.py +0 -0
  91. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/internal/CRD_API_DOCUMENTATION.md +0 -0
  92. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/internal/__init__.py +0 -0
  93. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/internal/ai_integration.py +0 -0
  94. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/internal/crds.py +0 -0
  95. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/internal/discovery_events.py +0 -0
  96. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/job_utils.py +0 -0
  97. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/node_enrichment_utils.py +0 -0
  98. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/node_playbook_utils.py +0 -0
  99. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/oom_killer_utils.py +0 -0
  100. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/playbooks_event_handler.py +0 -0
  101. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/playbooks_event_handler_impl.py +0 -0
  102. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +0 -0
  103. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/pod_utils/imagepull_utils.py +0 -0
  104. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/playbooks/pod_utils/pending_pod_utils.py +0 -0
  105. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/pubsub/__init__.py +0 -0
  106. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/pubsub/event_emitter.py +0 -0
  107. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/pubsub/event_subscriber.py +0 -0
  108. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/pubsub/events_pubsub.py +0 -0
  109. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/__init__.py +0 -0
  110. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/consts.py +0 -0
  111. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/finding_subjects.py +0 -0
  112. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/url_helpers.py +0 -0
  113. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/reporting/utils.py +0 -0
  114. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/schedule/__init__.py +0 -0
  115. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/schedule/scheduler.py +0 -0
  116. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/__init__.py +0 -0
  117. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/common/__init__.py +0 -0
  118. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/common/channel_transformer.py +0 -0
  119. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/common/html_tools.py +0 -0
  120. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/datadog/__init__.py +0 -0
  121. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/datadog/datadog_sink.py +0 -0
  122. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/datadog/datadog_sink_params.py +0 -0
  123. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/discord/__init__.py +0 -0
  124. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/discord/discord_sink.py +0 -0
  125. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/discord/discord_sink_params.py +0 -0
  126. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/file/__init__.py +0 -0
  127. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/file/file_sink.py +0 -0
  128. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/file/file_sink_params.py +0 -0
  129. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/file/object_traverser.py +0 -0
  130. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/google_chat/__init__.py +0 -0
  131. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/google_chat/google_chat.py +0 -0
  132. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/incidentio/__init__.py +0 -0
  133. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/incidentio/incidentio_api.py +0 -0
  134. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/incidentio/incidentio_client.py +0 -0
  135. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/incidentio/incidentio_sink.py +0 -0
  136. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/jira/__init__.py +0 -0
  137. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/jira/jira_sink.py +0 -0
  138. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/jira/jira_sink_params.py +0 -0
  139. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/kafka/__init__.py +0 -0
  140. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/kafka/kafka_sink.py +0 -0
  141. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/kafka/kafka_sink_params.py +0 -0
  142. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/mail/__init__.py +0 -0
  143. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/mail/mail_sink.py +0 -0
  144. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/mattermost/__init__.py +0 -0
  145. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/mattermost/mattermost_sink.py +0 -0
  146. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/msteams/__init__.py +0 -0
  147. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/msteams/msteams_sink.py +0 -0
  148. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/msteams/msteams_webhook_tranformer.py +0 -0
  149. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/opsgenie/__init__.py +0 -0
  150. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/opsgenie/opsgenie_sink.py +0 -0
  151. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/opsgenie/opsgenie_sink_params.py +0 -0
  152. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/pagerduty/__init__.py +0 -0
  153. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/pagerduty/pagerduty_sink.py +0 -0
  154. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/pagerduty/pagerduty_sink_params.py +0 -0
  155. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/pushover/__init__.py +0 -0
  156. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/pushover/pushover_client.py +0 -0
  157. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/pushover/pushover_sink.py +0 -0
  158. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/pushover/pushover_sink_params.py +0 -0
  159. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/__init__.py +0 -0
  160. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/dal/__init__.py +0 -0
  161. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/dal/model_conversion.py +0 -0
  162. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/discovery_metrics.py +0 -0
  163. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/robusta_sink.py +0 -0
  164. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/rrm/__init__.py +0 -0
  165. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/rrm/account_resource_fetcher.py +0 -0
  166. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/rrm/base_resource_manager.py +0 -0
  167. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/rrm/prometheus_alert_resource_manager.py +0 -0
  168. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/robusta/rrm/rrm.py +0 -0
  169. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/rocketchat/__init__.py +0 -0
  170. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/rocketchat/rocketchat_sink.py +0 -0
  171. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/servicenow/__init__.py +0 -0
  172. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/servicenow/servicenow_sink.py +0 -0
  173. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/sink_factory.py +0 -0
  174. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/slack/__init__.py +0 -0
  175. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/slack/preview/slack_sink_preview.py +0 -0
  176. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/slack/slack_sink.py +0 -0
  177. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/slack/templates/header.j2 +0 -0
  178. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/slack/templates/template_loader.py +0 -0
  179. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/telegram/__init__.py +0 -0
  180. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/telegram/telegram_client.py +0 -0
  181. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/telegram/telegram_sink.py +0 -0
  182. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/telegram/telegram_sink_params.py +0 -0
  183. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/timing.py +0 -0
  184. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/transformer.py +0 -0
  185. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/victorops/__init__.py +0 -0
  186. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/victorops/victorops_sink.py +0 -0
  187. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/victorops/victorops_sink_params.py +0 -0
  188. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/webex/__init__.py +0 -0
  189. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/webex/webex_sink.py +0 -0
  190. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/webhook/__init__.py +0 -0
  191. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/webhook/webhook_sink.py +0 -0
  192. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/yamessenger/__init__.py +0 -0
  193. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/yamessenger/yamessenger_client.py +0 -0
  194. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/yamessenger/yamessenger_sink.py +0 -0
  195. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/zulip/__init__.py +0 -0
  196. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/sinks/zulip/zulip_sink.py +0 -0
  197. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/stream/utils.py +0 -0
  198. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/container_oom_killed_trigger.py +0 -0
  199. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/error_event_trigger.py +0 -0
  200. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/job_failed_trigger.py +0 -0
  201. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/multi_resources_trigger.py +0 -0
  202. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/pod_crash_loop_trigger.py +0 -0
  203. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/pod_evicted_trigger.py +0 -0
  204. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/pod_image_pull_backoff.py +0 -0
  205. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/core/triggers/pod_oom_killed_trigger.py +0 -0
  206. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/__init__.py +0 -0
  207. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/argocd/argocd_client.py +0 -0
  208. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/common/__init__.py +0 -0
  209. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/common/requests.py +0 -0
  210. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/discord/__init__.py +0 -0
  211. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/discord/sender.py +0 -0
  212. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/git/__init__.py +0 -0
  213. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/git/git_repo.py +0 -0
  214. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/git/well_known_hosts.py +0 -0
  215. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/google_chat/__init__.py +0 -0
  216. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/google_chat/sender.py +0 -0
  217. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/grafana.py +0 -0
  218. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/helper.py +0 -0
  219. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/jira/__init__.py +0 -0
  220. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/jira/client.py +0 -0
  221. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/jira/sender.py +0 -0
  222. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/__init__.py +0 -0
  223. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/api_client_utils.py +0 -0
  224. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/autogenerated/__init__.py +0 -0
  225. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/autogenerated/models.py +0 -0
  226. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/autogenerated/v1/__init__.py +0 -0
  227. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/autogenerated/v1/models.py +0 -0
  228. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/base_event.py +0 -0
  229. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/model_not_found_exception.py +0 -0
  230. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/process_utils.py +0 -0
  231. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/kubernetes/templates.py +0 -0
  232. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/mail/__init__.py +0 -0
  233. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/mail/sender.py +0 -0
  234. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/mattermost/__init__.py +0 -0
  235. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/mattermost/client.py +0 -0
  236. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/mattermost/sender.py +0 -0
  237. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/__init__.py +0 -0
  238. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files.py +0 -0
  239. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_image.py +0 -0
  240. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_text.py +0 -0
  241. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/__init__.py +0 -0
  242. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_action.py +0 -0
  243. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_base.py +0 -0
  244. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_card.py +0 -0
  245. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_column.py +0 -0
  246. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_container.py +0 -0
  247. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_images.py +0 -0
  248. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_table.py +0 -0
  249. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_elements/msteams_text_block.py +0 -0
  250. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_mark_down_fix_url.py +0 -0
  251. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/msteams_msg.py +0 -0
  252. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/msteams/sender.py +0 -0
  253. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/openshift/__init__.py +0 -0
  254. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/openshift/token.py +0 -0
  255. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/prometheus/__init__.py +0 -0
  256. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/prometheus/utils.py +0 -0
  257. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/resource_analysis/__init__.py +0 -0
  258. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/resource_analysis/cpu_analyzer.py +0 -0
  259. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/resource_analysis/memory_analyzer.py +0 -0
  260. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/resource_analysis/node_cpu_analyzer.py +0 -0
  261. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/resource_analysis/prometheus_analyzer.py +0 -0
  262. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/rocketchat/__init__.py +0 -0
  263. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/rocketchat/sender.py +0 -0
  264. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/scheduled/__init__.py +0 -0
  265. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/scheduled/event.py +0 -0
  266. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/scheduled/playbook_scheduler.py +0 -0
  267. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/scheduled/playbook_scheduler_manager.py +0 -0
  268. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/servicenow/__init__.py +0 -0
  269. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/servicenow/sender.py +0 -0
  270. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/slack/__init__.py +0 -0
  271. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/slack/sender.py +0 -0
  272. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/webex/__init__.py +0 -0
  273. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/webex/sender.py +0 -0
  274. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/zulip/__init__.py +0 -0
  275. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/integrations/zulip/sender.py +0 -0
  276. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/model/config.py +0 -0
  277. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/patch/patch.py +0 -0
  278. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/__init__.py +0 -0
  279. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/config_loader.py +0 -0
  280. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/log_init.py +0 -0
  281. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/main.py +0 -0
  282. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/not_found_exception.py +0 -0
  283. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/object_updater.py +0 -0
  284. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/process_setup.py +0 -0
  285. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/ssl_utils.py +0 -0
  286. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/telemetry_service.py +0 -0
  287. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/web.py +0 -0
  288. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/runner/web_api.py +0 -0
  289. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/__init__.py +0 -0
  290. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/archive.py +0 -0
  291. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/auth_provider.py +0 -0
  292. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/base64_utils.py +0 -0
  293. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/cluster_provider_discovery.py +0 -0
  294. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/common.py +0 -0
  295. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/decorators.py +0 -0
  296. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/docs.py +0 -0
  297. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/error_codes.py +0 -0
  298. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/file_system_watcher.py +0 -0
  299. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/json_schema.py +0 -0
  300. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/parsing.py +0 -0
  301. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/rate_limiter.py +0 -0
  302. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/server_start.py +0 -0
  303. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/service_discovery.py +0 -0
  304. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/stack_tracer.py +0 -0
  305. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/task_queue.py +0 -0
  306. {robusta_api-0.48.0 → robusta_api-0.49.0}/src/robusta/utils/time_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robusta-api
3
- Version: 0.48.0
3
+ Version: 0.49.0
4
4
  Summary:
5
5
  Author: Arik Alon
6
6
  Author-email: arikalon1@users.noreply.github.com
@@ -38,12 +38,11 @@ Requires-Dist: markdown2 (==2.4.13)
38
38
  Requires-Dist: opsgenie-sdk (>=2.1.5,<3.0.0)
39
39
  Requires-Dist: pillow (>=12.3.0,<13.0.0)
40
40
  Requires-Dist: poetry-core (==1.1.0a7) ; extra == "all"
41
- Requires-Dist: postgrest (==0.16.8)
42
41
  Requires-Dist: prometheus-api-client (==0.5.4) ; extra == "all"
43
42
  Requires-Dist: prometheus-client (>=0.12.0,<0.13.0)
44
43
  Requires-Dist: prometrix (==0.2.11)
45
44
  Requires-Dist: pyasn1 (>=0.6.4)
46
- Requires-Dist: pydantic (>=1.8.1,<2.0.0)
45
+ Requires-Dist: pydantic (>=2.11.7,<3.0.0)
47
46
  Requires-Dist: pydash (==8.0.0)
48
47
  Requires-Dist: pygal (>=3.0.0,<4.0.0)
49
48
  Requires-Dist: pyjwt (>=2.13.0,<3.0.0)
@@ -59,7 +58,7 @@ Requires-Dist: rocketchat-api (>=1.30.0,<2.0.0)
59
58
  Requires-Dist: sentry-sdk[flask] (>=2.13.0,<3.0.0) ; extra == "all"
60
59
  Requires-Dist: setuptools (>=80.9.0,<81.0.0)
61
60
  Requires-Dist: slack-sdk (>=3.23.0,<4.0.0)
62
- Requires-Dist: supabase (==2.5.1) ; extra == "all"
61
+ Requires-Dist: supabase (==2.28.1) ; extra == "all"
63
62
  Requires-Dist: tabulate (>=0.8.10,<0.9.0) ; extra == "all"
64
63
  Requires-Dist: tenacity (>=9.1.2,<10.0.0)
65
64
  Requires-Dist: toml (>=0.10.2,<0.11.0)
@@ -69,4 +68,5 @@ Requires-Dist: watchdog (>=2.1.0,<3.0.0) ; extra == "all"
69
68
  Requires-Dist: watchgod (>=0.7,<0.8)
70
69
  Requires-Dist: webexteamssdk (>=1.6.1,<2.0.0)
71
70
  Requires-Dist: websocket-client (==1.3.3)
71
+ Requires-Dist: websockets (>=13)
72
72
  Requires-Dist: werkzeug (>=3.1.6)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "robusta-api"
3
- version = "0.48.0"
3
+ version = "0.49.0"
4
4
  description = ""
5
5
  authors = ["Arik Alon <arikalon1@users.noreply.github.com>"]
6
6
  packages = [
@@ -21,13 +21,13 @@ python = ">=3.10, <3.12"
21
21
  setuptools = "^80.9.0"
22
22
  colorlog = "^5.0.1"
23
23
  python-json-logger = "^3.0.0"
24
- pydantic = "^1.8.1"
24
+ pydantic = "^2.11.7"
25
25
  kubernetes = "^26.1.0"
26
26
  pymsteams = "^0.1.16"
27
27
  # Bump to fix CVE-2026-45409 / GHSA-65pc-fj4g-8rjx (Moderate, GHSA published
28
28
  # 2026-05-19, older than 60 days): idna.encode() bypass of the CVE-2024-3651 fix
29
29
  idna= { version = ">=3.15", optional = true }
30
- supabase = "2.5.1"
30
+ supabase = "2.28.1"
31
31
  tabulate = { version = "^0.8.10" }
32
32
  slack-sdk = { version = "^3.23.0" }
33
33
  Flask = { version = "^3.1.3", optional = true }
@@ -88,7 +88,8 @@ regex = "2024.5.15"
88
88
  pyjwt = "^2.13.0"
89
89
  urllib3 = "^2.7.0"
90
90
  httpx = "0.27.2"
91
- postgrest = "0.16.8"
91
+ # realtime (supabase dependency) requires websockets.asyncio, added in websockets 13
92
+ websockets = ">=13"
92
93
  # Pin to fix cve https://github.com/robusta-dev/robusta/security/dependabot/85
93
94
  h2 = "^4.3.0"
94
95
  # Pin to fix CVE-2026-30922 (transitive via google-auth)
@@ -1,2 +1,2 @@
1
1
  # this is updated by .github/workflows/release.yaml
2
- __version__ = "0.48.0"
2
+ __version__ = "0.49.0"
@@ -38,7 +38,7 @@ from kubernetes.client import (
38
38
  V1StatefulSetList,
39
39
  V1Volume,
40
40
  )
41
- from pydantic import BaseModel
41
+ from pydantic.v1 import BaseModel
42
42
 
43
43
  from robusta.core.discovery import utils
44
44
  from robusta.core.model.cluster_status import ClusterStats
@@ -1,7 +1,7 @@
1
1
  from typing import Callable, List, Optional
2
2
 
3
3
  from kubernetes import client
4
- from pydantic import BaseModel
4
+ from pydantic.v1 import BaseModel
5
5
 
6
6
  from robusta.integrations.kubernetes.custom_models import DeploymentConfig, Rollout
7
7
  from robusta.utils.error_codes import ActionException, ErrorCodes
@@ -3,7 +3,7 @@ import time
3
3
  from collections import defaultdict
4
4
  from typing import Dict, List, Optional
5
5
 
6
- from pydantic.main import BaseModel
6
+ from pydantic.v1.main import BaseModel
7
7
 
8
8
  from robusta.core.model.env_vars import RESOURCE_UPDATES_CACHE_TTL_SEC
9
9
 
@@ -2,7 +2,7 @@ import logging
2
2
  from enum import Enum, auto
3
3
  from typing import Any, Dict, List, Optional, Union
4
4
 
5
- from pydantic import BaseModel, SecretStr, validator, Field
5
+ from pydantic.v1 import BaseModel, SecretStr, validator, Field
6
6
 
7
7
  from robusta.integrations import openshift
8
8
  from robusta.utils.documented_pydantic import DocumentedModel
@@ -213,6 +213,10 @@ class HolmesChatParams(HolmesParams):
213
213
  source_ref: Optional[str] = None
214
214
  conversation_id: Optional[str] = None
215
215
  conversation_source: Optional[str] = None
216
+ # URL of the surface the chat originated from (Slack thread permalink,
217
+ # Teams message link, platform chat/workflow-run URL). Holmes renders it
218
+ # into the system prompt so PRs/issues it creates link back to it.
219
+ conversation_link: Optional[str] = None
216
220
  is_internal: Optional[bool] = None
217
221
  meta: Optional[Dict[str, Any]] = None
218
222
 
@@ -1,4 +1,6 @@
1
- from pydantic.main import BaseModel, List, Optional
1
+ from typing import List, Optional
2
+
3
+ from pydantic.v1 import BaseModel
2
4
 
3
5
 
4
6
  class ClusterStats(BaseModel):
@@ -144,6 +144,8 @@ RESOURCE_YAML_BLOCK_LIST = json.loads(os.environ.get("RESOURCE_YAML_BLOCK_LIST",
144
144
 
145
145
  NAMESPACE_DATA_TTL = int(os.environ.get("NAMESPACE_DATA_TTL", 30 * 60)) # in seconds
146
146
 
147
+ NODE_IP_CACHE_TTL_SEC = int(os.environ.get("NODE_IP_CACHE_TTL_SEC", 15 * 60))
148
+
147
149
  PROCESSED_ALERTS_CACHE_TTL = int(os.environ.get("PROCESSED_ALERT_CACHE_TTL", 2 * 3600))
148
150
  PROCESSED_ALERTS_CACHE_MAX_SIZE = int(os.environ.get("PROCESSED_ALERTS_CACHE_MAX_SIZE", 100_000))
149
151
 
@@ -6,7 +6,7 @@ from dataclasses import dataclass, field
6
6
  from enum import Enum
7
7
  from typing import Any, Dict, List, Optional, Callable
8
8
 
9
- from pydantic import BaseModel
9
+ from pydantic.v1 import BaseModel
10
10
 
11
11
  from robusta.core.pubsub.event_emitter import EventEmitter
12
12
  from robusta.core.reporting.base import (
@@ -1,5 +1,5 @@
1
1
  from typing import Optional, List, Any, Dict
2
- from pydantic import BaseModel
2
+ from pydantic.v1 import BaseModel
3
3
  from base64 import b64decode
4
4
  from datetime import datetime
5
5
  import gzip
@@ -3,7 +3,7 @@ from typing import Dict, List, Optional, Union
3
3
 
4
4
  from hikaru.model.rel_1_26 import Job
5
5
  from kubernetes.client import V1Container, V1Job, V1JobSpec, V1JobStatus, V1PodSpec
6
- from pydantic import BaseModel
6
+ from pydantic.v1 import BaseModel
7
7
 
8
8
  from robusta.core.discovery import utils
9
9
  from robusta.core.model.pods import ContainerResources, ResourceAttributes
@@ -1,5 +1,5 @@
1
1
  from typing import Optional, List
2
- from pydantic import BaseModel
2
+ from pydantic.v1 import BaseModel
3
3
  from kubernetes.client import V1Namespace
4
4
  import json
5
5
 
@@ -1,6 +1,6 @@
1
1
  from typing import Dict
2
2
 
3
- from pydantic.main import BaseModel, Field
3
+ from pydantic.v1 import BaseModel, Field
4
4
 
5
5
 
6
6
  class NodeInfo(BaseModel):
@@ -1,6 +1,6 @@
1
1
  from typing import Dict, Optional
2
2
 
3
- from pydantic import BaseModel
3
+ from pydantic.v1 import BaseModel
4
4
 
5
5
 
6
6
  class OpenshiftGroup(BaseModel):
@@ -5,7 +5,7 @@ from typing import Dict, List, Optional, Union
5
5
  from hikaru.model.rel_1_26 import Container, ContainerState, ContainerStatus, Pod
6
6
  from kubernetes.client.models import V1Container, V1ContainerStatus, V1PodStatus, V1Pod, V1PodSpec, V1ResourceRequirements
7
7
 
8
- from pydantic import BaseModel
8
+ from pydantic.v1 import BaseModel
9
9
 
10
10
  from robusta.integrations.kubernetes.api_client_utils import parse_kubernetes_datetime_to_ms
11
11
 
@@ -1,7 +1,7 @@
1
1
  import base64
2
2
  from typing import Dict, List, Optional, Union, cast
3
3
 
4
- from pydantic import BaseModel, SecretStr, root_validator, validator
4
+ from pydantic.v1 import BaseModel, SecretStr, root_validator, validator
5
5
 
6
6
  from robusta.core.playbooks.playbook_utils import get_env_replacement, replace_env_vars_values
7
7
  from robusta.core.sinks.datadog.datadog_sink_params import DataDogSinkConfigWrapper
@@ -2,7 +2,7 @@ from typing import Dict, List, Optional, Union
2
2
 
3
3
  from hikaru.model.rel_1_26 import Container, Volume
4
4
  from kubernetes.client import V1Container, V1Volume
5
- from pydantic import BaseModel
5
+ from pydantic.v1 import BaseModel
6
6
 
7
7
 
8
8
  class EnvVar(BaseModel):
@@ -2,7 +2,7 @@
2
2
  from contextlib import contextmanager
3
3
  from typing import ContextManager, Dict, Type, TypeVar
4
4
 
5
- from pydantic import BaseModel
5
+ from pydantic.v1 import BaseModel
6
6
 
7
7
  persistent_data: Dict[str, BaseModel] = {}
8
8
 
@@ -1,7 +1,7 @@
1
1
  import inspect
2
2
  from typing import Callable, Dict, List, Optional, Tuple, Type, cast
3
3
 
4
- from pydantic.main import BaseModel
4
+ from pydantic.v1.main import BaseModel
5
5
 
6
6
  from robusta.core.model.events import ExecutionBaseEvent, ExecutionEventBaseParams
7
7
  from robusta.utils.decorators import doublewrap
@@ -1,7 +1,7 @@
1
1
  import abc
2
2
  from typing import Any, Dict, List, Optional, Type
3
3
 
4
- from pydantic import BaseModel
4
+ from pydantic.v1 import BaseModel
5
5
 
6
6
  from robusta.core.model.events import ExecutionBaseEvent
7
7
  from robusta.core.reporting.base import Finding
@@ -3,8 +3,8 @@ import os
3
3
  import re
4
4
  from typing import Dict, Optional
5
5
 
6
- from pydantic.main import BaseModel
7
- from pydantic.types import SecretStr
6
+ from pydantic.v1.main import BaseModel
7
+ from pydantic.v1.types import SecretStr
8
8
 
9
9
 
10
10
  def get_env_replacement(value: str) -> Optional[str]:
@@ -9,7 +9,7 @@ import humanize
9
9
  import pygal
10
10
  from hikaru.model.rel_1_26 import Node
11
11
  from prometrix import PrometheusQueryResult
12
- from pydantic import BaseModel
12
+ from pydantic.v1 import BaseModel
13
13
 
14
14
  from robusta.core.model.base_params import (
15
15
  ChartValuesFormat,
@@ -1,4 +1,4 @@
1
- from pydantic import PrivateAttr
1
+ from pydantic.v1 import PrivateAttr
2
2
 
3
3
  from robusta.core.playbooks.base_trigger import BaseTrigger
4
4
  from robusta.core.triggers.custom_triggers import CustomTriggers
@@ -5,7 +5,7 @@ from typing import List, Optional
5
5
  from uuid import UUID
6
6
 
7
7
  import requests
8
- from pydantic import BaseModel
8
+ from pydantic.v1 import BaseModel
9
9
 
10
10
  from robusta.core.model.env_vars import RELAY_EXTERNAL_ACTIONS_URL
11
11
 
@@ -9,7 +9,7 @@ from enum import Enum
9
9
  from typing import Any, Dict, List, Optional, Union
10
10
  from urllib.parse import urlencode
11
11
 
12
- from pydantic.main import BaseModel
12
+ from pydantic.v1.main import BaseModel
13
13
  from strenum import StrEnum
14
14
 
15
15
  from robusta.core.discovery.top_service_resolver import TopServiceResolver
@@ -16,7 +16,7 @@ from typing import Any, Callable, Dict, List, Literal, Optional, Sequence, Tuple
16
16
  import hikaru
17
17
  from hikaru import DiffDetail, DiffType
18
18
  from hikaru.model.rel_1_26 import HikaruDocumentBase
19
- from pydantic import BaseModel
19
+ from pydantic.v1 import BaseModel
20
20
 
21
21
  from robusta.core.model.base_params import ChartValuesFormat
22
22
 
@@ -1,6 +1,6 @@
1
1
  import time
2
2
 
3
- from pydantic import BaseModel
3
+ from pydantic.v1 import BaseModel
4
4
 
5
5
  from robusta.core.playbooks.actions_registry import Action
6
6
  from robusta.core.reporting import CallbackChoice
@@ -37,6 +37,15 @@ def charts_style(
37
37
  opacity_hover=".9",
38
38
  transition="400ms ease-in",
39
39
  colors=graph_colors,
40
+ # pygal's own default font stack ("Consolas, Liberation Mono, Menlo, Courier,
41
+ # monospace") has no match in our chart-rendering image (only fonts-dejavu-core is
42
+ # installed there), and resvg does exact font-family matching with no fontconfig-style
43
+ # generic-family fallback - so with the default, resvg silently drops every
44
+ # title/axis/legend text element while still drawing the plotted lines. "DejaVu Sans
45
+ # Mono" is the font we know that package provides. Setting it here propagates to every
46
+ # *_font_family Style attribute (title/legend/label/tooltip/...), since pygal's
47
+ # Style.__init__ defaults each of those to font_family when unset.
48
+ font_family="DejaVu Sans Mono",
40
49
  )
41
50
 
42
51
 
@@ -50,15 +59,15 @@ class PlotCustomCSS:
50
59
  {{ id }}.title {
51
60
  fill: #11383A;
52
61
  }
53
-
62
+
54
63
  {{ id }}.legends .legend text {
55
64
  fill: #3f3f3f;
56
65
  }
57
-
66
+
58
67
  {{ id }}.axis.y text {
59
68
  fill: #3f3f3f;
60
69
  }
61
-
70
+
62
71
  {{ id }}.axis.x text {
63
72
  fill: #3f3f3f;
64
73
  }
@@ -1,6 +1,6 @@
1
1
  from typing import Any, Dict, List, Optional, Union
2
2
 
3
- from pydantic import BaseModel, Field
3
+ from pydantic.v1 import BaseModel, Field
4
4
 
5
5
  from robusta.core.model.base_params import (
6
6
  ConversationType,
@@ -57,6 +57,10 @@ class HolmesChatRequest(BaseModel):
57
57
  source_ref: Optional[str] = None
58
58
  conversation_id: Optional[str] = None
59
59
  conversation_source: Optional[str] = None
60
+ # URL of the surface the chat originated from (Slack thread permalink,
61
+ # Teams message link, platform chat/workflow-run URL). Holmes renders it
62
+ # into the system prompt so PRs/issues it creates link back to it.
63
+ conversation_link: Optional[str] = None
60
64
  is_internal: Optional[bool] = None
61
65
  meta: Optional[Dict[str, Any]] = None
62
66
 
@@ -1,7 +1,7 @@
1
1
  from enum import Enum
2
2
  from typing import List, Union
3
3
 
4
- from pydantic import BaseModel
4
+ from pydantic.v1 import BaseModel
5
5
 
6
6
 
7
7
  class JobStatus(Enum):
@@ -1,4 +1,4 @@
1
- from pydantic import SecretStr
1
+ from pydantic.v1 import SecretStr
2
2
 
3
3
  from robusta.core.sinks.sink_base_params import SinkBaseParams
4
4
  from robusta.core.sinks.sink_config import SinkConfigBase
@@ -3,7 +3,7 @@ from typing import Optional
3
3
  from urllib.parse import urlparse
4
4
  from robusta.core.playbooks.playbook_utils import get_env_replacement
5
5
 
6
- from pydantic import validator
6
+ from pydantic.v1 import validator
7
7
 
8
8
  from robusta.core.sinks.sink_base_params import SinkBaseParams
9
9
  from robusta.core.sinks.sink_config import SinkConfigBase
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from pydantic import validator, root_validator
3
+ from pydantic.v1 import validator, root_validator
4
4
 
5
5
  from robusta.core.sinks.sink_base_params import SinkBaseParams
6
6
  from robusta.core.sinks.sink_config import SinkConfigBase
@@ -1,7 +1,7 @@
1
1
  from typing import Optional
2
2
  from urllib.parse import urlparse
3
3
 
4
- from pydantic import validator
4
+ from pydantic.v1 import validator
5
5
 
6
6
  from robusta.core.sinks.sink_base_params import SinkBaseParams
7
7
  from robusta.core.sinks.sink_config import SinkConfigBase
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from pydantic import validator
3
+ from pydantic.v1 import validator
4
4
 
5
5
  from robusta.core.sinks.msteams.msteams_webhook_tranformer import MsTeamsWebhookUrlTransformer
6
6
  from robusta.core.sinks.sink_base_params import SinkBaseParams
@@ -9,19 +9,21 @@ from uuid import uuid4
9
9
  from cachetools import TTLCache
10
10
  import httpx
11
11
  import requests
12
- from gotrue.errors import AuthRetryableError
12
+ from supabase_auth.errors import AuthRetryableError
13
13
  from postgrest._sync.request_builder import SyncQueryRequestBuilder
14
14
  from postgrest.base_request_builder import BaseFilterRequestBuilder, QueryArgs
15
15
  from postgrest.exceptions import APIError as PostgrestAPIError
16
16
  from postgrest.types import ReturnMethod
17
17
  from postgrest.utils import sanitize_param
18
18
  from supabase import create_client
19
- from supabase.lib.client_options import ClientOptions
20
- from tenacity import RetryCallState, Retrying, retry_if_exception_type, stop_after_attempt, wait_exponential
19
+ from supabase.lib.client_options import SyncClientOptions as ClientOptions
20
+ from tenacity import RetryCallState, Retrying, retry, retry_if_exception_type, stop_after_attempt, wait_exponential
21
21
 
22
22
  from robusta.core.model.cluster_status import ClusterStatus
23
23
  from robusta.core.exceptions import SupabaseDnsException
24
24
  from robusta.core.model.env_vars import (
25
+ ROBUSTA_API_ENDPOINT,
26
+ RUNNER_VERSION,
25
27
  SUPABASE_CONNECT_TIMEOUT_SECONDS,
26
28
  SUPABASE_LOGIN_RETRIES,
27
29
  SUPABASE_LOGIN_RETRY_BACKOFF_SEC,
@@ -78,6 +80,36 @@ def pre_select_patched(*args, **kwargs) -> QueryArgs:
78
80
  supabase_request_builder.pre_select = pre_select_patched
79
81
 
80
82
 
83
+ KEY_CACHE = TTLCache(maxsize=1, ttl=24 * 60 * 60)
84
+
85
+
86
+ @retry(
87
+ stop=stop_after_attempt(3),
88
+ wait=wait_exponential(multiplier=1, max=4),
89
+ retry=retry_if_exception_type((requests.ConnectionError, requests.Timeout)),
90
+ reraise=True,
91
+ )
92
+ def _request_supabase_api_key(params: dict) -> Optional[str]:
93
+ url = f"{ROBUSTA_API_ENDPOINT}/api/config/supabase-keys"
94
+ response = requests.get(url, params=params, timeout=10)
95
+ response.raise_for_status()
96
+ return response.json().get("api_key")
97
+
98
+
99
+ def fetch_supabase_api_key(account_id: str, cluster: str) -> Optional[str]:
100
+ params = {
101
+ "account_id": account_id,
102
+ "cluster": cluster,
103
+ "component": "runner",
104
+ "component_version": RUNNER_VERSION,
105
+ }
106
+ try:
107
+ return _request_supabase_api_key(params)
108
+ except Exception as e:
109
+ logging.warning(f"Failed to fetch the api key from relay: {e}")
110
+ return None
111
+
112
+
81
113
  class _AuthHttpClient(httpx.Client):
82
114
  """The httpx client we hand to Supabase's auth (GoTrue) sub-client.
83
115
 
@@ -111,12 +143,10 @@ class SupabaseDal(AccountResourceFetcher):
111
143
  self.account_id = account_id
112
144
  self.cluster = cluster_name
113
145
  options = ClientOptions(postgrest_client_timeout=SUPABASE_TIMEOUT_SECONDS, auto_refresh_token=True)
114
- self.client = create_client(url, key, options)
115
- self.__apply_auth_client_timeout()
116
- self.patch_postgrest_execute()
117
146
  self.email = email
118
147
  self.password = password
119
- self.user_id = self.sign_in()
148
+ self.__connect(options)
149
+ self.patch_postgrest_execute()
120
150
  self.client.auth.on_auth_state_change(self.__update_token_patch)
121
151
  self.sink_name = sink_name
122
152
  self.persist_events = persist_events
@@ -125,6 +155,23 @@ class SupabaseDal(AccountResourceFetcher):
125
155
  self.token_cache = TTLCache(maxsize=1, ttl=ttl)
126
156
  self.lock = threading.Lock()
127
157
 
158
+ def __connect(self, options: ClientOptions):
159
+ self.options = options
160
+ relay_key = fetch_supabase_api_key(self.account_id, self.cluster)
161
+ for key in filter(None, (KEY_CACHE.pop("key", None), relay_key)):
162
+ try:
163
+ self.__login(key, options)
164
+ KEY_CACHE["key"] = key
165
+ return
166
+ except Exception as e:
167
+ logging.warning(f"Supabase login with the relay api key failed: {e}")
168
+ self.__login(self.key, options)
169
+
170
+ def __login(self, api_key: str, options: ClientOptions):
171
+ self.client = create_client(self.url, api_key, options)
172
+ self.__apply_auth_client_timeout()
173
+ self.user_id = self.sign_in()
174
+
128
175
  def __apply_auth_client_timeout(self) -> None:
129
176
  """Give the auth (GoTrue) client the configured timeout, over HTTP/1.1.
130
177
 
@@ -182,7 +229,7 @@ class SupabaseDal(AccountResourceFetcher):
182
229
  if exc.code == "PGRST301" or "expired" in message.lower():
183
230
  # JWT expired. Sign in again and retry the query
184
231
  logging.error("JWT token expired/invalid, signing in to Supabase again")
185
- self.sign_in()
232
+ self.__connect(self.options)
186
233
  return self._original_execute(_self)
187
234
  else:
188
235
  raise
@@ -468,7 +515,8 @@ class SupabaseDal(AccountResourceFetcher):
468
515
  frq: BaseFilterRequestBuilder, operator: str, criteria: str
469
516
  ) -> BaseFilterRequestBuilder:
470
517
  key, val = sanitize_param(operator), f"{criteria}"
471
- frq.params = frq.params.set(key, val)
518
+ target = frq.request if hasattr(frq, "request") else frq
519
+ target.params = target.params.set(key, val)
472
520
 
473
521
  return frq
474
522
 
@@ -5,7 +5,7 @@ import time
5
5
  from typing import Optional
6
6
 
7
7
  from prometrix import PrometheusFlagsConnectionError, PrometheusNotFound, VictoriaMetricsNotFound
8
- from pydantic import BaseModel
8
+ from pydantic.v1 import BaseModel
9
9
 
10
10
  from robusta.core.exceptions import AlertsManagerNotFound, NoAlertManagerUrlFound, NoPrometheusUrlFound
11
11
  from robusta.core.model.base_params import PrometheusParams
@@ -1,4 +1,4 @@
1
- from pydantic.main import BaseModel
1
+ from pydantic.v1.main import BaseModel
2
2
  from typing import List, Optional
3
3
  from robusta.core.sinks.sink_base_params import SinkBaseParams
4
4
  from robusta.core.sinks.sink_config import SinkConfigBase
@@ -1,7 +1,7 @@
1
1
  from datetime import datetime
2
2
  from enum import Enum
3
3
  from typing import List, Optional
4
- from pydantic import BaseModel
4
+ from pydantic.v1 import BaseModel
5
5
 
6
6
 
7
7
  class AccountResourceStatusInfo(BaseModel):
@@ -1,6 +1,6 @@
1
1
  from typing import Dict, Optional
2
2
 
3
- from pydantic import validator
3
+ from pydantic.v1 import validator
4
4
 
5
5
  from robusta.core.sinks.sink_base_params import SinkBaseParams
6
6
  from robusta.core.sinks.sink_config import SinkConfigBase
@@ -1,6 +1,6 @@
1
1
  from typing import Optional
2
2
 
3
- from pydantic import SecretStr
3
+ from pydantic.v1 import SecretStr
4
4
 
5
5
  from robusta.core.sinks.sink_base_params import SinkBaseParams
6
6
  from robusta.core.sinks.sink_config import SinkConfigBase
@@ -4,7 +4,7 @@ from abc import abstractmethod, ABC
4
4
  from collections import defaultdict
5
5
  from typing import Any, List, Dict, Tuple, DefaultDict, Optional
6
6
 
7
- from pydantic import BaseModel, Field
7
+ from pydantic.v1 import BaseModel, Field
8
8
 
9
9
  from robusta.core.model.k8s_operation_type import K8sOperationType
10
10
  from robusta.core.reporting.base import Finding
@@ -3,8 +3,8 @@ import re
3
3
  from abc import ABC, abstractmethod
4
4
  from typing import Dict, List, Optional, Union
5
5
 
6
- from pydantic import BaseModel, root_validator, validator
7
- from pydantic.types import PositiveInt
6
+ from pydantic.v1 import BaseModel, root_validator, validator
7
+ from pydantic.v1.types import PositiveInt
8
8
  import pytz
9
9
 
10
10
  from robusta.core.playbooks.playbook_utils import replace_env_vars_values
@@ -1,6 +1,6 @@
1
1
  import abc
2
2
 
3
- from pydantic import BaseModel
3
+ from pydantic.v1 import BaseModel
4
4
 
5
5
  from robusta.core.sinks.sink_base_params import SinkBaseParams
6
6