robusta-cli 0.10.29__tar.gz → 0.10.30a0__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.
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/PKG-INFO +4 -3
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/pyproject.toml +5 -4
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/_version.py +1 -1
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/api/__init__.py +6 -4
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/main.py +0 -7
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/env_vars.py +3 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/events.py +16 -3
- robusta_cli-0.10.30a0/src/robusta/core/playbooks/crash_reporter.py +65 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/oom_killer_utils.py +21 -7
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/playbooks_event_handler_impl.py +1 -0
- robusta_cli-0.10.30a0/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +61 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/pod_utils/imagepull_utils.py +50 -42
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/pod_utils/pending_pod_utils.py +15 -6
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/prometheus_enrichment_utils.py +43 -35
- robusta_cli-0.10.30a0/src/robusta/core/pubsub/event_emitter.py +7 -0
- robusta_cli-0.10.30a0/src/robusta/core/pubsub/event_subscriber.py +17 -0
- robusta_cli-0.10.30a0/src/robusta/core/pubsub/events_pubsub.py +20 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/__init__.py +2 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/base.py +71 -7
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/blocks.py +32 -1
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/consts.py +21 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/dal/model_conversion.py +18 -4
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/dal/supabase_dal.py +99 -46
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/robusta_sink.py +23 -4
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/sink_base.py +5 -2
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/sink_base_params.py +31 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/transformer.py +3 -3
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/git/git_repo.py +33 -8
- robusta_cli-0.10.30a0/src/robusta/integrations/git/well_known_hosts.py +16 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/custom_models.py +13 -7
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/sender.py +1 -1
- robusta_cli-0.10.30a0/src/robusta/integrations/openshift/__init__.py +1 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/resource_analysis/node_cpu_analyzer.py +6 -3
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/resource_analysis/prometheus_analyzer.py +4 -2
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/model/config.py +13 -0
- robusta_cli-0.10.30a0/src/robusta/runner/process_setup.py +21 -0
- robusta_cli-0.10.30a0/src/robusta/utils/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/auth_provider.py +3 -3
- robusta_cli-0.10.29/src/robusta/core/playbooks/pod_utils/crashloop_utils.py +0 -57
- robusta_cli-0.10.29/src/robusta/integrations/openshift/__init__.py +0 -1
- robusta_cli-0.10.29/src/robusta/runner/process_setup.py +0 -18
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/LICENSE +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/auth.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/backend_profile.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/eula.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/integrations_cmd.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/playbooks_cmd.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/self_host.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/slack_feedback_message.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/slack_verification.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/cli/utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/discovery/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/discovery/discovery.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/discovery/resource_names.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/discovery/top_service_resolver.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/discovery/utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/exceptions.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/base_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/cluster_status.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/helm_release.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/jobs.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/k8s_operation_type.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/namespaces.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/nodes.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/pods.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/runner_config.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/model/services.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/persistency/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/persistency/in_memory.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/persistency/scheduled_jobs_states_dal.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/actions_registry.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/base_trigger.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/common.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/container_playbook_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/generation.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/internal/discovery_events.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/job_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/node_playbook_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/playbook_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/playbooks_event_handler.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/trigger.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/schedule → robusta_cli-0.10.30a0/src/robusta/core/pubsub}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/action_requests.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/callbacks.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/custom_rendering.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/finding_subjects.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/reporting/utils.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/common → robusta_cli-0.10.30a0/src/robusta/core/schedule}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/schedule/model.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/schedule/scheduler.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/__init__.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/file → robusta_cli-0.10.30a0/src/robusta/core/sinks/common}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/common/html_tools.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/datadog/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/datadog/datadog_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/datadog/datadog_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/discord/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/discord/discord_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/discord/discord_sink_params.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/google_chat → robusta_cli-0.10.30a0/src/robusta/core/sinks/file}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/file/file_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/file/file_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/file/object_traverser.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/mail → robusta_cli-0.10.30a0/src/robusta/core/sinks/google_chat}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/google_chat/google_chat.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/google_chat/google_chat_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/jira/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/jira/jira_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/jira/jira_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/kafka/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/kafka/kafka_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/kafka/kafka_sink_params.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/robusta/dal → robusta_cli-0.10.30a0/src/robusta/core/sinks/mail}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/mail/mail_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/mail/mail_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/mattermost/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/mattermost/mattermost_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/mattermost/mattermost_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/msteams/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/msteams/msteams_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/msteams/msteams_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/opsgenie/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/opsgenie/opsgenie_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/opsgenie/opsgenie_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/pagerduty/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/pagerduty/pagerduty_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/pagerduty/pagerduty_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/pushover/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/pushover/pushover_client.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/pushover/pushover_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/pushover/pushover_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/__init__.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/robusta/rrm → robusta_cli-0.10.30a0/src/robusta/core/sinks/robusta/dal}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/discovery_metrics.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/prometheus_health_checker.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/robusta_sink_params.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/rocketchat → robusta_cli-0.10.30a0/src/robusta/core/sinks/robusta/rrm}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/rrm/account_resource_fetcher.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/rrm/base_resource_manager.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/rrm/prometheus_alert_resource_manager.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/rrm/rrm.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/robusta/rrm/types.py +0 -0
- {robusta_cli-0.10.29/src/robusta/core/sinks/servicenow → robusta_cli-0.10.30a0/src/robusta/core/sinks/rocketchat}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/rocketchat/rocketchat_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/rocketchat/rocketchat_sink_params.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations → robusta_cli-0.10.30a0/src/robusta/core/sinks/servicenow}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/servicenow/servicenow_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/servicenow/servicenow_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/sink_config.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/sink_factory.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/slack/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/slack/slack_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/slack/slack_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/telegram/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/telegram/telegram_client.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/telegram/telegram_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/telegram/telegram_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/timing.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/victorops/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/victorops/victorops_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/victorops/victorops_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/webex/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/webex/webex_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/webex/webex_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/webhook/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/webhook/webhook_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/webhook/webhook_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/yamessenger/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/yamessenger/yamessenger_client.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/yamessenger/yamessenger_sink.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/sinks/yamessenger/yamessenger_sink_params.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/container_oom_killed_trigger.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/custom_triggers.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/error_event_trigger.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/helm_releases_triggers.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/job_failed_trigger.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/multi_resources_trigger.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/oom_killed_trigger_base.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/pod_crash_loop_trigger.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/pod_image_pull_backoff.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/triggers/pod_oom_killed_trigger.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/common → robusta_cli-0.10.30a0/src/robusta/integrations}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/argocd/argocd_client.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/discord → robusta_cli-0.10.30a0/src/robusta/integrations/common}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/common/requests.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/git → robusta_cli-0.10.30a0/src/robusta/integrations/discord}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/discord/sender.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/google_chat → robusta_cli-0.10.30a0/src/robusta/integrations/git}/__init__.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/jira → robusta_cli-0.10.30a0/src/robusta/integrations/google_chat}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/google_chat/sender.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/grafana.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/helper.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/kubernetes → robusta_cli-0.10.30a0/src/robusta/integrations/jira}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/jira/client.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/jira/sender.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/kubernetes/autogenerated → robusta_cli-0.10.30a0/src/robusta/integrations/kubernetes}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/api_client_utils.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/kubernetes/autogenerated/v1 → robusta_cli-0.10.30a0/src/robusta/integrations/kubernetes/autogenerated}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/autogenerated/events.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/autogenerated/models.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/autogenerated/triggers.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/mail → robusta_cli-0.10.30a0/src/robusta/integrations/kubernetes/autogenerated/v1}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/autogenerated/v1/models.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/base_event.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/base_triggers.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/model_not_found_exception.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/process_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/kubernetes/templates.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/mattermost → robusta_cli-0.10.30a0/src/robusta/integrations/mail}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/mail/sender.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/msteams/msteams_elements → robusta_cli-0.10.30a0/src/robusta/integrations/mattermost}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/mattermost/client.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/mattermost/sender.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_adaptive_card_files.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_image.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_adaptive_card_files_text.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/prometheus → robusta_cli-0.10.30a0/src/robusta/integrations/msteams/msteams_elements}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_action.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_base.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_card.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_column.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_container.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_images.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_table.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_elements/msteams_text_block.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_mark_down_fix_url.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/msteams/msteams_msg.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/openshift/token.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/resource_analysis → robusta_cli-0.10.30a0/src/robusta/integrations/prometheus}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/prometheus/models.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/prometheus/trigger.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/prometheus/utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/receiver.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/rocketchat → robusta_cli-0.10.30a0/src/robusta/integrations/resource_analysis}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/resource_analysis/cpu_analyzer.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/resource_analysis/memory_analyzer.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/scheduled → robusta_cli-0.10.30a0/src/robusta/integrations/rocketchat}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/rocketchat/sender.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/servicenow → robusta_cli-0.10.30a0/src/robusta/integrations/scheduled}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/scheduled/event.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/scheduled/models.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/scheduled/playbook_scheduler.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/scheduled/playbook_scheduler_manager.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/scheduled/playbook_scheduler_manager_impl.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/scheduled/trigger.py +0 -0
- {robusta_cli-0.10.29/src/robusta/integrations/webex → robusta_cli-0.10.30a0/src/robusta/integrations/servicenow}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/servicenow/sender.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/slack/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/slack/sender.py +0 -0
- {robusta_cli-0.10.29/src/robusta/runner → robusta_cli-0.10.30a0/src/robusta/integrations/webex}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/integrations/webex/sender.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/model/alert_relabel_config.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/model/playbook_action.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/model/playbook_definition.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/patch/patch.py +0 -0
- {robusta_cli-0.10.29/src/robusta/utils → robusta_cli-0.10.30a0/src/robusta/runner}/__init__.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/config_loader.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/log_init.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/main.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/not_found_exception.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/object_updater.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/ssl_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/telemetry.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/telemetry_service.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/web.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/runner/web_api.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/base64_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/cluster_provider_discovery.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/common.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/decorators.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/docs.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/documented_pydantic.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/error_codes.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/file_system_watcher.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/function_hashes.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/json_schema.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/parsing.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/rate_limiter.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/server_start.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/service_discovery.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/silence_utils.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/utils/stack_tracer.py +0 -0
- {robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/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.
|
|
3
|
+
Version: 0.10.30a0
|
|
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 (>=
|
|
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.
|
|
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.
|
|
3
|
+
version = "0.10.30-alpha"
|
|
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 = "^
|
|
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.
|
|
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 = "^
|
|
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.
|
|
2
|
+
__version__ = "0.10.30-alpha"
|
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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,
|
|
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(
|
|
107
|
-
|
|
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)
|
{robusta_cli-0.10.29 → robusta_cli-0.10.30a0}/src/robusta/core/playbooks/oom_killer_utils.py
RENAMED
|
@@ -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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
55
|
+
image_issue_rows: List[List[str]] = \
|
|
56
|
+
[["Container", container_status.name], ["Image", container_status.image]]
|
|
59
57
|
|
|
60
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
if
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
107
|
-
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
|
|
19
|
+
pending_rows = [["Pod", pod.metadata.name]]
|
|
19
20
|
if message:
|
|
20
|
-
|
|
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
|
|
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]:
|