Source code for mlrun.common.schemas.notification
# Copyright 2023 Iguazio
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import datetime
import enum
import typing
import pydantic
import mlrun.common.types
[docs]class NotificationKind(mlrun.common.types.StrEnum):
"""Currently, the supported notification kinds and their params are as follows:"""
console: str = "console"
"""no params, local only"""
git: str = "git"
"""
**token** - The git token to use for the git notification.\n
**repo** - The git repo to which to send the notification.\n
**issue** - The git issue to which to send the notification.\n
**merge_request** -
In GitLab (as opposed to GitHub), merge requests and issues are separate entities.
If using merge request, the issue will be ignored, and vice versa.\n
**server** - The git server to which to send the notification.\n
**gitlab** - (bool) Whether the git server is GitLab or not.\n
"""
ipython: str = "ipython"
"""no params, local only"""
slack: str = "slack"
"""**webhook** - The slack webhook to which to send the notification."""
webhook: str = "webhook"
"""
**url** - The webhook url to which to send the notification.\n
**method** - The http method to use when sending the notification (GET, POST, PUT, etc…).\n
**headers** - (dict) The http headers to send with the notification.\n
**override_body** -
(dict) The body to send with the notification. If not specified, the
default body will be a dictionary containing `name`, `message`, `severity`, and a `runs` list of the
completed runs. You can also add the run's details.\n
Example::
"override_body": {"message":"Run Completed {{ runs }}"
# Results would look like:
"message": "Run Completed [{'project': 'my-project', 'name': 'my-function', 'host': <run-host>,
'status': {'state': 'completed', 'results': <run-results>}}]"
**verify_ssl** -
(bool) Whether SSL certificates are validated during HTTP requests or not.
The default is set to True.\n
"""
[docs]class NotificationSeverity(mlrun.common.types.StrEnum):
INFO = "info"
DEBUG = "debug"
VERBOSE = "verbose"
WARNING = "warning"
ERROR = "error"
[docs]class NotificationStatus(mlrun.common.types.StrEnum):
PENDING = "pending"
SENT = "sent"
ERROR = "error"
[docs]class NotificationLimits(enum.Enum):
max_params_size = (
900 * 1024
) # 900KB (k8s secret size limit is 1MB minus buffer for metadata)
[docs]class Notification(pydantic.BaseModel):
"""
Notification object schema
:param kind: notification implementation kind - slack, webhook, etc.
:param name: for logging and identification
:param message: message content in the notification
:param severity: severity to display in the notification
:param when: list of statuses to trigger the notification: 'running', 'completed', 'error'
:param condition: optional condition to trigger the notification, a jinja2 expression that can use run data
to evaluate if the notification should be sent in addition to the 'when' statuses.
e.g.: '{{ run["status"]["results"]["accuracy"] < 0.9}}'
:param params: Implementation specific parameters for the notification implementation (e.g. slack webhook url,
git repository details, etc.)
:param secret_params: secret parameters for the notification implementation, same as params but will be stored
in a k8s secret and passed as a secret reference to the implementation.
:param status: notification status - pending, sent, error
:param sent_time: time the notification was sent
:param reason: failure reason if the notification failed to send
"""
kind: NotificationKind
name: str
message: typing.Optional[str] = None
severity: typing.Optional[NotificationSeverity] = None
when: typing.Optional[list[str]] = None
condition: typing.Optional[str] = None
params: typing.Optional[dict[str, typing.Any]] = None
status: typing.Optional[NotificationStatus] = None
sent_time: typing.Optional[typing.Union[str, datetime.datetime]] = None
secret_params: typing.Optional[dict[str, typing.Any]] = None
reason: typing.Optional[str] = None
[docs]class SetNotificationRequest(pydantic.BaseModel):
notifications: list[Notification] = None