Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
197 changes: 98 additions & 99 deletions Cargo.lock

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "cage"
version = "0.4.0"
version = "0.4.1-pre1"
authors = ["Eric Kidd <[email protected]>",
"Seamus Abshere <[email protected]>"]
edition = "2021"
Expand All @@ -22,7 +22,7 @@ doc = false
test = true

[dev-dependencies]
cli_test_dir = "0.1.4"
cli_test_dir = "0.1.8"
copy_dir = "0.1"

[dependencies]
Expand All @@ -40,11 +40,11 @@ handlebars = "6.3"
vault = { version = "2.1", package = "hashicorp_vault", default-features = false, features = ["rustls-tls"] }
include_dir = "0.7"
itertools = "0.14"
lazy_static = "1.0"
log = "0.4.8"
lazy_static = "1.5"
log = "0.4.28"
rand = "0.9"
rayon = "1.3.0"
regex = "1.3.6"
rayon = "1.11.0"
regex = "1.12.2"
retry = "2.1"
semver = "1.0"
serde = "1.0"
Expand All @@ -53,4 +53,4 @@ serde_json = "1.0"
serde_yaml = "0.9"
shlex = "1.3"
tokio = { version = "1", features = ["rt", "macros"] }
url = "2.1.1"
url = "2.5.7"
35 changes: 34 additions & 1 deletion src/args/opts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,46 @@ impl ToArgs for Pull {
}
}

/// Options for `docker-compose build`.
#[derive(Debug, Default, Clone)]
#[allow(missing_copy_implementations)]
#[non_exhaustive]
pub struct Build {
/// Suppress the build output.
pub quiet: bool,
}

impl ToArgs for Build {
fn to_args(&self) -> Vec<OsString> {
let mut args = vec![];
if self.quiet {
args.push(OsString::from("-q"));
}
args
}
}

/// Command-line flags with for `docker-compose up`.
#[derive(Debug, Default, Clone)]
#[allow(missing_copy_implementations)]
#[non_exhaustive]
pub struct Up {
/// Should we initialize each pod after we start it up?
pub init: bool,
/// For build operations during up
pub quiet: bool,
}

impl Up {
/// Create new `Up` options.
pub fn new(init: bool) -> Up {
Up { init }
Up { init, quiet: false }
}

/// Set quiet mode.
pub fn with_quiet(mut self, quiet: bool) -> Self {
self.quiet = quiet;
self
}
}

Expand Down Expand Up @@ -203,6 +230,9 @@ pub struct Run {
/// default: false
pub no_deps: bool,

/// Pull without printing progress information
pub quiet_pull: bool,

/// PRIVATE: This field is a stand-in for future options.
/// See http://stackoverflow.com/q/39277157/12089
#[doc(hidden)]
Expand Down Expand Up @@ -245,6 +275,9 @@ impl ToArgs for Run {
if self.no_deps {
args.push(OsStr::new("--no-deps").to_owned());
}
if self.quiet_pull {
args.push(OsStr::new("--quiet-pull").to_owned());
}
args
}
}
Expand Down
85 changes: 85 additions & 0 deletions src/cmd/compose.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,3 +179,88 @@ fn runs_docker_compose_on_named_pods_and_services() {

proj.remove_test_output().unwrap();
}

#[test]
fn runs_docker_compose_with_quiet_mode() {
let _ = env_logger::try_init();
let mut proj = Project::from_example("rails_hello").unwrap();
proj.set_quiet(true);
let runner = TestCommandRunner::new();
proj.output("stop").unwrap();

let opts = args::opts::Empty;
proj.compose(&runner, "stop", &args::ActOn::All, &opts)
.unwrap();
assert_ran!(runner, {
["docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("db.yml"),
"--progress",
"quiet",
"stop"],
["docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("frontend.yml"),
"--progress",
"quiet",
"stop"],
["docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("rake.yml"),
"--progress",
"quiet",
"stop"]
});

proj.remove_test_output().unwrap();
}

#[test]
fn runs_docker_compose_build_with_quiet_flag() {
let _ = env_logger::try_init();
let mut proj = Project::from_example("rails_hello").unwrap();
proj.set_quiet(true);
let runner = TestCommandRunner::new();
proj.output("build").unwrap();

let opts = args::opts::Build { quiet: true };
proj.compose(&runner, "build", &args::ActOn::All, &opts)
.unwrap();
assert_ran!(runner, {
["docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("db.yml"),
"--progress",
"quiet",
"build",
"-q"],
["docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("frontend.yml"),
"--progress",
"quiet",
"build",
"-q"],
["docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("rake.yml"),
"--progress",
"quiet",
"build",
"-q"]
});

proj.remove_test_output().unwrap();
}
53 changes: 53 additions & 0 deletions src/cmd/pull.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,56 @@ fn runs_docker_compose_pull_on_all_pods() {

proj.remove_test_output().unwrap();
}

