summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsoftprops <d.tangren@gmail.com>2016-01-03 17:31:43 -0500
committersoftprops <d.tangren@gmail.com>2016-01-03 17:31:43 -0500
commit00b269ffcfcbacd2c32fbdfe98e916f5260c8349 (patch)
treedc9d3da5cd01d4a5ae3d60f2e1738cff2fa6b0fa
parentb0bf43fc517b7c688e51dbed9ef218b598c9be12 (diff)
impl container filter
-rw-r--r--examples/containers.rs9
-rw-r--r--src/builder.rs24
-rw-r--r--src/lib.rs2
-rw-r--r--src/transport.rs1
4 files changed, 34 insertions, 2 deletions
diff --git a/examples/containers.rs b/examples/containers.rs
index e7987e6..e4df6b3 100644
--- a/examples/containers.rs
+++ b/examples/containers.rs
@@ -1,10 +1,15 @@
extern crate shiplift;
-use shiplift::Docker;
+use shiplift::{ContainerFilter, Docker};
fn main() {
let docker = Docker::new();
- for c in docker.containers().list().sized().build().unwrap() {
+ for c in docker.containers().
+ list()
+ .sized()
+ .filter(vec![
+ ContainerFilter::Label("foo".to_owned(), "bar".to_owned())
+ ]).build().unwrap() {
println!("container -> {:?}", c)
}
}
diff --git a/src/builder.rs b/src/builder.rs
index 87b79d5..de83b6a 100644
--- a/src/builder.rs
+++ b/src/builder.rs
@@ -18,6 +18,13 @@ pub struct ContainerListBuilder<'a> {
params: HashMap<&'static str, String>,
}
+pub enum ContainerFilter {
+ ExitCode(u64),
+ Status(String),
+ LabelName(String),
+ Label(String, String)
+}
+
impl<'a> ContainerListBuilder<'a> {
pub fn new(docker: &'a Docker) -> ContainerListBuilder<'a> {
ContainerListBuilder {
@@ -26,6 +33,23 @@ impl<'a> ContainerListBuilder<'a> {
}
}
+ pub fn filter(&mut self, filters: Vec<ContainerFilter>) -> &mut ContainerListBuilder<'a> {
+ let mut param = HashMap::new();
+ for f in filters {
+ match f {
+ ContainerFilter::ExitCode(c) => param.insert("exit", vec![c.to_string()]),
+ ContainerFilter::Status(s) => param.insert("status", vec![s]),
+ ContainerFilter::LabelName(n) => param.insert("label", vec![n]),
+ ContainerFilter::Label(n,v) => param.insert("label", vec![format!("{}={}", n, v)])
+ };
+
+ }
+ // structure is a a json encoded object mapping string keys to a list
+ // of string values
+ self.params.insert("filters", json::encode(&param).unwrap());
+ self
+ }
+
pub fn all(&mut self) -> &mut ContainerListBuilder<'a> {
self.params.insert("all", "true".to_owned());
self
diff --git a/src/lib.rs b/src/lib.rs
index 116bb7e..95743bb 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -26,6 +26,8 @@ pub mod transport;
pub mod errors;
pub use errors::Error;
+pub use builder::ContainerFilter;
+
use builder::{ContainerBuilder, ContainerListBuilder, EventsBuilder};
use hyper::{Client, Url};
use hyper::net::{HttpsConnector, Openssl};
diff --git a/src/transport.rs b/src/transport.rs
index e82f5c8..f22027e 100644
--- a/src/transport.rs
+++ b/src/transport.rs
@@ -81,6 +81,7 @@ impl Transport {
Ok(Box::new(res))
}
StatusCode::NoContent => Ok(Box::new(BufReader::new("".as_bytes()))),
+ // todo: constantize these
StatusCode::BadRequest => Err(Error::Fault { code: res.status, message: "bad parameter".to_owned() }),
StatusCode::NotFound => Err(Error::Fault { code: res.status, message: "not found".to_owned() }),
StatusCode::NotAcceptable => Err(Error::Fault { code: res.status, message: "not acceptable".to_owned() }),