1
0
Fork 0
mirror of https://codeberg.org/icewind/haze.git synced 2026-06-03 17:14:08 +02:00

allow exec in db

This commit is contained in:
Robin Appelman 2021-06-14 18:46:00 +02:00
commit b46291b0f0
3 changed files with 89 additions and 18 deletions

View file

@ -22,6 +22,7 @@ pub enum HazeArgs {
},
Exec {
filter: Option<String>,
service: Option<ExecService>,
command: Vec<String>,
},
Occ {
@ -43,6 +44,11 @@ pub enum HazeArgs {
},
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub enum ExecService {
Db,
}
impl HazeArgs {
pub fn parse<I, S>(mut args: I) -> Result<HazeArgs>
where
@ -94,10 +100,24 @@ impl HazeArgs {
let args = args.map(S::into).collect();
Ok(HazeArgs::Test { options, args })
}
HazeCommand::Exec => Ok(HazeArgs::Exec {
filter,
command: args.map(S::into).collect(),
}),
HazeCommand::Exec => {
let mut args = args.peekable();
let service = match args.peek() {
Some(arg) if arg == "db" => {
args.next();
Some(ExecService::Db)
}
_ => None,
};
let command = args.map(S::into).collect();
Ok(HazeArgs::Exec {
filter,
service,
command,
})
}
HazeCommand::Occ => Ok(HazeArgs::Occ {
filter,
command: args.map(S::into).collect(),
@ -209,6 +229,7 @@ fn test_arg_parse() {
HazeArgs::parse(vec!["haze", "exec", "foo", "bar"].into_iter()).unwrap(),
HazeArgs::Exec {
filter: None,
service: None,
command: vec!["foo".to_string(), "bar".to_string()],
}
);
@ -216,6 +237,15 @@ fn test_arg_parse() {
HazeArgs::parse(vec!["haze", "asdasd", "exec", "foo", "bar"].into_iter()).unwrap(),
HazeArgs::Exec {
filter: Some("asdasd".to_string()),
service: None,
command: vec!["foo".to_string(), "bar".to_string()],
}
);
assert_eq!(
HazeArgs::parse(vec!["haze", "asdasd", "exec", "db", "foo", "bar"].into_iter()).unwrap(),
HazeArgs::Exec {
filter: Some("asdasd".to_string()),
service: Some("db".to_string()),
command: vec!["foo".to_string(), "bar".to_string()],
}
);

View file

@ -5,7 +5,7 @@ use bollard::models::{EndpointSettings, HostConfig};
use bollard::Docker;
use color_eyre::{eyre::WrapErr, Report, Result};
use maplit::hashmap;
use std::io::Stdout;
use std::io::{stdout, Stdout};
use std::str::FromStr;
use std::time::Duration;
use tokio::time::{sleep, timeout};
@ -209,6 +209,24 @@ impl Database {
Ok(Some(id))
}
pub async fn exec_sh<S: Into<String>>(
&self,
docker: &mut Docker,
cloud_id: &str,
cmd: Vec<S>,
tty: bool,
) -> Result<i64> {
let container = match self.family() {
DatabaseFamily::Sqlite => cloud_id.to_string(),
_ => format!("{}-db", cloud_id.to_string()),
};
if tty {
exec_tty(docker, &container, "root", cmd, vec![]).await
} else {
exec(docker, &container, "root", cmd, vec![], Some(stdout())).await
}
}
pub async fn exec(&self, docker: &mut Docker, cloud_id: &str, root: bool) -> Result<i64> {
match self.family() {
DatabaseFamily::Sqlite => {

View file

@ -1,4 +1,4 @@
use crate::args::HazeArgs;
use crate::args::{ExecService, HazeArgs};
use crate::cloud::Cloud;
use crate::config::HazeConfig;
use crate::exec::container_logs;
@ -111,19 +111,42 @@ async fn main() -> Result<()> {
print!("{}", log);
}
}
HazeArgs::Exec { filter, command } => {
HazeArgs::Exec {
filter,
service,
command,
} => {
let cloud = Cloud::get_by_filter(&mut docker, filter, &config).await?;
cloud
.exec(
&mut docker,
if command.is_empty() {
vec!["bash".to_string()]
} else {
command
},
true,
)
.await?;
match service {
None => {
cloud
.exec(
&mut docker,
if command.is_empty() {
vec!["bash".to_string()]
} else {
command
},
true,
)
.await?;
}
Some(ExecService::Db) => {
cloud
.db
.exec_sh(
&mut docker,
&cloud.id,
if command.is_empty() {
vec!["bash".to_string()]
} else {
command
},
true,
)
.await?;
}
}
}
HazeArgs::Occ {
filter,