diff --git a/client-cli/cli_lib/ceph.py b/client-cli/cli_lib/ceph.py index 86974cf1..b30d676c 100644 --- a/client-cli/cli_lib/ceph.py +++ b/client-cli/cli_lib/ceph.py @@ -159,9 +159,12 @@ def ceph_util(config): return False, response.json()['message'] def format_raw_output(status_data): - click.echo('{bold}Ceph cluster {stype} (primary node {end}{blue}{primary}{end}{bold}){end}\n'.format(bold=ansiprint.bold(), end=ansiprint.end(), blue=ansiprint.blue(), stype=status_data['type'], primary=status_data['primary_node'])) - click.echo(status_data['ceph_data']) - click.echo('') + ainformation = list() + ainformation.append('{bold}Ceph cluster {stype} (primary node {end}{blue}{primary}{end}{bold}){end}\n'.format(bold=ansiprint.bold(), end=ansiprint.end(), blue=ansiprint.blue(), stype=status_data['type'], primary=status_data['primary_node'])) + ainformation.append(status_data['ceph_data']) + ainformation.append('') + + return '\n'.join(ainformation) # # OSD functions @@ -589,7 +592,7 @@ Wr: {osd_wrops: <{osd_wrops_length}} \ ) ) - click.echo('\n'.join(sorted(osd_list_output))) + return '\n'.join(sorted(osd_list_output)) # @@ -900,7 +903,7 @@ Wr: {pool_write_ops: <{pool_write_ops_length}} \ ) ) - click.echo('\n'.join(sorted(pool_list_output))) + return '\n'.join(sorted(pool_list_output)) # # Volume functions @@ -1186,7 +1189,7 @@ def format_list_volume(volume_list): ) ) - click.echo('\n'.join(sorted(volume_list_output))) + return '\n'.join(sorted(volume_list_output)) # @@ -1404,4 +1407,4 @@ def format_list_snapshot(snapshot_list): ) ) - click.echo('\n'.join(sorted(snapshot_list_output))) + return '\n'.join(sorted(snapshot_list_output)) diff --git a/client-cli/cli_lib/cluster.py b/client-cli/cli_lib/cluster.py index 0810982b..25bb852f 100644 --- a/client-cli/cli_lib/cluster.py +++ b/client-cli/cli_lib/cluster.py @@ -156,8 +156,5 @@ def format_info(cluster_information, oformat): ainformation.append('') ainformation.append(osds_string) - information = '\n'.join(ainformation) - click.echo(information) - - click.echo('') - + ainformation.append('') + return '\n'.join(ainformation) diff --git a/client-cli/cli_lib/network.py b/client-cli/cli_lib/network.py index 1a5dc3c0..f9a15f7e 100644 --- a/client-cli/cli_lib/network.py +++ b/client-cli/cli_lib/network.py @@ -483,8 +483,7 @@ def getOutputColours(network_information): def format_info(config, network_information, long_output): if not network_information: - click.echo("No network found") - return + return "No network found" v6_flag_colour, v4_flag_colour, dhcp6_flag_colour, dhcp4_flag_colour = getOutputColours(network_information) @@ -513,30 +512,36 @@ def format_info(config, network_information, long_output): ainformation.append('{}DHCPv4 range:{} {} - {}'.format(ansiprint.purple(), ansiprint.end(), network_information['ip4']['dhcp_start'], network_information['ip4']['dhcp_end'])) if long_output: - dhcp4_reservations_list = getNetworkDHCPReservations(zk_conn, vni) + retcode, dhcp4_reservations_list = net_dhcp_list(config, network_information['vni'], None) if dhcp4_reservations_list: ainformation.append('') ainformation.append('{}Client DHCPv4 reservations:{}'.format(ansiprint.bold(), ansiprint.end())) ainformation.append('') - # Only show static reservations in the detailed information - dhcp4_reservations_string = formatDHCPLeaseList(zk_conn, vni, dhcp4_reservations_list, reservations=True) - for line in dhcp4_reservations_string.split('\n'): - ainformation.append(line) + if retcode: + dhcp4_reservations_string = format_list_dhcp(dhcp4_reservations_list) + for line in dhcp4_reservations_string.split('\n'): + ainformation.append(line) + else: + ainformation.append("No leases found") - firewall_rules = zkhandler.listchildren(zk_conn, '/networks/{}/firewall_rules'.format(vni)) - if firewall_rules: + retcode, firewall_rules_list = net_acl_list(config, network_information['vni'], None, None) + if firewall_rules_list: ainformation.append('') ainformation.append('{}Network firewall rules:{}'.format(ansiprint.bold(), ansiprint.end())) ainformation.append('') - formatted_firewall_rules = get_list_firewall_rules(zk_conn, vni) + if retcode: + firewall_rules_string = format_list_acl(firewall_rules_list) + for line in firewall_rules_string.split('\n'): + ainformation.append(line) + else: + ainformation.append("No ACLs found") # Join it all together - click.echo('\n'.join(ainformation)) + return '\n'.join(ainformation) def format_list(config, network_list): if not network_list: - click.echo("No network found") - return + return "No network found" # Handle single-element lists if not isinstance(network_list, list): @@ -653,7 +658,7 @@ def format_list(config, network_list): ) ) - click.echo('\n'.join(sorted(network_list_output))) + return '\n'.join(sorted(network_list_output)) def format_list_dhcp(dhcp_lease_list): dhcp_lease_list_output = [] @@ -665,15 +670,15 @@ def format_list_dhcp(dhcp_lease_list): lease_timestamp_length = 13 for dhcp_lease_information in dhcp_lease_list: # hostname column - _lease_hostname_length = len(dhcp_lease_information['hostname']) + 1 + _lease_hostname_length = len(str(dhcp_lease_information['hostname'])) + 1 if _lease_hostname_length > lease_hostname_length: lease_hostname_length = _lease_hostname_length # ip4_address column - _lease_ip4_address_length = len(dhcp_lease_information['ip4_address']) + 1 + _lease_ip4_address_length = len(str(dhcp_lease_information['ip4_address'])) + 1 if _lease_ip4_address_length > lease_ip4_address_length: lease_ip4_address_length = _lease_ip4_address_length # mac_address column - _lease_mac_address_length = len(dhcp_lease_information['mac_address']) + 1 + _lease_mac_address_length = len(str(dhcp_lease_information['mac_address'])) + 1 if _lease_mac_address_length > lease_mac_address_length: lease_mac_address_length = _lease_mac_address_length @@ -710,14 +715,14 @@ def format_list_dhcp(dhcp_lease_list): lease_ip4_address_length=lease_ip4_address_length, lease_mac_address_length=lease_mac_address_length, lease_timestamp_length=12, - lease_hostname=dhcp_lease_information['hostname'], - lease_ip4_address=dhcp_lease_information['ip4_address'], - lease_mac_address=dhcp_lease_information['mac_address'], - lease_timestamp=dhcp_lease_information['timestamp'] + lease_hostname=str(dhcp_lease_information['hostname']), + lease_ip4_address=str(dhcp_lease_information['ip4_address']), + lease_mac_address=str(dhcp_lease_information['mac_address']), + lease_timestamp=str(dhcp_lease_information['timestamp']) ) ) - click.echo('\n'.join(sorted(dhcp_lease_list_output))) + return '\n'.join(sorted(dhcp_lease_list_output)) def format_list_acl(acl_list): # Handle when we get an empty entry @@ -788,4 +793,4 @@ def format_list_acl(acl_list): ) ) - click.echo('\n'.join(sorted(acl_list_output))) + return '\n'.join(sorted(acl_list_output)) diff --git a/client-cli/cli_lib/node.py b/client-cli/cli_lib/node.py index 1e890cbc..5304bc6b 100644 --- a/client-cli/cli_lib/node.py +++ b/client-cli/cli_lib/node.py @@ -208,10 +208,8 @@ def format_info(node_information, long_output): ainformation.append('{}Allocated RAM (MiB):{} {}'.format(ansiprint.purple(), ansiprint.end(), node_information['memory']['allocated'])) # Join it all together - information = '\n'.join(ainformation) - click.echo(information) - - click.echo('') + ainformation.append('') + return '\n'.join(ainformation) def format_list(node_list): # Handle single-element lists @@ -354,4 +352,4 @@ Mem (M): {node_mem_total: <{mem_total_length}} {node_mem_used: <{mem_used_length ) ) - click.echo('\n'.join(sorted(node_list_output))) + return '\n'.join(sorted(node_list_output)) diff --git a/client-cli/cli_lib/provisioner.py b/client-cli/cli_lib/provisioner.py index 7e91c035..30251178 100644 --- a/client-cli/cli_lib/provisioner.py +++ b/client-cli/cli_lib/provisioner.py @@ -673,6 +673,7 @@ def format_list_template(template_data, template_type=None): """ template_types = [ 'system', 'network', 'storage' ] normalized_template_data = dict() + ainformation = list() if template_type in template_types: template_types = [ template_type ] @@ -682,23 +683,25 @@ def format_list_template(template_data, template_type=None): normalized_template_data = template_data if 'system' in template_types: - click.echo('System templates:') - click.echo() - format_list_template_system(normalized_template_data['system_templates']) + ainformation.append('System templates:') + ainformation.append('') + ainformation.append(format_list_template_system(normalized_template_data['system_templates'])) if len(template_types) > 1: - click.echo() + ainformation.append('') if 'network' in template_types: - click.echo('Network templates:') - click.echo() - format_list_template_network(normalized_template_data['network_templates']) + ainformation.append('Network templates:') + ainformation.append('') + ainformation.append(format_list_template_network(normalized_template_data['network_templates'])) if len(template_types) > 1: - click.echo() + ainformation.append('') if 'storage' in template_types: - click.echo('Storage templates:') - click.echo() - format_list_template_storage(normalized_template_data['storage_templates']) + ainformation.append('Storage templates:') + ainformation.append('') + ainformation.append(format_list_template_storage(normalized_template_data['storage_templates'])) + + return '\n'.join(ainformation) def format_list_template_system(template_data): if isinstance(template_data, dict): @@ -836,7 +839,7 @@ Metatemplate: {template_node_limit: <{template_node_limit_length}} \ ) ) - click.echo('\n'.join([template_list_output_header] + template_list_output)) + return '\n'.join([template_list_output_header] + template_list_output) return True, '' @@ -912,9 +915,7 @@ def format_list_template_network(template_template): ) ) - click.echo('\n'.join([template_list_output_header] + template_list_output)) - - return True, '' + return '\n'.join([template_list_output_header] + template_list_output) def format_list_template_storage(template_template): if isinstance(template_template, dict): @@ -1044,9 +1045,7 @@ def format_list_template_storage(template_template): ) ) - click.echo('\n'.join([template_list_output_header] + template_list_output)) - - return True, '' + return '\n'.join([template_list_output_header] + template_list_output) def format_list_userdata(userdata_data, lines=None): if isinstance(userdata_data, dict): @@ -1121,9 +1120,7 @@ def format_list_userdata(userdata_data, lines=None): ) ) - click.echo('\n'.join([userdata_list_output_header] + userdata_list_output)) - - return True, '' + return '\n'.join([userdata_list_output_header] + userdata_list_output) def format_list_script(script_data, lines=None): if isinstance(script_data, dict): @@ -1198,9 +1195,7 @@ def format_list_script(script_data, lines=None): ) ) - click.echo('\n'.join([script_list_output_header] + script_list_output)) - - return True, '' + return '\n'.join([script_list_output_header] + script_list_output) def format_list_profile(profile_data): if isinstance(profile_data, dict): @@ -1305,7 +1300,4 @@ Data: {profile_userdata: <{profile_userdata_length}} \ ) ) - click.echo('\n'.join([profile_list_output_header] + profile_list_output)) - - return True, '' - + return '\n'.join([profile_list_output_header] + profile_list_output) diff --git a/client-cli/cli_lib/vm.py b/client-cli/cli_lib/vm.py index d884aadc..5f4994f5 100644 --- a/client-cli/cli_lib/vm.py +++ b/client-cli/cli_lib/vm.py @@ -361,8 +361,10 @@ def view_console_log(config, vm, lines=100): pager = subprocess.Popen(['less', '-R'], stdin=subprocess.PIPE) pager.communicate(input=loglines.encode('utf8')) except FileNotFoundError: - click.echo("Error: `less` pager not found, dumping log ({} lines) to stdout".format(lines)) - return True, loglines + ainformation = list() + ainformation.append("Error: `less` pager not found, dumping log ({} lines) to stdout".format(lines)) + ainformation.append(loglines) + return False, '\n'.join(ainformation) return True, '' @@ -556,10 +558,8 @@ def format_info(config, domain_information, long_output): ainformation.append(' {0: <3} {1: <14} {2: <8}'.format(domain_information['controllers'].index(controller), controller['type'], controller['model'])) # Join it all together - information = '\n'.join(ainformation) - click.echo(information) - - click.echo('') + ainformation.append('') + return '\n'.join(ainformation) def format_list(config, vm_list, raw): # Handle single-element lists @@ -582,9 +582,10 @@ def format_list(config, vm_list, raw): # Handle raw mode since it just lists the names if raw: + ainformation = list() for vm in sorted(item['name'] for item in vm_list): - click.echo(vm) - return True, '' + ainformation.append(vm) + return '\n'.join(ainformation) vm_list_output = [] @@ -717,6 +718,4 @@ def format_list(config, vm_list, raw): ) ) - click.echo('\n'.join(sorted(vm_list_output))) - - return True, '' + return '\n'.join(sorted(vm_list_output)) diff --git a/client-cli/pvc.py b/client-cli/pvc.py index c07a3dc1..7f24d14d 100755 --- a/client-cli/pvc.py +++ b/client-cli/pvc.py @@ -405,8 +405,7 @@ def node_info(node, long_output): retcode, retdata = pvc_node.node_info(config, node) if retcode: - pvc_node.format_info(retdata, long_output) - retdata = '' + retdata = pvc_node.format_info(retdata, long_output) cleanup(retcode, retdata) ############################################################################### @@ -423,8 +422,7 @@ def node_list(limit): retcode, retdata = pvc_node.node_list(config, limit) if retcode: - pvc_node.format_list(retdata) - retdata = '' + retdata = pvc_node.format_list(retdata) cleanup(retcode, retdata) ############################################################################### @@ -826,8 +824,7 @@ def vm_info(domain, long_output): retcode, retdata = pvc_vm.vm_info(config, domain) if retcode: - pvc_vm.format_info(config, retdata, long_output) - retdata = '' + retdata = pvc_vm.format_info(config, retdata, long_output) cleanup(retcode, retdata) ############################################################################### @@ -880,8 +877,7 @@ def vm_list(target_node, target_state, limit, raw): retcode, retdata = pvc_vm.vm_list(config, limit, target_node, target_state) if retcode: - pvc_vm.format_list(config, retdata, raw) - retdata = '' + retdata = pvc_vm.format_list(config, retdata, raw) cleanup(retcode, retdata) ############################################################################### @@ -1089,8 +1085,7 @@ def net_info(vni, long_output): retcode, retdata = pvc_network.net_info(config, vni) if retcode: - pvc_network.format_info(config, retdata, long_output) - retdata = '' + retdata = pvc_network.format_info(config, retdata, long_output) cleanup(retcode, retdata) ############################################################################### @@ -1107,8 +1102,7 @@ def net_list(limit): retcode, retdata = pvc_network.net_list(config, limit) if retcode: - pvc_network.format_list(config, retdata) - retdata = '' + retdata = pvc_network.format_list(config, retdata) cleanup(retcode, retdata) ############################################################################### @@ -1186,8 +1180,7 @@ def net_dhcp_list(net, limit, only_static): retcode, retdata = pvc_network.net_dhcp_list(config, net, limit, only_static) if retcode: - pvc_network.format_list_dhcp(retdata) - retdata = '' + retdata = pvc_network.format_list_dhcp(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1300,8 +1293,7 @@ def net_acl_list(net, limit, direction): retcode, retdata = pvc_network.net_acl_list(config, net, limit, direction) if retcode: - pvc_network.format_list_acl(retdata) - retdata = '' + retdata = pvc_network.format_list_acl(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1346,8 +1338,7 @@ def ceph_status(): retcode, retdata = pvc_ceph.ceph_status(config) if retcode: - pvc_ceph.format_raw_output(retdata) - retdata = '' + retdata = pvc_ceph.format_raw_output(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1361,8 +1352,7 @@ def ceph_util(): retcode, retdata = pvc_ceph.ceph_util(config) if retcode: - pvc_ceph.format_raw_output(retdata) - retdata = '' + retdata = pvc_ceph.format_raw_output(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1519,8 +1509,7 @@ def ceph_osd_list(limit): retcode, retdata = pvc_ceph.ceph_osd_list(config, limit) if retcode: - pvc_ceph.format_list_osd(retdata) - retdata = '' + retdata = pvc_ceph.format_list_osd(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1604,8 +1593,7 @@ def ceph_pool_list(limit): retcode, retdata = pvc_ceph.ceph_pool_list(config, limit) if retcode: - pvc_ceph.format_list_pool(retdata) - retdata = '' + retdata = pvc_ceph.format_list_pool(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1749,8 +1737,7 @@ def ceph_volume_list(limit, pool): retcode, retdata = pvc_ceph.ceph_volume_list(config, limit, pool) if retcode: - pvc_ceph.format_list_volume(retdata) - retdata = '' + retdata = pvc_ceph.format_list_volume(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1865,8 +1852,7 @@ def ceph_volume_snapshot_list(pool, volume, limit): retcode, retdata = pvc_ceph.ceph_snapshot_list(config, limit, volume, pool) if retcode: - pvc_ceph.format_list_snapshot(retdata) - retdata = '' + retdata = pvc_ceph.format_list_snapshot(retdata) cleanup(retcode, retdata) @@ -1908,8 +1894,7 @@ def provisioner_template_list(limit): """ retcode, retdata = pvc_provisioner.template_list(config, limit) if retcode: - pvc_provisioner.format_list_template(retdata) - retdata = '' + retdata = pvc_provisioner.format_list_template(retdata) cleanup(retcode, retdata) ############################################################################### @@ -1937,8 +1922,7 @@ def provisioner_template_system_list(limit): """ retcode, retdata = pvc_provisioner.template_list(config, limit, template_type='system') if retcode: - pvc_provisioner.format_list_template(retdata, template_type='system') - retdata = '' + retdata = pvc_provisioner.format_list_template(retdata, template_type='system') cleanup(retcode, retdata) ############################################################################### @@ -2051,8 +2035,7 @@ def provisioner_template_network_list(limit): """ retcode, retdata = pvc_provisioner.template_list(config, limit, template_type='network') if retcode: - pvc_provisioner.format_list_template(retdata, template_type='network') - retdata = '' + retdata = pvc_provisioner.format_list_template(retdata, template_type='network') cleanup(retcode, retdata) ############################################################################### @@ -2194,8 +2177,7 @@ def provisioner_template_storage_list(limit): """ retcode, retdata = pvc_provisioner.template_list(config, limit, template_type='storage') if retcode: - pvc_provisioner.format_list_template(retdata, template_type='storage') - retdata = '' + retdata = pvc_provisioner.format_list_template(retdata, template_type='storage') cleanup(retcode, retdata) ############################################################################### @@ -2358,8 +2340,7 @@ def provisioner_userdata_list(limit, full): lines = 4 else: lines = None - pvc_provisioner.format_list_userdata(retdata, lines) - retdata = '' + retdata = pvc_provisioner.format_list_userdata(retdata, lines) cleanup(retcode, retdata) ############################################################################### @@ -2520,8 +2501,7 @@ def provisioner_script_list(limit, full): lines = 4 else: lines = None - pvc_provisioner.format_list_script(retdata, lines) - retdata = '' + retdata = pvc_provisioner.format_list_script(retdata, lines) cleanup(retcode, retdata) ############################################################################### @@ -2673,8 +2653,7 @@ def provisioner_profile_list(limit): """ retcode, retdata = pvc_provisioner.profile_list(config, limit) if retcode: - pvc_provisioner.format_list_profile(retdata) - retdata = '' + retdata = pvc_provisioner.format_list_profile(retdata) cleanup(retcode, retdata) ############################################################################### @@ -2873,8 +2852,7 @@ def status_cluster(oformat): retcode, retdata = pvc_cluster.get_info(config) if retcode: - pvc_cluster.format_info(retdata, oformat) - retdata = '' + retdata = pvc_cluster.format_info(retdata, oformat) cleanup(retcode, retdata) ###############################################################################