From f2e03919d72ed37bd0654a178df813c36da8289b Mon Sep 17 00:00:00 2001 From: forest Date: Thu, 9 Dec 2021 12:40:30 -0600 Subject: [PATCH] trying to improve error handling inside get_all_by_host_and_network --- capsulflask/shell_scripts/virsh-list.sh | 10 +++++--- capsulflask/shell_scripts/virsh-net-list.sh | 10 +++++--- capsulflask/spoke_model.py | 28 ++++++++++++++++----- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/capsulflask/shell_scripts/virsh-list.sh b/capsulflask/shell_scripts/virsh-list.sh index 9e48fa0..4beb3c0 100755 --- a/capsulflask/shell_scripts/virsh-list.sh +++ b/capsulflask/shell_scripts/virsh-list.sh @@ -3,9 +3,11 @@ printf '[' delimiter="" virsh list --all | tail -n +3 | while read -r line; do - capsul_id="$(echo "$line" | awk '{ print $2 }')" - capsul_state="$(echo "$line" | sed -E 's/^ *[0-9-]+ +[^ ]+ +//')" - printf '%s\n {"id":"%s", "state":"%s"}' "$delimiter" "$capsul_id" "$capsul_state" - delimiter="," + if [ "$line" != "" ]; then + capsul_id="$(echo "$line" | awk '{ print $2 }')" + capsul_state="$(echo "$line" | sed -E 's/^ *[0-9-]+ +[^ ]+ +//')" + printf '%s\n {"id":"%s", "state":"%s"}' "$delimiter" "$capsul_id" "$capsul_state" + delimiter="," + fi done printf '\n]\n' diff --git a/capsulflask/shell_scripts/virsh-net-list.sh b/capsulflask/shell_scripts/virsh-net-list.sh index e7c4e79..2dfeabf 100755 --- a/capsulflask/shell_scripts/virsh-net-list.sh +++ b/capsulflask/shell_scripts/virsh-net-list.sh @@ -4,10 +4,12 @@ printf '[' delimiter="" virsh net-list --all | tail -n +3 | awk '{ print $1 }' | while read -r network_name; do - virtual_bridge_name="$(virsh net-info "$network_name" | grep -E '^Bridge:' | awk '{ print $2 }')" - capsul_state="$(echo "$line" | sed -E 's/^ *[0-9-]+ +[^ ]+ +//')" - printf '%s\n {"name":"%s", "virtual_bridge_name":"%s"}' "$delimiter" "$network_name" "$virtual_bridge_name" - delimiter="," + if [ "$line" != "" ]; then + virtual_bridge_name="$(virsh net-info "$network_name" | grep -E '^Bridge:' | awk '{ print $2 }')" + capsul_state="$(echo "$line" | sed -E 's/^ *[0-9-]+ +[^ ]+ +//')" + printf '%s\n {"name":"%s", "virtual_bridge_name":"%s"}' "$delimiter" "$network_name" "$virtual_bridge_name" + delimiter="," + fi done printf '\n]\n' diff --git a/capsulflask/spoke_model.py b/capsulflask/spoke_model.py index 5b13030..8c896b9 100644 --- a/capsulflask/spoke_model.py +++ b/capsulflask/spoke_model.py @@ -139,7 +139,9 @@ class ShellScriptSpoke(VirtualizationInterface): vm_list_process = run([join(current_app.root_path, 'shell_scripts/virsh-list.sh')], capture_output=True) self.validate_completed_process(vm_list_process) - list_of_vms = json.loads(vm_list_process.stdout.decode("utf-8")) + vms_json_string = vm_list_process.stdout.decode("utf-8") + current_app.logger.info(f"vms_json_string: {vms_json_string}") + list_of_vms = json.loads(vms_json_string) current_app.logger.info(f"list_of_vms: {json.dumps(list_of_vms)}") @@ -149,7 +151,9 @@ class ShellScriptSpoke(VirtualizationInterface): net_list_process = run([join(current_app.root_path, 'shell_scripts/virsh-net-list.sh')], capture_output=True) self.validate_completed_process(net_list_process) - list_of_networks = json.loads(net_list_process.stdout.decode("utf-8")) + net_list_json_string = net_list_process.stdout.decode("utf-8") + current_app.logger.info(f"net_list_json_string: {net_list_json_string}") + list_of_networks = json.loads(net_list_json_string) current_app.logger.info(f"list_of_networks: {json.dumps(list_of_networks)}") @@ -158,8 +162,14 @@ class ShellScriptSpoke(VirtualizationInterface): vm_id_by_mac = dict() for network in list_of_networks: - with open(f"{current_app.config['LIBVIRT_DNSMASQ_PATH']}/{network['virtual_bridge_name']}.macs", mode='r') as macs_json_file: - vms_with_macs = json.load(macs_json_file) + macs_json_filename = f"{current_app.config['LIBVIRT_DNSMASQ_PATH']}/{network['virtual_bridge_name']}.macs" + with open(macs_json_filename, mode='r') as macs_json_file: + vms_with_macs = [] + try: + vms_with_macs = json.load(macs_json_file) + except: + raise Exception(f"failed to parse the JSON file '{macs_json_filename}'") + for vm in vms_with_macs: for mac in vm['macs']: if mac not in vm_id_by_mac: @@ -178,8 +188,14 @@ class ShellScriptSpoke(VirtualizationInterface): vms_by_id[vm['domain']]['macs'][mac] = True - with open(f"{current_app.config['LIBVIRT_DNSMASQ_PATH']}/{network['virtual_bridge_name']}.status", mode='r') as status_json_file: - statuses = json.load(status_json_file) + status_json_filename = f"{current_app.config['LIBVIRT_DNSMASQ_PATH']}/{network['virtual_bridge_name']}.status" + with open(status_json_filename, mode='r') as status_json_file: + statuses = [] + try: + statuses = json.load(status_json_file) + except: + raise Exception(f"failed to parse the JSON file '{status_json_filename}'") + for status in statuses: if status['mac-address'] in vm_id_by_mac: vm_id = vm_id_by_mac[status['mac-address']]