mirror of
https://codeberg.org/icewind/haze.git
synced 2026-06-03 17:14:08 +02:00
service logs
This commit is contained in:
parent
fdee3d7cfa
commit
fe33330547
5 changed files with 61 additions and 27 deletions
18
src/args.rs
18
src/args.rs
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::cloud::CloudOptions;
|
use crate::cloud::CloudOptions;
|
||||||
|
use crate::service::Service;
|
||||||
use color_eyre::{Report, Result};
|
use color_eyre::{Report, Result};
|
||||||
use parse_display::Display;
|
use parse_display::Display;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
@ -33,6 +34,7 @@ pub enum HazeArgs {
|
||||||
Clean,
|
Clean,
|
||||||
Logs {
|
Logs {
|
||||||
filter: Option<String>,
|
filter: Option<String>,
|
||||||
|
service: Option<Service>,
|
||||||
count: Option<usize>,
|
count: Option<usize>,
|
||||||
},
|
},
|
||||||
Open {
|
Open {
|
||||||
|
|
@ -104,10 +106,22 @@ impl HazeArgs {
|
||||||
}),
|
}),
|
||||||
HazeCommand::Db => Ok(HazeArgs::Db { filter }),
|
HazeCommand::Db => Ok(HazeArgs::Db { filter }),
|
||||||
HazeCommand::Clean => Ok(HazeArgs::Clean),
|
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,
|
filter,
|
||||||
|
service,
|
||||||
count: args.next().map(|arg| arg.as_ref().parse()).transpose()?,
|
count: args.next().map(|arg| arg.as_ref().parse()).transpose()?,
|
||||||
}),
|
})
|
||||||
|
}
|
||||||
HazeCommand::Open => Ok(HazeArgs::Open { filter }),
|
HazeCommand::Open => Ok(HazeArgs::Open { filter }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
24
src/cloud.rs
24
src/cloud.rs
|
|
@ -4,14 +4,13 @@ use crate::exec::{exec, exec_tty};
|
||||||
use crate::mapping::default_mappings;
|
use crate::mapping::default_mappings;
|
||||||
use crate::php::PhpVersion;
|
use crate::php::PhpVersion;
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use bollard::container::{ListContainersOptions, LogsOptions, RemoveContainerOptions};
|
use bollard::container::{ListContainersOptions, RemoveContainerOptions};
|
||||||
use bollard::models::ContainerState;
|
use bollard::models::ContainerState;
|
||||||
use bollard::network::CreateNetworkOptions;
|
use bollard::network::CreateNetworkOptions;
|
||||||
use bollard::Docker;
|
use bollard::Docker;
|
||||||
use camino::Utf8PathBuf;
|
use camino::Utf8PathBuf;
|
||||||
use color_eyre::{eyre::WrapErr, Report, Result};
|
use color_eyre::{eyre::WrapErr, Report, Result};
|
||||||
use futures_util::future::try_join_all;
|
use futures_util::future::try_join_all;
|
||||||
use futures_util::stream::StreamExt;
|
|
||||||
use petname::petname;
|
use petname::petname;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
@ -61,11 +60,11 @@ impl CloudOptions {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(dbg!(CloudOptions {
|
Ok(CloudOptions {
|
||||||
db: db.unwrap_or_default(),
|
db: db.unwrap_or_default(),
|
||||||
php: php.unwrap_or_default(),
|
php: php.unwrap_or_default(),
|
||||||
services,
|
services,
|
||||||
}))
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -269,23 +268,6 @@ impl Cloud {
|
||||||
Ok(())
|
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>>(
|
pub async fn exec<S: Into<String>>(
|
||||||
&self,
|
&self,
|
||||||
docker: &mut Docker,
|
docker: &mut Docker,
|
||||||
|
|
|
||||||
18
src/exec.rs
18
src/exec.rs
|
|
@ -1,3 +1,4 @@
|
||||||
|
use bollard::container::LogsOptions;
|
||||||
use bollard::exec::{CreateExecOptions, StartExecResults};
|
use bollard::exec::{CreateExecOptions, StartExecResults};
|
||||||
use bollard::Docker;
|
use bollard::Docker;
|
||||||
use color_eyre::{eyre::WrapErr, Result};
|
use color_eyre::{eyre::WrapErr, Result};
|
||||||
|
|
@ -119,3 +120,20 @@ pub async fn exec<S1: AsRef<str>, S2: Into<String>>(
|
||||||
.exit_code
|
.exit_code
|
||||||
.unwrap_or_default())
|
.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)
|
||||||
|
}
|
||||||
|
|
|
||||||
14
src/main.rs
14
src/main.rs
|
|
@ -1,6 +1,7 @@
|
||||||
use crate::args::HazeArgs;
|
use crate::args::HazeArgs;
|
||||||
use crate::cloud::Cloud;
|
use crate::cloud::Cloud;
|
||||||
use crate::config::HazeConfig;
|
use crate::config::HazeConfig;
|
||||||
|
use crate::exec::container_logs;
|
||||||
use crate::service::Service;
|
use crate::service::Service;
|
||||||
use bollard::Docker;
|
use bollard::Docker;
|
||||||
use color_eyre::{eyre::WrapErr, Result};
|
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?;
|
let cloud = Cloud::get_by_filter(&mut docker, filter, &config).await?;
|
||||||
cloud.destroy(&mut docker).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 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 {
|
for log in logs {
|
||||||
print!("{}", log);
|
print!("{}", log);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,12 @@ impl Service {
|
||||||
.await
|
.await
|
||||||
.wrap_err("Timeout after 15 seconds")?
|
.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)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
|
|
@ -120,4 +126,8 @@ impl ObjectStore {
|
||||||
async fn is_healthy(&self, _docker: &Docker, _cloud_id: &str) -> Result<bool> {
|
async fn is_healthy(&self, _docker: &Docker, _cloud_id: &str) -> Result<bool> {
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn container_name(&self, cloud_id: &str) -> String {
|
||||||
|
format!("{}-object", cloud_id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue