def show(cls, args, lstmsg): tbl = linstor_client.Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) vlm_dfn_hdrs = list(cls._vlm_dfn_headers) if args.external_name: vlm_dfn_hdrs.insert(1, linstor_client.TableHeader("External")) for hdr in vlm_dfn_hdrs: tbl.add_header(hdr) tbl.set_groupby(args.groupby if args.groupby else [tbl.header_name(0)]) for rsc_dfn in lstmsg.resource_definitions: for vlmdfn in rsc_dfn.volume_definitions: state = tbl.color_cell("ok", Color.DARKGREEN) if FLAG_DELETE in vlmdfn.flags: state = tbl.color_cell("DELETING", Color.RED) elif FLAG_RESIZE in vlmdfn.flags: state = tbl.color_cell("resizing", Color.DARKPINK) drbd_data = vlmdfn.drbd_data tbl.add_row([ rsc_dfn.name, vlmdfn.number, drbd_data.minor if drbd_data else "", SizeCalc.approximate_size_string(vlmdfn.size), "+" if FLAG_GROSS_SIZE in vlmdfn.flags else "", state ]) tbl.show()
def show(cls, args, lstmsg): tbl = linstor_client.Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) tbl.add_column("ResourceName") tbl.add_column("SnapshotName") tbl.add_column("NodeNames") tbl.add_column("Volumes") tbl.add_column("State", color=Output.color(Color.DARKGREEN, args.no_color)) for snapshot_dfn in lstmsg.snapshots: if FLAG_DELETE in snapshot_dfn.flags: state_cell = tbl.color_cell("DELETING", Color.RED) elif FLAG_FAILED_DEPLOYMENT in snapshot_dfn.flags: state_cell = tbl.color_cell("Failed", Color.RED) elif FLAG_FAILED_DISCONNECT in snapshot_dfn.flags: state_cell = tbl.color_cell("Satellite disconnected", Color.RED) elif FLAG_SUCCESSFUL in snapshot_dfn.flags: state_cell = tbl.color_cell("Successful", Color.DARKGREEN) else: state_cell = tbl.color_cell("Incomplete", Color.DARKBLUE) tbl.add_row([ snapshot_dfn.resource_name, snapshot_dfn.name, ", ".join([node_name for node_name in snapshot_dfn.nodes]), ", ".join([ str(snapshot_vlm_dfn.number) + ": " + SizeCalc.approximate_size_string(snapshot_vlm_dfn.size) for snapshot_vlm_dfn in snapshot_dfn.snapshot_volume_definitions ]), state_cell ]) tbl.show()
def _show_query_max_volume(self, args, lstmsg): """ DEPRECATED will be removed :param args: :param lstmsg: :return: """ print( Output.color_str("DEPRECATED:", Color.YELLOW, args.no_color) + " use `linstor controller query-max-volume-size`") tbl = linstor_client.Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) tbl.add_column("StoragePool") tbl.add_column("MaxVolumeSize", just_txt='>') tbl.add_column("Provisioning") tbl.add_column("Nodes") def limited_string(obj_list): limit = 40 s = "" list_length = len(obj_list) for i in range(0, len(obj_list)): obj = obj_list[i] s += obj + (", " if i != list_length - 1 else "") if len(s) > limit: s = s[:limit - 3] + "..." return s storage_pool_dfns = self.get_linstorapi().storage_pool_dfn_list( )[0].storage_pool_definitions for candidate in lstmsg.candidates: max_vlm_size = SizeCalc.approximate_size_string( candidate.max_volume_size) storage_pool_props = [ x for x in storage_pool_dfns if x.name == candidate.storage_pool ][0].properties max_oversubscription_ratio_props = \ [x for x in storage_pool_props if x.key == KEY_STOR_POOL_DFN_MAX_OVERSUBSCRIPTION_RATIO] max_oversubscription_ratio_prop = max_oversubscription_ratio_props[0].value \ if max_oversubscription_ratio_props \ else lstmsg.default_max_oversubscription_ratio max_oversubscription_ratio = float(max_oversubscription_ratio_prop) tbl.add_row([ candidate.storage_pool, max_vlm_size, "Thin, oversubscription ratio " + str(max_oversubscription_ratio) if candidate.all_thin else "Thick", limited_string(candidate.node_names) ]) tbl.show()
def show(self, args, lstmsg): tbl = linstor_client.Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) for hdr in self._stor_pool_headers: tbl.add_header(hdr) storage_pool_resp = lstmsg # type: StoragePoolListResponse tbl.set_groupby(args.groupby if args. groupby else [self._stor_pool_headers[0].name]) errors = [] for storpool in storage_pool_resp.storage_pools: driver_device = linstor.StoragePoolDriver.storage_props_to_driver_pool( storpool.provider_kind, storpool.properties) free_capacity = "" total_capacity = "" if not storpool.is_diskless() and storpool.free_space is not None: free_capacity = SizeCalc.approximate_size_string( storpool.free_space.free_capacity) total_capacity = SizeCalc.approximate_size_string( storpool.free_space.total_capacity) for error in storpool.reports: if error not in errors: errors.append(error) state_str, state_color = self.get_replies_state(storpool.reports) tbl.add_row([ storpool.name, storpool.node_name, storpool.provider_kind, driver_device, free_capacity, total_capacity, storpool.supports_snapshots(), tbl.color_cell(state_str, state_color), storpool.free_space_mgr_name if ':' not in storpool.free_space_mgr_name else '' ]) tbl.show() for err in errors: Output.handle_ret(err, warn_as_error=args.warn_as_error, no_color=args.no_color)
def show(cls, args, lstmsg): tbl = linstor_client.Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) tbl.add_column("ResourceName") tbl.add_column("SnapshotName") tbl.add_column("NodeNames") tbl.add_column("Volumes") tbl.add_column("CreatedOn") tbl.add_column("State", color=Output.color(Color.DARKGREEN, args.no_color)) for snapshot_dfn in lstmsg.snapshots: if FLAG_DELETE in snapshot_dfn.flags: state_cell = tbl.color_cell("DELETING", Color.RED) elif FLAG_FAILED_DEPLOYMENT in snapshot_dfn.flags: state_cell = tbl.color_cell("Failed", Color.RED) elif FLAG_FAILED_DISCONNECT in snapshot_dfn.flags: state_cell = tbl.color_cell("Satellite disconnected", Color.RED) elif FLAG_SUCCESSFUL in snapshot_dfn.flags: in_backup_restore = False in_backup_create = False if FLAG_BACKUP in snapshot_dfn.flags and FLAG_SHIPPING in snapshot_dfn.flags: for snap in snapshot_dfn.snapshots: in_backup_create |= FLAG_BACKUP_SOURCE in snap.flags in_backup_restore |= FLAG_BACKUP_TARGET in snap.flags if in_backup_create: state_cell = tbl.color_cell("Shipping", Color.YELLOW) elif in_backup_restore: state_cell = tbl.color_cell("Restoring", Color.YELLOW) else: state_cell = tbl.color_cell("Successful", Color.DARKGREEN) else: state_cell = tbl.color_cell("Incomplete", Color.DARKBLUE) snapshot_date = "" if snapshot_dfn.snapshots and snapshot_dfn.snapshots[ 0].create_datetime: snapshot_date = str( snapshot_dfn.snapshots[0].create_datetime)[:19] tbl.add_row([ snapshot_dfn.resource_name, snapshot_dfn.name, ", ".join([node_name for node_name in snapshot_dfn.nodes]), ", ".join([ str(snapshot_vlm_dfn.number) + ": " + SizeCalc.approximate_size_string(snapshot_vlm_dfn.size) for snapshot_vlm_dfn in snapshot_dfn.snapshot_volume_definitions ]), snapshot_date, state_cell ]) tbl.show()
def make_volume_node(cls, vlm): """ :param responses.Volume vlm: :return: """ volume_node = TreeNode('volume' + str(vlm.number), '', Color.DARKGREEN) volume_node.set_description('minor number: ' + str(vlm.drbd_data.drbd_volume_definition.minor) if vlm.drbd_data else '') volume_node.add_description( ', size: ' + str(SizeCalc.approximate_size_string(vlm.allocated_size)) ) return volume_node
def _show_query_max_volume(self, args, lstmsg): tbl = linstor_client.Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) tbl.add_column("StoragePool") tbl.add_column("MaxVolumeSize", just_txt='>') tbl.add_column("Provisioning") tbl.add_column("Nodes") def limited_string(obj_list): limit = 40 s = "" list_length = len(obj_list) for i in range(0, len(obj_list)): obj = obj_list[i] s += obj + (", " if i != list_length - 1 else "") if len(s) > limit: s = s[:limit - 3] + "..." return s storage_pool_dfns = self.get_linstorapi().storage_pool_dfn_list( )[0].storage_pool_definitions for candidate in lstmsg.candidates: max_vlm_size = SizeCalc.approximate_size_string( candidate.max_volume_size) storage_pool_props = [ x for x in storage_pool_dfns if x.name == candidate.storage_pool ][0].properties max_oversubscription_ratio = float( storage_pool_props.get( KEY_STOR_POOL_DFN_MAX_OVERSUBSCRIPTION_RATIO, lstmsg.default_max_oversubscription_ratio)) tbl.add_row([ candidate.storage_pool, max_vlm_size, "Thin, oversubscription ratio " + str(max_oversubscription_ratio) if candidate.all_thin else "Thick", limited_string(candidate.node_names) ]) tbl.show()
def show_volumes(cls, args, lstmsg): """ :param args: :param responses.ResourceResponse lstmsg: resource response data to display :return: None """ tbl = Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) tbl.add_column("Node") tbl.add_column("Resource") tbl.add_column("StoragePool") tbl.add_column("VolNr", just_txt='>') tbl.add_column("MinorNr", just_txt='>') tbl.add_column("DeviceName") tbl.add_column("Allocated", just_txt='>') tbl.add_column("InUse", color=Output.color(Color.DARKGREEN, args.no_color)) tbl.add_column("State", color=Output.color(Color.DARKGREEN, args.no_color), just_txt='>') rsc_state_lkup = { x.node_name + x.name: x for x in lstmsg.resource_states } reports = [] for rsc in lstmsg.resources: if not args.all and apiconsts.FLAG_TIE_BREAKER in rsc.flags: continue # skip tie breaker resources if apiconsts.FLAG_RSC_INACTIVE in rsc.flags: continue # do not show non existing volumes for inactive resources rsc_state = rsc_state_lkup.get(rsc.node_name + rsc.name) rsc_usage = "" if rsc_state and rsc_state.in_use is not None: if rsc_state.in_use: rsc_usage = tbl.color_cell("InUse", Color.GREEN) else: rsc_usage = "Unused" for vlm in rsc.volumes: vlm_state = cls.get_volume_state( rsc_state.volume_states, vlm.number) if rsc_state else None state_txt, color = cls.volume_state_cell( vlm_state, rsc.flags, vlm.flags) has_errors = any([x.is_error() for x in vlm.reports]) conn_failed = (rsc.layer_data.drbd_resource and any(not v.connected for k, v in rsc.layer_data. drbd_resource.connections.items())) if conn_failed: color = Color.RED state = tbl.color_cell(state_txt, color) if color else state_txt if has_errors: state = tbl.color_cell("Error", Color.RED) for x in vlm.reports: reports.append(x) vlm_drbd_data = vlm.drbd_data tbl.add_row([ rsc.node_name, rsc.name, vlm.storage_pool_name, str(vlm.number), str(vlm_drbd_data.drbd_volume_definition.minor) if vlm_drbd_data else "", vlm.device_path, SizeCalc.approximate_size_string(vlm.allocated_size) if vlm.allocated_size else "", rsc_usage, state ]) tbl.show() for x in reports: Output.handle_ret(x, args.no_color, warn_as_error=args.warn_as_error)
def show_backups_info(cls, args, lstmsg): rsc_tbl = Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) rsc_tbl.add_column("Resource") rsc_tbl.add_column("Snapshot") rsc_tbl.add_column("Full Backup") rsc_tbl.add_column("Latest Backup") rsc_tbl.add_column("Backup Count") rsc_tbl.add_column("Download Size") rsc_tbl.add_column("Allocated Size") # table will only have a single row row = [ lstmsg.rsc, lstmsg.snap, lstmsg.full, lstmsg.latest, lstmsg.count ] row += [ SizeCalc.approximate_size_string(lstmsg.dl_size), SizeCalc.approximate_size_string(lstmsg.alloc_size) ] rsc_tbl.add_row(row) rsc_tbl.show() stor_pool_tbl = Table(utf8=not args.no_utf8, colors=not args.no_color, pastable=args.pastable) stor_pool_tbl.add_column("Origin StorPool (Type)") if args.target_node: stor_pool_tbl.add_column("Target Pool") stor_pool_tbl.add_column("Remaining Free Space") stor_pool_tbl.add_column("Volume to Download") stor_pool_tbl.add_column("Type") stor_pool_tbl.add_column("Download Size") stor_pool_tbl.add_column("Allocated Size") stor_pool_tbl.add_column("Usable Size") for stor_pool in lstmsg.storpools: row = [stor_pool.name + " (" + stor_pool.provider_kind + ")"] if args.target_node: row += [ stor_pool.target_name, ] if stor_pool.remaining_space < 0: row += [ stor_pool_tbl.color_cell( "-" + SizeCalc.approximate_size_string( -stor_pool.remaining_space), Color.RED) ] else: row += [ SizeCalc.approximate_size_string( stor_pool.remaining_space) ] vlm_to_dl_cell = [] type_cell = [] dl_size_cell = [] alloc_size_cell = [] usable_size_cell = [] for volume in stor_pool.volumes: vlm_to_dl_cell += [volume.name if volume.name else "-"] type_cell += [volume.layer_type] dl_size_cell += [ SizeCalc.approximate_size_string(volume.dl_size) if volume.dl_size else "-" ] alloc_size_cell += [ SizeCalc.approximate_size_string(volume.alloc_size) if volume.alloc_size else "-" ] usable_size_cell += [ SizeCalc.approximate_size_string(volume.usable_size) if volume.usable_size else "-" ] row += [ "\n".join(vlm_to_dl_cell), "\n".join(type_cell), "\n".join(dl_size_cell), "\n".join(alloc_size_cell), "\n".join(usable_size_cell) ] stor_pool_tbl.add_row(row) stor_pool_tbl.show()