forked from uncloud/uncloud
		
	ucloud now logs to /etc/ucloud/log.txt, delete network interfaces on stopping of VMs
This commit is contained in:
		
					parent
					
						
							
								abc2c6fe51
							
						
					
				
			
			
				commit
				
					
						ad87982cf0
					
				
			
		
					 3 changed files with 51 additions and 1 deletions
				
			
		| 
						 | 
					@ -19,7 +19,7 @@ if __name__ == "__main__":
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    logging.basicConfig(
 | 
					    logging.basicConfig(
 | 
				
			||||||
        level=logging.DEBUG,
 | 
					        level=logging.DEBUG,
 | 
				
			||||||
        filename=join_path("logs.txt"),
 | 
					        filename=join_path("/", "etc", "ucloud", "log.txt"),
 | 
				
			||||||
        filemode="a",
 | 
					        filemode="a",
 | 
				
			||||||
        format="%(name)s %(asctime)s: %(levelname)s - %(message)s",
 | 
					        format="%(name)s %(asctime)s: %(levelname)s - %(message)s",
 | 
				
			||||||
        datefmt="%d-%b-%y %H:%M:%S",
 | 
					        datefmt="%d-%b-%y %H:%M:%S",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,6 +65,11 @@ class VmPool:
 | 
				
			||||||
            _vms = self.vms
 | 
					            _vms = self.vms
 | 
				
			||||||
        return list(filter(lambda x: x.status == status, _vms))
 | 
					        return list(filter(lambda x: x.status == status, _vms))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def by_owner(self, owner, _vms=None):
 | 
				
			||||||
 | 
					        if _vms is None:
 | 
				
			||||||
 | 
					            _vms = self.vms
 | 
				
			||||||
 | 
					        return list(filter(lambda x: x.owner == owner, _vms))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def except_status(self, status, _vms=None):
 | 
					    def except_status(self, status, _vms=None):
 | 
				
			||||||
        if _vms is None:
 | 
					        if _vms is None:
 | 
				
			||||||
            _vms = self.vms
 | 
					            _vms = self.vms
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,6 +38,50 @@ class VM:
 | 
				
			||||||
        return "VM({})".format(self.key)
 | 
					        return "VM({})".format(self.key)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def delete_network_interface(iface):
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        sp.check_output(['ip', 'link', 'del', iface])
 | 
				
			||||||
 | 
					    except Exception:
 | 
				
			||||||
 | 
					        pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def resolve_network(network_name, network_owner):
 | 
				
			||||||
 | 
					    network = etcd_client.get(join_path(env_vars.get("NETWORK_PREFIX"),
 | 
				
			||||||
 | 
					                                        network_owner,
 | 
				
			||||||
 | 
					                                        network_name),
 | 
				
			||||||
 | 
					                              value_in_json=True)
 | 
				
			||||||
 | 
					    return network
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def delete_vm_network(vm_entry):
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
 | 
					        for network in vm_entry.network:
 | 
				
			||||||
 | 
					            network_name = network[0]
 | 
				
			||||||
 | 
					            tap_mac = network[1]
 | 
				
			||||||
 | 
					            tap_id = network[2]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            delete_network_interface('tap{}'.format(tap_id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            owners_vms = vm_pool.by_owner(vm_entry.owner)
 | 
				
			||||||
 | 
					            owners_running_vms = vm_pool.by_status(VMStatus.running, 
 | 
				
			||||||
 | 
					                                                _vms=owners_vms)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            networks = map(lambda n: n[0],
 | 
				
			||||||
 | 
					                        map(lambda vm: vm.network, owners_running_vms)
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            networks_in_use_by_user_vms = [vm[0] for vm in networks]
 | 
				
			||||||
 | 
					            if network_name not in networks_in_use_by_user_vms:
 | 
				
			||||||
 | 
					                network_entry = resolve_network(network[0], vm_entry.owner)
 | 
				
			||||||
 | 
					                if network_entry:
 | 
				
			||||||
 | 
					                    network_type = network_entry.value["type"]
 | 
				
			||||||
 | 
					                    network_id = network_entry.value["id"]
 | 
				
			||||||
 | 
					                    if network_type == "vxlan":
 | 
				
			||||||
 | 
					                        delete_network_interface('br{}'.format(network_id))
 | 
				
			||||||
 | 
					                        delete_network_interface('vxlan{}'.format(network_id))
 | 
				
			||||||
 | 
					    except Exception:
 | 
				
			||||||
 | 
					        logger.exception("Exception in network interface deletion")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def create_dev(script, _id, dev, ip=None):
 | 
					def create_dev(script, _id, dev, ip=None):
 | 
				
			||||||
    command = [script, _id, dev]
 | 
					    command = [script, _id, dev]
 | 
				
			||||||
    if ip:
 | 
					    if ip:
 | 
				
			||||||
| 
						 | 
					@ -237,6 +281,7 @@ def stop(vm_entry):
 | 
				
			||||||
        vm_entry.declare_stopped()
 | 
					        vm_entry.declare_stopped()
 | 
				
			||||||
        vm_pool.put(vm_entry)
 | 
					        vm_pool.put(vm_entry)
 | 
				
			||||||
        running_vms.remove(vm)
 | 
					        running_vms.remove(vm)
 | 
				
			||||||
 | 
					        delete_vm_network(vm_entry)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def delete(vm_entry):
 | 
					def delete(vm_entry):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue