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