kubernetes/
lib.rs

1//! # Kubernetes client
2
3extern crate serde;
4#[cfg_attr(test, macro_use)]
5extern crate serde_json;
6extern crate url;
7#[macro_use]
8extern crate serde_derive;
9extern crate serde_urlencoded;
10extern crate serde_yaml;
11#[macro_use]
12extern crate failure;
13extern crate base64;
14extern crate futures;
15extern crate hyper;
16extern crate hyper_tls;
17extern crate native_tls;
18extern crate openssl;
19extern crate tokio_core;
20#[macro_use]
21extern crate log;
22
23pub mod api;
24pub mod client;
25mod groupversion;
26mod serde_base64;
27mod unstructured;
28
29use std::borrow::Cow;
30use std::slice;
31
32use api::meta::v1::{ListMeta, ObjectMeta};
33
34pub use groupversion::*;
35pub use unstructured::*;
36
37pub trait Metadata {
38    fn api_version(&self) -> &str;
39    fn kind(&self) -> &str;
40    fn metadata(&self) -> Cow<ObjectMeta>;
41}
42
43pub trait List<T> {
44    fn listmeta(&self) -> Cow<ListMeta>;
45    fn items(&self) -> &[T];
46    fn items_mut(&mut self) -> &mut [T];
47    fn into_items(self) -> Vec<T>;
48}
49
50impl<'a, T> IntoIterator for &'a List<T> {
51    type Item = &'a T;
52    type IntoIter = slice::Iter<'a, T>;
53
54    fn into_iter(self) -> Self::IntoIter {
55        self.items().into_iter()
56    }
57}
58
59impl<'a, T> IntoIterator for &'a mut List<T> {
60    type Item = &'a mut T;
61    type IntoIter = slice::IterMut<'a, T>;
62
63    fn into_iter(self) -> Self::IntoIter {
64        self.items_mut().iter_mut()
65    }
66}
67
68#[cfg(test)]
69mod tests {
70    use super::Metadata;
71    use serde_json::{self, Value};
72
73    fn pod_json() -> Value {
74        json!({
75            "apiVersion": "v1",
76            "kind": "Pod",
77            "metadata": {
78                "name": "pod-example",
79            },
80            "spec": {
81                "containers": [
82                    {
83                        "image": "busybox",
84                        "command": ["echo"],
85                        "args": ["Hello world"],
86                    },
87                ],
88            },
89        })
90    }
91
92    #[test]
93    fn untyped() {
94        let j = pod_json();
95        assert_eq!(j.kind(), "Pod");
96        assert_eq!(j.api_version(), "v1");
97        assert_eq!(j.metadata().name.as_ref().unwrap(), "pod-example");
98    }
99
100    #[test]
101    fn typed() {
102        use api::core::v1::Pod;
103        let pod: Pod = serde_json::from_value(pod_json()).unwrap();
104        assert_eq!(pod.spec.containers[0].image, Some("busybox".into()));
105    }
106}