robusta-cli 0.10.29__tar.gz → 0.10.30__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 (289) hide show
  1. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/PKG-INFO +4 -3
  2. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/pyproject.toml +5 -4
  3. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/_version.py +1 -1
  4. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/api/__init__.py +6 -4
  5. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/main.py +0 -7
  6. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/env_vars.py +3 -0
  7. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/events.py +16 -3
  8. robusta_cli-0.10.30/src/robusta/core/playbooks/crash_reporter.py +65 -0
  9. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/oom_killer_utils.py +21 -7
  10. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/playbooks_event_handler_impl.py +1 -0
  11. robusta_cli-0.10.30/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +61 -0
  12. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/pod_utils/imagepull_utils.py +50 -42
  13. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/pod_utils/pending_pod_utils.py +15 -6
  14. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/prometheus_enrichment_utils.py +43 -35
  15. robusta_cli-0.10.30/src/robusta/core/pubsub/event_emitter.py +7 -0
  16. robusta_cli-0.10.30/src/robusta/core/pubsub/event_subscriber.py +17 -0
  17. robusta_cli-0.10.30/src/robusta/core/pubsub/events_pubsub.py +20 -0
  18. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/__init__.py +2 -0
  19. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/base.py +71 -7
  20. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/blocks.py +32 -1
  21. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/consts.py +21 -0
  22. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/dal/model_conversion.py +18 -4
  23. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/dal/supabase_dal.py +99 -46
  24. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/robusta_sink.py +23 -4
  25. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/sink_base.py +5 -2
  26. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/sink_base_params.py +31 -0
  27. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/transformer.py +3 -3
  28. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/git/git_repo.py +33 -8
  29. robusta_cli-0.10.30/src/robusta/integrations/git/well_known_hosts.py +16 -0
  30. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/custom_models.py +13 -7
  31. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/sender.py +1 -1
  32. robusta_cli-0.10.30/src/robusta/integrations/openshift/__init__.py +1 -0
  33. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/resource_analysis/node_cpu_analyzer.py +6 -3
  34. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/resource_analysis/prometheus_analyzer.py +4 -2
  35. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/model/config.py +13 -0
  36. robusta_cli-0.10.30/src/robusta/runner/process_setup.py +21 -0
  37. robusta_cli-0.10.30/src/robusta/utils/__init__.py +0 -0
  38. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/auth_provider.py +3 -3
  39. robusta_cli-0.10.29/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +0 -57
  40. robusta_cli-0.10.29/src/robusta/integrations/openshift/__init__.py +0 -1
  41. robusta_cli-0.10.29/src/robusta/runner/process_setup.py +0 -18
  42. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/LICENSE +0 -0
  43. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/__init__.py +0 -0
  44. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/__init__.py +0 -0
  45. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/auth.py +0 -0
  46. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/backend_profile.py +0 -0
  47. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/eula.py +0 -0
  48. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/integrations_cmd.py +0 -0
  49. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/playbooks_cmd.py +0 -0
  50. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/self_host.py +0 -0
  51. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/slack_feedback_message.py +0 -0
  52. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/slack_verification.py +0 -0
  53. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/cli/utils.py +0 -0
  54. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/__init__.py +0 -0
  55. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/discovery/__init__.py +0 -0
  56. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/discovery/discovery.py +0 -0
  57. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/discovery/resource_names.py +0 -0
  58. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/discovery/top_service_resolver.py +0 -0
  59. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/discovery/utils.py +0 -0
  60. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/exceptions.py +0 -0
  61. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/__init__.py +0 -0
  62. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/base_params.py +0 -0
  63. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/cluster_status.py +0 -0
  64. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/helm_release.py +0 -0
  65. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/jobs.py +0 -0
  66. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/k8s_operation_type.py +0 -0
  67. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/namespaces.py +0 -0
  68. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/nodes.py +0 -0
  69. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/pods.py +0 -0
  70. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/runner_config.py +0 -0
  71. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/model/services.py +0 -0
  72. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/persistency/__init__.py +0 -0
  73. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/persistency/in_memory.py +0 -0
  74. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/persistency/scheduled_jobs_states_dal.py +0 -0
  75. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/__init__.py +0 -0
  76. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/actions_registry.py +0 -0
  77. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/base_trigger.py +0 -0
  78. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/common.py +0 -0
  79. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/container_playbook_utils.py +0 -0
  80. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/generation.py +0 -0
  81. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/internal/discovery_events.py +0 -0
  82. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/job_utils.py +0 -0
  83. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/node_playbook_utils.py +0 -0
  84. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/playbook_utils.py +0 -0
  85. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/playbooks_event_handler.py +0 -0
  86. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/playbooks/trigger.py +0 -0
  87. {robusta_cli-0.10.29/src/robusta/core/schedule → robusta_cli-0.10.30/src/robusta/core/pubsub}/__init__.py +0 -0
  88. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/action_requests.py +0 -0
  89. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/callbacks.py +0 -0
  90. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/custom_rendering.py +0 -0
  91. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/finding_subjects.py +0 -0
  92. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/reporting/utils.py +0 -0
  93. {robusta_cli-0.10.29/src/robusta/core/sinks/common → robusta_cli-0.10.30/src/robusta/core/schedule}/__init__.py +0 -0
  94. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/schedule/model.py +0 -0
  95. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/schedule/scheduler.py +0 -0
  96. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/__init__.py +0 -0
  97. {robusta_cli-0.10.29/src/robusta/core/sinks/file → robusta_cli-0.10.30/src/robusta/core/sinks/common}/__init__.py +0 -0
  98. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/common/html_tools.py +0 -0
  99. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/datadog/__init__.py +0 -0
  100. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/datadog/datadog_sink.py +0 -0
  101. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/datadog/datadog_sink_params.py +0 -0
  102. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/discord/__init__.py +0 -0
  103. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/discord/discord_sink.py +0 -0
  104. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/discord/discord_sink_params.py +0 -0
  105. {robusta_cli-0.10.29/src/robusta/core/sinks/google_chat → robusta_cli-0.10.30/src/robusta/core/sinks/file}/__init__.py +0 -0
  106. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/file/file_sink.py +0 -0
  107. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/file/file_sink_params.py +0 -0
  108. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/file/object_traverser.py +0 -0
  109. {robusta_cli-0.10.29/src/robusta/core/sinks/mail → robusta_cli-0.10.30/src/robusta/core/sinks/google_chat}/__init__.py +0 -0
  110. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/google_chat/google_chat.py +0 -0
  111. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/google_chat/google_chat_params.py +0 -0
  112. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/jira/__init__.py +0 -0
  113. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/jira/jira_sink.py +0 -0
  114. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/jira/jira_sink_params.py +0 -0
  115. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/kafka/__init__.py +0 -0
  116. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/kafka/kafka_sink.py +0 -0
  117. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/kafka/kafka_sink_params.py +0 -0
  118. {robusta_cli-0.10.29/src/robusta/core/sinks/robusta/dal → robusta_cli-0.10.30/src/robusta/core/sinks/mail}/__init__.py +0 -0
  119. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/mail/mail_sink.py +0 -0
  120. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/mail/mail_sink_params.py +0 -0
  121. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/mattermost/__init__.py +0 -0
  122. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/mattermost/mattermost_sink.py +0 -0
  123. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/mattermost/mattermost_sink_params.py +0 -0
  124. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/msteams/__init__.py +0 -0
  125. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/msteams/msteams_sink.py +0 -0
  126. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/msteams/msteams_sink_params.py +0 -0
  127. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/opsgenie/__init__.py +0 -0
  128. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/opsgenie/opsgenie_sink.py +0 -0
  129. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/opsgenie/opsgenie_sink_params.py +0 -0
  130. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/pagerduty/__init__.py +0 -0
  131. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/pagerduty/pagerduty_sink.py +0 -0
  132. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/pagerduty/pagerduty_sink_params.py +0 -0
  133. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/pushover/__init__.py +0 -0
  134. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/pushover/pushover_client.py +0 -0
  135. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/pushover/pushover_sink.py +0 -0
  136. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/pushover/pushover_sink_params.py +0 -0
  137. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/__init__.py +0 -0
  138. {robusta_cli-0.10.29/src/robusta/core/sinks/robusta/rrm → robusta_cli-0.10.30/src/robusta/core/sinks/robusta/dal}/__init__.py +0 -0
  139. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/discovery_metrics.py +0 -0
  140. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/prometheus_health_checker.py +0 -0
  141. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/robusta_sink_params.py +0 -0
  142. {robusta_cli-0.10.29/src/robusta/core/sinks/rocketchat → robusta_cli-0.10.30/src/robusta/core/sinks/robusta/rrm}/__init__.py +0 -0
  143. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/rrm/account_resource_fetcher.py +0 -0
  144. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/rrm/base_resource_manager.py +0 -0
  145. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/rrm/prometheus_alert_resource_manager.py +0 -0
  146. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/rrm/rrm.py +0 -0
  147. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/robusta/rrm/types.py +0 -0
  148. {robusta_cli-0.10.29/src/robusta/core/sinks/servicenow → robusta_cli-0.10.30/src/robusta/core/sinks/rocketchat}/__init__.py +0 -0
  149. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/rocketchat/rocketchat_sink.py +0 -0
  150. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/rocketchat/rocketchat_sink_params.py +0 -0
  151. {robusta_cli-0.10.29/src/robusta/integrations → robusta_cli-0.10.30/src/robusta/core/sinks/servicenow}/__init__.py +0 -0
  152. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/servicenow/servicenow_sink.py +0 -0
  153. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/servicenow/servicenow_sink_params.py +0 -0
  154. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/sink_config.py +0 -0
  155. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/sink_factory.py +0 -0
  156. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/slack/__init__.py +0 -0
  157. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/slack/slack_sink.py +0 -0
  158. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/slack/slack_sink_params.py +0 -0
  159. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/telegram/__init__.py +0 -0
  160. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/telegram/telegram_client.py +0 -0
  161. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/telegram/telegram_sink.py +0 -0
  162. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/telegram/telegram_sink_params.py +0 -0
  163. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/timing.py +0 -0
  164. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/victorops/__init__.py +0 -0
  165. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/victorops/victorops_sink.py +0 -0
  166. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/victorops/victorops_sink_params.py +0 -0
  167. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/webex/__init__.py +0 -0
  168. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/webex/webex_sink.py +0 -0
  169. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/webex/webex_sink_params.py +0 -0
  170. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/webhook/__init__.py +0 -0
  171. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/webhook/webhook_sink.py +0 -0
  172. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/webhook/webhook_sink_params.py +0 -0
  173. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/yamessenger/__init__.py +0 -0
  174. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/yamessenger/yamessenger_client.py +0 -0
  175. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/yamessenger/yamessenger_sink.py +0 -0
  176. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/sinks/yamessenger/yamessenger_sink_params.py +0 -0
  177. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/container_oom_killed_trigger.py +0 -0
  178. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/custom_triggers.py +0 -0
  179. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/error_event_trigger.py +0 -0
  180. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/helm_releases_triggers.py +0 -0
  181. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/job_failed_trigger.py +0 -0
  182. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/multi_resources_trigger.py +0 -0
  183. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/oom_killed_trigger_base.py +0 -0
  184. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/pod_crash_loop_trigger.py +0 -0
  185. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/pod_image_pull_backoff.py +0 -0
  186. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/core/triggers/pod_oom_killed_trigger.py +0 -0
  187. {robusta_cli-0.10.29/src/robusta/integrations/common → robusta_cli-0.10.30/src/robusta/integrations}/__init__.py +0 -0
  188. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/argocd/argocd_client.py +0 -0
  189. {robusta_cli-0.10.29/src/robusta/integrations/discord → robusta_cli-0.10.30/src/robusta/integrations/common}/__init__.py +0 -0
  190. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/common/requests.py +0 -0
  191. {robusta_cli-0.10.29/src/robusta/integrations/git → robusta_cli-0.10.30/src/robusta/integrations/discord}/__init__.py +0 -0
  192. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/discord/sender.py +0 -0
  193. {robusta_cli-0.10.29/src/robusta/integrations/google_chat → robusta_cli-0.10.30/src/robusta/integrations/git}/__init__.py +0 -0
  194. {robusta_cli-0.10.29/src/robusta/integrations/jira → robusta_cli-0.10.30/src/robusta/integrations/google_chat}/__init__.py +0 -0
  195. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/google_chat/sender.py +0 -0
  196. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/grafana.py +0 -0
  197. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/helper.py +0 -0
  198. {robusta_cli-0.10.29/src/robusta/integrations/kubernetes → robusta_cli-0.10.30/src/robusta/integrations/jira}/__init__.py +0 -0
  199. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/jira/client.py +0 -0
  200. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/jira/sender.py +0 -0
  201. {robusta_cli-0.10.29/src/robusta/integrations/kubernetes/autogenerated → robusta_cli-0.10.30/src/robusta/integrations/kubernetes}/__init__.py +0 -0
  202. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/api_client_utils.py +0 -0
  203. {robusta_cli-0.10.29/src/robusta/integrations/kubernetes/autogenerated/v1 → robusta_cli-0.10.30/src/robusta/integrations/kubernetes/autogenerated}/__init__.py +0 -0
  204. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/autogenerated/events.py +0 -0
  205. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/autogenerated/models.py +0 -0
  206. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/autogenerated/triggers.py +0 -0
  207. {robusta_cli-0.10.29/src/robusta/integrations/mail → robusta_cli-0.10.30/src/robusta/integrations/kubernetes/autogenerated/v1}/__init__.py +0 -0
  208. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/autogenerated/v1/models.py +0 -0
  209. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/base_event.py +0 -0
  210. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/base_triggers.py +0 -0
  211. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/model_not_found_exception.py +0 -0
  212. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/process_utils.py +0 -0
  213. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/kubernetes/templates.py +0 -0
  214. {robusta_cli-0.10.29/src/robusta/integrations/mattermost → robusta_cli-0.10.30/src/robusta/integrations/mail}/__init__.py +0 -0
  215. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/mail/sender.py +0 -0
  216. {robusta_cli-0.10.29/src/robusta/integrations/msteams/msteams_elements → robusta_cli-0.10.30/src/robusta/integrations/mattermost}/__init__.py +0 -0
  217. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/mattermost/client.py +0 -0
  218. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/mattermost/sender.py +0 -0
  219. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/__init__.py +0 -0
  220. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_adaptive_card_files.py +0 -0
  221. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_adaptive_card_files_image.py +0 -0
  222. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_adaptive_card_files_text.py +0 -0
  223. {robusta_cli-0.10.29/src/robusta/integrations/prometheus → robusta_cli-0.10.30/src/robusta/integrations/msteams/msteams_elements}/__init__.py +0 -0
  224. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_action.py +0 -0
  225. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_base.py +0 -0
  226. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_card.py +0 -0
  227. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_column.py +0 -0
  228. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_container.py +0 -0
  229. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_images.py +0 -0
  230. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_table.py +0 -0
  231. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_elements/msteams_text_block.py +0 -0
  232. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_mark_down_fix_url.py +0 -0
  233. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/msteams/msteams_msg.py +0 -0
  234. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/openshift/token.py +0 -0
  235. {robusta_cli-0.10.29/src/robusta/integrations/resource_analysis → robusta_cli-0.10.30/src/robusta/integrations/prometheus}/__init__.py +0 -0
  236. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/prometheus/models.py +0 -0
  237. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/prometheus/trigger.py +0 -0
  238. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/prometheus/utils.py +0 -0
  239. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/receiver.py +0 -0
  240. {robusta_cli-0.10.29/src/robusta/integrations/rocketchat → robusta_cli-0.10.30/src/robusta/integrations/resource_analysis}/__init__.py +0 -0
  241. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/resource_analysis/cpu_analyzer.py +0 -0
  242. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/resource_analysis/memory_analyzer.py +0 -0
  243. {robusta_cli-0.10.29/src/robusta/integrations/scheduled → robusta_cli-0.10.30/src/robusta/integrations/rocketchat}/__init__.py +0 -0
  244. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/rocketchat/sender.py +0 -0
  245. {robusta_cli-0.10.29/src/robusta/integrations/servicenow → robusta_cli-0.10.30/src/robusta/integrations/scheduled}/__init__.py +0 -0
  246. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/scheduled/event.py +0 -0
  247. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/scheduled/models.py +0 -0
  248. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/scheduled/playbook_scheduler.py +0 -0
  249. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/scheduled/playbook_scheduler_manager.py +0 -0
  250. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/scheduled/playbook_scheduler_manager_impl.py +0 -0
  251. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/scheduled/trigger.py +0 -0
  252. {robusta_cli-0.10.29/src/robusta/integrations/webex → robusta_cli-0.10.30/src/robusta/integrations/servicenow}/__init__.py +0 -0
  253. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/servicenow/sender.py +0 -0
  254. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/slack/__init__.py +0 -0
  255. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/slack/sender.py +0 -0
  256. {robusta_cli-0.10.29/src/robusta/runner → robusta_cli-0.10.30/src/robusta/integrations/webex}/__init__.py +0 -0
  257. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/integrations/webex/sender.py +0 -0
  258. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/model/alert_relabel_config.py +0 -0
  259. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/model/playbook_action.py +0 -0
  260. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/model/playbook_definition.py +0 -0
  261. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/patch/patch.py +0 -0
  262. {robusta_cli-0.10.29/src/robusta/utils → robusta_cli-0.10.30/src/robusta/runner}/__init__.py +0 -0
  263. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/config_loader.py +0 -0
  264. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/log_init.py +0 -0
  265. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/main.py +0 -0
  266. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/not_found_exception.py +0 -0
  267. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/object_updater.py +0 -0
  268. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/ssl_utils.py +0 -0
  269. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/telemetry.py +0 -0
  270. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/telemetry_service.py +0 -0
  271. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/web.py +0 -0
  272. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/runner/web_api.py +0 -0
  273. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/base64_utils.py +0 -0
  274. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/cluster_provider_discovery.py +0 -0
  275. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/common.py +0 -0
  276. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/decorators.py +0 -0
  277. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/docs.py +0 -0
  278. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/documented_pydantic.py +0 -0
  279. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/error_codes.py +0 -0
  280. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/file_system_watcher.py +0 -0
  281. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/function_hashes.py +0 -0
  282. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/json_schema.py +0 -0
  283. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/parsing.py +0 -0
  284. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/rate_limiter.py +0 -0
  285. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/server_start.py +0 -0
  286. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/service_discovery.py +0 -0
  287. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/silence_utils.py +0 -0
  288. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/src/robusta/utils/stack_tracer.py +0 -0
  289. {robusta_cli-0.10.29 → robusta_cli-0.10.30}/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.29
3
+ Version: 0.10.30
4
4
  Summary:
5
5
  Author: Natan Yellin
6
6
  Author-email: aantn@users.noreply.github.com
@@ -20,7 +20,7 @@ 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 (>=36.0.0,<37.0.0)
23
+ Requires-Dist: cryptography (>=39.0.1,<40.0.0)
24
24
  Requires-Dist: datadog-api-client (>=1.2.0,<2.0.0) ; extra == "all"
25
25
  Requires-Dist: docutils (>=0.17.0,<0.18.0)
26
26
  Requires-Dist: dpath (>=2.0.5,<3.0.0)
@@ -34,13 +34,14 @@ Requires-Dist: markdown2 (>=2.4.2,<3.0.0)
34
34
  Requires-Dist: opsgenie-sdk (>=2.1.5,<3.0.0)
35
35
  Requires-Dist: poetry-core (==1.1.0a7) ; extra == "all"
36
36
  Requires-Dist: prometheus-client (>=0.12.0,<0.13.0)
37
- Requires-Dist: prometrix (==0.1.15)
37
+ Requires-Dist: prometrix (==0.1.16)
38
38
  Requires-Dist: pydantic (>=1.8.1,<2.0.0)
39
39
  Requires-Dist: pymsteams (>=0.1.16,<0.2.0)
