robusta-cli 0.10.31__tar.gz → 0.10.32a0__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 (287) hide show
  1. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/PKG-INFO +4 -3
  2. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/pyproject.toml +7 -6
  3. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/_version.py +1 -1
  4. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/api/__init__.py +4 -2
  5. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/discovery/discovery.py +48 -1
  6. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/discovery/resource_names.py +5 -1
  7. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/env_vars.py +4 -0
  8. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/events.py +1 -1
  9. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/crash_reporter.py +2 -2
  10. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/internal/discovery_events.py +1 -1
  11. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/playbooks_event_handler_impl.py +4 -0
  12. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +3 -2
  13. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/pod_utils/imagepull_utils.py +3 -1
  14. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/pod_utils/pending_pod_utils.py +2 -1
  15. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/__init__.py +4 -2
  16. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/base.py +15 -45
  17. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/blocks.py +203 -24
  18. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/dal/model_conversion.py +3 -0
  19. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/prometheus_health_checker.py +2 -2
  20. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/sink_base_params.py +1 -31
  21. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/transformer.py +6 -17
  22. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/autogenerated/events.py +123 -197
  23. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/autogenerated/triggers.py +777 -80
  24. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/autogenerated/v1/models.py +2 -2
  25. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/base_event.py +1 -1
  26. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/base_triggers.py +131 -4
  27. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/custom_models.py +88 -3
  28. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/prometheus/trigger.py +20 -1
  29. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/prometheus/utils.py +0 -1
  30. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/scheduled/event.py +1 -1
  31. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/cluster_provider_discovery.py +1 -1
  32. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/common.py +1 -0
  33. robusta_cli-0.10.32a0/src/robusta/utils/scope.py +92 -0
  34. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/silence_utils.py +7 -7
  35. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/LICENSE +0 -0
  36. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/__init__.py +0 -0
  37. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/__init__.py +0 -0
  38. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/auth.py +0 -0
  39. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/backend_profile.py +0 -0
  40. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/eula.py +0 -0
  41. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/integrations_cmd.py +0 -0
  42. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/main.py +0 -0
  43. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/playbooks_cmd.py +0 -0
  44. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/self_host.py +0 -0
  45. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/slack_feedback_message.py +0 -0
  46. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/slack_verification.py +0 -0
  47. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/cli/utils.py +0 -0
  48. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/__init__.py +0 -0
  49. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/discovery/__init__.py +0 -0
  50. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/discovery/top_service_resolver.py +0 -0
  51. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/discovery/utils.py +0 -0
  52. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/exceptions.py +0 -0
  53. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/__init__.py +0 -0
  54. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/base_params.py +0 -0
  55. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/cluster_status.py +0 -0
  56. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/helm_release.py +0 -0
  57. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/jobs.py +0 -0
  58. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/k8s_operation_type.py +0 -0
  59. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/namespaces.py +0 -0
  60. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/nodes.py +0 -0
  61. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/pods.py +0 -0
  62. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/runner_config.py +0 -0
  63. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/model/services.py +0 -0
  64. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/persistency/__init__.py +0 -0
  65. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/persistency/in_memory.py +0 -0
  66. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/persistency/scheduled_jobs_states_dal.py +0 -0
  67. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/__init__.py +0 -0
  68. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/actions_registry.py +0 -0
  69. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/base_trigger.py +0 -0
  70. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/common.py +0 -0
  71. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/container_playbook_utils.py +0 -0
  72. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/generation.py +0 -0
  73. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/job_utils.py +0 -0
  74. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/node_playbook_utils.py +0 -0
  75. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/oom_killer_utils.py +0 -0
  76. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/playbook_utils.py +0 -0
  77. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/playbooks_event_handler.py +0 -0
  78. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/prometheus_enrichment_utils.py +0 -0
  79. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/playbooks/trigger.py +0 -0
  80. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/pubsub/__init__.py +0 -0
  81. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/pubsub/event_emitter.py +0 -0
  82. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/pubsub/event_subscriber.py +0 -0
  83. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/pubsub/events_pubsub.py +0 -0
  84. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/action_requests.py +0 -0
  85. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/callbacks.py +0 -0
  86. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/consts.py +0 -0
  87. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/custom_rendering.py +0 -0
  88. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/finding_subjects.py +0 -0
  89. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/reporting/utils.py +0 -0
  90. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/schedule/__init__.py +0 -0
  91. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/schedule/model.py +0 -0
  92. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/schedule/scheduler.py +0 -0
  93. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/__init__.py +0 -0
  94. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/common/__init__.py +0 -0
  95. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/common/html_tools.py +0 -0
  96. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/datadog/__init__.py +0 -0
  97. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/datadog/datadog_sink.py +0 -0
  98. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/datadog/datadog_sink_params.py +0 -0
  99. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/discord/__init__.py +0 -0
  100. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/discord/discord_sink.py +0 -0
  101. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/discord/discord_sink_params.py +0 -0
  102. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/file/__init__.py +0 -0
  103. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/file/file_sink.py +0 -0
  104. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/file/file_sink_params.py +0 -0
  105. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/file/object_traverser.py +0 -0
  106. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/google_chat/__init__.py +0 -0
  107. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/google_chat/google_chat.py +0 -0
  108. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/google_chat/google_chat_params.py +0 -0
  109. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/jira/__init__.py +0 -0
  110. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/jira/jira_sink.py +0 -0
  111. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/jira/jira_sink_params.py +0 -0
  112. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/kafka/__init__.py +0 -0
  113. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/kafka/kafka_sink.py +0 -0
  114. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/kafka/kafka_sink_params.py +0 -0
  115. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/mail/__init__.py +0 -0
  116. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/mail/mail_sink.py +0 -0
  117. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/mail/mail_sink_params.py +0 -0
  118. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/mattermost/__init__.py +0 -0
  119. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/mattermost/mattermost_sink.py +0 -0
  120. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/mattermost/mattermost_sink_params.py +0 -0
  121. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/msteams/__init__.py +0 -0
  122. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/msteams/msteams_sink.py +0 -0
  123. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/msteams/msteams_sink_params.py +0 -0
  124. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/opsgenie/__init__.py +0 -0
  125. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/opsgenie/opsgenie_sink.py +0 -0
  126. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/opsgenie/opsgenie_sink_params.py +0 -0
  127. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/pagerduty/__init__.py +0 -0
  128. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/pagerduty/pagerduty_sink.py +0 -0
  129. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/pagerduty/pagerduty_sink_params.py +0 -0
  130. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/pushover/__init__.py +0 -0
  131. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/pushover/pushover_client.py +0 -0
  132. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/pushover/pushover_sink.py +0 -0
  133. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/pushover/pushover_sink_params.py +0 -0
  134. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/__init__.py +0 -0
  135. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/dal/__init__.py +0 -0
  136. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/dal/supabase_dal.py +0 -0
  137. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/discovery_metrics.py +0 -0
  138. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/robusta_sink.py +0 -0
  139. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/robusta_sink_params.py +0 -0
  140. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/rrm/__init__.py +0 -0
  141. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/rrm/account_resource_fetcher.py +0 -0
  142. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/rrm/base_resource_manager.py +0 -0
  143. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/rrm/prometheus_alert_resource_manager.py +0 -0
  144. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/rrm/rrm.py +0 -0
  145. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/robusta/rrm/types.py +0 -0
  146. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/rocketchat/__init__.py +0 -0
  147. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/rocketchat/rocketchat_sink.py +0 -0
  148. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/rocketchat/rocketchat_sink_params.py +0 -0
  149. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/servicenow/__init__.py +0 -0
  150. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/servicenow/servicenow_sink.py +0 -0
  151. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/servicenow/servicenow_sink_params.py +0 -0
  152. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/sink_base.py +0 -0
  153. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/sink_config.py +0 -0
  154. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/sink_factory.py +0 -0
  155. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/slack/__init__.py +0 -0
  156. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/slack/slack_sink.py +0 -0
  157. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/slack/slack_sink_params.py +0 -0
  158. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/telegram/__init__.py +0 -0
  159. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/telegram/telegram_client.py +0 -0
  160. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/telegram/telegram_sink.py +0 -0
  161. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/telegram/telegram_sink_params.py +0 -0
  162. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/timing.py +0 -0
  163. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/victorops/__init__.py +0 -0
  164. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/victorops/victorops_sink.py +0 -0
  165. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/victorops/victorops_sink_params.py +0 -0
  166. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/webex/__init__.py +0 -0
  167. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/webex/webex_sink.py +0 -0
  168. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/webex/webex_sink_params.py +0 -0
  169. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/webhook/__init__.py +0 -0
  170. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/webhook/webhook_sink.py +0 -0
  171. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/webhook/webhook_sink_params.py +0 -0
  172. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/yamessenger/__init__.py +0 -0
  173. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/yamessenger/yamessenger_client.py +0 -0
  174. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/yamessenger/yamessenger_sink.py +0 -0
  175. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/sinks/yamessenger/yamessenger_sink_params.py +0 -0
  176. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/container_oom_killed_trigger.py +0 -0
  177. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/custom_triggers.py +0 -0
  178. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/error_event_trigger.py +0 -0
  179. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/helm_releases_triggers.py +0 -0
  180. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/job_failed_trigger.py +0 -0
  181. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/multi_resources_trigger.py +0 -0
  182. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/oom_killed_trigger_base.py +0 -0
  183. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/pod_crash_loop_trigger.py +0 -0
  184. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/pod_image_pull_backoff.py +0 -0
  185. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/core/triggers/pod_oom_killed_trigger.py +0 -0
  186. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/__init__.py +0 -0
  187. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/argocd/argocd_client.py +0 -0
  188. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/common/__init__.py +0 -0
  189. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/common/requests.py +0 -0
  190. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/discord/__init__.py +0 -0
  191. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/discord/sender.py +0 -0
  192. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/git/__init__.py +0 -0
  193. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/git/git_repo.py +0 -0
  194. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/git/well_known_hosts.py +0 -0
  195. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/google_chat/__init__.py +0 -0
  196. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/google_chat/sender.py +0 -0
  197. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/grafana.py +0 -0
  198. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/helper.py +0 -0
  199. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/jira/__init__.py +0 -0
  200. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/jira/client.py +0 -0
  201. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/jira/sender.py +0 -0
  202. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/__init__.py +0 -0
  203. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/api_client_utils.py +0 -0
  204. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/autogenerated/__init__.py +0 -0
  205. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/autogenerated/models.py +0 -0
  206. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/autogenerated/v1/__init__.py +0 -0
  207. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/model_not_found_exception.py +0 -0
  208. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/process_utils.py +0 -0
  209. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/kubernetes/templates.py +0 -0
  210. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/mail/__init__.py +0 -0
  211. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/mail/sender.py +0 -0
  212. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/mattermost/__init__.py +0 -0
  213. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/mattermost/client.py +0 -0
  214. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/mattermost/sender.py +0 -0
  215. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/__init__.py +0 -0
  216. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_adaptive_card_files.py +0 -0
  217. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_image.py +0 -0
  218. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_text.py +0 -0
  219. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/__init__.py +0 -0
  220. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_action.py +0 -0
  221. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_base.py +0 -0
  222. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_card.py +0 -0
  223. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_column.py +0 -0
  224. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_container.py +0 -0
  225. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_images.py +0 -0
  226. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_table.py +0 -0
  227. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_elements/msteams_text_block.py +0 -0
  228. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_mark_down_fix_url.py +0 -0
  229. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/msteams_msg.py +0 -0
  230. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/msteams/sender.py +0 -0
  231. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/openshift/__init__.py +0 -0
  232. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/openshift/token.py +0 -0
  233. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/prometheus/__init__.py +0 -0
  234. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/prometheus/models.py +0 -0
  235. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/receiver.py +0 -0
  236. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/resource_analysis/__init__.py +0 -0
  237. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/resource_analysis/cpu_analyzer.py +0 -0
  238. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/resource_analysis/memory_analyzer.py +0 -0
  239. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/resource_analysis/node_cpu_analyzer.py +0 -0
  240. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/resource_analysis/prometheus_analyzer.py +0 -0
  241. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/rocketchat/__init__.py +0 -0
  242. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/rocketchat/sender.py +0 -0
  243. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/scheduled/__init__.py +0 -0
  244. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/scheduled/models.py +0 -0
  245. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/scheduled/playbook_scheduler.py +0 -0
  246. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/scheduled/playbook_scheduler_manager.py +0 -0
  247. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/scheduled/playbook_scheduler_manager_impl.py +0 -0
  248. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/scheduled/trigger.py +0 -0
  249. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/servicenow/__init__.py +0 -0
  250. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/servicenow/sender.py +0 -0
  251. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/slack/__init__.py +0 -0
  252. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/slack/sender.py +0 -0
  253. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/webex/__init__.py +0 -0
  254. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/integrations/webex/sender.py +0 -0
  255. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/model/alert_relabel_config.py +0 -0
  256. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/model/config.py +0 -0
  257. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/model/playbook_action.py +0 -0
  258. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/model/playbook_definition.py +0 -0
  259. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/patch/patch.py +0 -0
  260. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/__init__.py +0 -0
  261. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/config_loader.py +0 -0
  262. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/log_init.py +0 -0
  263. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/main.py +0 -0
  264. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/not_found_exception.py +0 -0
  265. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/object_updater.py +0 -0
  266. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/process_setup.py +0 -0
  267. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/ssl_utils.py +0 -0
  268. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/telemetry.py +0 -0
  269. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/telemetry_service.py +0 -0
  270. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/web.py +0 -0
  271. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/runner/web_api.py +0 -0
  272. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/__init__.py +0 -0
  273. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/auth_provider.py +0 -0
  274. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/base64_utils.py +0 -0
  275. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/decorators.py +0 -0
  276. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/docs.py +0 -0
  277. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/documented_pydantic.py +0 -0
  278. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/error_codes.py +0 -0
  279. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/file_system_watcher.py +0 -0
  280. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/function_hashes.py +0 -0
  281. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/json_schema.py +0 -0
  282. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/parsing.py +0 -0
  283. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/rate_limiter.py +0 -0
  284. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/server_start.py +0 -0
  285. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/service_discovery.py +0 -0
  286. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/stack_tracer.py +0 -0
  287. {robusta_cli-0.10.31 → robusta_cli-0.10.32a0}/src/robusta/utils/task_queue.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: robusta-cli
