Example #1
0
def delete_stack_chef_roles(planet, runtime, stacks):

    result = dict()

    for skybase_stack_id in stacks.keys():

        skybase_id, stack_name = os.path.split(skybase_stack_id)
        service = ServiceRegistryRecord.init_from_id(skybase_id)

        for role in service.blueprint.stacks[stack_name]['roles']:

            chef_role_name = make_chef_role_name(
                role_name=role,
                deploy_tag=service.tag,
            )

            try:
                if runtime.apply:
                    if skybase.actions.skycloud.is_stack_deleted_or_not_found(
                            planet, stack_name):
                        result[
                            chef_role_name] = skybase.actions.sky_chef.delete_role(
                                planet=planet, role=chef_role_name)
                    else:
                        result[
                            chef_role_name] = 'stack {0} exists.  cannot delete chef role {1}'.format(
                                stack_name, chef_role_name)
                else:
                    result[chef_role_name] = skybase.actions.sky_chef.get_role(
                        planet=planet, role=chef_role_name)
            except Exception as e:
                result[chef_role_name] = simple_error_format(e)

    return result
Example #2
0
def delete_stack_chef_roles(planet, runtime, stacks):

    result = dict()

    for skybase_stack_id in stacks.keys():

        skybase_id, stack_name = os.path.split(skybase_stack_id)
        service = ServiceRegistryRecord.init_from_id(skybase_id)

        for role in service.blueprint.stacks[stack_name]['roles']:

            chef_role_name = make_chef_role_name(
                role_name=role,
                deploy_tag=service.tag,
            )

            try:
                if runtime.apply:
                    if skybase.actions.skycloud.is_stack_deleted_or_not_found(planet, stack_name):
                        result[chef_role_name] = skybase.actions.sky_chef.delete_role(planet=planet, role=chef_role_name)
                    else:
                        result[chef_role_name] = 'stack {0} exists.  cannot delete chef role {1}'.format(stack_name, chef_role_name)
                else:
                    result[chef_role_name] = skybase.actions.sky_chef.get_role(planet=planet, role=chef_role_name)
            except Exception as e:
                result[chef_role_name] = simple_error_format(e)

    return result
Example #3
0
def read(record_id, format=None):
    '''
    attempt to instantiate state db record from id
    '''

    state_db_record = ServiceRegistryRecord.init_from_id(record_id)

    if format == 'yaml':
        result = state_db_record.serialize_as_yaml()
    else:
        result = state_db_record.output_as_dict()
    return result
Example #4
0
def read(record_id, format=None):
    '''
    attempt to instantiate state db record from id
    '''

    state_db_record = ServiceRegistryRecord.init_from_id(record_id)

    if format == 'yaml':
        result = state_db_record.serialize_as_yaml()
    else:
        result = state_db_record.output_as_dict()
    return result
Example #5
0
def update(record_id, record_object, **kwargs):
    current_state_db_record = ServiceRegistryRecord.init_from_id(record_id)
    record_bi_key = create_bi_record(record_id, current_state_db_record)

    new_state_db_record = yaml.load(record_object)
    new_state_db_record.update()

    result = {
        'record_id': record_id,
        'record_bi_key': record_bi_key,
    }

    return result
Example #6
0
def update(record_id, record_object, **kwargs):
    current_state_db_record = ServiceRegistryRecord.init_from_id(record_id)
    record_bi_key = create_bi_record(record_id, current_state_db_record)

    new_state_db_record = yaml.load(record_object)
    new_state_db_record.update()

    result = {
        'record_id': record_id,
        'record_bi_key': record_bi_key,
    }

    return result
Example #7
0
def get_stack_chef_nodes(skybase_stack_id, runner_cfg):

    skybase_id, stack_name = os.path.split(skybase_stack_id)

    service = ServiceRegistryRecord.init_from_id(skybase_id)
    stack_grain = service.stacks.stacks[stack_name].salt_grain_skybase_id

    authtoken = skybase.actions.salt.get_saltapi_authtoken(runner_cfg=runner_cfg, planet_name=service.planet)
    saltapi_result = skybase.actions.salt.get_host_by_grain(
        grain=stack_grain,
        authtoken=authtoken,
        planet_name=service.planet,
    )

    # extract host/instance id from  non-empty result that contains minion data
    result = []
    if saltapi_result[0] and saltapi_result[0] != SkySaltAPI.NO_MINIONS:
        for minion in saltapi_result:
            if 'host' in minion.values()[0]:
                result.append(minion.values()[0]['host'])

    return result
