summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsoftprops <d.tangren@gmail.com>2016-01-03 19:03:02 -0500
committersoftprops <d.tangren@gmail.com>2016-01-03 19:03:02 -0500
commit97689b1449f4c67069d52d0f4ffac8228371d098 (patch)
treefd9370cbe3d7a8b02ca0bfe9eb40bbfd0db74af1
parentbec764a28fd42e7a39de84b2d7caa96cd05a194a (diff)
add log and top options
-rw-r--r--examples/logs.rs15
-rw-r--r--examples/top.rs12
-rw-r--r--src/builder.rs66
-rw-r--r--src/lib.rs30
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()
+ }
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index b347a53..f00d896 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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