3
- Version: 0.10.31
3
+ Version: 0.10.32a0
4
4
  Summary:
5
5
  Author: Natan Yellin
6
6
  Author-email: aantn@users.noreply.github.com
@@ -20,9 +20,9 @@ Requires-Dist: bitmath (>=1.3.3.1,<2.0.0.0)
20
20
  Requires-Dist: click-spinner (>=0.1.10,<0.2.0)
21
21
  Requires-Dist: colorlog (>=5.0.1,<6.0.0)
22
22
  Requires-Dist: croniter (>=1.3.15,<2.0.0)
23
- Requires-Dist: cryptography (>=39.0.1,<40.0.0)
23
+ Requires-Dist: cryptography (>=42.0.5,<43.0.0)
24
24
  Requires-Dist: datadog-api-client (>=1.2.0,<2.0.0) ; extra == "all"
25
- Requires-Dist: docutils (>=0.17.0,<0.18.0)
25
+ Requires-Dist: docutils (==0.19)
26
26
  Requires-Dist: dpath (>=2.0.5,<3.0.0)
27
27
  Requires-Dist: dulwich (==0.20.28) ; extra == "all"
28
28
  Requires-Dist: fpdf2 (>=2.7.1,<3.0.0)
@@ -36,6 +36,7 @@ Requires-Dist: poetry-core (==1.1.0a7) ; extra == "all"
36
36
  Requires-Dist: prometheus-client (>=0.12.0,<0.13.0)
37
37
  Requires-Dist: prometrix (==0.1.16)
38
38
  Requires-Dist: pydantic (>=1.8.1,<2.0.0)
39
+ Requires-Dist: pydash (==8.0.0)
39
40
  Requires-Dist: pymsteams (>=0.1.16,<0.2.0)
40
41
  Requires-Dist: pytz (>=2021.3,<2022.0)
41
42
  Requires-Dist: pyyaml (>=6.0,<7.0)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "robusta-cli"
3
- version = "0.10.31"
3
+ version = "0.10.32-alpha"
4
4
  description = ""
5
5
  authors = ["Natan Yellin <aantn@users.noreply.github.com>"]
6
6
  packages = [
@@ -48,7 +48,7 @@ prometheus-client = "^0.12.0"
48
48
  pyyaml = "^6.0"
49
49
  pytz = "^2021.3"
50
50
  poetry-core = "1.1.0a7"
51
- docutils="^0.17.0"
51
+ docutils="0.19"
52
52
  sentry-sdk = { version = "^1.5.2", optional = true }
53
53
  opsgenie-sdk = "^2.1.5"
54
54
  markdown2 = "^2.4.2"
@@ -62,7 +62,7 @@ croniter = "^1.3.15"
62
62
  # and therefore requires gcc to install which we'd like to avoid
63
63
  # this is similar to the issue at https://github.com/dulwich/dulwich/issues/839
64
64
  dulwich = { version = "0.20.28", optional = true }
65
- cryptography = "^39.0.1"
65
+ cryptography = "^42.0.5"
66
66
  PyJWT = "2.4.0"
67
67
  fpdf2 = "^2.7.1"
68
68
  attrs = "^23.1.0"
@@ -70,21 +70,22 @@ prometrix = "0.1.16"
70
70
  hikaru-model-26 = "^1.1.1"
71
71
  apprise = "^1.5.0"
72
72
  rocketchat-api = "^1.30.0"
73
+ pydash = "8.0.0"
73
74
 
74
75
  [tool.poetry.dev-dependencies]
75
76
  pre-commit = "^2.13.0"
76
77
  pytest = "^6.2.4"
77
78
  python-dotenv = "^0.18.0"
78
- Sphinx = "^4.3.2"
79
+ Sphinx = "6.2.1"
79
80
  #furo = "^2021.11.12"
80
81
  sphinx-autobuild = "^2021.3.14"
81
82
  sphinx-copybutton = "^0.4.0"
82
- sphinx-design = "^0.0.13"
83
+ sphinx-design = "0.5.0"
83
84
  witchhazel = "^2018.8.23"
84
85
  sphinx-autodoc-typehints = "^1.12.0"
85
86
  sphinxcontrib-images = "^0.9.4"
86
87
  jsonref = "^0.2"
87
- Pillow = "^10.2.0"
88
+ Pillow = "^10.3.0"
88
89
  sphinxcontrib-mermaid = "^0.7.1"
89
90
  humanize = "^3.13.1"
90
91
  cssselect = "^1.1.0"
@@ -1,2 +1,2 @@
1
1
  # this is updated by .github/workflows/release.yaml
2
- __version__ = "0.10.31"
2
+ __version__ = "0.10.32-alpha"
@@ -155,9 +155,11 @@ from robusta.core.reporting import (
155
155
  MarkdownBlock,
156
156
  PrometheusBlock,
157
157
  ScanReportBlock,
158
+ PopeyeScanReportBlock,
159
+ KRRScanReportBlock,
158
160
  ScanReportRow,
159
161
  TableBlock,
160
- VideoLink
162
+ VideoLink,
161
163
  )
162
164
 
163
165
  from robusta.core.reporting.base import EnrichmentType
@@ -318,7 +320,7 @@ from robusta.utils.parsing import load_json
318
320
  from robusta.utils.rate_limiter import RateLimiter
319
321
  from robusta.utils.silence_utils import (
320
322
  AddSilenceParams,
321
- BaseSilenceParams,
323
+ AlertManagerParams,
322
324
  DeleteSilenceParams,
323
325
  Silence,
324
326
  SilenceOperation,
@@ -42,6 +42,7 @@ from pydantic import BaseModel
42
42
  from robusta.core.discovery import utils
43
43
  from robusta.core.model.cluster_status import ClusterStats
44
44
  from robusta.core.model.env_vars import (
45
+ ARGO_ROLLOUTS,
45
46
  DISABLE_HELM_MONITORING,
46
47
  DISCOVERY_BATCH_SIZE,
47
48
  DISCOVERY_MAX_BATCHES,
@@ -53,7 +54,7 @@ from robusta.core.model.helm_release import HelmRelease
53
54
  from robusta.core.model.jobs import JobInfo
54
55
  from robusta.core.model.namespaces import NamespaceInfo
55
56
  from robusta.core.model.services import ContainerInfo, ServiceConfig, ServiceInfo, VolumeInfo
56
- from robusta.integrations.kubernetes.custom_models import DeploymentConfig, DictToK8sObj
57
+ from robusta.integrations.kubernetes.custom_models import DeploymentConfig, DictToK8sObj, Rollout
57
58
  from robusta.patch.patch import create_monkey_patches
58
59
  from robusta.utils.cluster_provider_discovery import cluster_provider
59
60
  from robusta.utils.stack_tracer import StackTracer
@@ -231,6 +232,52 @@ class Discovery:
231
232
  if not continue_ref:
232
233
  break
233
234
 
235
+ # rollouts.
236
+ continue_ref = None
237
+ if ARGO_ROLLOUTS:
238
+ for _ in range(DISCOVERY_MAX_BATCHES):
239
+ try:
240
+ rollouts_res = client.CustomObjectsApi().list_cluster_custom_object(
241
+ group=Rollout.group,
242
+ version=Rollout.version,
243
+ plural=Rollout.plural,
244
+ limit=DISCOVERY_BATCH_SIZE,
245
+ _continue=continue_ref,
246
+ )
247
+ except Exception:
248
+ logging.exception(msg="Failed to list Argo Rollouts from api.")
249
+ break
250
+
251
+ for ro in rollouts_res.get("items", []):
252
+ try:
253
+ meta = DictToK8sObj(ro.get("metadata"), V1ObjectMeta)
254
+ spec = ro.get("spec", {})
255
+ template = DictToK8sObj(spec.get("template"), V1PodTemplateSpec)
256
+ status = ro.get("status", {})
257
+
258
+ active_services.extend(
259
+ [
260
+ Discovery.__create_service_info(
261
+ meta=meta,
262
+ kind=Rollout.kind,
263
+ containers=template.spec.containers if template else [],
264
+ volumes=template.spec.volumes if template else [],
265
+ total_pods=status.get("replicas", 1),
266
+ ready_pods=status.get("readyReplicas", 0),
267
+ is_helm_release=is_release_managed_by_helm(
268
+ annotations=meta.annotations, labels=meta.labels
269
+ ),
270
+ )
271
+ ]
272
+ )
273
+ except Exception:
274
+ logging.exception(msg=f"Failed to parse Rollout/n {ro}")
275
+ continue
276
+
277
+ continue_ref = rollouts_res.get("metadata", {}).get("continue")
278
+ if not continue_ref:
279
+ break
280
+
234
281
  # discover deployments
235
282
  # using k8s api `continue` to load in batches
236
283
  continue_ref = None
@@ -3,7 +3,7 @@ from typing import Callable, List, Optional
3
3
  from kubernetes import client
4
4
  from pydantic import BaseModel
5
5
 
6
- from robusta.integrations.kubernetes.custom_models import DeploymentConfig
6
+ from robusta.integrations.kubernetes.custom_models import DeploymentConfig, Rollout
7
7
  from robusta.utils.error_codes import ActionException, ErrorCodes
8
8
 
9
9
 
@@ -59,6 +59,10 @@ LISTERS = { # TODO add ingress and cronjobs once upgrading the k8s client versi
59
59
  list_all=DeploymentConfig.list_for_all_namespaces,
60
60
  list_namespaced=DeploymentConfig.list_namespaced,
61
61
  ),
62
+ "rollout": ResourceLister(
63
+ list_all=Rollout.list_for_all_namespaces,
64
+ list_namespaced=Rollout.list_namespaced,
65
+ ),
62
66
  }
63
67
 
64
68
 
@@ -109,3 +109,7 @@ IS_OPENSHIFT = load_bool("IS_OPENSHIFT", False)
109
109
  ENABLE_GRAPH_BLOCK = load_bool("ENABLE_GRAPH_BLOCK", False)
110
110
 
111
111
  RUN_AS_SUBPROCESS = load_bool("RUN_AS_SUBPROCESS", True)
112
+
113
+ ARGO_ROLLOUTS = load_bool("ARGO_ROLLOUTS", False)
114
+ # lowered case k8s kinds in a json array string. "[\"configmap\", \"secret\"]"
115
+ RESOURCE_YAML_BLOCK_LIST = json.loads(os.environ.get("RESOURCE_YAML_BLOCK_LIST", "[]"))
@@ -76,7 +76,7 @@ class ExecutionBaseEvent:
76
76
 
77
77
  def create_default_finding(self) -> Finding:
78
78
  """Create finding default fields according to the event type"""
79
- return Finding(title="Robusta notification", aggregation_key="Generic finding key")
79
+ return Finding(title="Robusta notification", aggregation_key="GenericFindingKey")
80
80
 
81
81
  def set_all_sinks(self, all_sinks: Dict[str, SinkBase]):
82
82
  self.all_sinks = all_sinks
@@ -12,7 +12,7 @@ from robusta.integrations.kubernetes.custom_models import RegexReplacementStyle
12
12
 
13
13
  def send_crash_report(
14
14
  event: PodEvent,
15
- action_name: str,
15
+ aggregation_key: str,
16
16
  regex_replacer_patterns: Optional[NamedRegexPattern] = None,
17
17
  regex_replacement_style: Optional[RegexReplacementStyle] = None,
18
18
  ):
@@ -29,7 +29,7 @@ def send_crash_report(
29
29
  title=f"Crashing pod {pod.metadata.name} in namespace {pod.metadata.namespace}",
30
30
  source=FindingSource.KUBERNETES_API_SERVER,
31
31
  severity=FindingSeverity.HIGH,
32
- aggregation_key=action_name,
32
+ aggregation_key=aggregation_key,
33
33
  subject=PodFindingSubject(pod),
34
34
  )
35
35
 
@@ -71,7 +71,7 @@ def create_debug_event_finding(event: Event):
71
71
  source=FindingSource.KUBERNETES_API_SERVER,
72
72
  severity=FindingSeverity.DEBUG,
73
73
  finding_type=FindingType.ISSUE,
74
- aggregation_key=f"Kubernetes {event.type} Event",
74
+ aggregation_key=f"Kubernetes{event.type}Event",
75
75
  subject=FindingSubject(
76
76
  k8s_obj.name,
77
77
  subject_type,
@@ -18,6 +18,7 @@ from robusta.core.reporting import MarkdownBlock
18
18
  from robusta.core.reporting.base import Finding
19
19
  from robusta.core.reporting.consts import SYNC_RESPONSE_SINK
20
20
  from robusta.core.sinks.robusta.dal.model_conversion import ModelConversion
21
+ from robusta.integrations.kubernetes.base_triggers import K8sBaseTrigger
21
22
  from robusta.model.alert_relabel_config import AlertRelabel
22
23
  from robusta.model.config import Registry
23
24
  from robusta.model.playbook_action import PlaybookAction
@@ -52,6 +53,9 @@ class PlaybooksEventHandlerImpl(PlaybooksEventHandler):
52
53
  execution_event = None
53
54
  try:
54
55
  execution_event = fired_trigger.build_execution_event(trigger_event, sink_findings, build_context)
56
+ if isinstance(fired_trigger, K8sBaseTrigger):
57
+ if not fired_trigger.check_change_filters(execution_event):
58
+ continue
55
59
  # sink_findings needs to be shared between playbooks.
56
60
  # build_execution_event returns a different instance because it's running in a child process
57
61
  execution_event.sink_findings = sink_findings
@@ -4,6 +4,7 @@ from hikaru.model.rel_1_26 import Pod
4
4
 
5
5
  from robusta.core.reporting import TableBlock
6
6
  from robusta.core.reporting.base import Enrichment, EnrichmentType
7
+ from robusta.core.reporting.blocks import TableBlockFormat
7
8
 
8
9
 
9
10
  def get_crash_report_enrichments(
@@ -26,8 +27,6 @@ def get_crash_report_enrichments(
26
27
  crash_info_rows.append(["Restarts", container_status.restartCount])
27
28
 
28
29
  if container_status.state and container_status.state.terminated:
29
- if container_status.state.terminated.startedAt:
30
- crash_info_rows.append(["Crashing since", container_status.state.terminated.startedAt])
31
30
  crash_info_rows.append(["Status", "TERMINATED"])
32
31
  crash_info_rows.append(["Reason", container_status.state.terminated.reason])
33
32
 
@@ -47,11 +46,13 @@ def get_crash_report_enrichments(
47
46
  [[k, v] for (k, v) in crash_info_rows],
48
47
  ["label", "value"],
49
48
  table_name="*Crash Info*",
49
+ table_format=TableBlockFormat.vertical,
50
50
  )
51
51
  prev_container_table_block = TableBlock(
52
52
  [[k, v] for (k, v) in prev_container_rows],
53
53
  ["label", "value"],
54
54
  table_name="*Previous Container*",
55
+ table_format=TableBlockFormat.vertical,
55
56
  )
56
57
 
57
58
  pod_issues_enrichments.append(Enrichment(enrichment_type=EnrichmentType.crash_info,
@@ -9,6 +9,7 @@ from hikaru.model.rel_1_26 import ContainerStatus, Event, EventList, Pod, PodSta
9
9
 
10
10
  from robusta.core.reporting import BaseBlock, MarkdownBlock, TableBlock
11
11
  from robusta.core.reporting.base import EnrichmentType, Enrichment
12
+ from robusta.core.reporting.blocks import TableBlockFormat
12
13
 
13
14
 
14
15
  class ImagePullBackoffReason(Flag):
@@ -92,6 +93,7 @@ def get_image_pull_backoff_enrichment(pod: Pod) -> Enrichment:
92
93
  image_pull_table_blocks.append(TableBlock(
93
94
  [[k, v] for (k, v) in image_issue_rows],
94
95
  ["label", "value"],
96
+ table_format=TableBlockFormat.vertical,
95
97
  ))
96
98
 
97
99
  image_pull_table_blocks.extend(error_blocks)
@@ -106,7 +108,7 @@ def __imagepull_backoff_reason_to_fix(reason: ImagePullBackoffReason) -> Optiona
106
108
  if reason == ImagePullBackoffReason.RepoDoesntExist:
107
109
  return "Image not found", "Make sure the image repository, image name and image tag are correct."
108
110
  if reason == ImagePullBackoffReason.NotAuthorized:
109
- return "Unauthorized", 'The repo is access protected. Make sure to <a target="_blank" href="https:\/\/kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/">configure the correct image pull secrets</a>'
111
+ return "Unauthorized", 'The repo is access protected. Make sure to configure the correct image pull secrets: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry'
110
112
  if reason == ImagePullBackoffReason.Timeout:
111
113
  return "Timeout", 'If this does not resolved after a few minutes, make sure the image repository is responding.'
112
114
 
@@ -9,7 +9,7 @@ from robusta.core.model.pods import pod_other_requests, pod_requests
9
9
  from robusta.core.playbooks.common import get_event_timestamp
10
10
  from robusta.core.reporting import Enrichment
11
11
  from robusta.core.reporting.base import EnrichmentType
12
- from robusta.core.reporting.blocks import BaseBlock, MarkdownBlock, TableBlock
12
+ from robusta.core.reporting.blocks import BaseBlock, MarkdownBlock, TableBlock, TableBlockFormat
13
13
 
14
14
 
15
15
  def get_pending_pod_enrichment(pod: Pod) -> Enrichment:
@@ -23,6 +23,7 @@ def get_pending_pod_enrichment(pod: Pod) -> Enrichment:
23
23
  blocks = [TableBlock(
24
24
  [[k, v] for (k, v) in pending_rows],
25
25
  ["label", "value"],
26
+ table_format=TableBlockFormat.vertical,
26
27
  )]
27
28
 
28
29
  if all_reasons:
@@ -1,8 +1,8 @@
1
1
  from robusta.core.reporting.base import (
2
2
  BaseBlock,
3
3
  Emojis,
4
- Enrichment,
5
4
  Filterable,
5
+ Enrichment,
6
6
  Finding,
7
7
  FindingSeverity,
8
8
  FindingSource,
@@ -28,6 +28,8 @@ from robusta.core.reporting.blocks import (
28
28
  MarkdownBlock,
29
29
  PrometheusBlock,
30
30
  ScanReportBlock,
31
+ PopeyeScanReportBlock,
32
+ KRRScanReportBlock,
31
33
  ScanReportRow,
32
34
  TableBlock,
33
35
  )
@@ -40,8 +42,8 @@ __all__ = [
40
42
  "VideoLink",
41
43
  "FindingSource",
42
44
  "Enrichment",
43
- "FindingSubjectType",
44
45
  "Filterable",
46
+ "FindingSubjectType",
45
47
  "FindingSubject",
46
48
  "Finding",
47
49
  "MarkdownBlock",
@@ -3,6 +3,7 @@ import logging
3
3
  import re
4
4
  import urllib.parse
5
5
  import uuid
6
+ from abc import ABC, abstractmethod
6
7
  from datetime import datetime
7
8
  from enum import Enum
8
9
  from typing import Any, Dict, List, Optional, Union
@@ -13,6 +14,7 @@ from pydantic.main import BaseModel
13
14
  from robusta.core.discovery.top_service_resolver import TopServiceResolver
14
15
  from robusta.core.model.env_vars import ROBUSTA_UI_DOMAIN
15
16
  from robusta.core.reporting.consts import FindingSource, FindingSubjectType, FindingType
17
+ from robusta.utils.scope import BaseScopeMatcher
16
18
 
17
19
 
18
20
  class BaseBlock(BaseModel):
@@ -129,8 +131,17 @@ class Enrichment:
129
131
  return f"annotations: {self.annotations} Enrichment: {self.blocks} "
130
132
 
131
133
 
132
- class Filterable:
134
+ class FilterableScopeMatcher(BaseScopeMatcher):
135
+ def __init__(self, data):
136
+ self.data = data
137
+
138
+ def get_data(self) -> Dict:
139
+ return self.data
140
+
141
+
142
+ class Filterable(ABC):
133
143
  @property
144
+ @abstractmethod
134
145
  def attribute_map(self) -> Dict[str, Union[str, Dict[str, str]]]:
135
146
  raise NotImplementedError
136
147
 
@@ -158,11 +169,12 @@ class Filterable:
158
169
  # 1. "scope" check
159
170
  accept = True
160
171
  if scope_requirements is not None:
172
+ matcher = FilterableScopeMatcher(self.attribute_map)
161
173
  if scope_requirements.exclude:
162
- if self.scope_inc_exc_matches(scope_requirements.exclude):
174
+ if matcher.scope_inc_exc_matches(scope_requirements.exclude):
163
175
  return False
164
176
  if scope_requirements.include:
165
- if self.scope_inc_exc_matches(scope_requirements.include):
177
+ if matcher.scope_inc_exc_matches(scope_requirements.include):
166
178
  return True
167
179
  else: # include was defined, but not matched. So if not matched by old matcher, should be rejected!
168
180
  accept = False
@@ -178,48 +190,6 @@ class Filterable:
178
190
  return False
179
191
  return accept
180
192
 
181
- def scope_inc_exc_matches(self, scope_inc_exc: Optional[list]):
182
- return any(self.scope_matches(scope) for scope in scope_inc_exc)
183
-
184
- def scope_matches(self, scope: Dict[str, List[str]]):
185
- # scope is e.g. {'labels': ['app=oomki.*,app!=X.*Y']}
186
- # or {'name': ['pod-xyz.*'], 'title': ['fdc.*a', 'fdd.*b'], 'type': ['ISSUE']}
187
- for attr_name, attr_matchers in scope.items():
188
- if not self.scope_attribute_matches(attr_name, attr_matchers):
189
- return False
190
- return True
191
-
192
- def scope_attribute_matches(self, attr_name: str, attr_matchers: List[str]):
193
- if attr_name not in self.attribute_map:
194
- raise ValueError(f'Scope match on unknown attribute "{attr_name}"')
195
- attr_value = self.attribute_map[attr_name]
196
- for attr_matcher in attr_matchers:
197
- if attr_name in ["labels", "annotations"]:
198
- return self.match_labels_annotations(attr_matcher, attr_value)
199
- elif re.fullmatch(attr_matcher, attr_value):
200
- return True
201
- return False
202
-
203
- def match_labels_annotations(self, labels_match_expr: str, labels: Dict[str, str]):
204
- for label_match in labels_match_expr.split(","):
205
- if not self.label_matches(label_match, labels):
206
- return False
207
- return True
208
-
209
- def label_matches(self, label_match: str, labels: Dict[str, str]):
210
- label_name, label_regex = label_match.split("=", 1)
211
- label_name = label_name.strip()
212
- label_regex = label_regex.strip()
213
- if label_name.endswith("!"): # label_name!=match_expr
214
- label_name = label_name[:-1].rstrip()
215
- expect_match = False
216
- else:
217
- expect_match = True
218
- label_value = labels.get(label_name)
219
- if label_value is None: # no label with that name
220
- return False
221
- return bool(re.fullmatch(label_regex, label_value.strip())) == expect_match
222
-
223
193
 
224
194
  class FindingSubject:
225
195
  def __init__(