From 36de8511f91fc19704698323c3760b15616950cb Mon Sep 17 00:00:00 2001 From: Maximiliano Duthey Date: Fri, 24 Oct 2025 12:34:54 -0300 Subject: [PATCH 1/3] feat: add SubmitAPI configuration and integration --- bootstrap/main.tf | 2 ++ bootstrap/proxy/deployment.tf | 20 ++++++++++++++++++++ bootstrap/proxy/main.tf | 20 ++++++++++++++++++++ bootstrap/variables.tf | 10 ++++++++++ operator/src/utils.rs | 1 + proxy/src/config.rs | 21 +++++++++++++++++++++ proxy/src/proxy.rs | 22 +++++++++++++++++++++- 7 files changed, 95 insertions(+), 1 deletion(-) diff --git a/bootstrap/main.tf b/bootstrap/main.tf index 15deebc..37fc8c8 100644 --- a/bootstrap/main.tf +++ b/bootstrap/main.tf @@ -50,6 +50,7 @@ module "blockfrost_v1_proxy" { dns_names = var.dns_names cache_max_size_bytes = var.proxy_cache_max_size_bytes dolos_endpoints = var.proxy_blue_dolos_endpoints + submitapi_endpoints = var.proxy_blue_submitapi_endpoints } module "blockfrost_v1_proxy_green" { @@ -67,6 +68,7 @@ module "blockfrost_v1_proxy_green" { dns_names = var.dns_names cache_max_size_bytes = var.proxy_cache_max_size_bytes dolos_endpoints = var.proxy_green_dolos_endpoints + submitapi_endpoints = var.proxy_green_submitapi_endpoints } module "blockfrost_instances" { diff --git a/bootstrap/proxy/deployment.tf b/bootstrap/proxy/deployment.tf index b90c276..09f5087 100644 --- a/bootstrap/proxy/deployment.tf +++ b/bootstrap/proxy/deployment.tf @@ -139,6 +139,26 @@ resource "kubernetes_deployment_v1" "blockfrost_proxy" { value = var.dolos_endpoints } + env { + name = "SUBMITAPI_ENABLED" + value = var.submitapi_enabled + } + + env { + name = "SUBMITAPI_PORT" + value = var.submitapi_port + } + + env { + name = "SUBMITAPI_DNS" + value = var.submitapi_dns + } + + env { + name = "SUBMITAPI_ENDPOINTS" + value = var.submitapi_endpoints + } + volume_mount { mount_path = "/certs" name = "certs" diff --git a/bootstrap/proxy/main.tf b/bootstrap/proxy/main.tf index b74bc11..e63afab 100644 --- a/bootstrap/proxy/main.tf +++ b/bootstrap/proxy/main.tf @@ -108,6 +108,26 @@ variable "dolos_endpoints" { default = "\\/blocks\\/[A-z0-9]+\\/txs\\/?$,\\/blocks\\/[A-z0-9]+\\/?$,\\/addresses\\/[A-z0-9]+\\/utxos(\\?.*)?$" } +variable "submitapi_enabled" { + type = bool + default = true +} + +variable "submitapi_port" { + type = number + default = 8090 +} + +variable "submitapi_dns" { + type = string + default = "ext-submitapi-m1.svc.cluster.local" +} + +variable "submitapi_endpoints" { + type = string + default = "\\/tx\\/submit" +} + variable "tolerations" { type = list(object({ effect = string diff --git a/bootstrap/variables.tf b/bootstrap/variables.tf index 90180ba..2bad46c 100644 --- a/bootstrap/variables.tf +++ b/bootstrap/variables.tf @@ -102,6 +102,16 @@ variable "proxy_green_dolos_endpoints" { default = "\\/blocks\\/[A-z0-9]+\\/txs\\/?$,\\/blocks\\/[A-z0-9]+\\/?$,\\/addresses\\/[A-z0-9]+\\/utxos(\\?.*)?$" } +variable "proxy_blue_submitapi_endpoints" { + type = string + default = "\\/tx\\/submit" +} + +variable "proxy_green_submitapi_endpoints" { + type = string + default = "\\/tx\\/submit" +} + variable "proxy_green_image_tag" { type = string } diff --git a/operator/src/utils.rs b/operator/src/utils.rs index d942168..2ff5b51 100644 --- a/operator/src/utils.rs +++ b/operator/src/utils.rs @@ -99,6 +99,7 @@ mod test { network: "preview".to_string(), throughput_tier: "0".to_string(), blockfrost_version: Some("v1".to_string()), + auth_token: None, }, ); crd.metadata.namespace = Some("namespace".to_string()); diff --git a/proxy/src/config.rs b/proxy/src/config.rs index 3a8686d..94315c8 100644 --- a/proxy/src/config.rs +++ b/proxy/src/config.rs @@ -20,6 +20,12 @@ pub struct Config { pub dolos_dns: String, pub dolos_endpoints: Vec, + // Submit API settings + pub submitapi_enabled: bool, + pub submitapi_port: u16, + pub submitapi_dns: String, + pub submitapi_endpoints: Vec, + // Cache settings pub cache_rules_path: PathBuf, pub cache_db_path: String, @@ -85,6 +91,17 @@ impl Config { .split(',') .map(|endpoint| Endpoint::new(endpoint).expect("Invalid dolos endpoint regex")) .collect(), + submitapi_enabled: env::var("SUBMITAPI_ENABLED").unwrap_or("false".to_string()) == "true", + submitapi_port: env::var("SUBMITAPI_PORT") + .expect("SUBMITAPI_PORT must be set") + .parse() + .expect("SUBMITAPI_PORT must be a number"), + submitapi_dns: env::var("SUBMITAPI_DNS").expect("SUBMITAPI_DNS must be set"), + submitapi_endpoints: env::var("SUBMITAPI_ENDPOINTS") + .expect("Missing SUBMITAPI_ENDPOINTS variable") + .split(',') + .map(|endpoint| Endpoint::new(endpoint).expect("Invalid submit api endpoint regex")) + .collect(), health_endpoint: "/dmtr_health".to_string(), } } @@ -118,6 +135,10 @@ mod tests { env::set_var("FORBIDDEN_ENDPOINTS", r"/network,/pools/\w+$"); env::set_var("DOLOS_PORT", "50051"); env::set_var("DOLOS_DNS", "ext-utxorpc-m1"); + env::set_var("DOLOS_ENDPOINTS", r"/blocks/,/epochs/"); + env::set_var("SUBMITAPI_PORT", "8090"); + env::set_var("SUBMITAPI_DNS", "ext-submitapi-m1"); + env::set_var("SUBMITAPI_ENDPOINTS", r"/tx/submit"); let config = Config::new(); assert!(config.forbidden_endpoints[0].matches("/network")); diff --git a/proxy/src/proxy.rs b/proxy/src/proxy.rs index e4ba70f..30e39cf 100644 --- a/proxy/src/proxy.rs +++ b/proxy/src/proxy.rs @@ -171,6 +171,19 @@ impl BlockfrostProxy { fn should_use_dolos(&self, network: &str, path: &str) -> bool { network != "vector-testnet" && self.config.dolos_enabled && self.is_dolos_path(path) } + + fn is_submit_api_path(&self, path: &str) -> bool { + for submit_api_endpoint in self.config.submitapi_endpoints.clone().into_iter() { + if submit_api_endpoint.matches(path) { + return true; + } + } + false + } + + fn should_use_submit_api(&self, path: &str) -> bool { + self.config.submitapi_enabled && self.is_submit_api_path(path) + } } #[derive(Debug, Default)] @@ -220,7 +233,14 @@ impl ProxyHttp for BlockfrostProxy { ctx.consumer = consumer.unwrap(); - if self.should_use_dolos(&ctx.consumer.network, path) { + if self.should_use_submit_api(path) { + ctx.instance = format!( + //eg: internal-cardano-mainnet-submitapi.ext-submitapi-m1.svc.cluster.local:8090 + "internal-{}-submitapi.{}:{}", + ctx.consumer.network, self.config.submitapi_dns, self.config.submitapi_port + ); + ctx.resolved_by = "submitapi".to_string(); + } else if self.should_use_dolos(&ctx.consumer.network, path) { ctx.instance = format!( //eg: internal-cardano-mainnet-minibf.ext-utxorpc-m1.svc.cluster.local:3001 "internal-{}-minibf.{}:{}", From 3e5aa2474935f80eb2c6bdb77d367e5aab70ca00 Mon Sep 17 00:00:00 2001 From: Maximiliano Duthey Date: Fri, 24 Oct 2025 14:57:42 -0300 Subject: [PATCH 2/3] refactor: remove submit API endpoint configurations and simplify path checks --- bootstrap/main.tf | 2 -- bootstrap/proxy/deployment.tf | 5 ----- bootstrap/proxy/main.tf | 5 ----- bootstrap/variables.tf | 10 ---------- proxy/src/config.rs | 7 ------- proxy/src/proxy.rs | 7 +------ 6 files changed, 1 insertion(+), 35 deletions(-) diff --git a/bootstrap/main.tf b/bootstrap/main.tf index 37fc8c8..15deebc 100644 --- a/bootstrap/main.tf +++ b/bootstrap/main.tf @@ -50,7 +50,6 @@ module "blockfrost_v1_proxy" { dns_names = var.dns_names cache_max_size_bytes = var.proxy_cache_max_size_bytes dolos_endpoints = var.proxy_blue_dolos_endpoints - submitapi_endpoints = var.proxy_blue_submitapi_endpoints } module "blockfrost_v1_proxy_green" { @@ -68,7 +67,6 @@ module "blockfrost_v1_proxy_green" { dns_names = var.dns_names cache_max_size_bytes = var.proxy_cache_max_size_bytes dolos_endpoints = var.proxy_green_dolos_endpoints - submitapi_endpoints = var.proxy_green_submitapi_endpoints } module "blockfrost_instances" { diff --git a/bootstrap/proxy/deployment.tf b/bootstrap/proxy/deployment.tf index 09f5087..d9e3326 100644 --- a/bootstrap/proxy/deployment.tf +++ b/bootstrap/proxy/deployment.tf @@ -154,11 +154,6 @@ resource "kubernetes_deployment_v1" "blockfrost_proxy" { value = var.submitapi_dns } - env { - name = "SUBMITAPI_ENDPOINTS" - value = var.submitapi_endpoints - } - volume_mount { mount_path = "/certs" name = "certs" diff --git a/bootstrap/proxy/main.tf b/bootstrap/proxy/main.tf index e63afab..82b53aa 100644 --- a/bootstrap/proxy/main.tf +++ b/bootstrap/proxy/main.tf @@ -123,11 +123,6 @@ variable "submitapi_dns" { default = "ext-submitapi-m1.svc.cluster.local" } -variable "submitapi_endpoints" { - type = string - default = "\\/tx\\/submit" -} - variable "tolerations" { type = list(object({ effect = string diff --git a/bootstrap/variables.tf b/bootstrap/variables.tf index 2bad46c..90180ba 100644 --- a/bootstrap/variables.tf +++ b/bootstrap/variables.tf @@ -102,16 +102,6 @@ variable "proxy_green_dolos_endpoints" { default = "\\/blocks\\/[A-z0-9]+\\/txs\\/?$,\\/blocks\\/[A-z0-9]+\\/?$,\\/addresses\\/[A-z0-9]+\\/utxos(\\?.*)?$" } -variable "proxy_blue_submitapi_endpoints" { - type = string - default = "\\/tx\\/submit" -} - -variable "proxy_green_submitapi_endpoints" { - type = string - default = "\\/tx\\/submit" -} - variable "proxy_green_image_tag" { type = string } diff --git a/proxy/src/config.rs b/proxy/src/config.rs index 94315c8..e413fe5 100644 --- a/proxy/src/config.rs +++ b/proxy/src/config.rs @@ -24,7 +24,6 @@ pub struct Config { pub submitapi_enabled: bool, pub submitapi_port: u16, pub submitapi_dns: String, - pub submitapi_endpoints: Vec, // Cache settings pub cache_rules_path: PathBuf, @@ -97,11 +96,6 @@ impl Config { .parse() .expect("SUBMITAPI_PORT must be a number"), submitapi_dns: env::var("SUBMITAPI_DNS").expect("SUBMITAPI_DNS must be set"), - submitapi_endpoints: env::var("SUBMITAPI_ENDPOINTS") - .expect("Missing SUBMITAPI_ENDPOINTS variable") - .split(',') - .map(|endpoint| Endpoint::new(endpoint).expect("Invalid submit api endpoint regex")) - .collect(), health_endpoint: "/dmtr_health".to_string(), } } @@ -138,7 +132,6 @@ mod tests { env::set_var("DOLOS_ENDPOINTS", r"/blocks/,/epochs/"); env::set_var("SUBMITAPI_PORT", "8090"); env::set_var("SUBMITAPI_DNS", "ext-submitapi-m1"); - env::set_var("SUBMITAPI_ENDPOINTS", r"/tx/submit"); let config = Config::new(); assert!(config.forbidden_endpoints[0].matches("/network")); diff --git a/proxy/src/proxy.rs b/proxy/src/proxy.rs index 30e39cf..1960717 100644 --- a/proxy/src/proxy.rs +++ b/proxy/src/proxy.rs @@ -173,12 +173,7 @@ impl BlockfrostProxy { } fn is_submit_api_path(&self, path: &str) -> bool { - for submit_api_endpoint in self.config.submitapi_endpoints.clone().into_iter() { - if submit_api_endpoint.matches(path) { - return true; - } - } - false + path == "/tx/submit" } fn should_use_submit_api(&self, path: &str) -> bool { From 4aa2cc7418641c9cf2691d46ecc6d1ca51caf681 Mon Sep 17 00:00:00 2001 From: Maximiliano Duthey Date: Mon, 27 Oct 2025 10:28:04 -0300 Subject: [PATCH 3/3] fix: update submit API instance structure --- proxy/src/proxy.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proxy/src/proxy.rs b/proxy/src/proxy.rs index 1960717..a22534a 100644 --- a/proxy/src/proxy.rs +++ b/proxy/src/proxy.rs @@ -230,8 +230,8 @@ impl ProxyHttp for BlockfrostProxy { if self.should_use_submit_api(path) { ctx.instance = format!( - //eg: internal-cardano-mainnet-submitapi.ext-submitapi-m1.svc.cluster.local:8090 - "internal-{}-submitapi.{}:{}", + //eg: submitapi-cardano-mainnet.ext-submitapi-m1.svc.cluster.local:8090 + "submitapi-{}.{}:{}", ctx.consumer.network, self.config.submitapi_dns, self.config.submitapi_port ); ctx.resolved_by = "submitapi".to_string();