mirror of
				https://github.com/retspen/webvirtcloud
				synced 2025-07-31 12:41:08 +00:00 
			
		
		
		
	
						commit
						3caf1d538c
					
				
					 8 changed files with 72 additions and 33 deletions
				
			
		|  | @ -204,10 +204,6 @@ class Instance(models.Model): | |||
|     def formats(self): | ||||
|         return self.proxy.get_image_formats() | ||||
| 
 | ||||
|     @cached_property | ||||
|     def interfaces(self): | ||||
|         return self.proxy.get_ifaces() | ||||
| 
 | ||||
| 
 | ||||
| class PermissionSet(models.Model): | ||||
|     """ | ||||
|  |  | |||
|  | @ -27,7 +27,7 @@ | |||
|                                     {% for c_net in networks_host %} | ||||
|                                         <option value="net:{{ c_net }}">Network {{ c_net }}</option> | ||||
|                                     {% endfor %} | ||||
|                                     {% for c_iface in instance.interfaces %} | ||||
|                                     {% for c_iface in interfaces_host %} | ||||
|                                         <option value="iface:{{ c_iface }}">Interface {{ c_iface }}</option> | ||||
|                                     {% endfor %} | ||||
|                                 </select> | ||||
|  |  | |||
|  | @ -401,7 +401,7 @@ | |||
|                                                         {% for c_net in networks_host %} | ||||
|                                                         <option value="net:{{ c_net }}" {% if c_net == network.nic %} selected {% endif %}>{% trans 'Network' %} {{ c_net }}</option> | ||||
|                                                         {% endfor %} | ||||
|                                                         {% for c_iface in instance.interfaces %} | ||||
|                                                         {% for c_iface in interfaces_host %} | ||||
|                                                         <option value="iface:{{ c_iface }}" {% if c_iface == network.nic %} selected {% endif %}>{% trans 'Interface' %} {{ c_iface }}</option> | ||||
|                                                         {% endfor %} | ||||
|                                                     </select> | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ from logs.views import addlogmsg | |||
| from vrtManager import util | ||||
| from vrtManager.create import wvmCreate | ||||
| from vrtManager.instance import wvmInstances | ||||
| from vrtManager.interface import wvmInterface | ||||
| from vrtManager.storage import wvmStorage | ||||
| from vrtManager.util import randomPasswd | ||||
| 
 | ||||
|  | @ -121,6 +122,7 @@ def instance(request, pk): | |||
|     memory_host = instance.proxy.get_max_memory() | ||||
|     bus_host = instance.proxy.get_disk_bus_types(instance.arch, instance.machine) | ||||
|     networks_host = sorted(instance.proxy.get_networks()) | ||||
|     interfaces_host = sorted(instance.proxy.get_ifaces()) | ||||
|     nwfilters_host = instance.proxy.get_nwfilters() | ||||
|     storages_host = sorted(instance.proxy.get_storages(True)) | ||||
|     net_models_host = instance.proxy.get_network_models() | ||||
|  | @ -904,6 +906,16 @@ def change_network(request, pk): | |||
|             (source, source_type) = utils.get_network_tuple(request.POST.get(post)) | ||||
|             network_data[post] = source | ||||
|             network_data[post + "-type"] = source_type | ||||
| 
 | ||||
|             if source_type == 'iface': | ||||
|                 iface = wvmInterface( | ||||
|                     instance.compute.hostname, | ||||
|                     instance.compute.login, | ||||
|                     instance.compute.password, | ||||
|                     instance.compute.type, | ||||
|                     source, | ||||
|                 ) | ||||
|                 network_data[post + "-type"] = iface.get_type() | ||||
|         elif post.startswith("net-"): | ||||
|             network_data[post] = request.POST.get(post, "") | ||||
| 
 | ||||
|  | @ -923,6 +935,16 @@ def add_network(request, pk): | |||
|     nwfilter = request.POST.get("add-net-nwfilter") | ||||
|     (source, source_type) = utils.get_network_tuple(request.POST.get("add-net-network")) | ||||
| 
 | ||||
|     if source_type == 'iface': | ||||
|         iface = wvmInterface( | ||||
|                 instance.compute.hostname, | ||||
|                 instance.compute.login, | ||||
|                 instance.compute.password, | ||||
|                 instance.compute.type, | ||||
|                 source, | ||||
|             ) | ||||
|         source_type = iface.get_type() | ||||
| 
 | ||||
|     instance.proxy.add_network(mac, source, source_type, nwfilter=nwfilter) | ||||
|     msg = _("Add network: %(mac)s") % {"mac": mac} | ||||
|     addlogmsg(request.user.username, instance.name, msg) | ||||
|  |  | |||
|  | @ -29,7 +29,8 @@ def interfaces(request, compute_id): | |||
|             netdevs = ["eth0", "eth1"] | ||||
| 
 | ||||
|         for iface in ifaces: | ||||
|             ifaces_all.append(conn.get_iface_info(iface)) | ||||
|             interf = wvmInterface(compute.hostname, compute.login, compute.password, compute.type, iface) | ||||
|             ifaces_all.append(interf.get_details()) | ||||
| 
 | ||||
|         if request.method == "POST": | ||||
|             if "create" in request.POST: | ||||
|  |  | |||
|  | @ -482,7 +482,7 @@ class wvmConnect(object): | |||
| 
 | ||||
|     def get_networks(self): | ||||
|         """ | ||||
|         :return: list of networks | ||||
|         :return: list of host networks | ||||
|         """ | ||||
|         virtnet = [] | ||||
|         for net in self.wvm.listNetworks(): | ||||
|  | @ -493,7 +493,7 @@ class wvmConnect(object): | |||
| 
 | ||||
|     def get_ifaces(self): | ||||
|         """ | ||||
|         :return: list of network interfaces | ||||
|         :return: list of host interfaces | ||||
|         """ | ||||
|         interface = [] | ||||
|         for inface in self.wvm.listInterfaces(): | ||||
|  |  | |||
|  | @ -1366,19 +1366,15 @@ class wvmInstance(wvmConnect): | |||
|         return bridge_name | ||||
| 
 | ||||
|     def add_network(self, mac_address, source, source_type="net", model="virtio", nwfilter=None): | ||||
|         forward_mode = "" | ||||
|         if source_type != "iface": | ||||
|             forward_mode = self.get_network_forward(source) | ||||
| 
 | ||||
|         if forward_mode in ["nat", "isolated", "routed"]: | ||||
|              | ||||
|         if source_type == "net": | ||||
|             interface_type = "network" | ||||
|         elif forward_mode == "": | ||||
|             interface_type = "direct" | ||||
|         elif source_type == "bridge": | ||||
|             interface_type = "bridge" | ||||
|         else: | ||||
|             if self.get_bridge_name(source, source_type) is None: | ||||
|                 interface_type = "network" | ||||
|             else: | ||||
|                 interface_type = "bridge" | ||||
|             interface_type = "direct" | ||||
|         | ||||
|         # network modes not handled: default is bridge | ||||
| 
 | ||||
|         xml_iface = f""" | ||||
|           <interface type='{interface_type}'> | ||||
|  | @ -1386,13 +1382,11 @@ class wvmInstance(wvmConnect): | |||
|         if interface_type == "network": | ||||
|             xml_iface += f"""<source network='{source}'/>""" | ||||
|         elif interface_type == "direct": | ||||
|             if source_type == "net": | ||||
|                 xml_iface += f"""<source network='{source}' mode='bridge'/>""" | ||||
|             else: | ||||
|                 xml_iface += f"""<source dev='{source}' mode='bridge'/>""" | ||||
|             xml_iface += f"""<source dev='{source}' mode='bridge'/>""" | ||||
|         elif interface_type == "bridge": | ||||
|             xml_iface += f"""<source bridge='{source}'/>""" | ||||
|         else: | ||||
|             bridge_name = self.get_bridge_name(source, source_type) | ||||
|             xml_iface += f"""<source bridge='{bridge_name}'/>""" | ||||
|             raise libvirtError(f"'{interface_type}' is an unexpected interface type.") | ||||
|         xml_iface += f"""<model type='{model}'/>""" | ||||
|         if nwfilter: | ||||
|             xml_iface += f"""<filterref filter='{nwfilter}'/>""" | ||||
|  | @ -1416,8 +1410,35 @@ class wvmInstance(wvmConnect): | |||
|                     self.instance.detachDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_CONFIG) | ||||
|                 if self.get_status() == 5: | ||||
|                     self.instance.detachDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_CONFIG) | ||||
|                 return new_xml | ||||
|         return None | ||||
| 
 | ||||
|     def change_network(self, network_data): | ||||
|         net_mac = network_data.get("net-mac-0") | ||||
|         net_source = network_data.get("net-source-0") | ||||
|         net_source_type = network_data.get("net-source-0-type") | ||||
|         net_filter = network_data.get("net-nwfilter-0") | ||||
|         net_model = network_data.get("net-model-0") | ||||
|          | ||||
|         # Remove interface first, but keep network interface XML definition | ||||
|         # If there is an error happened while adding changed one, then add removed one to back. | ||||
|         status = self.delete_network(net_mac) | ||||
|         try: | ||||
|             self.add_network(net_mac, net_source, net_source_type, net_model, net_filter) | ||||
|         except libvirtError: | ||||
|             if status is not None: | ||||
|                 if self.get_status() == 1: | ||||
|                     self.instance.attachDeviceFlags(status, VIR_DOMAIN_AFFECT_LIVE) | ||||
|                     self.instance.attachDeviceFlags(status, VIR_DOMAIN_AFFECT_CONFIG) | ||||
|                 if self.get_status() == 5: | ||||
|                     self.instance.attachDeviceFlags(status, VIR_DOMAIN_AFFECT_CONFIG) | ||||
| 
 | ||||
| 
 | ||||
|     def change_network_oldway(self, network_data): | ||||
|         ''' | ||||
|             change network firsh version... | ||||
|             will be removed if new one works as expected for all scenarios | ||||
|         ''' | ||||
|         xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE) | ||||
|         tree = ElementTree.fromstring(xml) | ||||
|         for num, interface in enumerate(tree.findall("devices/interface")): | ||||
|  |  | |||
|  | @ -6,13 +6,6 @@ from vrtManager.connection import wvmConnect | |||
| 
 | ||||
| 
 | ||||
| class wvmInterfaces(wvmConnect): | ||||
|     def get_iface_info(self, name): | ||||
|         iface = self.get_iface(name) | ||||
|         xml = iface.XMLDesc(0) | ||||
|         mac = iface.MACString() | ||||
|         itype = util.get_xml_path(xml, "/interface/@type") | ||||
|         state = iface.isActive() | ||||
|         return {"name": name, "type": itype, "state": state, "mac": mac} | ||||
| 
 | ||||
|     def define_iface(self, xml, flag=0): | ||||
|         self.wvm.interfaceDefineXML(xml, flag) | ||||
|  | @ -153,6 +146,12 @@ class wvmInterface(wvmConnect): | |||
|         else: | ||||
|             return None | ||||
| 
 | ||||
|     def get_details(self): | ||||
|         mac = self.get_mac() | ||||
|         itype = self.get_type() | ||||
|         state = self.is_active() | ||||
|         return {"name": self.iface, "type": itype, "state": state, "mac": mac} | ||||
| 
 | ||||
|     def stop_iface(self): | ||||
|         self.iface.destroy() | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue