diff options
author | softprops <d.tangren@gmail.com> | 2016-01-03 19:03:02 -0500 |
---|---|---|
committer | softprops <d.tangren@gmail.com> | 2016-01-03 19:03:02 -0500 |
commit | 97689b1449f4c67069d52d0f4ffac8228371d098 (patch) | |
tree | fd9370cbe3d7a8b02ca0bfe9eb40bbfd0db74af1 | |
parent | bec764a28fd42e7a39de84b2d7caa96cd05a194a (diff) |
add log and top options
-rw-r--r-- | examples/logs.rs | 15 | ||||
-rw-r--r-- | examples/top.rs | 12 | ||||
-rw-r--r-- | src/builder.rs | 66 | ||||
-rw-r--r-- | src/lib.rs | 30 |
4 files changed, 111 insertions, 12 deletions
diff --git a/examples/logs.rs b/examples/logs.rs new file mode 100644 index 0000000..76724e1 --- /dev/null +++ b/examples/logs.rs @@ -0,0 +1,15 @@ +extern crate shiplift; + +use shiplift::{Docker, LogsOptions}; +use std::env; + +fn main() { + let docker = Docker::new(); + if let Some(id) = env::args().nth(1) { + let mut logs = docker.containers() + .get(&id) + .logs(&Default::default()) + .unwrap(); + std::io::copy(&mut logs, &mut std::io::stdout()).unwrap(); + } +} diff --git a/examples/top.rs b/examples/top.rs new file mode 100644 index 0000000..567107e --- /dev/null +++ b/examples/top.rs @@ -0,0 +1,12 @@ +extern crate shiplift; + +use shiplift::Docker; +use std::env; + +fn main() { + let docker = Docker::new(); + if let Some(id) = env::args().nth(1) { + let top = docker.containers().get(&id).top(Default::default()).unwrap(); + println!("{:?}", top); + } +} diff --git a/src/builder.rs b/src/builder.rs index 8df0d12..a4d643e 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -188,3 +188,69 @@ impl EventsOptionsBuilder { } } } + + +#[derive(Default)] +pub struct LogsOptions { + params: HashMap<&'static str, String> +} + +impl LogsOptions { + /// return a new instance of a builder for options + pub fn builder() -> LogsOptionsBuilder { + LogsOptionsBuilder::new() + } + + /// serialize options as a string. returns None if no options are defined + pub fn serialize(&self) -> Option<String> { + if self.params.is_empty() { None } + else { + Some(form_urlencoded::serialize(&self.params)) + } + } +} + +#[derive(Default)] +pub struct LogsOptionsBuilder { + params: HashMap<&'static str, String> +} + +impl LogsOptionsBuilder { + pub fn new() -> LogsOptionsBuilder { + LogsOptionsBuilder { + ..Default::default() + } + } + + pub fn follow(&mut self, f: bool) -> &mut LogsOptionsBuilder { + self.params.insert("follow", f.to_string()); + self + } + + pub fn stdout(&mut self, s: bool) -> &mut LogsOptionsBuilder { + self.params.insert("stdout", s.to_string()); + self + } + + pub fn stderr(&mut self, s: bool) -> &mut LogsOptionsBuilder { + self.params.insert("stderr", s.to_string()); + self + } + + pub fn timestamps(&mut self, t: bool) -> &mut LogsOptionsBuilder { + self.params.insert("timestamps", t.to_string()); + self + } + + /// how_many can either by "all" or a to_string() of the number + pub fn tail(&mut self, how_many: &str) -> &mut LogsOptionsBuilder { + self.params.insert("tail", how_many.to_owned()); + self + } + + pub fn build(&self) -> LogsOptions { + LogsOptions { + params: self.params.clone() + } + } +} @@ -26,7 +26,7 @@ pub mod transport; pub mod errors; pub use errors::Error; -pub use builder::{ContainerListOptions, ContainerFilter, EventsOptions}; +pub use builder::{ContainerListOptions, ContainerFilter, EventsOptions, LogsOptions}; use builder::ContainerBuilder; use hyper::{Client, Url}; @@ -179,21 +179,27 @@ impl<'a, 'b> Container<'a, 'b> { } /// Returns a `top` view of information about the container process - pub fn top(self) -> Result<Top> { - let raw = try!(self.docker.get(&format!("/containers/{}/top", self.id)[..])); + pub fn top(self, psargs: Option<&str>) -> Result<Top> { + let mut path = vec![format!("/containers/{}/top", self.id)]; + if let Some(ref args) = psargs { + let encoded = form_urlencoded::serialize( + vec![ + ("ps_args", args) + ]); + path.push(encoded) + } + let raw = try!(self.docker.get(&path.join("?"))); + Ok(try!(json::decode::<Top>(&raw))) } /// Returns a stream of logs emitted but the container instance - pub fn logs(self) -> Result<Box<Read>> { - let query = form_urlencoded::serialize(vec![ - ("follow", true.to_string()), - ("stdout", true.to_string()), - ("stderr", true.to_string()), - ("timestamps", true.to_string()), - ("tail", "all".to_owned()) - ]); - self.docker.stream_get(&format!("/containers/{}/logs?{}", self.id, query)[..]) + pub fn logs(self, opts: &LogsOptions) -> Result<Box<Read>> { + let mut path = vec![format!("/containers/{}/logs", self.id)]; + if let Some(query) = opts.serialize() { + path.push(query) + } + self.docker.stream_get(&path.join("?")) } /// Returns a set of changes made to the container instance |