예제 #1
0
 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=(',', ': '))
예제 #2
0
 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
예제 #3
0
    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)
예제 #4
0
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
예제 #5
0
 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
예제 #6
0
 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]
예제 #7
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)
예제 #8
0
    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)
예제 #9
0
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)
예제 #10
0
    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)
예제 #11
0
 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]
예제 #12
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
예제 #13
0
 def get_stack_account(self, stack_name):
     cf_stack = stack(self.session)
     stack_id = cf_stack.get_stack_account(stack_name)
     return stack_id
예제 #14
0
 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