diff --git a/instances/models.py b/instances/models.py index 978d118..0a20031 100644 --- a/instances/models.py +++ b/instances/models.py @@ -252,6 +252,7 @@ class CreateInstance(models.Model): error_messages={"required": _("No Network pool has been choosen")}, ) nwfilter = models.CharField(max_length=256, blank=True) + net_model = models.CharField(max_length=256, blank=True) storage = models.CharField(max_length=256, blank=True) template = models.CharField(max_length=256, blank=True) images = models.CharField(max_length=256, blank=True) diff --git a/instances/templates/add_instance_network_block.html b/instances/templates/add_instance_network_block.html index 2a57b12..c5ce705 100644 --- a/instances/templates/add_instance_network_block.html +++ b/instances/templates/add_instance_network_block.html @@ -45,6 +45,16 @@ </select> </div> </div> + <div class="row"> + <label class="col-sm-4 col-form-label">{% trans "Model" %} </label> + <div class="col-sm-6"> + <select class="form-select" name="add-net-model"> + {% for model in net_models_host %} + <option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option> + {% endfor %} + </select> + </div> + </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{% trans "Close" %}</button> diff --git a/instances/templates/create_instance_w2.html b/instances/templates/create_instance_w2.html index e00bf95..766dd1f 100644 --- a/instances/templates/create_instance_w2.html +++ b/instances/templates/create_instance_w2.html @@ -168,6 +168,16 @@ {% endfor %} </select> </div> + </div> + <div class="row"> + <label class="col-sm-4 col-form-label">{% trans "Model" %} </label> + <div class="col-sm-7"> + <select class="form-select" name="net_model"> + {% for model in net_models_host %} + <option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option> + {% endfor %} + </select> + </div> </div> <div class="row"> <label class="col-sm-4 col-form-label">{% trans "Advanced" %}</label> @@ -422,7 +432,16 @@ {% endfor %} </select> </div> - <input id="mac" type="hidden" name="mac" value=""/> + </div> + <div class="row"> + <label class="col-sm-3 col-form-label">{% trans "Model" %} </label> + <div class="col-sm-7 my-1"> + <select class="form-select" name="net_model"> + {% for model in net_models_host %} + <option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option> + {% endfor %} + </select> + </div> </div> <div class="row"> <label class="col-sm-3 col-form-label">{% trans "Advanced" %}</label> @@ -666,6 +685,16 @@ <input type="text" class="form-control" name="mac" maxlength="17" value="{{ mac_auto }}" required pattern="[a-zA-Z0-9:]+"> </div> </div> + <div class="row"> + <label class="col-sm-3 col-form-label">{% trans "Model" %} </label> + <div class="col-sm-7 my-1"> + <select class="form-select" name="net_model"> + {% for model in net_models_host %} + <option value="{{ model }}" {% if model == 'default' %} selected {% endif %}>{{ model }}</option> + {% endfor %} + </select> + </div> + </div> <div class="row"> <label class="col-sm-3 col-form-label">{% trans "Advanced" %}</label> <div class="d-grid col-sm-7"> @@ -865,7 +894,7 @@ '{% endfor %}' + '</select>' + ' -> ' + value + ' ' + - '<a class="btn-link float-end" onclick="javascript:$(\'#image-control\').multiselect(\'deselect\', \'' + value + '\', true)">{% bs_icon 'trash'%} </a></li>'; + '<a class="btn-link float-end" onclick="javascript:$(\'#image-control\').multiselect(\'deselect\', \'' + value + '\', true)"> X </a></li>'; selected_list_html += li; counter++; }); @@ -899,7 +928,7 @@ let li = '<li><input type="text" class="input-xs" name="mac'+ net_counter +'" maxlength="17" required pattern="[a-zA-Z0-9:]+" onchange="populate_mac(' + net_counter +')">' + ' eth' + net_counter + ' -> ' + value + ' ' + - '<a class="btn-link float-end" onclick="$(\'#network-control\').multiselect(\'deselect\', \'' + value + '\', true)">{% bs_icon 'trash'%} </a></li>'; + '<a class="btn-link float-end" onclick="$(\'#network-control\').multiselect(\'deselect\', \'' + value + '\', true)"> X </a></li>'; random_mac(net_counter); selected_list_html += li; net_counter++; diff --git a/instances/views.py b/instances/views.py index d4865fd..57d1598 100755 --- a/instances/views.py +++ b/instances/views.py @@ -1253,6 +1253,7 @@ def add_network(request, pk): mac = request.POST.get("add-net-mac") nwfilter = request.POST.get("add-net-nwfilter") (source, source_type) = utils.get_network_tuple(request.POST.get("add-net-network")) + model = request.POST.get("add-net-model") if source_type == "iface": iface = wvmInterface( @@ -1264,7 +1265,7 @@ def add_network(request, pk): ) source_type = iface.get_type() - instance.proxy.add_network(mac, source, source_type, nwfilter=nwfilter) + instance.proxy.add_network(mac, source, source_type, model=model, nwfilter=nwfilter) msg = _("Add network: %(mac)s") % {"mac": mac} addlogmsg(request.user.username, instance.compute.name, instance.name, msg) return redirect(request.META.get("HTTP_REFERER") + "#network") @@ -1690,6 +1691,7 @@ def create_instance(request, compute_id, arch, machine): default_bus = app_settings.INSTANCE_VOLUME_DEFAULT_BUS networks = sorted(conn.get_networks()) nwfilters = conn.get_nwfilters() + net_models_host = conn.get_network_models() storages = sorted(conn.get_storages(only_actives=True)) default_graphics = app_settings.QEMU_CONSOLE_DEFAULT_TYPE default_cdrom = app_settings.INSTANCE_CDROM_ADD @@ -1866,6 +1868,7 @@ def create_instance(request, compute_id, arch, machine): virtio=data["virtio"], listener_addr=data["listener_addr"], nwfilter=data["nwfilter"], + net_model=data["net_model"], graphics=data["graphics"], video=data["video"], console_pass=data["console_pass"], diff --git a/vrtManager/connection.py b/vrtManager/connection.py index 3f49667..e2dfaed 100644 --- a/vrtManager/connection.py +++ b/vrtManager/connection.py @@ -757,7 +757,7 @@ class wvmConnect(object): """ :return: network card models """ - return ["default", "e1000", "virtio"] + return ["default", "e1000", "e1000e","rt18139", "virtio"] def get_image_formats(self): """ diff --git a/vrtManager/create.py b/vrtManager/create.py index 014a70b..90cd511 100644 --- a/vrtManager/create.py +++ b/vrtManager/create.py @@ -161,6 +161,7 @@ class wvmCreate(wvmConnect): graphics, virtio, listener_addr, + net_model="virtio", video="vga", console_pass="random", mac=None, @@ -316,7 +317,7 @@ class wvmCreate(wvmConnect): if nwfilter: xml += f"""<filterref filter='{nwfilter}'/>""" if virtio: - xml += """<model type='virtio'/>""" + xml += f"""<model type='{net_model}'/>""" xml += """</interface>""" if console_pass == "random":