diff --git a/api/main.py b/api/main.py index 4b6d7bb..224ab2e 100644 --- a/api/main.py +++ b/api/main.py @@ -36,6 +36,8 @@ class CreateVM(Resource): "hdd": validator.specs["hdd"], } macs = [generate_mac() for i in range(len(data["network"]))] + tap_ids = [counters.increment_etcd_counter(etcd_client, "/v1/counter/tap") + for i in range(len(data["network"]))] vm_entry = { "name": data["vm_name"], "owner": data["name"], @@ -46,7 +48,7 @@ class CreateVM(Resource): "image_uuid": validator.image_uuid, "log": [], "vnc_socket": "", - "network": list(zip(data["network"], macs)), + "network": list(zip(data["network"], macs, tap_ids)), "metadata": {"ssh-keys": []}, } etcd_client.put(vm_key, vm_entry, value_in_json=True) @@ -73,8 +75,8 @@ class VmStatus(Resource): ) vm_value = vm.value.copy() vm_value["ip"] = [] - for network_and_mac in vm.network: - network_name, mac = network_and_mac + for network_mac_and_tap in vm.network: + network_name, mac, tap = network_mac_and_tap network = etcd_client.get( join_path( env_vars.get("NETWORK_PREFIX"), diff --git a/host/main.py b/host/main.py index c5c5887..9b12c30 100755 --- a/host/main.py +++ b/host/main.py @@ -63,6 +63,7 @@ def maintenance(host): # initiated by user inside VM. OR crash of VM by some # user running process if (_vm and not _vm.handle.is_running()) or not _vm: + logger.debug("_vm = %s, is_running() = %s" % (_vm, _vm.handle.is_running())) vm_entry.add_log("""{} is not running but is said to be running. So, shutting it down and declare it killed""".format(vm_entry.key)) vm_entry.declare_killed() diff --git a/host/virtualmachine.py b/host/virtualmachine.py index e9fb919..52bf7dc 100755 --- a/host/virtualmachine.py +++ b/host/virtualmachine.py @@ -11,9 +11,9 @@ import tempfile import time from functools import wraps -from os.path import join as join_path from string import Template from typing import Union +from os.path import join as join_path import bitmath import sshtunnel @@ -49,7 +49,7 @@ def create_dev(script, _id, dev, ip=None): return output.decode("utf-8").strip() -def create_vxlan_br_tap(_id, _dev, ip=None): +def create_vxlan_br_tap(_id, _dev, tap_id, ip=None): network_script_base = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'network') vxlan = create_dev(script=os.path.join(network_script_base, 'create-vxlan.sh'), _id=_id, dev=_dev) @@ -58,7 +58,7 @@ def create_vxlan_br_tap(_id, _dev, ip=None): _id=_id, dev=vxlan, ip=ip) if bridge: tap = create_dev(script=os.path.join(network_script_base, 'create-tap.sh'), - _id=str(random.randint(1, 100000)), dev=bridge) + _id=str(tap_id), dev=bridge) if tap: return tap @@ -108,6 +108,7 @@ def update_radvd_conf(etcd_client): except Exception: sp.check_output(['service', 'radvd', 'restart']) + def get_start_command_args(vm_entry, vnc_sock_filename: str, migration=False, migration_port=None): threads_per_core = 1 vm_memory = int(bitmath.parse_string_unsafe(vm_entry.specs["ram"]).to_MB()) @@ -129,8 +130,8 @@ def get_start_command_args(vm_entry, vnc_sock_filename: str, migration=False, mi command += " -incoming tcp:[::]:{}".format(migration_port) tap = None - for network_and_mac in vm_networks: - network_name, mac = network_and_mac + for network_mac_and_tap in vm_networks: + network_name, mac, tap = network_mac_and_tap _key = os.path.join(env_vars.get('NETWORK_PREFIX'), vm_entry.owner, network_name) network = etcd_client.get(_key, value_in_json=True) @@ -139,7 +140,10 @@ def get_start_command_args(vm_entry, vnc_sock_filename: str, migration=False, mi network_ipv6 = network.value["ipv6"] if network_type == "vxlan": - tap = create_vxlan_br_tap(network_id, env_vars.get("VXLAN_PHY_DEV"), network_ipv6) + tap = create_vxlan_br_tap(_id=network_id, + _dev=env_vars.get("VXLAN_PHY_DEV"), + tap_id=tap, + ip=network_ipv6) update_radvd_conf(etcd_client) command += " -netdev tap,id=vmnet{net_id},ifname={tap},script=no,downscript=no" \ @@ -237,11 +241,13 @@ def delete(vm_entry): logger.info("Deleting VM | %s", vm_entry) stop(vm_entry) - r_status = image_storage_handler.delete_vm_image(vm_entry.uuid) - if r_status: + if image_storage_handler.is_vm_image_exists(vm_entry.uuid): + r_status = image_storage_handler.delete_vm_image(vm_entry.uuid) + if r_status: + etcd_client.client.delete(vm_entry.key) + else: etcd_client.client.delete(vm_entry.key) - def transfer(request_event): # This function would run on source host i.e host on which the vm # is running initially. This host would be responsible for transferring