def do_usage_list(cs, args): """List usage data for all tenants""" dateformat = "%Y-%m-%d" rows = [ "Tenant ID", "Instances", "RAM MB-Hours", "CPU Hours", "Disk GB-Hours" ] if args.start: start = datetime.datetime.strptime(args.start, dateformat) else: start = (datetime.datetime.today() - datetime.timedelta(weeks=4)) if args.end: end = datetime.datetime.strptime(args.end, dateformat) else: end = datetime.datetime.tomorrow() def simplify_usage(u): simplerows = map(lambda x: x.lower().replace(" ", "_"), rows) setattr(u, simplerows[0], u.tenant_id) setattr(u, simplerows[1], "%d" % len(u.server_usages)) setattr(u, simplerows[2], "%.2f" % u.total_memory_mb_usage) setattr(u, simplerows[3], "%.2f" % u.total_vcpus_usage) setattr(u, simplerows[4], "%.2f" % u.total_local_gb_usage) usage_list = cs.usage.list(start, end, detailed=True) print "Usage from %s to %s:" % (start.strftime(dateformat), end.strftime(dateformat)) for usage in usage_list: simplify_usage(usage) utils.print_list(usage_list, rows)
def do_network_list(cs, args): """ List networks """ from novaclient import utils networks = cs.os_networksv2_python_novaclient_ext.list() utils.print_list(networks, ['ID', 'Label', 'CIDR'])
def do_usage_list(cs, args): """List usage data for all tenants""" dateformat = "%Y-%m-%d" rows = ["Tenant ID", "Instances", "RAM MB-Hours", "CPU Hours", "Disk GB-Hours"] if args.start: start = datetime.datetime.strptime(args.start, dateformat) else: start = (datetime.datetime.today() - datetime.timedelta(weeks=4)) if args.end: end = datetime.datetime.strptime(args.end, dateformat) else: end = datetime.datetime.tomorrow() def simplify_usage(u): simplerows = map(lambda x: x.lower().replace(" ", "_"), rows) setattr(u, simplerows[0], u.tenant_id) setattr(u, simplerows[1], "%d" % len(u.server_usages)) setattr(u, simplerows[2], "%.2f" % u.total_memory_mb_usage) setattr(u, simplerows[3], "%.2f" % u.total_vcpus_usage) setattr(u, simplerows[4], "%.2f" % u.total_local_gb_usage) usage_list = cs.usage.list(start, end, detailed=True) print "Usage from %s to %s:" % (start.strftime(dateformat), end.strftime(dateformat)) for usage in usage_list: simplify_usage(usage) utils.print_list(usage_list, rows)
def do_instance_action_list(cs, args): """List actions on a server.""" server = _find_server(cs, args) actions = cs.instance_action.list(server) utils.print_list(actions, ['Action', 'Request_ID', 'Message', 'Start_Time'], sortby_index=3)
def do_ip_association_list(cs, args): """ List IP associations """ ip_associations = cs.ip_associations_python_novaclient_ext.list( args.instance_id) utils.print_list(ip_associations, ['ID', 'Address'])
def do_list(cs, args): """List active servers.""" recurse_zones = args.recurse_zones search_opts = { 'reservation_id': args.reservation_id, 'recurse_zones': recurse_zones, 'ip': args.ip, 'ip6': args.ip6, 'name': args.name, 'image': args.image, 'flavor': args.flavor, 'status': args.status, 'host': args.host, 'instance_name': args.instance_name } if recurse_zones: id_col = 'UUID' else: id_col = 'ID' columns = [id_col, 'Name', 'Status', 'Networks'] formatters = {'Networks': _format_servers_list_networks} utils.print_list(cs.servers.list(search_opts=search_opts), columns, formatters)
def _show_maintenance_status(cs, host): hv = cs.host_maintenance.get(host) host = HostMaintenanceResource(HostMaintenanceManager, hv.hypervisor_maintenance) utils.print_list([host], ['hypervisor_hostname', 'maintenance_status', 'maintenance_migration_action'])
def do_instance_action_list(cs, args): """List actions on a server.""" server = utils.find_resource(cs.servers, args.server) actions = cs.instance_action.list(server) utils.print_list(actions, ['Action', 'Request_ID', 'Message', 'Start_Time'], sortby_index=3)
def do_list_extensions(client, _args): """ List all the os-api extensions that are available. """ extensions = client.list_extensions.show_all() fields = ["Name", "Summary", "Alias", "Updated"] utils.print_list(extensions, fields)
def do_host_maintenance(cs, args): """Enable maintenance mode for a hypervisor.""" if not args.set_status: if args.migrate or args.target_host: raise exceptions.CommandError(_("Need to set --set-status " "to 'enable' when --migrate " "or --target-host specified.")) else: return _show_maintenance_status(cs, args.host) if "disable" == args.set_status.lower(): if args.migrate or args.target_host: raise exceptions.CommandError(_("No need to specify migrate or " "target-host when disabling the " "host maintenance mode.")) hv = cs.host_maintenance.update(args.host, args.set_status, args.migrate, args.target_host) host = HostMaintenanceResource(HostMaintenanceManager, hv.hypervisor_maintenance) utils.print_list([host], ['hypervisor_hostname', 'status', 'migrate', 'target-host'])
def _print_baremetal_nodes_list(nodes): """Print the list of baremetal nodes.""" def _parse_address(fields): macs = [] for interface in fields.interfaces: macs.append(interface["address"]) return ", ".join("%s" % i for i in macs) formatters = {"MAC Address": _parse_address} _translate_baremetal_node_keys(nodes) utils.print_list( nodes, [ "ID", "Host", "Task State", "CPUs", "Memory_MB", "Disk_GB", "MAC Address", "PM Address", "PM Username", "PM Password", "Terminal Port", ], formatters=formatters, )
def do_host_maintenance(cs, args): """Enable maintenance mode for a hypervisor.""" if not args.set_status: if args.migrate or args.target_host: raise exceptions.CommandError( _("Need to set --set-status " "to 'enable' when --migrate " "or --target-host specified.")) else: return _show_maintenance_status(cs, args.host) if "disable" == args.set_status.lower(): if args.migrate or args.target_host: raise exceptions.CommandError( _("No need to specify migrate or " "target-host when disabling the " "host maintenance mode.")) hv = cs.host_maintenance.update(args.host, args.set_status, args.migrate, args.target_host) host = HostMaintenanceResource(HostMaintenanceManager, hv.hypervisor_maintenance) utils.print_list( [host], ['hypervisor_hostname', 'status', 'migrate', 'target-host'])
def do_flavor_list(cs, args): """Print a list of available 'flavors' (sizes of servers).""" flavors = cs.flavors.list() _translate_flavor_keys(flavors) utils.print_list(flavors, [ 'ID', 'Name', 'Memory_MB', 'Swap', 'Local_GB', 'VCPUs', 'RXTX_Factor' ])
def _print_baremetal_nodes_list(nodes): """Print the list of baremetal nodes.""" def _parse_address(fields): macs = [] for interface in fields.interfaces: macs.append(interface['address']) return ', '.join("%s" % i for i in macs) formatters = {'MAC Address': _parse_address} _translate_baremetal_node_keys(nodes) utils.print_list(nodes, [ 'ID', 'Host', 'Task State', 'CPUs', 'Memory_MB', 'Disk_GB', 'MAC Address', 'PM Address', 'PM Username', 'PM Password', 'Terminal Port', ], formatters=formatters)
def _print_baremetal_nodes_list(nodes): """Print the list of baremetal nodes.""" def _parse_address(fields): macs = [] for interface in fields.interfaces: macs.append(interface['address']) return ', '.join("%s" % i for i in macs) formatters = { 'MAC Address': _parse_address } _translate_baremetal_node_keys(nodes) utils.print_list(nodes, [ 'ID', 'Host', 'Task State', 'CPUs', 'Memory_MB', 'Disk_GB', 'MAC Address', 'PM Address', 'PM Username', 'PM Password', 'Terminal Port', ], formatters=formatters)
def do_virtual_interface_list(cs, args): """ Lists the virtual interfaces for an instance """ vifs = cs.os_virtual_interfacesv2_python_novaclient_ext.list( args.instance_id) utils.print_list(vifs, ["id", "mac_address", "ip_addresses"], formatters={"ip_addresses": ip_address_formatter})
def _print_baremetal_node_interfaces(interfaces): """Print interfaces of a baremetal node.""" utils.print_list(interfaces, [ 'ID', 'Datapath_ID', 'Port_No', 'Address', ])
def do_ipgroup_list(cs, args): """Show IP groups.""" def pretty_server_list(ipgroup): return ", ".join(cs.servers.get(id).name for id in ipgroup.servers) utils.print_list(cs.ipgroups.list(), fields=['ID', 'Name', 'Server List'], formatters={'Server List': pretty_server_list})
def _show_maintenance_status(cs, host): hv = cs.host_maintenance.get(host) host = HostMaintenanceResource(HostMaintenanceManager, hv.hypervisor_maintenance) utils.print_list([host], [ 'hypervisor_hostname', 'maintenance_status', 'maintenance_migration_action' ])
def _print_flavor_list(flavors): _translate_flavor_keys(flavors) utils.print_list(flavors, [ 'ID', 'Name', 'Memory_MB', 'Swap', 'Local_GB', 'VCPUs', 'RXTX_Factor'])
def do_instance_action_list(cs, args): """List actions on a server.""" if cs.api_version < api_versions.APIVersion("2.21"): server = shell._find_server(cs, args.server) else: server = shell._find_server(cs, args.server, raise_if_notfound=False) actions = cs.instance_action.list(server) utils.print_list(actions, ['Action', 'Request_ID', 'Message', 'Start_Time'], sortby_index=3)
def test_print_unicode_list(self): objs = [_FakeResult("k", '\u2026')] utils.print_list(objs, ["Name", "Value"]) s = '\u2026' self.assertEqual('+------+-------+\n' '| Name | Value |\n' '+------+-------+\n' '| k | %s |\n' '+------+-------+\n' % s, sys.stdout.getvalue())
def do_host_evacuate(cs, args): """Evacuate all instances from failed host.""" hypervisors = cs.hypervisors.search(args.host, servers=True) response = [] for hyper in hypervisors: if hasattr(hyper, "servers"): for server in hyper.servers: response.append(_server_evacuate(cs, server, args)) utils.print_list(response, ["Server UUID", "Evacuate Accepted", "Error Message"])
def do_image_list(cs, args): """Print a list of available images to boot from.""" server_list = {} for server in cs.servers.list(): server_list[server.id] = server.name image_list = cs.images.list() for i in range(len(image_list)): if hasattr(image_list[i], 'serverId'): image_list[i].serverId = server_list[image_list[i].serverId] + \ ' (' + str(image_list[i].serverId) + ')' utils.print_list(cs.images.list(), ['ID', 'Name', 'serverId', 'Status'])
def do_canary_query(cs, args): """ Query a Canary host for monitoring stats. """ kwargs = \ { "from_time" : args.from_time, "to_time" : args.to_time, "cf" : args.cf, "resolution" : args.resolution } utils.print_list(cs.canary.query(args.host, args.metric, **kwargs), ["timestamp", "cf", "value"])
def do_get_vnc_console(cs, args): """Get a vnc console to a server.""" server = _find_server(cs, args.server) data = server.get_vnc_console(args.console_type) class VNCConsole: def __init__(self, console_dict): self.type = console_dict['type'] self.url = console_dict['url'] utils.print_list([VNCConsole(data['console'])], ['Type', 'Url'])
def do_host_servers_migrate(cs, args): """Migrate all instances of the specified host to other available hosts.""" hypervisors = cs.hypervisors.search(args.host, servers=True) response = [] for hyper in hypervisors: if hasattr(hyper, 'servers'): for server in hyper.servers: response.append(_server_migrate(cs, server)) utils.print_list(response, ["Server UUID", "Migration Accepted", "Error Message"])
def do_volume_list(cs, args): """List all the volumes.""" volumes = cs.volumes.list() _translate_volume_keys(volumes) # Create a list of servers to which the volume is attached for vol in volumes: servers = [server.get('serverId') for server in vol.attachments] setattr(vol, 'attached_to', ','.join(map(str, servers))) utils.print_list(volumes, ['ID', 'Status', 'Display Name', 'Size', 'Attached to'])
def do_host_evacuate_live(cs, args): """Live migrate all instances of the specified host to other available hosts. """ hypervisors = cs.hypervisors.search(args.host, servers=True) response = [] for hyper in hypervisors: for server in getattr(hyper, "servers", []): response.append(_server_live_migrate(cs, server, args)) utils.print_list(response, ["Server UUID", "Live Migration Accepted", "Error Message"])
def do_host_evacuate(cs, args): """Evacuate all instances from failed host.""" hypervisors = cs.hypervisors.search(args.host, servers=True) response = [] for hyper in hypervisors: if hasattr(hyper, 'servers'): for server in hyper.servers: response.append(_server_evacuate(cs, server, args)) utils.print_list(response, ["Server UUID", "Evacuate Accepted", "Error Message"])
def _dump_timings(self, timings): class Tyme(object): def __init__(self, url, seconds): self.url = url self.seconds = seconds results = [Tyme(url, end - start) for url, start, end in timings] total = 0.0 for tyme in results: total += tyme.seconds results.append(Tyme("Total", total)) utils.print_list(results, ["url", "seconds"], sortby_index=None)
def do_image_list(cs, args): """Print a list of available images to boot from.""" server_list = {} for server in cs.servers.list(): server_list[server.id] = server.name image_list = cs.images.list() for i in range(len(image_list)): if hasattr(image_list[i], 'serverId'): image_list[i].serverId = server_list[image_list[i].serverId] + \ ' (' + str(image_list[i].serverId) + ')' utils.print_list(image_list, ['ID', 'Name', 'serverId', 'Status'])
def do_host_evacuate_live(cs, args): """Live migrate all instances of the specified host to other available hosts. """ hypervisors = cs.hypervisors.search(args.host, servers=True) response = [] for hyper in hypervisors: for server in getattr(hyper, 'servers', []): response.append(_server_live_migrate(cs, server, args)) utils.print_list( response, ["Server UUID", "Live Migration Accepted", "Error Message"])
def do_image_list(cs, args): """Print a list of available images to boot from.""" image_list = cs.images.list() def parse_server_name(image): try: return image.server['id'] except (AttributeError, KeyError): return '' fmts = {'Server': parse_server_name} utils.print_list(image_list, ['ID', 'Name', 'Status', 'Server'], fmts)
def _print_backup_list(backups): class Backup: def __init__(self, id, ts, schedules): self.id = id self.timestamp = ts self.schedules = schedules columns = ['ID', 'Timestamp', 'Schedules'] objs = map(lambda b: \ Backup(b['uuid'], b['veta_backup_at'], b['veta_backup_ids']), backups) utils.print_list(objs, columns, sortby_index=1)
def do_flavor_list(cs, args): """Print a list of available 'flavors' (sizes of servers).""" flavors = cs.flavors.list() _translate_flavor_keys(flavors) utils.print_list(flavors, [ 'ID', 'Name', 'Memory_MB', 'Swap', 'Local_GB', 'VCPUs', 'RXTX_Factor'])
def test_print_unicode_list(self): objs = [_FakeResult("k", u'\u2026')] utils.print_list(objs, ["Name", "Value"]) if six.PY3: s = u'\u2026' else: s = encodeutils.safe_encode(u'\u2026') self.assertEqual('+------+-------+\n' '| Name | Value |\n' '+------+-------+\n' '| k | %s |\n' '+------+-------+\n' % s, sys.stdout.getvalue())
def _print_migrations(migrations): fields = ['Source Node', 'Dest Node', 'Source Compute', 'Dest Compute', 'Dest Host', 'Status', 'Instance UUID', 'Old Flavor', 'New Flavor', 'Created At', 'Updated At'] def old_flavor(migration): return migration.old_instance_type_id def new_flavor(migration): return migration.new_instance_type_id formatters = {'Old Flavor': old_flavor, 'New Flavor': new_flavor} utils.print_list(migrations, fields, formatters)
def test_print_list_sort_by_none(self): objs = [_FakeResult("k1", 1), _FakeResult("k3", 3), _FakeResult("k2", 2)] utils.print_list(objs, ["Name", "Value"], sortby_index=None) self.assertEqual('+------+-------+\n' '| Name | Value |\n' '+------+-------+\n' '| k1 | 1 |\n' '| k3 | 3 |\n' '| k2 | 2 |\n' '+------+-------+\n', sys.stdout.getvalue())
def _print_baremetal_nodes_list(nodes): """Print the list of baremetal nodes.""" _translate_baremetal_node_keys(nodes) utils.print_list(nodes, [ 'ID', 'Host', 'CPUs', 'Memory_MB', 'Disk_GB', 'MAC Address', 'PM Address', 'PM Username', 'PM Password', 'Terminal Port', ])
def test_print_list_sort_by_integer(self): objs = [_FakeResult("k1", 1), _FakeResult("k3", 2), _FakeResult("k2", 3)] utils.print_list(objs, ["Name", "Value"], sortby_index=1) self.assertEqual( sys.stdout.getvalue(), "+------+-------+\n" "| Name | Value |\n" "+------+-------+\n" "| k1 | 1 |\n" "| k3 | 2 |\n" "| k2 | 3 |\n" "+------+-------+\n", )
def _print_secgroup_rules(rules): class FormattedRule: def __init__(self, obj): items = (obj if isinstance(obj, dict) else obj._info).items() for k, v in items: if k == 'ip_range': v = v.get('cidr') elif k == 'group': k = 'source_group' v = v.get('name') if v == None: v = '' setattr(self, k, v) rules = [FormattedRule(rule) for rule in rules] utils.print_list( rules, ['IP Protocol', 'From Port', 'To Port', 'IP Range', 'Source Group'])
def do_list(cs, args): """List active servers.""" recurse_zones = args.recurse_zones search_opts = { 'reservation_id': args.reservation_id, 'fixed_ip': args.fixed_ip, 'recurse_zones': recurse_zones, 'ip': args.ip, 'ip6': args.ip6, 'name': args.name, 'image': args.image, 'flavor': args.flavor, 'status': args.status, 'host': args.host, 'instance_name': args.instance_name } if recurse_zones: to_print = ['UUID', 'Name', 'Status', 'Public IP', 'Private IP'] else: to_print = ['ID', 'Name', 'Status', 'Public IP', 'Private IP'] utils.print_list(cs.servers.list(search_opts=search_opts), to_print)
def _print_migrations(cs, migrations): fields = ['Source Node', 'Dest Node', 'Source Compute', 'Dest Compute', 'Dest Host', 'Status', 'Instance UUID', 'Old Flavor', 'New Flavor', 'Created At', 'Updated At'] def old_flavor(migration): return migration.old_instance_type_id def new_flavor(migration): return migration.new_instance_type_id def migration_type(migration): return migration.migration_type formatters = {'Old Flavor': old_flavor, 'New Flavor': new_flavor} if cs.api_version >= api_versions.APIVersion("2.23"): fields.insert(0, "Id") fields.append("Type") formatters.update({"Type": migration_type}) utils.print_list(migrations, fields, formatters)