Example #8
0
def get_stack_chef_nodes(skybase_stack_id, runner_cfg):

    skybase_id, stack_name = os.path.split(skybase_stack_id)

    service = ServiceRegistryRecord.init_from_id(skybase_id)
    stack_grain = service.stacks.stacks[stack_name].salt_grain_skybase_id

    authtoken = skybase.actions.salt.get_saltapi_authtoken(
        runner_cfg=runner_cfg, planet_name=service.planet)
    saltapi_result = skybase.actions.salt.get_host_by_grain(
        grain=stack_grain,
        authtoken=authtoken,
        planet_name=service.planet,
    )

    # extract host/instance id from  non-empty result that contains minion data
    result = []
    if saltapi_result[0] and saltapi_result[0] != SkySaltAPI.NO_MINIONS:
        for minion in saltapi_result:
            if 'host' in minion.values()[0]:
                result.append(minion.values()[0]['host'])

    return result
Example #9
0
    def preflight_check(self):
        # container for preflight check issues
        preflight_result = []

        # instantiate planet
        try:
            self.planet = Planet(self.args.get('planet_name'))
        except Exception as e:
            self.preflight_check_result.status = 'FAIL'
            preflight_result.append(skybase.exceptions.SkyBaseValidationError('planet init: {0}'.format(simple_error_format(e))))

        # validate required options to delete one or all stacks
        if not (self.args.get('stack_name') or self.args.get('delete_all_stacks'))\
           or (self.args.get('stack_name') and self.args.get('delete_all_stacks')):
            self.preflight_check_result.status = 'FAIL'
            preflight_result.append(('specify one stack or option to delete all stacks for {0}'.format(self.args.get('service_name'))))

        # validate existence of requested service/stack in state registry
        query = PlanetStateDbQuery(
            planet=self.args.get('planet_name'),
            service=self.args.get('service_name'),
            tag=self.runtime.tag,
            stack=self.args.get('stack_name'),
            query_type='exact',
        )

        # verify unique pointer to service or service/stack
        if not query.can_find_exact():
            self.preflight_check_result.status = 'FAIL'
            preflight_result.append((skybase.exceptions.SkyBaseDeployError(
                'options do not identify a unique service or stack: {0}'.format(query.show_query_path())
            )))

        # TODO: push stack path into task result
        # save validated query path for postprocessing
        self.stack_path = query.query

        # reconfigure query to read resources for one or many service stacks
        query.query_type = query.WILDCARD
        query.query = query.make_query()

        # collect all stacks for deletion
        result_set = query.execute()

        # collect status of launched stacks
        for record in result_set:
            # accumulate list of provider stack ids for deletion
            self.stack_deletion_list.append(record.cloud.stack_id)

            try:
                # verify cloud provider DELETE* status for stack id
                stack_status = skybase.actions.skycloud.call_cloud_api(
                    planet=self.planet,
                    stack_name=record.cloud.stack_id,
                    action='get_stack_status')
            except Exception as e:
                raise skybase.exceptions.SkyBaseDeployError(skybase.utils.simple_error_format(e))

            if stack_status.startswith('DELETE'):
                self.preflight_check_result.status = 'FAIL'
                preflight_result.append(skybase.exceptions.SkyBaseDeployError(
                    'cannot delete stack {0} with status {1}'.format(record.cloud.stack_id, stack_status)))

            # accumulate stack information for deleting state db records and logging result
            self.stack_deletion_info[record.cloud.id] = {
                'stack_id': record.cloud.stack_id,
                'stack_name': record.cloud.stack_name,
            }

        # determine if deployed service used chef server. if so, then prepare to delete chef nodes

        # TODO: find authoritative location/source for skybase id definition
        # skybase state DB id
        skybase_id = '/{0}/{1}/{2}'.format(
            self.args.get('planet_name'),
            self.args.get('service_name'),
            self.runtime.tag,
        )

        # init service registry record and examine blueprint chef type
        service_record = ServiceRegistryRecord.init_from_id(skybase_id)
        self.chef_type = service_record.blueprint.definition.get('chef_type')
        self.is_chef_type_server = (self.chef_type and self.chef_type == 'server')

        # prepopulate list of host/instance names for use in chef node delete when chef_type server
        # NOTE:
        self.stack_chef_nodes = dict()

        if self.is_chef_type_server:

            for skybase_stack_id, stack_info in self.stack_deletion_info.items():

                self.stack_chef_nodes[stack_info['stack_name']] = skybase.actions.skychef.get_stack_chef_nodes(
                    skybase_stack_id=skybase_stack_id,
                    runner_cfg=self.runner_cfg,
                )

        self.preflight_check_result.set_output(preflight_result)
        return self.preflight_check_result
