1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2024-12-24 23:25:24 +00:00

Merge pull request #411 from catborise/master

instance network change
This commit is contained in:
catborise 2021-02-25 09:49:28 +03:00 committed by GitHub
commit 3caf1d538c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 72 additions and 33 deletions

View file

@ -204,10 +204,6 @@ class Instance(models.Model):
def formats(self): def formats(self):
return self.proxy.get_image_formats() return self.proxy.get_image_formats()
@cached_property
def interfaces(self):
return self.proxy.get_ifaces()
class PermissionSet(models.Model): class PermissionSet(models.Model):
""" """

View file

@ -27,7 +27,7 @@
{% for c_net in networks_host %} {% for c_net in networks_host %}
<option value="net:{{ c_net }}">Network {{ c_net }}</option> <option value="net:{{ c_net }}">Network {{ c_net }}</option>
{% endfor %} {% endfor %}
{% for c_iface in instance.interfaces %} {% for c_iface in interfaces_host %}
<option value="iface:{{ c_iface }}">Interface {{ c_iface }}</option> <option value="iface:{{ c_iface }}">Interface {{ c_iface }}</option>
{% endfor %} {% endfor %}
</select> </select>

View file

@ -401,7 +401,7 @@
{% for c_net in networks_host %} {% for c_net in networks_host %}
<option value="net:{{ c_net }}" {% if c_net == network.nic %} selected {% endif %}>{% trans 'Network' %} {{ c_net }}</option> <option value="net:{{ c_net }}" {% if c_net == network.nic %} selected {% endif %}>{% trans 'Network' %} {{ c_net }}</option>
{% endfor %} {% 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> <option value="iface:{{ c_iface }}" {% if c_iface == network.nic %} selected {% endif %}>{% trans 'Interface' %} {{ c_iface }}</option>
{% endfor %} {% endfor %}
</select> </select>

View file

@ -25,6 +25,7 @@ from logs.views import addlogmsg
from vrtManager import util from vrtManager import util
from vrtManager.create import wvmCreate from vrtManager.create import wvmCreate
from vrtManager.instance import wvmInstances from vrtManager.instance import wvmInstances
from vrtManager.interface import wvmInterface
from vrtManager.storage import wvmStorage from vrtManager.storage import wvmStorage
from vrtManager.util import randomPasswd from vrtManager.util import randomPasswd
@ -121,6 +122,7 @@ def instance(request, pk):
memory_host = instance.proxy.get_max_memory() memory_host = instance.proxy.get_max_memory()
bus_host = instance.proxy.get_disk_bus_types(instance.arch, instance.machine) bus_host = instance.proxy.get_disk_bus_types(instance.arch, instance.machine)
networks_host = sorted(instance.proxy.get_networks()) networks_host = sorted(instance.proxy.get_networks())
interfaces_host = sorted(instance.proxy.get_ifaces())
nwfilters_host = instance.proxy.get_nwfilters() nwfilters_host = instance.proxy.get_nwfilters()
storages_host = sorted(instance.proxy.get_storages(True)) storages_host = sorted(instance.proxy.get_storages(True))
net_models_host = instance.proxy.get_network_models() 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)) (source, source_type) = utils.get_network_tuple(request.POST.get(post))
network_data[post] = source network_data[post] = source
network_data[post + "-type"] = source_type 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-"): elif post.startswith("net-"):
network_data[post] = request.POST.get(post, "") network_data[post] = request.POST.get(post, "")
@ -923,6 +935,16 @@ def add_network(request, pk):
nwfilter = request.POST.get("add-net-nwfilter") nwfilter = request.POST.get("add-net-nwfilter")
(source, source_type) = utils.get_network_tuple(request.POST.get("add-net-network")) (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) instance.proxy.add_network(mac, source, source_type, nwfilter=nwfilter)
msg = _("Add network: %(mac)s") % {"mac": mac} msg = _("Add network: %(mac)s") % {"mac": mac}
addlogmsg(request.user.username, instance.name, msg) addlogmsg(request.user.username, instance.name, msg)

View file

@ -29,7 +29,8 @@ def interfaces(request, compute_id):
netdevs = ["eth0", "eth1"] netdevs = ["eth0", "eth1"]
for iface in ifaces: 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 request.method == "POST":
if "create" in request.POST: if "create" in request.POST:

View file

@ -482,7 +482,7 @@ class wvmConnect(object):
def get_networks(self): def get_networks(self):
""" """
:return: list of networks :return: list of host networks
""" """
virtnet = [] virtnet = []
for net in self.wvm.listNetworks(): for net in self.wvm.listNetworks():
@ -493,7 +493,7 @@ class wvmConnect(object):
def get_ifaces(self): def get_ifaces(self):
""" """
:return: list of network interfaces :return: list of host interfaces
""" """
interface = [] interface = []
for inface in self.wvm.listInterfaces(): for inface in self.wvm.listInterfaces():

View file

@ -1366,19 +1366,15 @@ class wvmInstance(wvmConnect):
return bridge_name return bridge_name
def add_network(self, mac_address, source, source_type="net", model="virtio", nwfilter=None): def add_network(self, mac_address, source, source_type="net", model="virtio", nwfilter=None):
forward_mode = ""
if source_type != "iface": if source_type == "net":
forward_mode = self.get_network_forward(source)
if forward_mode in ["nat", "isolated", "routed"]:
interface_type = "network" interface_type = "network"
elif forward_mode == "": elif source_type == "bridge":
interface_type = "direct" interface_type = "bridge"
else: else:
if self.get_bridge_name(source, source_type) is None: interface_type = "direct"
interface_type = "network"
else: # network modes not handled: default is bridge
interface_type = "bridge"
xml_iface = f""" xml_iface = f"""
<interface type='{interface_type}'> <interface type='{interface_type}'>
@ -1386,13 +1382,11 @@ class wvmInstance(wvmConnect):
if interface_type == "network": if interface_type == "network":
xml_iface += f"""<source network='{source}'/>""" xml_iface += f"""<source network='{source}'/>"""
elif interface_type == "direct": elif interface_type == "direct":
if source_type == "net": xml_iface += f"""<source dev='{source}' mode='bridge'/>"""
xml_iface += f"""<source network='{source}' mode='bridge'/>""" elif interface_type == "bridge":
else: xml_iface += f"""<source bridge='{source}'/>"""
xml_iface += f"""<source dev='{source}' mode='bridge'/>"""
else: else:
bridge_name = self.get_bridge_name(source, source_type) raise libvirtError(f"'{interface_type}' is an unexpected interface type.")
xml_iface += f"""<source bridge='{bridge_name}'/>"""
xml_iface += f"""<model type='{model}'/>""" xml_iface += f"""<model type='{model}'/>"""
if nwfilter: if nwfilter:
xml_iface += f"""<filterref filter='{nwfilter}'/>""" xml_iface += f"""<filterref filter='{nwfilter}'/>"""
@ -1416,8 +1410,35 @@ class wvmInstance(wvmConnect):
self.instance.detachDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_CONFIG) self.instance.detachDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_CONFIG)
if self.get_status() == 5: if self.get_status() == 5:
self.instance.detachDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_CONFIG) self.instance.detachDeviceFlags(new_xml, VIR_DOMAIN_AFFECT_CONFIG)
return new_xml
return None
def change_network(self, network_data): 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) xml = self._XMLDesc(VIR_DOMAIN_XML_SECURE)
tree = ElementTree.fromstring(xml) tree = ElementTree.fromstring(xml)
for num, interface in enumerate(tree.findall("devices/interface")): for num, interface in enumerate(tree.findall("devices/interface")):

View file

@ -6,13 +6,6 @@ from vrtManager.connection import wvmConnect
class wvmInterfaces(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): def define_iface(self, xml, flag=0):
self.wvm.interfaceDefineXML(xml, flag) self.wvm.interfaceDefineXML(xml, flag)
@ -153,6 +146,12 @@ class wvmInterface(wvmConnect):
else: else:
return None 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): def stop_iface(self):
self.iface.destroy() self.iface.destroy()