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(a)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){
--
1.8.3.1