88from typing import Any
99
1010import boto3
11+ from botocore .exceptions import ClientError
1112
1213logging .basicConfig (level = logging .INFO , format = "%(levelname)s: %(message)s" )
1314logger = logging .getLogger (__name__ )
@@ -173,10 +174,15 @@ def push_job_definition(job_data: dict, batch_client) -> None:
173174 register_params = {
174175 "jobDefinitionName" : job_name ,
175176 "type" : job_data .get ("type" , "container" ),
176- "containerProperties" : job_data ["containerProperties" ],
177177 "platformCapabilities" : job_data .get ("platformCapabilities" , ["EC2" ]),
178178 }
179179
180+ # Handle both old containerProperties and new ecsProperties formats
181+ if "ecsProperties" in job_data :
182+ register_params ["ecsProperties" ] = job_data ["ecsProperties" ]
183+ elif "containerProperties" in job_data :
184+ register_params ["containerProperties" ] = job_data ["containerProperties" ]
185+
180186 if "parameters" in job_data :
181187 register_params ["parameters" ] = job_data ["parameters" ]
182188 if "tags" in job_data :
@@ -188,20 +194,70 @@ def push_job_definition(job_data: dict, batch_client) -> None:
188194 logger .info (f"✅ Successfully pushed job definition: { job_name } :{ revision } " )
189195
190196
197+ def _update_launch_template (template_data : dict , existing_template : dict , ec2_client ) -> None :
198+ """Update existing launch template by creating a new version."""
199+ template_name = template_data ["LaunchTemplateName" ]
200+ logger .info (f"Launch template { template_name } already exists, creating new version" )
201+
202+ create_params = {
203+ "LaunchTemplateId" : existing_template ["LaunchTemplateId" ],
204+ "LaunchTemplateData" : template_data ["LaunchTemplateData" ],
205+ }
206+
207+ response = ec2_client .create_launch_template_version (** create_params )
208+ version = response ["LaunchTemplateVersion" ]["VersionNumber" ]
209+
210+ logger .info (f"✅ Successfully created new version { version } for launch template: { template_name } " )
211+
212+
213+ def _create_launch_template (template_data : dict , ec2_client ) -> None :
214+ """Create new launch template."""
215+ template_name = template_data ["LaunchTemplateName" ]
216+ logger .info (f"Creating new launch template: { template_name } " )
217+
218+ create_params = {
219+ "LaunchTemplateName" : template_name ,
220+ "LaunchTemplateData" : template_data ["LaunchTemplateData" ],
221+ }
222+
223+ if "TagSpecifications" in template_data :
224+ create_params ["TagSpecifications" ] = template_data ["TagSpecifications" ]
225+
226+ ec2_client .create_launch_template (** create_params )
227+ logger .info (f"✅ Successfully created launch template: { template_name } " )
228+
229+
230+ def push_launch_template (template_data : dict , ec2_client ) -> None :
231+ """Push EC2 launch template to AWS."""
232+ template_name = template_data ["LaunchTemplateName" ]
233+
234+ try :
235+ response = ec2_client .describe_launch_templates (LaunchTemplateNames = [template_name ])
236+ existing_template = response ["LaunchTemplates" ][0 ]
237+ _update_launch_template (template_data , existing_template , ec2_client )
238+ except ClientError as e :
239+ if e .response ["Error" ]["Code" ] == "InvalidLaunchTemplateName.NotFoundException" :
240+ _create_launch_template (template_data , ec2_client )
241+ else :
242+ raise
243+
244+
191245def push_file (json_path : Path , region : str ) -> None :
192246 """Push a single JSON file to AWS."""
193247 data = json .loads (json_path .read_text ())
194248 filename = json_path .name
195249
196250 match filename :
197- case "iam-environment-role.json" | "iam-execution-role.json" | "iam-job-role.json" :
251+ case "iam-environment-role.json" | "iam-execution-role.json" | "iam-job-role.json" | "iam-ebs.json" :
198252 push_iam_role (data , boto3 .client ("iam" , region_name = region ))
199253 case "environment.json" :
200254 push_compute_environment (data , boto3 .client ("batch" , region_name = region ))
201255 case "job_queue.json" :
202256 push_job_queue (data , boto3 .client ("batch" , region_name = region ))
203257 case "job_definition.json" :
204258 push_job_definition (data , boto3 .client ("batch" , region_name = region ))
259+ case "launch_template.json" :
260+ push_launch_template (data , boto3 .client ("ec2" , region_name = region ))
205261 case _:
206262 logger .error (f"Unknown filename: { filename } " )
207263 raise ValueError (f"Unknown filename: { filename } " )
0 commit comments