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

service logs

This commit is contained in:
Robin Appelman 2021-03-19 18:42:40 +01:00
commit fe33330547
5 changed files with 61 additions and 27 deletions

View file

@ -1,4 +1,5 @@
use crate::cloud::CloudOptions;
use crate::service::Service;
use color_eyre::{Report, Result};
use parse_display::Display;
use std::fmt::Display;
@ -33,6 +34,7 @@ pub enum HazeArgs {
Clean,
Logs {
filter: Option<String>,
service: Option<Service>,
count: Option<usize>,
},
Open {
@ -104,10 +106,22 @@ impl HazeArgs {
}),
HazeCommand::Db => Ok(HazeArgs::Db { filter }),
HazeCommand::Clean => Ok(HazeArgs::Clean),
HazeCommand::Logs => Ok(HazeArgs::Logs {
HazeCommand::Logs => {
let mut args = args.peekable();
let service = args
.peek()
.map(|s| s.as_ref())
.map(Service::from_type)
.flatten();
if service.is_some() {
let _ = args.next();
}
Ok(HazeArgs::Logs {
filter,
service,
count: args.next().map(|arg| arg.as_ref().parse()).transpose()?,
}),
})
}
HazeCommand::Open => Ok(HazeArgs::Open { filter }),
}
}

View file

@ -4,14 +4,13 @@ use crate::exec::{exec, exec_tty};
use crate::mapping::default_mappings;
use crate::php::PhpVersion;
use crate::service::Service;
use bollard::container::{ListContainersOptions, LogsOptions, RemoveContainerOptions};
use bollard::container::{ListContainersOptions, RemoveContainerOptions};
use bollard::models::ContainerState;
use bollard::network::CreateNetworkOptions;
use bollard::Docker;
use camino::Utf8PathBuf;
use color_eyre::{eyre::WrapErr, Report, Result};
use futures_util::future::try_join_all;
use futures_util::stream::StreamExt;
use petname::petname;
use std::collections::HashMap;
use std::fmt::Display;
@ -61,11 +60,11 @@ impl CloudOptions {
}
}
Ok(dbg!(CloudOptions {
Ok(CloudOptions {
db: db.unwrap_or_default(),
php: php.unwrap_or_default(),
services,
}))
})
}
}
@ -269,23 +268,6 @@ impl Cloud {
Ok(())
}
pub async fn logs(&self, docker: &mut Docker, count: usize) -> Result<Vec<String>> {
let mut logs = Vec::new();
let mut stream = docker.logs::<String>(
&self.id,
Some(LogsOptions {
stdout: true,
stderr: true,
tail: format!("{}", count),
..Default::default()
}),
);
while let Some(line) = stream.next().await {
logs.push(line?.to_string());
}
Ok(logs)
}
pub async fn exec<S: Into<String>>(
&self,
docker: &mut Docker,

View file

@ -1,3 +1,4 @@
use bollard::container::LogsOptions;
use bollard::exec::{CreateExecOptions, StartExecResults};
use bollard::Docker;
use color_eyre::{eyre::WrapErr, Result};
@ -119,3 +120,20 @@ pub async fn exec<S1: AsRef<str>, S2: Into<String>>(
.exit_code
.unwrap_or_default())
}
pub async fn container_logs(docker: &Docker, container: &str, count: usize) -> Result<Vec<String>> {
let mut logs = Vec::new();
let mut stream = docker.logs::<String>(
container,
Some(LogsOptions {
stdout: true,
stderr: true,
tail: format!("{}", count),
..Default::default()
}),
);
while let Some(line) = stream.next().await {
logs.push(line?.to_string());
}
Ok(logs)
}

View file

@ -1,6 +1,7 @@
use crate::args::HazeArgs;
use crate::cloud::Cloud;
use crate::config::HazeConfig;
use crate::exec::container_logs;
use crate::service::Service;
use bollard::Docker;
use color_eyre::{eyre::WrapErr, Result};
@ -94,9 +95,18 @@ async fn main() -> Result<()> {
let cloud = Cloud::get_by_filter(&mut docker, filter, &config).await?;
cloud.destroy(&mut docker).await?;
}
HazeArgs::Logs { filter, count } => {
HazeArgs::Logs {
filter,
count,
service,
} => {
let cloud = Cloud::get_by_filter(&mut docker, filter, &config).await?;
let logs = cloud.logs(&mut docker, count.unwrap_or(20)).await?;
let container = if let Some(service) = service {
service.container_name(&cloud.id)
} else {
cloud.id
};
let logs = container_logs(&docker, &container, count.unwrap_or(20)).await?;
for log in logs {
print!("{}", log);
}

View file

@ -54,6 +54,12 @@ impl Service {
.await
.wrap_err("Timeout after 15 seconds")?
}
pub fn container_name(&self, cloud_id: &str) -> String {
match self {
Service::ObjectStore(store) => store.container_name(cloud_id),
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
@ -120,4 +126,8 @@ impl ObjectStore {
async fn is_healthy(&self, _docker: &Docker, _cloud_id: &str) -> Result<bool> {
Ok(true)
}
fn container_name(&self, cloud_id: &str) -> String {
format!("{}-object", cloud_id)
}
}