def getStackStatus(self, stack, region, githash=None, environment=None, logoutput=None): session, config = configtasks.getConfig(region, stack, githash, environment) cf = cloudformation.stack(session) cfstackname = self.generateStackName(config["stackname"], githash, environment) status = cf.getStackStatus(stackname=cfstackname) print "STATUS" print json.dumps(status, sort_keys=True, indent=4, separators=(',', ': '))
def validateStack(self, stack, region, logoutput=None): session, config = configtasks.getConfig(region, stack) cftemplate = template.voltron(stack, **config) template.writecompiled(data=cftemplate, name=stack, region=region) cf = cloudformation.stack(session) validationstatus = cf.validateTemplate(cftemplate) return validationstatus
def deleteCreateStack(self, stack, region, githash=None, environment=None, logoutput=None): '''Deletes a stack then creates it again''' self.optOut(stack) session, config = configtasks.getConfig(region, stack, githash, environment) cftemplate = template.voltron(stack, **config) template.writecompiled(cftemplate, stack, region) cf = cloudformation.stack(session) try: cf.validateTemplate(cftemplate) except: print "Template validation failed!" print json.dumps(cftemplate, sort_keys=True, indent=4, separators=(',', ': ')) sys.exit(1) try: cf.deleteStack(config["stackname"]) cf.statusPoller(stackname=config["stackname"]) except ClientError as err: print err sys.exit(1) try: cf.createStack(cftemplate, config["stackname"]) cf.statusPoller(stackname=config["stackname"]) except ClientError as err: log.warn(err) sys.exit(1)
def init_cf_action(parameters, parameters_file, stack_name, region, stack_file): parameters_list_from_file = [] parameters_list_from_args = [] if parameters_file: logging.info('Using passed in parameters for File for Template') parameters_list_from_file = load_cf_params_from_file( region, parameters_file) if parameters: logging.info('Using passed in parameters for CF Template') logging.info(parameters) parameters_list_from_args = load_cf_params_from_string(parameters) parameters_list = parameters_list_from_file + parameters_list_from_args logging.info("Parameters to be used for stack: %s" % parameters_list) print("[INFO] Parameters to be used for stack: %s" % parameters_list) session, stack_content = get_cf_stack_details(stack_name, region, stack_file) cf = cloudformation.stack(session) logging.info('Validating Template') cf.validate_template_from_file(stack_content=stack_content) return cf, stack_content, parameters_list
def createChangeSet(self, stack, region, githash, environment): session, config = configtasks.getConfig(region, stack, githash, environment) cftemplate = template.voltron(stack, **config) template.writecompiled(data=cftemplate, name=stack, region=region) cf = cloudformation.stack(session) cfstackname = self.generateStackName(stack, githash, environment) changes = cf.createChangeSet(cftemplate, cfstackname) return changes
def get_stack_domain_name(self, stack_name): """ Gets the domain name in API Gateway Stack Template :param stack_name: :return: """ cf_stack = stack(self.session) resources = cf_stack.get_stack_resources(stack_name, 'AWS::ApiGateway::DomainName') if not resources: return False return resources[0]
def upsertIamStackSet(self, stack, region, githash=None, environment=None, logoutput=None): self.optOut(stack) session, config = configtasks.getConfig(region, stack, githash, environment) cftemplate = template.voltron(stack, **config) cfstackname = self.generateStackName(config["stackname"], githash, environment) template.writecompiled(data=cftemplate, name=stack, region=region, logoutput=logoutput) cf = cloudformation.stack(session) try: cf.validateTemplate(cftemplate=cftemplate) except ClientError as err: log.warn(err) # print "Template validation failed!" # pprint.pprint(json.dumps(cftemplate)) sys.exit(1) status = cf.describeStackSet(stackname=cfstackname) if status: try: response = cf.updateStackSet(cftemplate=cftemplate, stackname=cfstackname, iamcapable=['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM']) if logoutput: print json.dumps(response, sort_keys=True, indent=4, separators=(',', ': ')) state, status = cf.statusPoller(stackname=cfstackname) if logoutput: print json.dumps(cf.getStackResources(stackname=cfstackname), default=str, sort_keys=True, indent=4, separators=(',', ': ')) if state != 0: sys.exit(1) except ClientError as err: log.warn(err) if 'No updates are to be performed' in str(err): sys.exit(0) sys.exit(1) else: try: response = cf.createStackSet(cftemplate=cftemplate, stackname=cfstackname, iamcapable=['CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM']) if logoutput: print json.dumps(response, sort_keys=True, indent=4, separators=(',', ': ')) state, status = cf.statusPoller(stackname=cfstackname) if logoutput: print json.dumps(cf.getStackResources(stackname=cfstackname), default=str, sort_keys=True, indent=4, separators=(',', ': ')) if state != 0: sys.exit(1) except ClientError as err: log.warn(err) if 'already exists' in str(err): sys.exit(0) sys.exit(1)
def deleteStackSet(self, stack, region, githash=None, environment=None, logoutput=None): '''Deletes a stack given a name and region USAGE deleteStack STACK REGION''' self.optOut(stack) session, config = configtasks.getConfig(region, stack, githash, environment) cfstackname = self.generateStackName(config["stackname"], githash, environment) cf = cloudformation.stack(session) try: cf.deleteStackSet(stackname=cfstackname) state, status = cf.statusPoller(stackname=cfstackname) if state != 0: sys.exit(1) except ClientError as err: print err sys.exit(1)
def deployEnvironment(ctx, version, environment): ecs.template_configs(VERSION=version, ENVIRONMENT=environment) authentication = auth.authenticate('ap-southeast-2') session = authentication.getSession() conf = ecs.loadServiceConfigs() task = ecs.task(session) contDef = task.createContDef() taskArn = task.registerTaskDef(contDef, version) print conf.deploy cftemplate = json.loads(ecs.template_service_cf(taskArn, **conf.deploy)) cf = cloudformation.stack(session) cfstackname = conf.deploy['service']['serviceName'] status = cf.describeStack(stackname=cfstackname) try: cf.validateTemplate(cftemplate=cftemplate) except ClientError as err: logging.warn(err) # print "Template validation failed!" # pprint.pprint(json.dumps(cftemplate)) sys.exit(1) if status: try: cf.updateStack(cftemplate, stackname=cfstackname) state, status = cf.statusPoller(stackname=cfstackname) if state != 0: sys.exit(1) else: pprint.pprint(cf.getStackResources(stackname=cfstackname)) except ClientError as err: logging.warn(err) if 'No updates are to be performed' in str(err): sys.exit(0) sys.exit(1) else: try: cf.createStack(cftemplate, stackname=cfstackname) state, status = cf.statusPoller(stackname=cfstackname) if state != 0: sys.exit(1) else: pprint.pprint(cf.getStackResources(stackname=cfstackname)) except ClientError as err: logging.warn(err) if 'already exists' in str(err): sys.exit(0) sys.exit(1)
def upsertS3Stack(self, stack, s3location, region, githash=None, environment=None, logoutput=None, customConfig=None): self.optOut(stack) session, config = configtasks.getConfig(region, stack, githash, environment, customConfig) cftemplate = template.voltron(stack, **config) cfstackname = self.generateStackName(config["stackname"], githash, environment) template.writecompiled(data=cftemplate, name=stack, region=region, logoutput=logoutput) cf = cloudformation.stack(session) status = cf.describeStack(stackname=cfstackname) if status: try: response = cf.updateStack(cftemplate=s3location, stackname=cfstackname) if logoutput: print json.dumps(response, sort_keys=True, indent=4, separators=(',', ': ')) state, status = cf.statusPoller(stackname=cfstackname) if logoutput: print json.dumps(cf.getStackResources(stackname=cfstackname), default=str, sort_keys=True, indent=4, separators=(',', ': ')) if state != 0: sys.exit(1) except ClientError as err: log.warn(err) if 'No updates are to be performed' in str(err): sys.exit(0) sys.exit(1) else: try: response = cf.createStack(cftemplate=s3location, stackname=cfstackname) if logoutput: print json.dumps(response, sort_keys=True, indent=4, separators=(',', ': ')) state, status = cf.statusPoller(stackname=cfstackname) if logoutput: print json.dumps(cf.getStackResources(stackname=cfstackname), default=str, sort_keys=True, indent=4, separators=(',', ': ')) if state != 0: sys.exit(1) except ClientError as err: log.warn(err) if 'already exists' in str(err): sys.exit(0) sys.exit(1)
def get_stack_restapi(self, stack_name): cf_stack = stack(self.session) resources = cf_stack.get_stack_resources(stack_name, 'AWS::ApiGateway::RestApi') # Todo Support for multiple REST APIs in a single stack return resources[0]
def get_stack_lambdas(self, stack_name): cf_stack = stack(self.session) resources = cf_stack.get_stack_resources(stack_name, 'AWS::Lambda::Function') return resources
def get_stack_account(self, stack_name): cf_stack = stack(self.session) stack_id = cf_stack.get_stack_account(stack_name) return stack_id
def getStackResources(self, stack, region='ap-southeast-2', githash=None, environment=None, logoutput=None): session = self.getBaseSession(region) cf = cloudformation.stack(session) cfstackname = self.generateStackName(stack, githash, environment) resources = cf.getStackResources(stackname=cfstackname) return resources