Some fixes and updates

Signed-off-by: Nikolai Rodionov <nikolai.rodionov@onpier.de>
This commit is contained in:
Nikolai Rodionov 2025-05-09 16:39:12 +02:00
parent 09b1dd522b
commit 1ecee01b17
No known key found for this signature in database
GPG Key ID: 0639A45505F3BFA6
5 changed files with 66 additions and 12 deletions

View File

@ -4,10 +4,17 @@ repositories:
url: https://grafana.github.io/helm-charts url: https://grafana.github.io/helm-charts
charts: charts:
- name: k8s-monitoring - name: mimir-distributed
repository: grafana repository: grafana
patches:
- name: vendor-deps
mirrors: mirrors:
- custom-command - custom-command
patches:
- name: vendor-deps
custom_command:
commands:
- yq -i '.dependencies[].repository = "file://charts"' Chart.yaml
mirrors: mirrors:
- name: custom-commands - name: custom-commands
custom_command: custom_command:

View File

@ -90,7 +90,7 @@ impl Git {
let _ = self.exec(cmd, git_opts.workdir.clone())?; let _ = self.exec(cmd, git_opts.workdir.clone())?;
} }
let cmd = format!( let cmd = format!(
"{} diff --staged --quiet || {} -C {} commit -m \"{}\"", "{} diff --cached --quiet || {} -C {} commit -m \"{}\"",
git_opts.bin, git_opts.bin, self.repo_path, opts.message git_opts.bin, git_opts.bin, self.repo_path, opts.message
); );
match self.exec(cmd, git_opts.workdir.clone()) { match self.exec(cmd, git_opts.workdir.clone()) {

View File

@ -20,6 +20,10 @@ pub(crate) fn latest() -> String {
"latest".to_string() "latest".to_string()
} }
pub(crate) fn def_false() -> bool {
false
}
impl Chart { impl Chart {
pub fn find_repo( pub fn find_repo(
&self, &self,

View File

@ -1,6 +1,7 @@
use clap::Parser; use clap::Parser;
use cli::{check_prerequisites, get_full_path_dir}; use cli::{check_prerequisites, get_full_path_dir};
use config::{read_config, Config, ConfigImpl}; use config::{read_config, ChartExtended, Config, ConfigImpl};
use helm::chart::Chart;
use output::{message_empty, message_error}; use output::{message_empty, message_error};
use std::{error::Error, process::exit}; use std::{error::Error, process::exit};
@ -24,6 +25,12 @@ struct Args {
/// Name of the working dir /// Name of the working dir
#[arg(short, long)] #[arg(short, long)]
workdir: Option<String>, workdir: Option<String>,
/// Configure the chart section from cli
/// If only one chart is needed
#[arg(long)]
chart: Option<String>,
#[arg(long)]
version_override: Option<String>,
/// Path to the configuration file /// Path to the configuration file
#[arg(short, long)] #[arg(short, long)]
config: String, config: String,
@ -53,12 +60,26 @@ fn exec(args: Args) -> Result<(), Box<dyn Error>> {
let workdir_path = workdir::setup_workdir(args.workdir)?; let workdir_path = workdir::setup_workdir(args.workdir)?;
let mut config: Config = read_config(args.config.clone())?; let mut config: Config = read_config(args.config.clone())?;
let config_full_path = get_full_path_dir(args.config.clone())?; let config_full_path = get_full_path_dir(args.config.clone())?;
if let Some(chart_arg) = args.chart {
config.charts = config.charts.into_iter().filter(|chart| chart.chart.name == chart_arg).collect::<Vec<ChartExtended>>();
if let Some(version_arg) = args.version_override {
config.charts.iter_mut()
.for_each(|chart| chart.chart.version = version_arg.clone());
};
};
config.apply_includes(config_full_path.clone())?; config.apply_includes(config_full_path.clone())?;
config config
.charts .charts
.into_iter() .into_iter()
.try_for_each(|mut chart| -> Result<(), Box<dyn Error>> { .try_for_each(|mut chart| -> Result<(), Box<dyn Error>> {
chart.populate_variables(config.variables.clone()); chart.populate_variables(config.variables.clone());
let mut chart_mirrors = config.mirrors.clone();
chart_mirrors.retain(|mirror| mirror.check_chart(&chart) == false);
if chart_mirrors.is_empty() {
output::message_info(&format!("mirrors are up-to-date for {}", chart.chart.name.clone()));
return Ok(());
}
// First step is to pull the chart to the working dir // First step is to pull the chart to the working dir
let current_repo = chart.chart.find_repo(config.repositories.clone())?; let current_repo = chart.chart.find_repo(config.repositories.clone())?;
let chart_path = current_repo.pull_chart(chart.chart.clone(), workdir_path.clone())?; let chart_path = current_repo.pull_chart(chart.chart.clone(), workdir_path.clone())?;
@ -77,16 +98,18 @@ fn exec(args: Args) -> Result<(), Box<dyn Error>> {
patch.apply(chart_path.clone(), config.patches.clone()) patch.apply(chart_path.clone(), config.patches.clone())
})? })?
} }
config chart_mirrors
.mirrors
.iter() .iter()
.try_for_each(|mirror| -> Result<(), Box<dyn Error>> { .try_for_each(|mirror| -> Result<(), Box<dyn Error>> {
if chart.chart.mirrors.contains(&mirror.name) {
mirror_from_mirror_obj(mirror.clone())?.push( mirror_from_mirror_obj(mirror.clone())?.push(
workdir_path.clone(), workdir_path.clone(),
chart_path.clone(), chart_path.clone(),
chart.clone(), chart.clone(),
args.dry_run, args.dry_run,
) )?
};
Ok(())
})?; })?;
message_empty(&format!("{}", chart.chart.name)); message_empty(&format!("{}", chart.chart.name));
Ok(()) Ok(())

View File

@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::config::ChartExtended; use crate::{cli::{self, cli_exec, cli_exec_from_dir}, config::ChartExtended, output::message_info, template::render};
pub(crate) mod custom_command; pub(crate) mod custom_command;
pub(crate) mod git; pub(crate) mod git;
@ -20,6 +20,26 @@ pub(crate) struct Mirror {
pub(crate) name: String, pub(crate) name: String,
pub(crate) git: Option<git::GitMirror>, pub(crate) git: Option<git::GitMirror>,
pub(crate) custom_command: Option<CustomCommandsMirror>, pub(crate) custom_command: Option<CustomCommandsMirror>,
pub(crate) check: Option<String>,
}
impl Mirror {
pub(crate) fn check_chart(&self, chart_local: &ChartExtended) -> bool {
match &self.check {
Some(check_cmd) => {
let cmd = match render(check_cmd.to_string(), chart_local) {
Ok(res) => res,
Err(_) => return false,
};
message_info(&format!("checking the mirror {}", self.name.clone()));
match cli_exec(cmd.clone()) {
Ok(_) => return true,
Err(_) => return false,
}
},
None => false,
}
}
} }
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)] #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]