fixed tap id for each NIC, add more logging when VM is declared killed
This commit is contained in:
		
					parent
					
						
							
								66b7cf525f
							
						
					
				
			
			
				commit
				
					
						bbe09667a6
					
				
			
		
					 3 changed files with 21 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -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"),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue