[Kimchi-devel] [PATCH] PCI Node filtering

Daniel Henrique Barboza danielhb at linux.vnet.ibm.com
Wed Jul 29 17:07:50 UTC 2015


Reviewed-by: Daniel Barboza <dhbarboza82 at gmail.com>

On 07/29/2015 01:16 PM, Socorro Stoppler wrote:
> Allow to only be able to add PCI device that is not attached to a VM
> All filter now shows only those PCI devices that are available to be added
> and ones that are already attached to a VM.
>
> Signed-off-by: Socorro Stoppler <socorro at linux.vnet.ibm.com>
> ---
>   ui/js/src/kimchi.guest_edit_main.js | 166 +++++++++++++++++++-----------------
>   1 file changed, 88 insertions(+), 78 deletions(-)
>
> diff --git a/ui/js/src/kimchi.guest_edit_main.js b/ui/js/src/kimchi.guest_edit_main.js
> index 7671e43..a07f938 100644
> --- a/ui/js/src/kimchi.guest_edit_main.js
> +++ b/ui/js/src/kimchi.guest_edit_main.js
> @@ -429,81 +429,7 @@ kimchi.guest_edit_main = function() {
>               filterNodes("", $("#permission-avail-groups"));
>           });
>       }
> -    var setupPCIDevice = function(){
> -        kimchi.getHostPCIDevices(function(hostPCIs){
> -            kimchi.getVMPCIDevices(kimchi.selectedGuest, function(vmPCIs){
> -                var pciEnabled = kimchi.capabilities.kernel_vfio;
> -                for(var i=0; i<hostPCIs.length; i++){
> -                    var itemNode = $.parseHTML(kimchi.substitute($('#pci-tmpl').html(),{
> -                        name: hostPCIs[i].name,
> -                        product: hostPCIs[i].product.description,
> -                        vendor: hostPCIs[i].vendor.description
> -                    }));
> -                    $(".body", "#form-guest-edit-pci").append(itemNode);
> -                    var iconClass = "ui-icon-plus";
> -                    for(var j=0; j<vmPCIs.length; j++){
> -                        if(hostPCIs[i].name==vmPCIs[j].name){
> -                            iconClass = "ui-icon-minus";
> -                            break;
> -                        }
> -                    }
> -                    pciEnabled || $("button", itemNode).remove();
> -                    $("button", itemNode).button({
> -                        icons: { primary: iconClass },
> -                        text: false
> -                    }).click(function(){
> -                        var obj = $(this);
> -                        if(obj.button("option", "icons").primary == "ui-icon-minus"){
> -                            kimchi.removeVMPCIDevice(kimchi.selectedGuest, obj.parent().prop("id"), function(){
> -                                kimchi.getVMPCIDevices(kimchi.selectedGuest, function(vmPCIs1){
> -                                    for(var k=0; k<hostPCIs.length; k++) {
> -                                        $("button", "#" + hostPCIs[k].name).button("option", "icons", {primary: "ui-icon-plus"});
> -                                    }
> -                                    for(var k=0; k<vmPCIs1.length; k++) {
> -                                        $("button", "#" + vmPCIs1[k].name).button("option", "icons", {primary: "ui-icon-minus"});
> -                                    }
> -                                });
> -                                filterNodes($("select", "#form-guest-edit-pci").val(), $("input", "#form-guest-edit-pci").val());
> -                            });
> -                        } else {
> -                            kimchi.addVMPCIDevice(kimchi.selectedGuest, { name: obj.parent().prop("id") }, function(){
> -                                kimchi.getVMPCIDevices(kimchi.selectedGuest, function(vmPCIs1){
> -                                    for(var k=0; k<vmPCIs1.length; k++) {
> -                                        $("button", "#" + vmPCIs1[k].name).button("option", "icons", {primary: "ui-icon-minus"});
> -                                    }
> -                                });
> -                                filterNodes($("select", "#form-guest-edit-pci").val(), $("input", "#form-guest-edit-pci").val());
> -                            });
> -                        }
> -                    });
> -                    kimchi.getPCIDeviceCompanions(hostPCIs[i].name, function(infoData) {
> -                        var pciTitle = i18n["KCHVMED6007M"] + "\n";
> -                        var haveCompanions = false;
> -                        for(var p=0; p<infoData.length; p++) {
> -                            if(infoData[p].device_type === "net") {
> -                                haveCompanions = true;
> -                                pciTitle += "   " + infoData[p].name + "\n";
> -                                pciTitle += "      " + i18n["KCHVMED6001M"] + " " + infoData[p].interface;
> -                                pciTitle += ", " + i18n["KCHVMED6002M"] + " " + infoData[p].address;
> -                                pciTitle += ", " + i18n["KCHVMED6003M"] + " " + infoData[p].link_type + "\n";
> -                            } else if(infoData[p].device_type === "storage") {
> -                                haveCompanions = true;
> -                                pciTitle += "   " + infoData[p].name + "\n";
> -                                pciTitle += "      " + i18n["KCHVMED6004M"] + " " + infoData[p].block;
> -                                pciTitle += ", " + i18n["KCHVMED6005M"] + " " + infoData[p].drive_type;
> -                                pciTitle += ", " + i18n["KCHVMED6006M"] + " " + infoData[p].model + "\n";
> -                            }
> -                        }
> -                        for(var q=0; q<infoData.length; q++) {
> -                            haveCompanions && $(".name", "#" + infoData[q].parent).attr("title", pciTitle);
> -                            haveCompanions && $(".product", "#" + infoData[q].parent).attr("title", pciTitle);
> -                            haveCompanions && $(".vendor", "#" + infoData[q].parent).attr("title", pciTitle);
> -                        }
> -                    });
> -                }
> -            });
> -        });
> -        var filterNodes = function(group, text){
> +    var filterPCINodes = function(group, text){
>               text = text.toLowerCase();
>               $(".body", "#form-guest-edit-pci").children().each(function(){
>                   var textFilter = $(".name", this).text().toLowerCase().indexOf(text)!=-1;
> @@ -522,15 +448,99 @@ kimchi.guest_edit_main = function() {
>                   }
>                   $(this).css("display", display);
>               });
> -        };
> +        }
> +    var setupPCIDevice = function(){
> +        kimchi.getAvailableHostPCIDevices(function(hostPCIs){
> +            kimchi.getVMPCIDevices(kimchi.selectedGuest, function(vmPCIs){
> +                setupNode(hostPCIs, "ui-icon-plus");
> +                setupNode(vmPCIs, "ui-icon-minus");
> +            });
> +        });
>           $("select", "#form-guest-edit-pci").change(function(){
> -            filterNodes($(this).val(), $("input", "#form-guest-edit-pci").val());
> +            filterPCINodes($(this).val(), $("input", "#form-guest-edit-pci").val());
>           });
>           $("input", "#form-guest-edit-pci").on("keyup", function() {
> -            filterNodes($("select", "#form-guest-edit-pci").val(), $(this).val());
> +            filterPCINodes($("select", "#form-guest-edit-pci").val(), $(this).val());
>           });
>       };
>
> +    var setupNode = function(arrPCIDevices, iconClass) {
> +        var pciEnabled = kimchi.capabilities.kernel_vfio;
> +        var pciDeviceName, pciDeviceProduct, pciDeviceProductDesc, pciDeviceVendor, pciDeviceVendorDesc;
> +        for(var i=0; i<arrPCIDevices.length; i++){
> +            pciDeviceName = arrPCIDevices[i].name;
> +            pciDeviceProduct = arrPCIDevices[i].product;
> +            pciDeviceVendor = arrPCIDevices[i].vendor;
> +            if(pciDeviceProduct!=null) {
> +                pciDeviceProductDesc = pciDeviceProduct.description;
> +            }
> +            if(pciDeviceVendor!=null) {
> +                pciDeviceVendorDesc = pciDeviceVendor.description;
> +            }
> +            var itemNode = $.parseHTML(kimchi.substitute($('#pci-tmpl').html(),{
> +                  name: pciDeviceName,
> +                  product: pciDeviceProductDesc,
> +                  vendor: pciDeviceVendorDesc
> +            }));
> +            $(".body", "#form-guest-edit-pci").append(itemNode);
> +            pciEnabled || $("button", itemNode).remove();
> +            $("button", itemNode).button({
> +                icons: { primary: iconClass },
> +                text: false
> +            }).click(function(){
> +                var obj = $(this);
> +                if(obj.button("option", "icons").primary == "ui-icon-minus"){
> +                    kimchi.removeVMPCIDevice(kimchi.selectedGuest, obj.parent().prop("id"), function(){
> +                        kimchi.getAvailableHostPCIDevices(function(arrPCIDevices1){
> +                            kimchi.getVMPCIDevices(kimchi.selectedGuest, function(vmPCIs1){
> +                                for(var k=0; k<arrPCIDevices1.length; k++) {
> +                                    $("button", "#" + arrPCIDevices1[k].name).button("option", "icons", {primary: "ui-icon-plus"});
> +                                }
> +                                for(var k=0; k<vmPCIs1.length; k++) {
> +                                    $("button", "#" + vmPCIs1[k].name).button("option", "icons", {primary: "ui-icon-minus"});
> +                                }
> +                            });
> +                        });
> +                        filterPCINodes($("select", "#form-guest-edit-pci").val(), $("input", "#form-guest-edit-pci").val());
> +                    });
> +                } else {
> +                    kimchi.addVMPCIDevice(kimchi.selectedGuest, { name: obj.parent().prop("id") }, function(){
> +                        kimchi.getVMPCIDevices(kimchi.selectedGuest, function(vmPCIs1){
> +                            for(var k=0; k<vmPCIs1.length; k++) {
> +                                $("button", "#" + vmPCIs1[k].name).button("option", "icons", {primary: "ui-icon-minus"});
> +                            }
> +                        });
> +                        filterPCINodes($("select", "#form-guest-edit-pci").val(), $("input", "#form-guest-edit-pci").val());
> +                    });
> +                }
> +            });
> +            kimchi.getPCIDeviceCompanions(pciDeviceName, function(infoData) {
> +                var pciTitle = i18n["KCHVMED6007M"] + "\n";
> +                var haveCompanions = false;
> +                for(var p=0; p<infoData.length; p++) {
> +                    if(infoData[p].device_type === "net") {
> +                        haveCompanions = true;
> +                        pciTitle += "   " + infoData[p].name + "\n";
> +                        pciTitle += "      " + i18n["KCHVMED6001M"] + " " + infoData[p].interface;
> +                        pciTitle += ", " + i18n["KCHVMED6002M"] + " " + infoData[p].address;
> +                        pciTitle += ", " + i18n["KCHVMED6003M"] + " " + infoData[p].link_type + "\n";
> +                    } else if(infoData[p].device_type === "storage") {
> +                        haveCompanions = true;
> +                        pciTitle += "   " + infoData[p].name + "\n";
> +                        pciTitle += "      " + i18n["KCHVMED6004M"] + " " + infoData[p].block;
> +                        pciTitle += ", " + i18n["KCHVMED6005M"] + " " + infoData[p].drive_type;
> +                        pciTitle += ", " + i18n["KCHVMED6006M"] + " " + infoData[p].model + "\n";
> +                    }
> +                }
> +                for(var q=0; q<infoData.length; q++) {
> +                    haveCompanions && $(".name", "#" + infoData[q].parent).attr("title", pciTitle);
> +                    haveCompanions && $(".product", "#" + infoData[q].parent).attr("title", pciTitle);
> +                    haveCompanions && $(".vendor", "#" + infoData[q].parent).attr("title", pciTitle);
> +                }
> +            });
> +        }
> +    };
> +
>       var setupSnapshot = function() {
>           var currentSnapshot;
>           var setCurrentSnapshot = function(aSnapshot){




More information about the Kimchi-devel mailing list