Example #10
0
    def preflight_check(self):
        # container for preflight check issues
        preflight_result = []

        # instantiate planet
        try:
            self.planet = Planet(self.args.get('planet_name'))
        except Exception as e:
            self.preflight_check_result.status = 'FAIL'
            preflight_result.append(
                skybase.exceptions.SkyBaseValidationError(
                    'planet init: {0}'.format(simple_error_format(e))))

        # validate required options to delete one or all stacks
        if not (self.args.get('stack_name') or self.args.get('delete_all_stacks'))\
           or (self.args.get('stack_name') and self.args.get('delete_all_stacks')):
            self.preflight_check_result.status = 'FAIL'
            preflight_result.append(
                ('specify one stack or option to delete all stacks for {0}'.
                 format(self.args.get('service_name'))))

        # validate existence of requested service/stack in state registry
        query = PlanetStateDbQuery(
            planet=self.args.get('planet_name'),
            service=self.args.get('service_name'),
            tag=self.runtime.tag,
            stack=self.args.get('stack_name'),
            query_type='exact',
        )

        # verify unique pointer to service or service/stack
        if not query.can_find_exact():
            self.preflight_check_result.status = 'FAIL'
            preflight_result.append((skybase.exceptions.SkyBaseDeployError(
                'options do not identify a unique service or stack: {0}'.
                format(query.show_query_path()))))

        # TODO: push stack path into task result
        # save validated query path for postprocessing
        self.stack_path = query.query

        # reconfigure query to read resources for one or many service stacks
        query.query_type = query.WILDCARD
        query.query = query.make_query()

        # collect all stacks for deletion
        result_set = query.execute()

        # collect status of launched stacks
        for record in result_set:
            # accumulate list of provider stack ids for deletion
            self.stack_deletion_list.append(record.cloud.stack_id)

            try:
                # verify cloud provider DELETE* status for stack id
                stack_status = skybase.actions.skycloud.call_cloud_api(
                    planet=self.planet,
                    stack_name=record.cloud.stack_id,
                    action='get_stack_status')
            except Exception as e:
                raise skybase.exceptions.SkyBaseDeployError(
                    skybase.utils.simple_error_format(e))

            if stack_status.startswith('DELETE'):
                self.preflight_check_result.status = 'FAIL'
                preflight_result.append(
                    skybase.exceptions.SkyBaseDeployError(
                        'cannot delete stack {0} with status {1}'.format(
                            record.cloud.stack_id, stack_status)))

            # accumulate stack information for deleting state db records and logging result
            self.stack_deletion_info[record.cloud.id] = {
                'stack_id': record.cloud.stack_id,
                'stack_name': record.cloud.stack_name,
            }

        # determine if deployed service used chef server. if so, then prepare to delete chef nodes

        # TODO: find authoritative location/source for skybase id definition
        # skybase state DB id
        skybase_id = '/{0}/{1}/{2}'.format(
            self.args.get('planet_name'),
            self.args.get('service_name'),
            self.runtime.tag,
        )

        # init service registry record and examine blueprint chef type
        service_record = ServiceRegistryRecord.init_from_id(skybase_id)
        self.chef_type = service_record.blueprint.definition.get('chef_type')
        self.is_chef_type_server = (self.chef_type
                                    and self.chef_type == 'server')

        # prepopulate list of host/instance names for use in chef node delete when chef_type server
        # NOTE:
        self.stack_chef_nodes = dict()

        if self.is_chef_type_server:

            for skybase_stack_id, stack_info in self.stack_deletion_info.items(
            ):

                self.stack_chef_nodes[stack_info[
                    'stack_name']] = skybase.actions.skychef.get_stack_chef_nodes(
                        skybase_stack_id=skybase_stack_id,
                        runner_cfg=self.runner_cfg,
                    )

        self.preflight_check_result.set_output(preflight_result)
        return self.preflight_check_result