#[test]
fn runs_docker_compose_pull_with_global_quiet() {
let _ = env_logger::try_init();
let mut proj = Project::from_example("hello").unwrap();
proj.set_quiet(true);
let runner = TestCommandRunner::new();
proj.output("pull").unwrap();

let opts = args::opts::Pull::default();
proj.pull(&runner, &args::ActOn::All, &opts).unwrap();
assert_ran!(runner, {
[proj.root_dir().join("config").join("hooks").join("pull.d")
.join("hello.hook")],
["docker-compose",
"-p",
"hello",
"-f",
proj.output_dir().join("pods").join("frontend.yml"),
"--progress",
"quiet",
"pull"]
});

proj.remove_test_output().unwrap();
}

#[test]
fn runs_docker_compose_pull_with_both_quiet_flags() {
let _ = env_logger::try_init();
let mut proj = Project::from_example("hello").unwrap();
proj.set_quiet(true);
let runner = TestCommandRunner::new();
proj.output("pull").unwrap();

let opts = args::opts::Pull { quiet: true };
proj.pull(&runner, &args::ActOn::All, &opts).unwrap();
assert_ran!(runner, {
[proj.root_dir().join("config").join("hooks").join("pull.d")
.join("hello.hook")],
["docker-compose",
"-p",
"hello",
"-f",
proj.output_dir().join("pods").join("frontend.yml"),
"--progress",
"quiet",
"pull",
"--quiet"]
});

proj.remove_test_output().unwrap();
}
47 changes: 40 additions & 7 deletions src/cmd/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,16 +108,16 @@ impl CommandRun for Project {
service.test_command()?.iter().map(|s| s.into()).collect()
};
let container_name = format!("{}_{}", service_name, random::<u16>());
runner
.build("docker-compose")
.args(&pod.compose_args(self)?)
let mut cmd = runner.build("docker-compose");
cmd.args(&pod.compose_args(self)?)
.arg("run")
.arg("--name")
.arg(&container_name)
.arg("--no-deps")
.arg(service_name)
.args(&command_args)
.exec()?;
.arg("--no-deps");
if self.quiet() {
cmd.arg("--quiet-pull");
}
cmd.arg(service_name).args(&command_args).exec()?;

// TODO: If exporting output, run `docker cp`.
if opts.export_test_output {
Expand Down Expand Up @@ -222,6 +222,39 @@ fn runs_tests() {
proj.remove_test_output().unwrap();
}

#[test]
fn runs_docker_compose_run_with_quiet_pull() {
let _ = env_logger::try_init();
let mut proj = Project::from_example("rails_hello").unwrap();
proj.set_quiet(true);
let runner = TestCommandRunner::new();
proj.output("run").unwrap();

let cmd = args::Command::new("db:migrate");
let mut opts = args::opts::Run::default();
opts.allocate_tty = false;
opts.quiet_pull = true;
proj.run(&runner, "rake", Some(&cmd), &opts).unwrap();
assert_ran!(runner, {
[
"docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("rake.yml"),
"--progress",
"quiet",
"run",
"-T",
"--quiet-pull",
"rake",
"db:migrate",
]
});

proj.remove_test_output().unwrap();
}

#[test]
fn runs_tests_with_custom_command() {
let _ = env_logger::try_init();
Expand Down
28 changes: 28 additions & 0 deletions src/cmd/up.rs
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,31 @@ fn runs_docker_compose_up_honors_enable_in_targets() {

proj.remove_test_output().unwrap();
}

#[test]
fn runs_docker_compose_up_with_quiet_mode() {
let _ = env_logger::try_init();
let mut proj = Project::from_example("rails_hello").unwrap();
proj.set_quiet(true);
proj.set_current_target_name("production").unwrap();
let runner = TestCommandRunner::new();
proj.output("up").unwrap();

let opts = args::opts::Up::default();
proj.up(&runner, &args::ActOn::All, &opts).unwrap();
assert_ran!(runner, {
[
"docker-compose",
"-p",
"railshello",
"-f",
proj.output_dir().join("pods").join("frontend.yml"),
"--progress",
"quiet",
"up",
"-d",
]
});

proj.remove_test_output().unwrap();
}
Loading