def to_columns_blob(self, file: BlobListing) -> Sequence[str]: date = time.strftime(TIME_FORMAT, time.localtime(file.modification_time)) if self.human_readable: size = format_size(file.size).rstrip("B") else: size = str(file.size) name = self.painter.paint(str(file.uri), get_file_type(file)) return ["", f"{size}", f"{date}", f"{name}"]
def _format_node_pools(node_pools: Iterable[_NodePool], prefix: str) -> Iterator[str]: is_scalable = _is_scalable(node_pools) has_preemptible = _has_preemptible(node_pools) has_tpu = _has_tpu(node_pools) has_idle = _has_idle(node_pools) headers = ["Machine", "CPU", "Memory"] if has_preemptible: headers.append("Preemptible") headers.append("GPU") if has_tpu: headers.append("TPU") if is_scalable: headers.append("Min") headers.append("Max") else: headers.append("Size") if has_idle: headers.append("Idle") rows = [headers] for node_pool in node_pools: row = [ node_pool.machine_type, str(node_pool.available_cpu), format_size(node_pool.available_memory_mb * 1024**2), ] if has_preemptible: row.append("√" if node_pool.is_preemptible else "×") row.append(_gpu(node_pool)) if has_tpu: row.append("√" if node_pool.is_tpu_enabled else "×") if is_scalable: row.append(str(node_pool.min_size)) row.append(str(node_pool.max_size)) if has_idle: row.append(str(node_pool.idle_size)) rows.append(row) aligns = [Align.LEFT, Align.RIGHT, Align.RIGHT] if has_preemptible: aligns.append(Align.CENTER) aligns.append(Align.RIGHT) if has_tpu: aligns.append(Align.CENTER) aligns.append(Align.RIGHT) if is_scalable: aligns.append(Align.RIGHT) if has_idle: aligns.append(Align.RIGHT) for line in table(rows=rows, aligns=aligns): yield prefix + line
def _disk_to_table_row(self, disk: Disk) -> Sequence[str]: storage_str = utils.format_size(disk.storage) line = [ disk.id, storage_str, self._uri_formatter(disk.uri), disk.status.value ] if self._long_format: line += [ format_datetime(disk.created_at), format_datetime(disk.last_usage) ] return line
def _columns_for_file(self, file: FileStatus) -> Sequence[str]: type = self.file_types_mapping[file.type] permission = self.permissions_mapping[file.permission] date = time.strftime(TIME_FORMAT, time.localtime(file.modification_time)) if self.human_readable: size = format_size(file.size).rstrip("B") else: size = str(file.size) name = self.painter.paint(file.name, file.type) return [f"{type}{permission}", f"{size}", f"{date}", f"{name}"]
def _format_presets( presets: Mapping[str, Preset], available_jobs_counts: Optional[Mapping[str, int]], prefix: str, ) -> Iterator[str]: has_tpu = False for preset in presets.values(): if preset.tpu_type: has_tpu = True break rows = [] headers = ["Name", "#CPU", "Memory", "Preemptible", "GPU"] if available_jobs_counts: headers.append("Jobs Available") # TODO: support ANSI styles in headers # headers = [style(name, bold=True) for name in headers] rows.append(headers) if has_tpu: headers.append("TPU") for name, preset in presets.items(): gpu = "" if preset.gpu: gpu = f"{preset.gpu} x {preset.gpu_model}" row = [ name, str(preset.cpu), format_size(preset.memory_mb * 1024**2), "√" if preset.is_preemptible else "×", gpu, ] if has_tpu: tpu = (f"{preset.tpu_type}/{preset.tpu_software_version}" if preset.tpu_type else "") row.append(tpu) if available_jobs_counts: if name in available_jobs_counts: row.append(str(available_jobs_counts[name])) else: row.append("") rows.append(row) aligns = [Align.LEFT, Align.RIGHT, Align.RIGHT, Align.CENTER, Align.LEFT] if available_jobs_counts: aligns.append(Align.RIGHT) for line in table(rows=rows, aligns=aligns): yield prefix + line
def __call__(self, resources: Resources) -> str: lines = list() lines.append("Memory: " + format_size(resources.memory_mb * 1024**2)) lines.append(f"CPU: {resources.cpu:0.1f}") if resources.gpu: lines.append(f"GPU: {resources.gpu:0.1f} x {resources.gpu_model}") if resources.tpu_type: lines.append( f"TPU: {resources.tpu_type}/{resources.tpu_software_version}") additional = list() if resources.shm: additional.append("Extended SHM space") if additional: lines.append(f'Additional: {",".join(additional)}') indent = " " return "Resources:\n" + indent + f"\n{indent}".join(lines)
def _format_presets(self, presets: Dict[str, Preset], indent: str = " ") -> str: if platform == "win32": yes, no = "Yes", "No" else: yes, no = "✔︎", "✖︎" has_tpu = False for preset in presets.values(): if preset.tpu_type: has_tpu = True break table = [] headers = ["Name", "#CPU", "Memory", "Preemptible", "GPU"] if has_tpu: headers.append("TPU") for name, preset in presets.items(): gpu = "" if preset.gpu: gpu = f"{preset.gpu} x {preset.gpu_model}" row = [ name, preset.cpu, format_size(preset.memory_mb * 1024**2), yes if preset.is_preemptible else no, gpu, ] if preset.tpu_type: tpu = f"{preset.tpu_type}/{preset.tpu_software_version}" row.append(tpu) table.append(row) return tabulate( # type: ignore table, headers=headers, tablefmt="plain", colalign=("left", "right", "right", "center"), )
def __call__(self, resources: Resources) -> str: lines = [] def add(descr: str, value: str) -> None: lines.append(f"{bold(descr)}: {value}") add("Memory", format_size(resources.memory_mb * 1024**2)) add("CPU", f"{resources.cpu:0.1f}") if resources.gpu: add("GPU", f"{resources.gpu:0.1f} x {resources.gpu_model}") if resources.tpu_type: add("TPU", f"{resources.tpu_type}/{resources.tpu_software_version}") additional = [] if resources.shm: additional.append("Extended SHM space") if additional: add("Additional", ",".join(additional)) indent = " " return f"{bold('Resources')}:\n" + indent + f"\n{indent}".join(lines)
def fmt_size(self, size: int) -> str: return format_size(size)