def exec_list_cmd(_): exec_api = ZoeExecutionsAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) data = exec_api.list() for e in data: print('Execution {} (User: {}, ID: {}): {}'.format( e['name'], e['user_id'], e['id'], e['status']))
def exec_get_cmd(args): """Gather information about an execution.""" exec_api = ZoeExecutionsAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) cont_api = ZoeServiceAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) execution = exec_api.get(args.id) if execution is None: print('Execution not found') else: print('Execution {} (ID: {})'.format(execution['name'], execution['id'])) print('Status: {}'.format(execution['status'])) if execution['status'] == 'error': print('Last error: {}'.format(execution['error_message'])) print('Time submit: {}'.format(datetime.datetime.fromtimestamp(execution['time_submit']))) if execution['time_start'] is None: print('Time start: {}'.format('not yet')) else: print('Time start: {}'.format(datetime.datetime.fromtimestamp(execution['time_start']))) if execution['time_end'] is None: print('Time end: {}'.format('not yet')) else: print('Time end: {}'.format(datetime.datetime.fromtimestamp(execution['time_end']))) app = execution['description'] print('Application name: {}'.format(app['name'])) for c_id in execution['services']: service = cont_api.get(c_id) print('Service {} (ID: {})'.format(service['name'], service['id'])) print(' - zoe status: {}'.format(service['status'])) print(' - docker status: {}'.format(service['docker_status'])) if service['docker_status'] == 'started': ip = service['ip_address'] for port in service['description']['ports']: print(' - {}: {}://{}:{}{}'.format(port['name'], port['protocol'], ip, port['port_number'], port['path']))
def main(): """Main.""" exec_api = ZoeExecutionsAPI(zoe_url(), zoe_user(), zoe_pass()) execs = exec_api.list() print( 'id,time_submit,time_start,time_end,cpu_usage,mem_usage,net_rx_usage,net_tx_usage,blkio_usage' ) for e_id in execs: e = exec_api.get(e_id) if e['name'] != 'boinc-loader' or e['status'] != 'terminated': continue trace_line = { 'id': e['id'], 'time_submit': e['time_submit'], 'time_start': e['time_start'], 'time_end': e['time_end'], 'cpu_usage': get_influx_cpu_data(e_id), 'mem_usage': get_influx_mem_data(e_id), 'net_rx_usage': get_influx_net_rx_data(e_id), 'net_tx_usage': get_influx_net_tx_data(e_id), 'blkio_usage': get_influx_blkio_data(e_id) } print( '{id},{time_submit},{time_start},{time_end},{cpu_usage},{mem_usage},{net_rx_usage},{net_tx_usage},{blkio_usage}' .format(**trace_line))
def submit_zapp(zapp): """Submits one ZApp for execution.""" exec_api = ZoeExecutionsAPI(zoe_url(), zoe_user(), zoe_pass()) ret = exec_api.start('boinc-loader', zapp) print( "Application scheduled successfully with ID {}, use the exec-get command to check its status" .format(ret))
def exec_start_cmd(args): """Submit an execution.""" app_descr = json.load(args.jsonfile) app_validate(app_descr) exec_api = ZoeExecutionsAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) ret = exec_api.start(args.name, app_descr) print("Application scheduled successfully with ID {}, use the exec-get command to check its status".format(ret))
def exec_get_cmd(auth, args): """Gather information about an execution.""" exec_api = ZoeExecutionsAPI(auth['url'], auth['user'], auth['pass']) cont_api = ZoeServiceAPI(auth['url'], auth['user'], auth['pass']) execution = exec_api.get(args.id) if execution is None: print('Execution not found') else: print('Execution {} (ID: {})'.format(execution['name'], execution['id'])) print('Application name: {}'.format(execution['description']['name'])) print('Status: {}'.format(execution['status'])) if execution['status'] == 'error': print('Last error: {}'.format(execution['error_message'])) print() print('Time submit: {}'.format( datetime.fromtimestamp(execution['time_submit'], timezone.utc).astimezone())) if execution['time_start'] is None: print('Time start: {}'.format('not yet')) else: print('Time start: {}'.format( datetime.fromtimestamp(execution['time_start'], timezone.utc).astimezone())) if execution['time_end'] is None: print('Time end: {}'.format('not yet')) else: print('Time end: {}'.format( datetime.fromtimestamp(execution['time_end'], timezone.utc).astimezone())) print() endpoints = exec_api.endpoints(execution['id']) if endpoints is not None and len(endpoints) > 0: print('Exposed endpoints:') for endpoint in endpoints: print(' - {}: {}'.format(endpoint[0], endpoint[1])) else: print('This ZApp does not expose any endpoint') print() tabular_data = [] for c_id in execution['services']: service = cont_api.get(c_id) service_data = [ service['id'], service['name'], 'true' if service['essential'] else 'false', service['status'], service['backend_status'], service['backend_host'], service['error_message'] if service['error_message'] is not None else '' ] tabular_data.append(service_data) headers = [ 'ID', 'Name', 'Essential', 'Zoe status', 'Backend status', 'Host', 'Error message' ] print(tabulate(tabular_data, headers))
def app_get_cmd(args): """Extract an application description from an execution.""" exec_api = ZoeExecutionsAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) execution = exec_api.get(args.id) if execution is None: print("no such execution") else: json.dump(execution['description'], sys.stdout, sort_keys=True, indent=4)
def delete_finished(): """Delete finished executions from Zoe.""" exec_api = ZoeExecutionsAPI(zoe_url(), zoe_user(), zoe_pass()) execs = exec_api.list() for e_id in execs: e = exec_api.get(e_id) if e['name'] == 'boinc-loader' and e['status'] == 'terminated': print('Execution {} has finished, deleting...'.format(e_id)) exec_api.delete(e['id'])
def exec_kill_user_cmd(auth, args): """Terminates all executions for the given user.""" exec_api = ZoeExecutionsAPI(auth['url'], auth['user'], auth['pass']) filters = {'status': 'running', 'user_id': args.user_id} data = exec_api.list(**filters) print('Terminating {} executions belonging to user {}'.format( len(data), args.user_id)) for execution in data: exec_api.terminate(execution) print('Execution {} terminated'.format(execution))
def app_get_cmd(auth, args): """Extract an application description from an execution.""" exec_api = ZoeExecutionsAPI(auth['url'], auth['user'], auth['pass']) execution = exec_api.get(args.id) if execution is None: print("no such execution") else: json.dump(execution['description'], sys.stdout, sort_keys=True, indent=4)
def count_jobs(): """Count how many zapps have already been submitted.""" exec_api = ZoeExecutionsAPI(zoe_url(), zoe_user(), zoe_pass()) execs = exec_api.list() count = 0 for e_id in execs: e = exec_api.get(e_id) if e['name'] != 'boinc-loader': continue if e['status'] != 'terminated': count += 1 return count
def __init__(self, workspace_base_path, identity, name): self.identity = identity self.name = name self.workspace = ZoeWorkspace(workspace_base_path, identity, name) self.exec_api = ZoeExecutionsAPI(self.identity['zoe_url'], self.identity['username'], self.identity['password']) self.cont_api = ZoeServiceAPI(self.identity['zoe_url'], self.identity['username'], self.identity['password']) info_api = ZoeInfoAPI(self.identity['zoe_url'], self.identity['username'], self.identity['password']) zoe_info = info_api.info() self.hostname_prefix = zoe_info['name_prefix'] self.exec_counter = 0
def exec_list_cmd(auth, args): """List executions""" exec_api = ZoeExecutionsAPI(auth['url'], auth['user'], auth['pass']) filter_names = [ 'status', 'name', 'limit', 'earlier_than_submit', 'earlier_than_start', 'earlier_than_end', 'later_than_submit', 'later_than_start', 'later_than_end' ] filters = {'user_id': auth['user']} for key, value in vars(args).items(): if key in filter_names: filters[key] = value data = exec_api.list(**filters) if len(data) == 0: return tabular_data = [[e['id'], e['name'], e['user_id'], e['status']] for e in sorted(data.values(), key=lambda x: x['id'])] headers = ['ID', 'Name', 'User ID', 'Status'] print(tabulate(tabular_data, headers))
def exec_start_cmd(auth, args): """Submit an execution.""" app_descr = json.load(args.jsonfile) exec_api = ZoeExecutionsAPI(auth['url'], auth['user'], auth['pass']) exec_id = exec_api.start(args.name, app_descr) if not args.synchronous: print( "Application scheduled successfully with ID {}, use the exec-get command to check its status" .format(exec_id)) else: print( "Application scheduled successfully with ID {}, waiting for status change" .format(exec_id)) old_status = 'submitted' while True: execution = exec_api.get(exec_id) current_status = execution['status'] if old_status != current_status: print('Execution is now {}'.format(current_status)) old_status = current_status if current_status == 'running': break time.sleep(1) monitor_service_id = None service_api = ZoeServiceAPI(auth['url'], auth['user'], auth['pass']) for service_id in execution['services']: service = service_api.get(service_id) if service['description']['monitor']: monitor_service_id = service['id'] break print('\n>------ start of log streaming -------<\n') why_stop = _log_stream_stdout(monitor_service_id, False, auth) print('\n>------ end of log streaming -------<\n') if why_stop == 'stream_end': print('Execution finished') exit(0) elif why_stop == 'interrupt': print('Do not worry, your execution ({}) is still running.'.format( exec_id)) exit(1)
def check_guests(swarm): query_api = ZoeQueryAPI(get_conf().master_url, 'zoeadmin', get_conf().zoeadmin_password) exec_api = ZoeExecutionsAPI(get_conf().master_url, 'zoeadmin', get_conf().zoeadmin_password) cont_api = ZoeServiceAPI(get_conf().master_url, 'zoeadmin', get_conf().zoeadmin_password) guests = query_api.query('user', role='guest') execs = exec_api.list() for guest in guests: my_execs = [e for e in execs if e['owner'] == guest['name']] for my_exec in my_execs: if len(my_exec['services']) == 0: continue my_exec_since_started = datetime.datetime.now( ) - dateutil.parser.parse(my_exec['time_started']) my_exec_since_started = my_exec_since_started.total_seconds() terminate = False for c in my_exec['services']: c = cont_api.get(c) for port in c['ports']: if port['name'] == 'Spark application web interface': idle_time = check_spark_job(swarm, c['docker_id'], my_exec_since_started) if check_if_kill(idle_time): log.info( 'Execution {} for user {} has been idle for too long, terminating...' .format(my_exec['name'], guest['name'])) terminate = True break else: log.debug( 'Execution {} for user {} has been idle for {} seconds' .format(my_exec['name'], guest['name'], idle_time)) if terminate: break if terminate: exec_api.terminate(my_exec['id'])
def exec_get_cmd(args): exec_api = ZoeExecutionsAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) cont_api = ZoeServiceAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) execution = exec_api.execution_get(args.id) if execution is None: print('Execution not found') else: print('Execution {} (ID: {})'.format(execution['name'], execution['id'])) print('Status: {}'.format(execution['status'])) if execution['status'] == 'error': print('Last error: {}'.format(execution['error'])) print('Time submit: {}'.format( datetime.datetime.fromtimestamp(execution['time_submit']))) if execution['time_start'] is None: print('Time start: {}'.format('not yet')) else: print('Time start: {}'.format( datetime.datetime.fromtimestamp(execution['time_start']))) if execution['time_end'] is None: print('Time end: {}'.format('not yet')) else: print('Time end: {}'.format( datetime.datetime.fromtimestamp(execution['time_end']))) app = execution['description'] print('Application name: {}'.format(app['name'])) for c_id in execution['services']: c = cont_api.get(c_id) ip = list(c['ip_address'].values())[ 0] # FIXME how to decide which network is the right one? print('Service {} (ID: {})'.format(c['name'], c['id'])) for p in c['ports']: print(' - {}: {}://{}:{}{}'.format(p['name'], p['protocol'], ip, p['port_number'], p['path']))
def exec_rm_cmd(auth, args): """Delete an execution and kill it if necessary.""" exec_api = ZoeExecutionsAPI(auth['url'], auth['user'], auth['pass']) exec_api.delete(args.id)
def submit_zapp(zapp): """Submits one ZApp for execution.""" exec_api = ZoeExecutionsAPI(zoe_url(), zoe_user(), zoe_pass()) ret = exec_api.start('boinc-loader', zapp) return ret
def exec_kill_cmd(auth, args): """Kill an execution.""" exec_api = ZoeExecutionsAPI(auth['url'], auth['user'], auth['pass']) exec_api.terminate(args.id)
def exec_kill_cmd(args): exec_api = ZoeExecutionsAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) exec_api.terminate(args.id)
def exec_rm_cmd(args): """Delete an execution and kill it if necessary.""" exec_api = ZoeExecutionsAPI(utils.zoe_url(), utils.zoe_user(), utils.zoe_pass()) exec_api.delete(args.id)