kube_core/watch.rs
1//! Types for the watch api
2//!
3//! See <https://kubernetes.io/docs/reference/using-api/api-concepts/#efficient-detection-of-changes>
4
5use crate::{error::ErrorResponse, metadata::TypeMeta};
6use serde::{Deserialize, Serialize};
7use std::fmt::Debug;
8/// A raw event returned from a watch query
9///
10/// Note that a watch query returns many of these as newline separated JSON.
11#[derive(Deserialize, Serialize, Clone)]
12#[serde(tag = "type", content = "object", rename_all = "UPPERCASE")]
13pub enum WatchEvent<K> {
14 /// Resource was added
15 Added(K),
16 /// Resource was modified
17 Modified(K),
18 /// Resource was deleted
19 Deleted(K),
20 /// Resource bookmark. `Bookmark` is a slimmed down `K` due to [#285](https://github.com/kube-rs/kube/issues/285).
21 ///
22 /// From [Watch bookmarks](https://kubernetes.io/docs/reference/using-api/api-concepts/#watch-bookmarks).
23 ///
24 /// NB: This became Beta first in Kubernetes 1.16.
25 Bookmark(Bookmark),
26 /// There was some kind of error
27 Error(ErrorResponse),
28}
29
30impl<K> Debug for WatchEvent<K> {
31 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
32 match &self {
33 WatchEvent::Added(_) => write!(f, "Added event"),
34 WatchEvent::Modified(_) => write!(f, "Modified event"),
35 WatchEvent::Deleted(_) => write!(f, "Deleted event"),
36 WatchEvent::Bookmark(_) => write!(f, "Bookmark event"),
37 WatchEvent::Error(e) => write!(f, "Error event: {e:?}"),
38 }
39 }
40}
41
42/// Slimed down K for [`WatchEvent::Bookmark`] due to [#285](https://github.com/kube-rs/kube/issues/285).
43///
44/// Can only be relied upon to have metadata with resource version.
45/// Bookmarks contain apiVersion + kind + basically empty metadata.
46#[derive(Serialize, Deserialize, Clone)]
47pub struct Bookmark {
48 /// apiVersion + kind
49 #[serde(flatten)]
50 pub types: TypeMeta,
51
52 /// Basically empty metadata
53 pub metadata: BookmarkMeta,
54}
55
56/// Slimed down Metadata for WatchEvent::Bookmark
57#[derive(Serialize, Deserialize, Clone)]
58#[serde(rename_all = "camelCase")]
59pub struct BookmarkMeta {
60 /// The only field we need from a Bookmark event.
61 pub resource_version: String,
62
63 /// Kubernetes 1.27 Streaming Lists
64 /// The rest of the fields are optional and may be empty.
65 #[serde(default)]
66 pub annotations: std::collections::BTreeMap<String, String>,
67}