def get_resource_name(self, stack_name, logical_name): try: return self.cf_client.describe_stack_resource( StackName=stack_name, LogicalResourceId=logical_name )['StackResourceDetail']['PhysicalResourceId'] except Exception as e: Log.error('resource {0} in stack {1} not found'.format(logical_name, stack_name), e)
def check_configs_are_set(self): missing_configs = [ config for config, value in self.SIT_CONFIGS.iteritems() if value is None ] if missing_configs: Log.error('The following configs are not set: {0}'.format( missing_configs))
def check_roles_not_empty(self): empty_roles = [ role for role in self.ROLES if not self.sit_helper.get_states_for_role(role) ] if empty_roles: Log.error( 'The following servers are missing roles inside of roles.yml file: {0}' .format(empty_roles))
def get_resource_name(self, stack_name, logical_name): try: return self.cf_client.describe_stack_resource( StackName=stack_name, LogicalResourceId=logical_name )['StackResourceDetail']['PhysicalResourceId'] except Exception as e: Log.error( 'resource {0} in stack {1} not found'.format( logical_name, stack_name), e)
def update_stack(self, stack_name, template_body, tag_value): logging.info('Updating stack: {0}'.format(stack_name)) try: self.cf_client.update_stack(StackName=stack_name, TemplateBody=template_body, Capabilities=['CAPABILITY_IAM'], Tags=[{ 'Key': 'Name', 'Value': tag_value }])['StackId'] except Exception as e: Log.error('Failed to update stack {0}'.format(stack_name), e)
def update_stack(self, stack_name, template_body, tag_value): logging.info('Updating stack: {0}'.format(stack_name)) try: self.cf_client.update_stack( StackName=stack_name, TemplateBody=template_body, Capabilities=['CAPABILITY_IAM'], Tags=[ { 'Key': 'Name', 'Value': tag_value } ] )['StackId'] except Exception as e: Log.error('Failed to update stack {0}'.format(stack_name), e)
def reboot_device(self, device_name, wait_after_off=10, wait_after_on=30): """ :param wait_time_after_off: Time to wait after turning the device off :param wait_time_after_on: Time to wait before verifying the reboot was successful (i.e. after turn on command) :return: Boolean representing whether or not the reboot was successful """ # FIXME: Do we need a self.pin_off() or just pin_off()? if not self.pin_off( device_name ): # If it's still on? Maybe trying to see if pin_off() was successful? return False # TODO: All code below is unconverted message = "From Pin {} ({}) reboot: sleeping {} second(s) after turn off.".format( self.eps_dict[device_name], device_name, wait_after_off) self.logger.debug(message) self.get_module_or_raise_error("telemetry").enqueue( Log(sys_name=self.name, lvl="INFO", msg=message)) time.sleep(wait_after_off) # Wait for specified time if not self.pin_on(device_name): return False message = "From Pin {} ({}) reboot: sleeping {} second(s) after turn on.".format( self.eps_dict[device_name], device_name, wait_after_off) self.logger.debug(message) self.get_module_or_raise_error("telemetry").enqueue( Log(sys_name=self.name, lvl="INFO", msg=message)) time.sleep(wait_after_off) if self.get_PDM_status(device_name) == 1: message = "Pin {} ({}) reboot successful.".format( self.eps_dict[device_name], device_name) self.logger.debug(message) self.get_module_or_raise_error("telemetry").enqueue( Log(sys_name=self.name, lvl="INFO", msg=message)) return True else: message = "Pin {} ({}) reboot NOT successful. Recommend PDM status check in {} second(s).".format( self.eps_dict[device_name], device_name, wait_after_off) self.logger.error(message) self.get_module_or_raise_error("telemetry").enqueue( Error(sys_name=self.name, msg=message)) return False
def pin_off(self, device_name) -> bool: with SMBusWrapper(1) as bus: if device_name in self.eps_dict: PDM_val = self.eps_dict[device_name] else: message = "Device name \"{}\" INVALID. Aborting command.".format( device_name) self.logger.error(message) self.get_module_or_raise_error("telemetry").enqueue( Error(sys_name=self.name, msg=message)) return False if self.get_PDM_status(device_name) == 0: message = "Pin {} ({}) is already OFF.".format( self.eps_dict[device_name], device_name) self.logger.debug(message) # Log to console for debugging self.get_module_or_raise_error("telemetry").enqueue( Log(sys_name=self.name, lvl="INFO", msg=message)) # Push to telemetry stack return True else: bus.write_byte_data(self.address, 0x13, PDM_val) # Attempt to execute pin off if self.get_PDM_status(device_name) == 0: # PDM is OFF message = "Pin {} ({}) communication successful. Pin is now OFF.".format( self.eps_dict[device_name], device_name) self.logger.debug(message) self.get_module_or_raise_error("telemetry").enqueue( Log(sys_name=self.name, lvl="INFO", msg=message)) return True else: message = "Pin {} ({}) communication NOT successful. Pin is still ON.".format( self.eps_dict[device_name], device_name) self.logger.error(message) self.get_module_or_raise_error("telemetry").enqueue( Error(sys_name=self.name, msg=message)) return False
def check_roles_file(self): if self.ROLES < 1: Log.error('roles.yml file is not setup properly. You require at least one role to test')
def not_found_error(self, resource_name, resource): Log.error('{0} "{1}" not found. Please update configs/troposphere.yml'.format(resource_name, resource))
def validate_configs(self): logging.info('Validating configs') missing_configs = [config for config, value in self.configs.iteritems() if value is None] if missing_configs: Log.error('The following configs have not been added in configs/troposphere.yml: {0}'.format(missing_configs))
def run(self): install.run(self) Log.setup() SITTemplateHelper().validate() SITLoader().run()
def check_stack_exists(self): stack_name = self.TROPOSPHERE_CONFIGS['stack_name'] if not self.cf_helper.get_stack_info(stack_name): Log.error( 'Stack "{0}" does not exist. Please run setup_troposphere'. format(stack_name))
def test_error(self): self.assertRaises(SystemExit, Log.error(2))
def check_roles_file(self): if self.ROLES < 1: Log.error( 'roles.yml file is not setup properly. You require at least one role to test' )
def test_setup(self): log = Log.setup()
response = self.ecs_client.stop_task(task=task_id, cluster=self.cluster) task_definitions.append(response['task']['taskDefinitionArn']) except Exception as e: logging.error('Error occurred while terminating tasks.', e) finally: return task_definitions def error(self, message, e=None, error_code=2): terminated_tasks = self.terminate_running_tasks() logging.info( '{0}. Exception: {1}\nFollowing tasks have been terminated: {2}'. format(message, e, terminated_tasks)) exit(error_code) def main(): job = argv[1] build_number = argv[2] slave_ip = argv[3] configs_directory = argv[4] review_job = ReviewJob(job, build_number, slave_ip, configs_directory) review_job.run() review_job.check_and_print_results() review_job.fail_build_if_failures_exist() if __name__ == '__main__': Log.setup() main()
def stack_created_successfully(self): if not self.cf_helper.stack_was_created_successfully(self.STACK_NAME): Log.error('stack was not created')
def check_configs_are_set(self): missing_configs = [config for config, value in self.SIT_CONFIGS.iteritems() if value is None] if missing_configs: Log.error('The following configs are not set: {0}'.format(missing_configs))
def validate_template(self, template_body): logging.info('Validating template') try: self.cf_client.validate_template(TemplateBody=template_body) except Exception as e: Log.error('stack validation error', e)
def check_roles_not_empty(self): empty_roles = [role for role in self.ROLES if not self.sit_helper.get_states_for_role(role)] if empty_roles: Log.error('The following servers are missing roles inside of roles.yml file: {0}'.format(empty_roles))
try: for task_id in self.running_task_ids: response = self.ecs_client.stop_task(task=task_id, cluster=self.cluster) task_definitions.append(response['task']['taskDefinitionArn']) except Exception as e: logging.error('Error occurred while terminating tasks.', e) finally: return task_definitions def error(self, message, e=None, error_code=2): terminated_tasks = self.terminate_running_tasks() logging.info('{0}. Exception: {1}\nFollowing tasks have been terminated: {2}'.format( message, e, terminated_tasks)) exit(error_code) def main(): job = argv[1] build_number = argv[2] slave_ip = argv[3] configs_directory = argv[4] review_job = ReviewJob(job, build_number, slave_ip, configs_directory) review_job.run() review_job.check_and_print_results() review_job.fail_build_if_failures_exist() if __name__ == '__main__': Log.setup() main()
def check_stack_exists(self): stack_name = self.TROPOSPHERE_CONFIGS['stack_name'] if not self.cf_helper.get_stack_info(stack_name): Log.error('Stack "{0}" does not exist. Please run setup_troposphere'.format(stack_name))