def _list_daemons(self, hostname=None, service_name=None, daemon_type=None, daemon_id=None, format='plain', refresh=False): completion = self.list_daemons(service_name, daemon_type, daemon_id=daemon_id, host=hostname, refresh=refresh) self._orchestrator_wait([completion]) raise_if_exception(completion) daemons: List[DaemonDescription] = completion.result def ukn(s): return '<unknown>' if s is None else s # Sort the list for display daemons.sort(key=lambda s: (ukn(s.daemon_type), ukn(s.hostname), ukn(s.daemon_id))) if len(daemons) == 0: return HandleCommandResult(stdout="No daemons reported") elif format != 'plain': data = [s.to_json() for s in daemons] return HandleCommandResult(stdout=to_format(data, format)) else: now = datetime.datetime.utcnow() table = PrettyTable([ 'NAME', 'HOST', 'STATUS', 'REFRESHED', 'AGE', 'VERSION', 'IMAGE NAME', 'IMAGE ID', 'CONTAINER ID' ], border=False) table.align = 'l' table.left_padding_width = 0 table.right_padding_width = 2 for s in sorted(daemons, key=lambda s: s.name()): if s.status_desc: status = s.status_desc else: status = { -1: 'error', 0: 'stopped', 1: 'running', None: '<unknown>' }[s.status] if s.status == 1 and s.started: status += ' (%s)' % to_pretty_timedelta(now - s.started) table.add_row( (s.name(), ukn(s.hostname), status, nice_delta(now, s.last_refresh, ' ago'), nice_delta(now, s.created), ukn(s.version), ukn(s.container_image_name), ukn(s.container_image_id)[0:12], ukn(s.container_id))) return HandleCommandResult(stdout=table.get_string())
def _list_services(self, host=None, svc_type=None, svc_id=None, format='plain', refresh=False): # XXX this is kind of confusing for people because in the orchestrator # context the service ID for MDS is the filesystem ID, not the daemon ID completion = self.describe_service(svc_type, svc_id, host, refresh=refresh) self._orchestrator_wait([completion]) orchestrator.raise_if_exception(completion) services = completion.result def ukn(s): return '<unknown>' if s is None else s # Sort the list for display services.sort(key=lambda s: (ukn(s.service_type), ukn(s.nodename), ukn(s.service_instance))) if len(services) == 0: return HandleCommandResult(stdout="No services reported") elif format == 'json': data = [s.to_json() for s in services] return HandleCommandResult(stdout=json.dumps(data)) else: now = datetime.datetime.utcnow() table = PrettyTable([ 'NAME', 'HOST', 'STATUS', 'REFRESHED', 'VERSION', 'IMAGE NAME', 'IMAGE ID', 'CONTAINER ID' ], border=False) table.align = 'l' table.left_padding_width = 0 table.right_padding_width = 1 for s in sorted(services, key=lambda s: s.name()): status = { -1: 'error', 0: 'stopped', 1: 'running', None: '<unknown>' }[s.status] if s.last_refresh: age = to_pretty_timedelta(now - s.last_refresh) + ' ago' else: age = '-' table.add_row((s.name(), ukn(s.nodename), status, age, ukn(s.version), ukn(s.container_image_name), ukn(s.container_image_id)[0:12], ukn(s.container_id)[0:12])) return HandleCommandResult(stdout=table.get_string())
def _list_services(self, host=None, service_type=None, service_name=None, format='plain', refresh=False): completion = self.describe_service(service_type, service_name, refresh=refresh) self._orchestrator_wait([completion]) raise_if_exception(completion) services = completion.result def ukn(s): return '<unknown>' if s is None else s # Sort the list for display services.sort(key=lambda s: (ukn(s.service_name))) if len(services) == 0: return HandleCommandResult(stdout="No services reported") elif format == 'json': data = [s.to_json() for s in services] return HandleCommandResult(stdout=json.dumps(data)) else: now = datetime.datetime.utcnow() table = PrettyTable([ 'NAME', 'RUNNING', 'REFRESHED', 'IMAGE NAME', 'IMAGE ID', 'SPEC', 'PLACEMENT' ], border=False) table.align['NAME'] = 'l' table.align['RUNNING'] = 'r' table.align['REFRESHED'] = 'l' table.align['IMAGE NAME'] = 'l' table.align['IMAGE ID'] = 'l' table.align['SPEC'] = 'l' table.align['PLACEMENT'] = 'l' table.left_padding_width = 0 table.right_padding_width = 2 for s in sorted(services, key=lambda s: s.service_name): if s.last_refresh: age = to_pretty_timedelta(now - s.last_refresh) + ' ago' else: age = '-' table.add_row(( s.service_name, '%d/%d' % (s.running, s.size), age, ukn(s.container_image_name), ukn(s.container_image_id)[0:12], 'present' if s.spec else '-', s.spec.placement.pretty_str() if s.spec else '-', )) return HandleCommandResult(stdout=table.get_string())
def _list_daemons(self, host=None, daemon_type=None, daemon_id=None, format='plain', refresh=False): completion = self.list_daemons(daemon_type, daemon_id=daemon_id, host=host, refresh=refresh) self._orchestrator_wait([completion]) orchestrator.raise_if_exception(completion) daemons = completion.result def ukn(s): return '<unknown>' if s is None else s # Sort the list for display daemons.sort(key=lambda s: (ukn(s.daemon_type), ukn(s.nodename), ukn(s.daemon_id))) if len(daemons) == 0: return HandleCommandResult(stdout="No daemons reported") elif format == 'json': data = [s.to_json() for s in daemons] return HandleCommandResult(stdout=json.dumps(data)) else: now = datetime.datetime.utcnow() table = PrettyTable([ 'NAME', 'HOST', 'STATUS', 'REFRESHED', 'VERSION', 'IMAGE NAME', 'IMAGE ID', 'CONTAINER ID' ], border=False) table.align = 'l' table.left_padding_width = 0 table.right_padding_width = 1 for s in sorted(daemons, key=lambda s: s.name()): status = { -1: 'error', 0: 'stopped', 1: 'running', None: '<unknown>' }[s.status] if s.last_refresh: age = to_pretty_timedelta(now - s.last_refresh) + ' ago' else: age = '-' table.add_row((s.name(), ukn(s.nodename), status, age, ukn(s.version), ukn(s.container_image_name), ukn(s.container_image_id)[0:12], ukn(s.container_id)[0:12])) return HandleCommandResult(stdout=table.get_string())
def twoline_progress(self, indent=4): """ e.g. - Eating my delicious strudel (since: 30s) [===============..............] (remaining: 04m) """ time_remaining = self.estimated_time_remaining() if time_remaining: remaining = "(remaining: %s)" % (to_pretty_timedelta( timedelta(seconds=time_remaining))) else: remaining = '' return "{0} {1}\n{2}{3} {4}".format(self._message, self.duration_str, " " * indent, self._progress_str(30), remaining)
def nice_delta(now, t, suffix=''): if t: return to_pretty_timedelta(now - t) + suffix else: return '-'
def duration_str(self): duration = time.time() - self.started_at return "(%s)" % (to_pretty_timedelta(timedelta(seconds=duration)))
def test_pretty_timedelta(delta: datetime.timedelta, out: str): assert mgr_util.to_pretty_timedelta(delta) == out