From 9bd3c83c4822a122fdefa4c0275aebb932df2e21 Mon Sep 17 00:00:00 2001 From: MasterPtato <23087326+MasterPtato@users.noreply.github.com> Date: Thu, 18 Apr 2024 20:21:27 +0000 Subject: [PATCH] fix: resolve minio url within k8s when using loopback cluster ip (#580) ## Changes --- lib/bolt/core/src/context/service.rs | 35 +++++++++++++++++++++++--- lib/bolt/core/src/dep/terraform/gen.rs | 9 ++++++- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/bolt/core/src/context/service.rs b/lib/bolt/core/src/context/service.rs index 4a604dea3d..3328c559e5 100644 --- a/lib/bolt/core/src/context/service.rs +++ b/lib/bolt/core/src/context/service.rs @@ -3,6 +3,7 @@ use async_recursion::async_recursion; use std::{ collections::HashMap, hash::{Hash, Hasher}, + net::Ipv4Addr, path::{Path, PathBuf}, sync::{Arc, Weak}, }; @@ -1369,10 +1370,36 @@ async fn add_s3_env( format!("S3_{provider_upper}_ENDPOINT_INTERNAL_{s3_dep_name}"), s3_config.endpoint_internal, )); - env.push(( - format!("S3_{provider_upper}_ENDPOINT_EXTERNAL_{s3_dep_name}"), - s3_config.endpoint_external, - )); + // External endpoint + { + let mut external_endpoint = s3_config.endpoint_external; + + // Switch to internal k8s url if public ip is loopback + if let ( + s3_util::Provider::Minio, + config::ns::ClusterKind::SingleNode { + public_ip, + minio_port, + .. + }, + ) = (provider, &project_ctx.ns().cluster.kind) + { + let is_loopback = public_ip + .parse::() + .ok() + .map(|ip| ip.is_loopback()) + .unwrap_or_default(); + + if is_loopback { + external_endpoint = format!("http://minio.minio.svc.cluster.local:{minio_port}"); + } + } + + env.push(( + format!("S3_{provider_upper}_ENDPOINT_EXTERNAL_{s3_dep_name}",), + external_endpoint, + )); + } env.push(( format!("S3_{provider_upper}_REGION_{s3_dep_name}"), s3_config.region, diff --git a/lib/bolt/core/src/dep/terraform/gen.rs b/lib/bolt/core/src/dep/terraform/gen.rs index f5d55c2bea..91583a9dfe 100644 --- a/lib/bolt/core/src/dep/terraform/gen.rs +++ b/lib/bolt/core/src/dep/terraform/gen.rs @@ -41,7 +41,14 @@ pub async fn project(ctx: &ProjectContext) { pub async fn gen_bolt_tf(ctx: &ProjectContext, plan_id: &str) -> Result<()> { // Configure the backend let backend = match ctx.ns().terraform.backend { - ns::TerraformBackend::Local {} => String::new(), + ns::TerraformBackend::Local {} => indoc!( + " + terraform { + backend \"local\" {} + } + " + ) + .to_string(), ns::TerraformBackend::Postgres {} => indoc!( " terraform {