def process_cf_file(self, args):
try:
cf_params_local = copy.deepcopy(args[0])
cluster = args[1]
elb_name_suffix = args[2]
env = args[3]
filename = args[4]
has_ecs_service = args[5]
listener_port = args[6]
region = args[7]
session = boto3.session.Session()
if has_ecs_service:
elb_name = 'ecs-elb-' + cluster
if elb_name_suffix is not None:
elb_name = "-".join([elb_name, elb_name_suffix])
self.populate_ecs_service_params(session, cf_params_local, cluster, elb_name, env, region, listener_port)
# Skip non-cf files
ext = filename.split('.')[-1]
if ext != 'template' and ext != 'yml':
return
cf_client = session.client('cloudformation', region_name=region)
name = filename.split('/')[-1].split('.')[0]
logging.info("%s: Processing CloudFormation Template" % filename)
cf_params_local['name'] = name
parameters = [{'ParameterKey': 'name', 'ParameterValue': name}]
if name is None or name in filename:
with open(filename, 'r') as f_h:
try:
cf_template = f_h.read()
except:
logging.exception("%s: Error reading file." % (filename))
self.catfile(filename)
raise
validate_response = self.validate_template(cf_client, cf_template, filename)
service_name = "%s-%s-%s" % (env, name, cluster)
if elb_name_suffix is not None:
service_name = "-".join([service_name, elb_name_suffix])
cf_command = cf_client.create_stack
existing_stack_id = self.find_existing_stack(cf_client, cf_params_local, service_name)
if existing_stack_id is not None:
cf_command = cf_client.update_stack
self.populate_cf_params(cf_params_local, existing_stack_id, filename, parameters, validate_response)
logging.info("%s: Updating CloudFormation Stack" % (service_name))
try:
cf_response = cf_command(StackName=service_name, TemplateBody=cf_template, Parameters=parameters, Capabilities=["CAPABILITY_IAM"])
creating_stack_id = cf_response['StackId']
stack_status = self.wait_for_stack_creation(cf_client, creating_stack_id, service_name)
except botocore.exceptions.ClientError as e:
if e.response["Error"]["Message"] == 'No updates are to be performed.':
logging.info("%s: No updates to be performed, CF update succeeded." % service_name)
else:
raise
self.q.put("%s Succeeded" % filename)
logging.info("%s Succeeded" % filename)
except Exception as e:
logging.error("%s: Error executing CloudFormation Stack" % filename)
logging.exception(e)
self.q.put("%s Failed" % filename)
评论列表
文章目录