40
40
  Requires-Dist: pytz (>=2021.3,<2022.0)
41
41
  Requires-Dist: pyyaml (>=6.0,<7.0)
42
42
  Requires-Dist: rocketchat-api (>=1.30.0,<2.0.0)
43
43
  Requires-Dist: sentry-sdk (>=1.5.2,<2.0.0) ; extra == "all"
44
+ Requires-Dist: setuptools (>=68.2.2,<69.0.0)
44
45
  Requires-Dist: slack-sdk (>=3.23.0,<4.0.0)
45
46
  Requires-Dist: supabase (>=1.0.3,<2.0.0) ; extra == "all"
46
47
  Requires-Dist: tabulate (>=0.8.10,<0.9.0) ; extra == "all"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "robusta-cli"
3
- version = "0.10.29"
3
+ version = "0.10.30"
4
4
  description = ""
5
5
  authors = ["Natan Yellin <aantn@users.noreply.github.com>"]
6
6
  packages = [
@@ -25,6 +25,7 @@ robusta = "robusta.cli.main:app"
25
25
  # are known not to work on 3.11. Unfortunately this spec is shared between
26
26
  # the CLI and core, so we have to specify 3.8+.
27
27
  python = "^3.8, <3.11"
28
+ setuptools = "^68.2.2"
28
29
  typer = "^0.4.1"
29
30
  colorlog = "^5.0.1"
30
31
  pydantic = "^1.8.1"
@@ -61,11 +62,11 @@ croniter = "^1.3.15"
61
62
  # and therefore requires gcc to install which we'd like to avoid
62
63
  # this is similar to the issue at https://github.com/dulwich/dulwich/issues/839
63
64
  dulwich = { version = "0.20.28", optional = true }
64
- cryptography = "^36.0.0"
65
+ cryptography = "^39.0.1"
65
66
  PyJWT = "2.4.0"
66
67
  fpdf2 = "^2.7.1"
67
68
  attrs = "^23.1.0"
68
- prometrix = "0.1.15"
69
+ prometrix = "0.1.16"
69
70
  hikaru-model-26 = "^1.1.1"
70
71
  apprise = "^1.5.0"
71
72
  rocketchat-api = "^1.30.0"
@@ -83,7 +84,7 @@ witchhazel = "^2018.8.23"
83
84
  sphinx-autodoc-typehints = "^1.12.0"
84
85
  sphinxcontrib-images = "^0.9.4"
85
86
  jsonref = "^0.2"
86
- Pillow = "^9.0.0"
87
+ Pillow = "^10.2.0"
87
88
  sphinxcontrib-mermaid = "^0.7.1"
88
89
  humanize = "^3.13.1"
89
90
  cssselect = "^1.1.0"
@@ -1,2 +1,2 @@
1
1
  # this is updated by .github/workflows/release.yaml
2
- __version__ = "0.10.29"
2
+ __version__ = "0.10.30"
@@ -70,7 +70,6 @@ from robusta.core.model.env_vars import (
70
70
  ROBUSTA_LOGO_URL,
71
71
  ROBUSTA_TELEMETRY_ENDPOINT,
72
72
  ROBUSTA_UI_DOMAIN,
73
- RSA_KEYS_PATH,
74
73
  RUNNER_VERSION,
75
74
  SEND_ADDITIONAL_TELEMETRY,
76
75
  SERVICE_CACHE_MAX_SIZE,
@@ -110,12 +109,13 @@ from robusta.core.playbooks.common import get_event_timestamp, get_resource_even
110
109
  from robusta.core.playbooks.container_playbook_utils import create_container_graph
111
110
  from robusta.core.playbooks.job_utils import CONTROLLER_UID, get_job_all_pods, get_job_latest_pod, get_job_selector
112
111
  from robusta.core.playbooks.node_playbook_utils import create_node_graph_enrichment
113
- from robusta.core.playbooks.pod_utils.crashloop_utils import get_crash_report_blocks
112
+ from robusta.core.playbooks.pod_utils.crashloop_utils import get_crash_report_enrichments
114
113
  from robusta.core.playbooks.pod_utils.imagepull_utils import (
115
- get_image_pull_backoff_blocks,
114
+ get_image_pull_backoff_enrichment,
116
115
  get_image_pull_backoff_container_statuses,
117
116
  )
118
- from robusta.core.playbooks.pod_utils.pending_pod_utils import get_pending_pod_blocks
117
+ from robusta.core.playbooks.pod_utils.pending_pod_utils import get_pending_pod_enrichment
118
+ from robusta.core.playbooks.crash_reporter import send_crash_report
119
119
  from robusta.core.playbooks.prometheus_enrichment_utils import (
120
120
  XAxisLine,
121
121
  create_chart_from_prometheus_query,
@@ -123,6 +123,7 @@ from robusta.core.playbooks.prometheus_enrichment_utils import (
123
123
  create_resource_enrichment,
124
124
  get_node_internal_ip,
125
125
  run_prometheus_query,
126
+ run_prometheus_query_range,
126
127
  )
127
128
  from robusta.core.playbooks.trigger import (
128
129
  BaseTrigger,
@@ -140,6 +141,7 @@ from robusta.core.reporting import (
140
141
  Emojis,
141
142
  Enrichment,
142
143
  FileBlock,
144
+ EmptyFileBlock,
143
145
  Filterable,
144
146
  Finding,
145
147
  FindingSeverity,
@@ -16,9 +16,7 @@ from kubernetes import client, config
16
16
  from pydantic import BaseModel, Extra
17
17
 
18
18
  from robusta._version import __version__
19
- from robusta.cli.auth import RSAKeyPair
20
19
  from robusta.cli.auth import app as auth_commands
21
- from robusta.cli.auth import gen_rsa_pair
22
20
  from robusta.cli.backend_profile import backend_profile
23
21
  from robusta.cli.eula import handle_eula
24
22
  from robusta.cli.integrations_cmd import app as integrations_commands
@@ -88,7 +86,6 @@ class HelmValues(BaseModel, extra=Extra.allow):
88
86
  kubewatch: Dict = None
89
87
  grafanaRenderer: Dict = None
90
88
  runner: Dict = None
91
- rsa: RSAKeyPair = None
92
89
 
93
90
 
94
91
  def get_slack_channel() -> str:
@@ -266,7 +263,6 @@ def gen_config(
266
263
  enablePrometheusStack=enable_prometheus_stack,
267
264
  disableCloudRouting=disable_cloud_routing,
268
265
  enablePlatformPlaybooks=enable_platform_playbooks,
269
- rsa=gen_rsa_pair(),
270
266
  )
271
267
 
272
268
  values.runner = {}
@@ -327,9 +323,6 @@ def update_config(
327
323
  """
328
324
  with open(existing_values, "r") as existing_values_file:
329
325
  values: HelmValues = HelmValues(**yaml.safe_load(existing_values_file))
330
- if not values.rsa:
331
- typer.secho("Generating RSA key-pair", fg="green")
332
- values.rsa = gen_rsa_pair()
333
326
 
334
327
  if not values.globalConfig.signing_key:
335
328
  typer.secho("Generating signing key", fg="green")
@@ -17,6 +17,7 @@ DEFAULT_PLAYBOOKS_ROOT = os.environ.get("DEFAULT_PLAYBOOKS_ROOT", os.path.join(P
17
17
  DEFAULT_PLAYBOOKS_PIP_INSTALL = load_bool("DEFAULT_PLAYBOOKS_PIP_INSTALL", False)
18
18
 
19
19
  CUSTOM_PLAYBOOKS_ROOT = os.path.join(PLAYBOOKS_ROOT, "storage")
20
+ CUSTOM_SSH_HOST_KEYS = os.environ.get("CUSTOM_SSH_HOST_KEYS", "")
20
21
 
21
22
  PLAYBOOKS_CONFIG_FILE_PATH = os.environ.get("PLAYBOOKS_CONFIG_FILE_PATH")
22
23
 
@@ -106,3 +107,5 @@ CLUSTER_DOMAIN = os.environ.get("CLUSTER_DOMAIN", "cluster.local")
106
107
  IS_OPENSHIFT = load_bool("IS_OPENSHIFT", False)
107
108
 
108
109
  ENABLE_GRAPH_BLOCK = load_bool("ENABLE_GRAPH_BLOCK", False)
110
+
111
+ RUN_AS_SUBPROCESS = load_bool("RUN_AS_SUBPROCESS", True)
@@ -8,14 +8,16 @@ from typing import Any, Dict, List, Optional
8
8
 
9
9
  from pydantic import BaseModel
10
10
 
11
+ from robusta.core.pubsub.event_emitter import EventEmitter
11
12
  from robusta.core.reporting.base import (
12
13
  BaseBlock,
14
+ EnrichmentType,
13
15
  Finding,
14
16
  FindingSeverity,
15
17
  FindingSource,
16
18
  FindingSubject,
17
19
  FindingSubjectType,
18
- VideoLink, EnrichmentType,
20
+ VideoLink,
19
21
  )
20
22
  from robusta.core.sinks import SinkBase
21
23
  from robusta.integrations.scheduled.playbook_scheduler import PlaybooksScheduler
@@ -55,6 +57,7 @@ class ExecutionBaseEvent:
55
57
  stop_processing: bool = False
56
58
  _scheduler: Optional[PlaybooksScheduler] = None
57
59
  _context: Optional[ExecutionContext] = None
60
+ _event_emitter: Optional[EventEmitter] = None
58
61
 
59
62
  def set_context(self, context: ExecutionContext):
60
63
  self._context = context
@@ -68,6 +71,9 @@ class ExecutionBaseEvent:
68
71
  def get_scheduler(self) -> PlaybooksScheduler:
69
72
  return self._scheduler
70
73
 
74
+ def set_event_emitter(self, emitter: EventEmitter):
75
+ self._event_emitter = emitter
76
+
71
77
  def create_default_finding(self) -> Finding:
72
78
  """Create finding default fields according to the event type"""
73
79
  return Finding(title="Robusta notification", aggregation_key="Generic finding key")
@@ -94,6 +100,12 @@ class ExecutionBaseEvent:
94
100
  for sink in self.named_sinks:
95
101
  self.sink_findings[sink][0].add_video_link(video_link, True)
96
102
 
103
+ def emit_event(self, event_name: str, **kwargs):
104
+ """Publish an event to the pubsub. It will be processed by the sinks during the execution of the playbook."""
105
+
106
+ if self._event_emitter:
107
+ self._event_emitter.emit_event(event_name, **kwargs)
108
+
97
109
  def add_enrichment(
98
110
  self,
99
111
  enrichment_blocks: List[BaseBlock],
@@ -103,8 +115,9 @@ class ExecutionBaseEvent:
103
115
  ):
104
116
  self.__prepare_sinks_findings()
105
117
  for sink in self.named_sinks:
106
- self.sink_findings[sink][0].add_enrichment(enrichment_blocks, annotations, True,
107
- enrichment_type=enrichment_type, title=title)
118
+ self.sink_findings[sink][0].add_enrichment(
119
+ enrichment_blocks, annotations, True, enrichment_type=enrichment_type, title=title
120
+ )
108
121
 
109
122
  def add_finding(self, finding: Finding, suppress_warning: bool = False):
110
123
  finding.dirty = True # Warn if new enrichments are added to this finding directly
@@ -0,0 +1,65 @@
1
+ import logging
2
+ from typing import Optional
3
+
4
+ from robusta.core.model.base_params import NamedRegexPattern
5
+ from robusta.core.playbooks.pod_utils.crashloop_utils import get_crash_report_enrichments
6
+ from robusta.core.reporting import Finding, FindingSource, FindingSeverity, FileBlock, EmptyFileBlock
7
+ from robusta.core.reporting.base import EnrichmentType
8
+ from robusta.core.reporting.finding_subjects import PodFindingSubject
9
+ from robusta.integrations.kubernetes.autogenerated.events import PodEvent
10
+ from robusta.integrations.kubernetes.custom_models import RegexReplacementStyle
11
+
12
+
13
+ def send_crash_report(
14
+ event: PodEvent,
15
+ action_name: str,
16
+ regex_replacer_patterns: Optional[NamedRegexPattern] = None,
17
+ regex_replacement_style: Optional[RegexReplacementStyle] = None,
18
+ ):
19
+ pod = event.get_pod()
20
+
21
+ all_statuses = pod.status.containerStatuses + pod.status.initContainerStatuses
22
+ crashed_container_statuses = [
23
+ container_status
24
+ for container_status in all_statuses
25
+ if container_status.state.waiting is not None and container_status.restartCount >= 1
26
+ ]
27
+
28
+ finding = Finding(
29
+ title=f"Crashing pod {pod.metadata.name} in namespace {pod.metadata.namespace}",
30
+ source=FindingSource.KUBERNETES_API_SERVER,
31
+ severity=FindingSeverity.HIGH,
32
+ aggregation_key=action_name,
33
+ subject=PodFindingSubject(pod),
34
+ )
35
+
36
+ enrichments = get_crash_report_enrichments(pod)
37
+ for enrichment in enrichments:
38
+ finding.add_enrichment(enrichment.blocks,
39
+ enrichment_type=enrichment.enrichment_type,
40
+ title=enrichment.title)
41
+
42
+ for container_status in crashed_container_statuses:
43
+ try:
44
+ container_log = pod.get_logs(
45
+ container_status.name,
46
+ previous=True,
47
+ regex_replacer_patterns=regex_replacer_patterns,
48
+ regex_replacement_style=regex_replacement_style,
49
+ )
50
+
51
+ if not container_log:
52
+ log_block = EmptyFileBlock(filename=f"{pod.metadata.name}.log",
53
+ remarks=f"Logs unavailable for container: {container_status.name}")
54
+ logging.info(
55
+ f"could not fetch logs from container: {container_status.name}"
56
+ )
57
+ else:
58
+ log_block = FileBlock(filename=f"{pod.metadata.name}.log", contents=container_log.encode())
59
+
60
+ finding.add_enrichment([log_block],
61
+ enrichment_type=EnrichmentType.text_file, title="Logs")
62
+ except Exception:
63
+ logging.error("Failed to get pod logs", exc_info=True)
64
+
65
+ event.add_finding(finding)
@@ -3,6 +3,7 @@ import time
3
3
 
4
4
  from robusta.api import (
5
5
  ExecutionBaseEvent,
6
+ EmptyFileBlock,
6
7
  FileBlock,
7
8
  LogEnricherParams,
8
9
  MarkdownBlock,
@@ -10,6 +11,7 @@ from robusta.api import (
10
11
  RegexReplacementStyle,
11
12
  RobustaPod,
12
13
  )
14
+ from robusta.core.playbooks.pod_utils.crashloop_utils import get_crash_report_enrichments
13
15
  from robusta.core.reporting.base import EnrichmentType
14
16
 
15
17
 
@@ -40,11 +42,19 @@ def start_log_enrichment(
40
42
  RegexReplacementStyle[params.regex_replacement_style] if params.regex_replacement_style else None
41
43
  )
42
44
 
45
+ enrichments = get_crash_report_enrichments(pod)
46
+ for enrichment in enrichments:
47
+ event.add_enrichment(enrichment.blocks,
48
+ enrichment_type=enrichment.enrichment_type,
49
+ title=enrichment.title)
50
+
43
51
  if not container and pod.spec.containers:
44
52
  # TODO do we want to keep this part of code? It used to sometimes report logs for a wrong
45
53
  # container when a container inside a pod was oomkilled. I can imagine it could cause
46
54
  # similar problems in other cases.
47
55
  container = pod.spec.containers[0].name
56
+
57
+ log_data = ""
48
58
  for _ in range(tries - 1):
49
59
  log_data = pod.get_logs(
50
60
  container=container,
@@ -57,15 +67,19 @@ def start_log_enrichment(
57
67
  logging.info("log data is empty, retrying...")
58
68
  time.sleep(backoff_seconds)
59
69
  continue
70
+ break
60
71
 
61
- log_name = pod.metadata.name
62
- log_name += f"/{container}"
63
- event.add_enrichment(
64
- [FileBlock(filename=f"{pod.metadata.name}.log", contents=log_data.encode())],
65
- enrichment_type=EnrichmentType.text_file,
66
- title="Pod Logs"
72
+ if not log_data:
73
+ log_block = EmptyFileBlock(filename=f"{pod.metadata.name}.log",
74
+ remarks=f"Logs unavailable for container: {container}")
75
+ logging.info(
76
+ f"could not fetch logs from container: {container}"
67
77
  )
68
- break
78
+ else:
79
+ log_block = FileBlock(filename=f"{pod.metadata.name}.log", contents=log_data.encode())
80
+
81
+ event.add_enrichment([log_block],
82
+ enrichment_type=EnrichmentType.text_file, title="Logs")
69
83
 
70
84
 
71
85
  def logs_enricher(event: PodEvent, params: LogEnricherParams):
@@ -128,6 +128,7 @@ class PlaybooksEventHandlerImpl(PlaybooksEventHandler):
128
128
 
129
129
  def __prepare_execution_event(self, execution_event: ExecutionBaseEvent):
130
130
  execution_event.set_scheduler(self.registry.get_scheduler())
131
+ execution_event.set_event_emitter(self.registry.get_event_emitter())
131
132
  execution_event.set_all_sinks(self.registry.get_sinks().get_all())
132
133
  execution_event.set_context(
133
134
  ExecutionContext(
@@ -0,0 +1,61 @@
1
+ from typing import List, Optional
2
+
3
+ from hikaru.model.rel_1_26 import Pod
4
+
5
+ from robusta.core.reporting import TableBlock
6
+ from robusta.core.reporting.base import Enrichment, EnrichmentType
7
+
8
+
9
+ def get_crash_report_enrichments(
10
+ pod: Pod,
11
+ ) -> List[Enrichment]:
12
+ all_statuses = pod.status.containerStatuses + pod.status.initContainerStatuses
13
+ crashed_container_statuses = [
14
+ container_status
15
+ for container_status in all_statuses
16
+ if container_status.state.waiting is not None and container_status.restartCount >= 1
17
+ ]
18
+
19
+ pod_issues_enrichments: List[Enrichment] = []
20
+
21
+ for container_status in crashed_container_statuses:
22
+ crash_info_rows: List[List[str]] = []
23
+ prev_container_rows: List[List[str]] = []
24
+
25
+ crash_info_rows.append(["Container", container_status.name])
26
+ crash_info_rows.append(["Restarts", container_status.restartCount])
27
+
28
+ 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
+ crash_info_rows.append(["Status", "TERMINATED"])
32
+ crash_info_rows.append(["Reason", container_status.state.terminated.reason])
33
+
34
+ if container_status.state and container_status.state.waiting:
35
+ crash_info_rows.append(["Status", "WAITING"])
36
+ crash_info_rows.append(["Reason", container_status.state.waiting.reason])
37
+
38
+ if container_status.lastState and container_status.lastState.terminated:
39
+ prev_container_rows.append(["Status", "TERMINATED"])
40
+ prev_container_rows.append(["Reason", container_status.lastState.terminated.reason])
41
+ if container_status.lastState.terminated.startedAt:
42
+ prev_container_rows.append(["Started at", container_status.lastState.terminated.startedAt])
43
+ if container_status.lastState.terminated.finishedAt:
44
+ prev_container_rows.append(["Finished at", container_status.lastState.terminated.finishedAt])
45
+
46
+ crash_info_table_block = TableBlock(
47
+ [[k, v] for (k, v) in crash_info_rows],
48
+ ["label", "value"],
49
+ table_name="*Crash Info*",
50
+ )
51
+ prev_container_table_block = TableBlock(
52
+ [[k, v] for (k, v) in prev_container_rows],
53
+ ["label", "value"],
54
+ table_name="*Previous Container*",
55
+ )
56
+
57
+ pod_issues_enrichments.append(Enrichment(enrichment_type=EnrichmentType.crash_info,
58
+ title="Container Crash information",
59
+ blocks=[crash_info_table_block, prev_container_table_block]))
60
+
61
+ return pod_issues_enrichments
@@ -7,15 +7,15 @@ from typing import List, Optional, Tuple
7
7
 
8
8
  from hikaru.model.rel_1_26 import ContainerStatus, Event, EventList, Pod, PodStatus
9
9
 
10
- from robusta.core.reporting import BaseBlock, HeaderBlock, MarkdownBlock
10
+ from robusta.core.reporting import BaseBlock, MarkdownBlock, TableBlock
11
+ from robusta.core.reporting.base import EnrichmentType, Enrichment
11
12
 
12
13
 
13
14
  class ImagePullBackoffReason(Flag):
14
15
  Unknown = 0
15
16
  RepoDoesntExist = 1
16
17
  NotAuthorized = 2
17
- ImageDoesntExist = 4
18
- TagNotFound = 8
18
+ Timeout = 16
19
19
 
20
20
 
21
21
  def get_image_pull_backoff_container_statuses(status: PodStatus) -> List[ContainerStatus]:
@@ -43,26 +43,19 @@ def get_pod_issue_message_and_reason(pod: Pod) -> Tuple[Optional[str], Optional[
43
43
  return None, None
44
44
 
45
45
 
46
- def decompose_flag(flag: Flag) -> List[Flag]:
47
- members, _ = enum._decompose(flag.__class__, flag._value_)
48
- return members
49
-
50
-
51
- def get_image_pull_backoff_blocks(pod: Pod) -> Optional[List[BaseBlock]]:
52
- blocks: List[BaseBlock] = []
46
+ def get_image_pull_backoff_enrichment(pod: Pod) -> Enrichment:
47
+ error_blocks: List[BaseBlock] = []
48
+ image_pull_table_blocks: List[BaseBlock] = []
53
49
  pod_name = pod.metadata.name
54
50
  namespace = pod.metadata.namespace
55
51
  image_pull_backoff_container_statuses = get_image_pull_backoff_container_statuses(pod.status)
56
52
  investigator = ImagePullBackoffInvestigator(pod_name, namespace)
53
+
57
54
  for container_status in image_pull_backoff_container_statuses:
58
- investigation = investigator.investigate(container_status)
55
+ image_issue_rows: List[List[str]] = \
56
+ [["Container", container_status.name], ["Image", container_status.image]]
59
57
 
60
- blocks.extend(
61
- [
62
- HeaderBlock(f"ImagePullBackOff in container {container_status.name}"),
63
- MarkdownBlock(f"*Image:* {container_status.image}"),
64
- ]
65
- )
58
+ investigation = investigator.investigate(container_status)
66
59
 
67
60
  # TODO: this happens when there is a backoff but the original events containing the actual error message are already gone
68
61
  # and all that remains is a backoff event without a detailed error message - maybe we should identify that case and
@@ -85,26 +78,39 @@ def get_image_pull_backoff_blocks(pod: Pod) -> Optional[List[BaseBlock]]:
85
78
 
86
79
  reason = investigation.reason
87
80
  error_message = investigation.error_message
88
-
89
81
  if reason != ImagePullBackoffReason.Unknown:
90
- reasons = decompose_flag(reason)
91
-
92
- if len(reasons) == 1:
93
- blocks.extend(
94
- [
95
- MarkdownBlock(f"*Reason:* {reason}"),
96
- ]
97
- )
98
- else:
99
- line_separated_reasons = "\n".join([f"{r}" for r in reasons])
100
- blocks.extend(
101
- [
102
- MarkdownBlock(f"*Possible reasons:*\n{line_separated_reasons}"),
103
- ]
104
- )
82
+ backoff_reason = __imagepull_backoff_reason_to_fix(reason=reason)
83
+
84
+ if backoff_reason:
85
+ reason_text, fix = backoff_reason
86
+ image_issue_rows.append(["Reason", reason_text])
87
+ image_issue_rows.append(["Fix", fix])
88
+
105
89
  else:
106
- blocks.append(MarkdownBlock(f"*Error message:* {container_status.name}:\n{error_message}"))
107
- return blocks
90
+ error_blocks.append(MarkdownBlock(f"*Error message:* {container_status.name}:\n{error_message}"))
91
+
92
+ image_pull_table_blocks.append(TableBlock(
93
+ [[k, v] for (k, v) in image_issue_rows],
94
+ ["label", "value"],
95
+ ))
96
+
97
+ image_pull_table_blocks.extend(error_blocks)
98
+
99
+ return Enrichment(
100
+ enrichment_type=EnrichmentType.image_pull_backoff_info,
101
+ blocks=image_pull_table_blocks,
102
+ title="Container Image-Pull-Backoff Information")
103
+
104
+
105
+ def __imagepull_backoff_reason_to_fix(reason: ImagePullBackoffReason) -> Optional[Tuple[str, str]]:
106
+ if reason == ImagePullBackoffReason.RepoDoesntExist:
107
+ return "Image not found", "Make sure the image repository, image name and image tag are correct."
108
+ 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>'
110
+ if reason == ImagePullBackoffReason.Timeout:
111
+ return "Timeout", 'If this does not resolved after a few minutes, make sure the image repository is responding.'
112
+
113
+ return None
108
114
 
109
115
 
110
116
  class ImagePullOffInvestigation:
@@ -121,9 +127,7 @@ class ImagePullBackoffInvestigator:
121
127
  # Containerd
122
128
  {
123
129
  "err_template": 'failed to pull and unpack image ".*?": failed to resolve reference ".*?": .*?: not found',
124
- "reason": ImagePullBackoffReason.RepoDoesntExist
125
- | ImagePullBackoffReason.ImageDoesntExist
126
- | ImagePullBackoffReason.TagNotFound,
130
+ "reason": ImagePullBackoffReason.RepoDoesntExist,
127
131
  },
128
132
  {
129
133
  "err_template": (
@@ -131,7 +135,7 @@ class ImagePullBackoffInvestigator:
131
135
  "pull access denied, repository does not exist or may require authorization: server message: "
132
136
  "insufficient_scope: authorization failed"
133
137
  ),
134
- "reason": ImagePullBackoffReason.NotAuthorized | ImagePullBackoffReason.ImageDoesntExist,
138
+ "reason": ImagePullBackoffReason.NotAuthorized,
135
139
  },
136
140
  {
137
141
  "err_template": (
@@ -146,11 +150,11 @@ class ImagePullBackoffInvestigator:
146
150
  "Error response from daemon: pull access denied for .*?, "
147
151
  "repository does not exist or may require 'docker login': denied: requested access to the resource is denied"
148
152
  ),
149
- "reason": ImagePullBackoffReason.NotAuthorized | ImagePullBackoffReason.ImageDoesntExist,
153
+ "reason": ImagePullBackoffReason.NotAuthorized,
150
154
  },
151
155
  {
152
156
  "err_template": "Error response from daemon: manifest for .*? not found: manifest unknown: manifest unknown",
153
- "reason": ImagePullBackoffReason.TagNotFound,
157
+ "reason": ImagePullBackoffReason.RepoDoesntExist,
154
158
  },
155
159
  {
156
160
  "err_template": (
@@ -161,8 +165,12 @@ class ImagePullBackoffInvestigator:
161
165
  },
162
166
  {
163
167
  "err_template": 'Error response from daemon: manifest for .*? not found: manifest unknown: Failed to fetch ".*?"',
164
- "reason": ImagePullBackoffReason.ImageDoesntExist | ImagePullBackoffReason.TagNotFound,
168
+ "reason": ImagePullBackoffReason.RepoDoesntExist,
165
169
  },
170
+ {
171
+ "err_template": r'.*Timeout exceeded.*',
172
+ "reason": ImagePullBackoffReason.Timeout, # Using the Timeout reason
173
+ }
166
174
  ]
167
175
 
168
176
  def __init__(self, pod_name: str, namespace: str):
@@ -7,17 +7,23 @@ from hikaru.model.rel_1_26 import Event, EventList, Pod
7
7
 
8
8
  from robusta.core.model.pods import pod_other_requests, pod_requests
9
9
  from robusta.core.playbooks.common import get_event_timestamp
10
- from robusta.core.reporting.blocks import BaseBlock, MarkdownBlock
10
+ from robusta.core.reporting import Enrichment
11
+ from robusta.core.reporting.base import EnrichmentType
12
+ from robusta.core.reporting.blocks import BaseBlock, MarkdownBlock, TableBlock
11
13
 
12
14
 
13
- def get_pending_pod_blocks(pod: Pod):
14
- blocks: List[BaseBlock] = []
15
+ def get_pending_pod_enrichment(pod: Pod) -> Enrichment:
15
16
  investigator = PendingInvestigator(pod)
16
17
  all_reasons = investigator.investigate()
17
18
  message = get_unscheduled_message(pod)
18
- blocks.append(MarkdownBlock(f"Pod {pod.metadata.name} could not be scheduled."))
19
+ pending_rows = [["Pod", pod.metadata.name]]
19
20
  if message:
20
- blocks.append(MarkdownBlock(f"*Reason:* {message}"))
21
+ pending_rows.append(["Reason", message])
22
+
23
+ blocks = [TableBlock(
24
+ [[k, v] for (k, v) in pending_rows],
25
+ ["label", "value"],
26
+ )]
21
27
 
22
28
  if all_reasons:
23
29
  RESOURCE_REASONS = [
@@ -39,7 +45,10 @@ def get_pending_pod_blocks(pod: Pod):
39
45
  resources_string = ", ".join(request_resources)
40
46
  blocks.append(MarkdownBlock(f"*Pod requires:* {resources_string}"))
41
47
 
42
- return blocks
48
+ return Enrichment(
49
+ enrichment_type=EnrichmentType.pending_pod_info,
50
+ blocks=blocks,
51
+ title="Unscheduled Pod Information")
43
52
 
44
53
 
45
54
  def get_unscheduled_message(pod: Pod) -> Optional[str]: