@@ -8,8 +8,9 @@ use serde::{Deserialize, Serialize};
88use serde_json:: json;
99
1010use crate :: agent:: tools:: error:: { ErrorCategory , format_error_for_llm} ;
11- use crate :: platform:: api:: types:: CreateDeploymentConfigRequest ;
11+ use crate :: platform:: api:: types:: { CloudProvider , CloudRunnerConfigInput , CreateDeploymentConfigRequest , build_cloud_runner_config_v2 } ;
1212use crate :: platform:: api:: { PlatformApiClient , PlatformApiError } ;
13+ use std:: str:: FromStr ;
1314
1415/// Arguments for the create deployment config tool
1516#[ derive( Debug , Deserialize ) ]
@@ -28,7 +29,7 @@ pub struct CreateDeploymentConfigArgs {
2829 pub branch : String ,
2930 /// Target type: "kubernetes" or "cloud_runner"
3031 pub target_type : String ,
31- /// Cloud provider: "gcp" or "hetzner "
32+ /// Cloud provider: "gcp", "hetzner", or "azure "
3233 pub provider : String ,
3334 /// Environment ID for deployment
3435 pub environment_id : String ,
@@ -43,6 +44,16 @@ pub struct CreateDeploymentConfigArgs {
4344 /// Enable auto-deploy on push (defaults to true)
4445 #[ serde( default = "default_auto_deploy" ) ]
4546 pub auto_deploy_enabled : bool ,
47+ /// CPU allocation (for GCP Cloud Run or Azure Container Apps)
48+ pub cpu : Option < String > ,
49+ /// Memory allocation (for GCP Cloud Run or Azure Container Apps)
50+ pub memory : Option < String > ,
51+ /// Minimum instances/replicas
52+ pub min_instances : Option < i32 > ,
53+ /// Maximum instances/replicas
54+ pub max_instances : Option < i32 > ,
55+ /// Whether the service should be publicly accessible
56+ pub is_public : Option < bool > ,
4657}
4758
4859fn default_auto_deploy ( ) -> bool {
@@ -84,6 +95,7 @@ A deployment config defines how to build and deploy a service, including:
8495- Dockerfile location and build context
8596- Target (Cloud Runner or Kubernetes)
8697- Port configuration
98+ - CPU/memory allocation (for Cloud Runner deployments)
8799- Auto-deploy settings
88100
89101**Required Parameters:**
@@ -94,7 +106,7 @@ A deployment config defines how to build and deploy a service, including:
94106- port: Port the service listens on
95107- branch: Git branch to deploy from (e.g., "main")
96108- target_type: "kubernetes" or "cloud_runner"
97- - provider: "gcp" or "hetzner "
109+ - provider: "gcp", "hetzner", or "azure "
98110- environment_id: Environment to deploy to
99111
100112**Optional Parameters:**
@@ -103,6 +115,11 @@ A deployment config defines how to build and deploy a service, including:
103115- cluster_id: Required for kubernetes target
104116- registry_id: Container registry ID (provisions new if not provided)
105117- auto_deploy_enabled: Enable auto-deploy on push (default: true)
118+ - cpu: CPU allocation (e.g., "1" for GCP Cloud Run, "0.5" for Azure ACA)
119+ - memory: Memory allocation (e.g., "512Mi" for GCP, "1.0Gi" for Azure)
120+ - min_instances: Minimum instances/replicas (default: 0)
121+ - max_instances: Maximum instances/replicas (default: 10)
122+ - is_public: Whether the service should be publicly accessible (default: true)
106123
107124**Prerequisites:**
108125- User must be authenticated
@@ -149,7 +166,7 @@ A deployment config defines how to build and deploy a service, including:
149166 } ,
150167 "provider" : {
151168 "type" : "string" ,
152- "enum" : [ "gcp" , "hetzner" ] ,
169+ "enum" : [ "gcp" , "hetzner" , "azure" ] ,
153170 "description" : "Cloud provider"
154171 } ,
155172 "environment_id" : {
@@ -175,6 +192,26 @@ A deployment config defines how to build and deploy a service, including:
175192 "auto_deploy_enabled" : {
176193 "type" : "boolean" ,
177194 "description" : "Enable auto-deploy on push (default: true)"
195+ } ,
196+ "cpu" : {
197+ "type" : "string" ,
198+ "description" : "CPU allocation (e.g., '1' for GCP Cloud Run, '0.5' for Azure ACA)"
199+ } ,
200+ "memory" : {
201+ "type" : "string" ,
202+ "description" : "Memory allocation (e.g., '512Mi' for GCP, '1.0Gi' for Azure)"
203+ } ,
204+ "min_instances" : {
205+ "type" : "integer" ,
206+ "description" : "Minimum instances/replicas (default: 0)"
207+ } ,
208+ "max_instances" : {
209+ "type" : "integer" ,
210+ "description" : "Maximum instances/replicas (default: 10)"
211+ } ,
212+ "is_public" : {
213+ "type" : "boolean" ,
214+ "description" : "Whether the service should be publicly accessible (default: true)"
178215 }
179216 } ,
180217 "required" : [
@@ -222,20 +259,20 @@ A deployment config defines how to build and deploy a service, including:
222259 args. target_type
223260 ) ,
224261 Some ( vec ! [
225- "Use 'cloud_runner' for GCP Cloud Run or Hetzner containers" ,
262+ "Use 'cloud_runner' for GCP Cloud Run, Hetzner containers, or Azure Container Apps " ,
226263 "Use 'kubernetes' for deploying to a K8s cluster" ,
227264 ] ) ,
228265 ) ) ;
229266 }
230267
231268 // Validate provider
232- let valid_providers = [ "gcp" , "hetzner" ] ;
269+ let valid_providers = [ "gcp" , "hetzner" , "azure" ] ;
233270 if !valid_providers. contains ( & args. provider . as_str ( ) ) {
234271 return Ok ( format_error_for_llm (
235272 "create_deployment_config" ,
236273 ErrorCategory :: ValidationFailed ,
237274 & format ! (
238- "Invalid provider '{}'. Must be 'gcp' or 'hetzner '" ,
275+ "Invalid provider '{}'. Must be 'gcp', 'hetzner', or 'azure '" ,
239276 args. provider
240277 ) ,
241278 Some ( vec ! [
@@ -266,6 +303,44 @@ A deployment config defines how to build and deploy a service, including:
266303 }
267304 } ;
268305
306+ // Build cloud runner config if deploying to cloud_runner
307+ let cloud_runner_config = if args. target_type == "cloud_runner" {
308+ let provider_enum = CloudProvider :: from_str ( & args. provider ) . ok ( ) ;
309+
310+ // Fetch provider_account_id from credentials when provider is azure or gcp
311+ let mut gcp_project_id = None ;
312+ let mut subscription_id = None ;
313+ if let Some ( ref provider) = provider_enum {
314+ if matches ! ( provider, CloudProvider :: Gcp | CloudProvider :: Azure ) {
315+ if let Ok ( credential) = client. check_provider_connection ( provider, & args. project_id ) . await {
316+ if let Some ( cred) = credential {
317+ match provider {
318+ CloudProvider :: Gcp => gcp_project_id = cred. provider_account_id ,
319+ CloudProvider :: Azure => subscription_id = cred. provider_account_id ,
320+ _ => { }
321+ }
322+ }
323+ }
324+ }
325+ }
326+
327+ let config_input = CloudRunnerConfigInput {
328+ provider : provider_enum,
329+ region : None , // Region is set at environment level or by deploy_service
330+ gcp_project_id,
331+ cpu : args. cpu . clone ( ) ,
332+ memory : args. memory . clone ( ) ,
333+ min_instances : args. min_instances ,
334+ max_instances : args. max_instances ,
335+ is_public : args. is_public ,
336+ subscription_id,
337+ ..Default :: default ( )
338+ } ;
339+ Some ( build_cloud_runner_config_v2 ( & config_input) )
340+ } else {
341+ None
342+ } ;
343+
269344 // Build the request
270345 // Note: Send both field name variants (dockerfile/dockerfilePath, context/buildContext)
271346 // for backend compatibility - different endpoints may expect different field names
@@ -286,8 +361,9 @@ A deployment config defines how to build and deploy a service, including:
286361 cluster_id : args. cluster_id . clone ( ) ,
287362 registry_id : args. registry_id . clone ( ) ,
288363 auto_deploy_enabled : args. auto_deploy_enabled ,
289- is_public : None ,
290- cloud_runner_config : None ,
364+ is_public : args. is_public ,
365+ cloud_runner_config,
366+ secrets : None ,
291367 } ;
292368
293369 // Create the deployment config
0 commit comments