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
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
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
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
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
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
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
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
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
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