/** * Global variables */ var networkDatatable; // zVM datatable containing networks var diskSpace; // Hash containing the disk pool space var zfcpSpace; // Hash containing the zFcp pool space /** * Get the network datatable * * @return Data table object */ function getNetworkDataTable() { return networkDatatable; } /** * Set the network datatable * * @param table Data table object */ function setNetworkDataTable(table) { networkDatatable = table; } /** * Load HCP specific info * * @param data Data from HTTP request */ function loadHcpInfo(data) { var args = data.msg.split(';'); // Get group var group = args[0].replace('group=', ''); // Get hardware control point var hcp = args[1].replace('hcp=', ''); // Get user directory entry var userEntry = data.rsp; if (!userEntry.length) return; if (userEntry[0].indexOf('Failed') < 0) { if (hcp) { // If there is no cookie for the disk pool names if (!$.cookie(hcp + 'diskpools') || $.cookie(hcp + 'diskpools') === null) { // Get disk pools $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--diskpoolnames', msg : hcp }, success : setDiskPoolCookies }); } // If there is no cookie for the zFCP pool names if (!$.cookie(hcp + 'zfcppools') || $.cookie(hcp + 'zfcppools') === null) { // Get disk pools $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--zfcppoolnames', msg : hcp }, success : setZfcpPoolCookies }); } // If there is no cookie for the network names if (!$.cookie(hcp + 'networks') || $.cookie(hcp + 'networks') === null) { // Get network names $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--getnetworknames', msg : hcp }, success : setNetworkCookies }); } } // End of if (hcp) } else { // Create warning dialog var warning = createWarnBar('z/VM SMAPI is not responding to ' + hcp + '. It needs to be reset.'); var warnDialog = $('
').append(warning); // Open dialog warnDialog.dialog({ title:'Warning', modal: true, close: function(){ $(this).remove(); }, width: 400, buttons: { "Ok": function() { $(this).dialog("close"); } } }); } } /** * Load user entry of a given node * * @param data Data from HTTP request */ function loadUserEntry(data) { var args = data.msg.split(';'); // Get tab ID var ueDivId = args[0].replace('out=', ''); // Get node var node = args[1].replace('node=', ''); // Get user directory entry var userEntry = data.rsp[0].split(node + ':'); // Remove loader $('#' + node + 'TabLoader').remove(); var toggleLinkId = node + 'ToggleLink'; $('#' + toggleLinkId).click(function() { // Get text within this link var lnkText = $(this).text(); // Toggle user entry division $('#' + node + 'UserEntry').toggle(); // Toggle inventory division $('#' + node + 'Inventory').toggle(); // Change text if (lnkText == 'Show directory entry') { $(this).text('Show inventory'); } else { $(this).text('Show directory entry'); } }); // Put user entry into a list var fieldSet = $('
'); var legend = $('Directory Entry'); fieldSet.append(legend); var txtArea = $(''); for ( var i = 1; i < userEntry.length; i++) { userEntry[i] = jQuery.trim(userEntry[i]); txtArea.append(userEntry[i]); if (i < userEntry.length) { txtArea.append('\n'); } } txtArea.attr('readonly', 'readonly'); fieldSet.append(txtArea); /** * Edit user entry */ txtArea.bind('dblclick', function(event) { txtArea.attr('readonly', ''); txtArea.css( { 'border-width' : '1px' }); saveBtn.show(); cancelBtn.show(); saveBtn.css('display', 'inline-table'); cancelBtn.css('display', 'inline-table'); }); /** * Save */ var saveBtn = createButton('Save').hide(); saveBtn.bind('click', function(event) { // Show loader $('#' + node + 'StatusBarLoader').show(); $('#' + node + 'StatusBar').show(); // Replace user entry var newUserEntry = jQuery.trim(txtArea.val()) + '\n'; // Replace user entry $.ajax( { url : 'lib/zCmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--replacevs', att : newUserEntry, msg : node }, success : updateZNodeStatus }); // Increment node process and save it in a cookie incrementNodeProcess(node); txtArea.attr('readonly', 'readonly'); txtArea.css( { 'border-width' : '0px' }); // Disable save button $(this).hide(); cancelBtn.hide(); }); /** * Cancel */ var cancelBtn = createButton('Cancel').hide(); cancelBtn.bind('click', function(event) { txtArea.attr('readonly', 'readonly'); txtArea.css( { 'border-width' : '0px' }); cancelBtn.hide(); saveBtn.hide(); }); // Create info bar var infoBar = createInfoBar('Double click on the directory entry to edit it.'); // Append user entry into division $('#' + ueDivId).append(infoBar); $('#' + ueDivId).append(fieldSet); $('#' + ueDivId).append(saveBtn); $('#' + ueDivId).append(cancelBtn); } /** * Increment number of processes running against a node * * @param node Node to increment running processes */ function incrementNodeProcess(node) { // Get current processes var procs = $.cookie(node + 'processes'); if (procs) { // One more process procs = parseInt(procs) + 1; $.cookie(node + 'processes', procs); } else { $.cookie(node + 'processes', 1); } } /** * Update provision new node status * * @param data Data returned from HTTP request */ function updateZProvisionNewStatus(data) { // Parse ajax response var rsp = data.rsp; var args = data.msg.split(';'); var lastCmd = args[0].replace('cmd=', ''); var out2Id = args[1].replace('out=', ''); // IDs for status bar, tab, and loader var statBarId = 'zProvisionStatBar' + out2Id; var tabId = 'zvmProvisionTab' + out2Id; var loaderId = 'zProvisionLoader' + out2Id; var node = $('#' + tabId + ' input[name=nodeName]').val(); /** * (2) Create user entry */ if (lastCmd == 'nodeadd') { if (rsp.length) { $('#' + loaderId).hide(); $('#' + statBarId).find('div').append('
(Error) Failed to create node definition
'); } else { $('#' + statBarId).find('div').append('
Node definition created for ' + node + '
'); // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); // Create user entry var userEntry = $('#' + tabId + ' textarea').val(); $.ajax( { url : 'lib/zCmd.php', dataType : 'json', data : { cmd : 'mkvm', tgt : node, args : '', att : userEntry, msg : 'cmd=mkvm;out=' + out2Id }, success : updateZProvisionNewStatus }); } } /** * (3) Update /etc/hosts */ else if (lastCmd == 'mkvm') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); // If there was an error, quit if (containErrors(prg.html())) { $('#' + loaderId).hide(); } else { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'makehosts', tgt : '', args : '', msg : 'cmd=makehosts;out=' + out2Id }, success : updateZProvisionNewStatus }); } } /** * (4) Update DNS */ else if (lastCmd == 'makehosts') { // If there was an error, quit if (rsp.length) { $('#' + loaderId).hide(); $('#' + statBarId).find('div').append('
(Error) Failed to update /etc/hosts
'); } else { $('#' + statBarId).find('div').append('
/etc/hosts updated
'); $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'makedns', tgt : '', args : '', msg : 'cmd=makedns;out=' + out2Id }, success : updateZProvisionNewStatus }); } } /** * (5) Add disk */ else if (lastCmd == 'makedns') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); // If there was an error, quit if (containErrors(prg.html())) { $('#' + loaderId).hide(); } else { // Set cookie for number of disks var diskRows = $('#' + tabId + ' table:eq(0):visible tbody tr'); $.cookie('disks2add' + out2Id, diskRows.length); if (diskRows.length > 0) { for (var i = 0; i < diskRows.length; i++) { var diskArgs = diskRows.eq(i).find('td'); var type = diskArgs.eq(1).find('select').val(); var address = diskArgs.eq(2).find('input').val(); var size = diskArgs.eq(3).find('input').val(); var mode = diskArgs.eq(4).find('select').val(); var pool = diskArgs.eq(5).find('select').val(); var password = diskArgs.eq(6).find('input').val(); // Create ajax arguments var args = ''; if (type == '3390') { args = '--add' + type + ';' + pool + ';' + address + ';' + size + ';' + mode + ';' + password + ';' + password + ';' + password; } else if (type == '9336') { var blkSize = '512'; args = '--add' + type + ';' + pool + ';' + address + ';' + blkSize + ';' + size + ';' + mode + ';' + password + ';' + password + ';' + password; } // Attach disk to node $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : args, msg : 'cmd=chvm-disk;out=' + out2Id }, success : updateZProvisionNewStatus }); } } // Set cookie for number of zFCP devices var zfcpRows = $('#' + tabId + ' table:eq(1):visible tbody tr'); $.cookie('zfcp2add' + out2Id, zfcpRows.length); if (zfcpRows.length > 0) { for ( var i = 0; i < zfcpRows.length; i++) { var diskArgs = zfcpRows.eq(i).find('td'); var address = diskArgs.eq(1).find('input').val(); var size = diskArgs.eq(2).find('input').val(); var pool = diskArgs.eq(3).find('select').val(); var tag = diskArgs.eq(4).find('input').val(); var portName = diskArgs.eq(5).find('input').val(); var unitNo = diskArgs.eq(6).find('input').val(); // This is either true or false var loaddev = diskArgs.eq(7).find('input').attr('checked'); if (loaddev) { loaddev = "1"; } else { loaddev = "0"; } // Create ajax arguments var args = '--addzfcp;' + pool + ';' + address + ';' + loaddev + ';' + size; if (tag && tag != "null") { args += ';' + tag; } if (portName && tag != "null") { args += ';' + portName; } if (unitNo && tag != "null") { args += ';' + unitNo; } // Attach zFCP device to node $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : args, msg : 'cmd=chvm-zfcp;out=' + out2Id }, success : updateZProvisionNewStatus }); } } // Done if no disks to add if (diskRows.length < 1 && zfcpRows.length < 1) { $('#' + loaderId).hide(); } } } /** * (6) Set operating system for given node */ else if (lastCmd == 'chvm-disk' || lastCmd == 'chvm-zfcp') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); // If there was an error, quit if (containErrors(prg.html())) { $('#' + loaderId).hide(); } else { // Set cookie for number of disks // One less disk to add var disks2add = $.cookie('disks2add' + out2Id); if (lastCmd == 'chvm-disk') { if (disks2add > 0) { disks2add--; $.cookie('disks2add' + out2Id, disks2add); } } var zfcp2add = $.cookie('zfcp2add' + out2Id); if (lastCmd == 'chvm-zfcp') { if (zfcp2add > 0) { zfcp2add--; $.cookie('zfcp2add' + out2Id, zfcp2add); } } // Only set operating system if there are no more disks to add if (zfcp2add < 1 && disks2add < 1) { // If an operating system image is given var osImage = $('#' + tabId + ' select[name=os]:visible').val(); if (osImage) { // Get operating system, architecture, provision method, and profile var tmp = osImage.split('-'); var os = tmp[0]; var arch = tmp[1]; var profile = tmp[3]; // If the last disk is added $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : node + ';noderes.netboot=zvm;nodetype.os=' + os + ';nodetype.arch=' + arch + ';nodetype.profile=' + profile, msg : 'cmd=noderes;out=' + out2Id }, success : updateZProvisionNewStatus }); } else { $('#' + loaderId).hide(); } } } } /** * (7) Update DHCP */ else if (lastCmd == 'noderes') { // If there was an error, do not continue if (rsp.length) { $('#' + loaderId).hide(); $('#' + statBarId).find('div').append('
(Error) Failed to set operating system
'); } else { $('#' + statBarId).find('div').append('
Operating system for ' + node + ' set
'); $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'makedhcp', tgt : '', args : '-a', msg : 'cmd=makedhcp;out=' + out2Id }, success : updateZProvisionNewStatus }); } } /** * (8) Prepare node for boot */ else if (lastCmd == 'makedhcp') { // Prepare node for boot $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeset', tgt : node, args : 'install', msg : 'cmd=nodeset;out=' + out2Id }, success : updateZProvisionNewStatus }); } /** * (9) Boot node to network */ else if (lastCmd == 'nodeset') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); // If there was an error // Do not continue if (containErrors(prg.html())) { $('#' + loaderId).hide(); } else { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'rnetboot', tgt : node, args : 'ipl=000C', msg : 'cmd=rnetboot;out=' + out2Id }, success : updateZProvisionNewStatus }); } } /** * (10) Done */ else if (lastCmd == 'rnetboot') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); if (prg.html().indexOf('Error') < 0) { $('#' + statBarId).find('div').append('
Open a VNC viewer to see the installation progress.  It might take a couple of minutes before you can connect.
'); } // Hide loader $('#' + loaderId).hide(); } } /** * Update the provision existing node status * * @param data Data returned from HTTP request */ function updateZProvisionExistingStatus(data) { // Get ajax response var rsp = data.rsp; var args = data.msg.split(';'); // Get command invoked var cmd = args[0].replace('cmd=', ''); // Get provision tab instance var inst = args[1].replace('out=', ''); // Get provision tab and status bar ID var statBarId = 'zProvisionStatBar' + inst; var tabId = 'zvmProvisionTab' + inst; /** * (2) Prepare node for boot */ if (cmd == 'nodeadd') { // Get operating system var bootMethod = $('#' + tabId + ' select[name=bootMethod]').val(); // Get nodes that were checked var dTableId = 'zNodesDatatable' + inst; var tgts = getNodesChecked(dTableId); // Prepare node for boot $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeset', tgt : tgts, args : bootMethod, msg : 'cmd=nodeset;out=' + inst }, success : updateZProvisionExistingStatus }); } /** * (3) Boot node from network */ else if (cmd == 'nodeset') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); // If there was an error, do not continue if (containErrors(prg.html())) { var loaderId = 'zProvisionLoader' + inst; $('#' + loaderId).remove(); return; } // Get nodes that were checked var dTableId = 'zNodesDatatable' + inst; var tgts = getNodesChecked(dTableId); // Boot node from network $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'rnetboot', tgt : tgts, args : 'ipl=000C', msg : 'cmd=rnetboot;out=' + inst }, success : updateZProvisionExistingStatus }); } /** * (4) Done */ else if (cmd == 'rnetboot') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); var loaderId = 'zProvisionLoader' + inst; $('#' + loaderId).remove(); } } /** * Update zVM node status * * @param data Data returned from HTTP request */ function updateZNodeStatus(data) { var node = data.msg; var rsp = data.rsp; // Get cookie for number processes performed against this node var actions = $.cookie(node + 'processes'); // One less process actions = actions - 1; $.cookie(node + 'processes', actions); if (actions < 1) { // Hide loader when there are no more processes var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).hide(); } var statBarId = node + 'StatusBar'; // Write ajax response to status bar var prg = writeRsp(rsp, node + ': '); $('#' + statBarId).find('div').append(prg); } /** * Update clone status * * @param data Data returned from HTTP request */ function updateZCloneStatus(data) { // Get ajax response var rsp = data.rsp; var args = data.msg.split(';'); var cmd = args[0].replace('cmd=', ''); // Get provision instance var inst = args[1].replace('inst=', ''); // Get output division ID var out2Id = args[2].replace('out=', ''); /** * (2) Update /etc/hosts */ if (cmd == 'nodeadd') { var node = args[3].replace('node=', ''); // If there was an error, do not continue if (rsp.length) { $('#' + out2Id).find('img').hide(); $('#' + out2Id).find('div').append('
(Error) Failed to create node definition
'); } else { $('#' + out2Id).find('div').append('
Node definition created for ' + node + '
'); // If last node definition was created var tmp = inst.split('/'); if (tmp[0] == tmp[1]) { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'makehosts', tgt : '', args : '', msg : 'cmd=makehosts;inst=' + inst + ';out=' + out2Id }, success : updateZCloneStatus }); } } } /** * (3) Update DNS */ else if (cmd == 'makehosts') { // If there was an error, do not continue if (rsp.length) { $('#' + out2Id).find('img').hide(); $('#' + out2Id).find('div').append('
(Error) Failed to update /etc/hosts
'); } else { $('#' + out2Id).find('div').append('
/etc/hosts updated
'); $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'makedns', tgt : '', args : '', msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id }, success : updateZCloneStatus }); } } /** * (4) Clone */ else if (cmd == 'makedns') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + out2Id).find('div').append(prg); // Get clone tab var tabId = out2Id.replace('CloneStatusBar', 'CloneTab'); // If a node range is given var tgtNodeRange = $('#' + tabId + ' input[name=tgtNode]').val(); var tgtNodes = ''; if (tgtNodeRange.indexOf('-') > -1) { var tmp = tgtNodeRange.split('-'); // Get node base name var nodeBase = tmp[0].match(/[a-zA-Z]+/); // Get the starting index var nodeStart = parseInt(tmp[0].match(/\d+/)); // Get the ending index var nodeEnd = parseInt(tmp[1].match(/\d+/)); for ( var i = nodeStart; i <= nodeEnd; i++) { // Do not append comma for last node if (i == nodeEnd) { tgtNodes += nodeBase + i.toString(); } else { tgtNodes += nodeBase + i.toString() + ','; } } } else { tgtNodes = tgtNodeRange; } // Get other inputs var srcNode = $('#' + tabId + ' input[name=srcNode]').val(); hcp = $('#' + tabId + ' input[name=newHcp]').val(); var group = $('#' + tabId + ' input[name=newGroup]').val(); var diskPool = $('#' + tabId + ' input[name=diskPool]').val(); var diskPw = $('#' + tabId + ' input[name=diskPw]').val(); if (!diskPw) { diskPw = ''; } // Clone $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'mkvm', tgt : tgtNodes, args : srcNode + ';pool=' + diskPool + ';pw=' + diskPw, msg : 'cmd=mkvm;inst=' + inst + ';out=' + out2Id }, success : updateZCloneStatus }); } /** * (5) Done */ else if (cmd == 'mkvm') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + out2Id).find('div').append(prg); // Hide loader $('#' + out2Id).find('img').hide(); } } /** * Get zVM resources * * @param data Data from HTTP request */ function getZResources(data) { var tabId = 'zvmResourceTab'; var info = createInfoBar('Manage storage and networks'); $('#' + tabId).append(info); // Do not continue if there is no output if (data.rsp.length) { // Push hardware control points into an array var node, hcp; var hcpHash = new Object(); for (var i in data.rsp) { node = data.rsp[i][0]; hcp = data.rsp[i][1]; hcpHash[hcp] = 1; } // Create an array for hardware control points var hcps = new Array(); for (var key in hcpHash) { // Get the short host name hcp = key.split('.')[0]; if (jQuery.inArray(hcp, hcps) == -1) hcps.push(hcp); } // Set hardware control point cookie $.cookie('hcp', hcps); // Delete loader $('#' + tabId).find('img[src="images/loader.gif"]').remove(); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); // Create accordion panel for disk diskSpace = new Object(); var resourcesAccordion = $('
'); var diskSection = $('
'); var diskLnk = $('

Disks

').click(function () { // Do not load panel again if it is already loaded if ($('#zvmDiskResource').children().length) { return; } // Resize accordion $('#zvmResourceAccordion').accordion('resize'); // Create a array for hardware control points var hcps = new Array(); if ($.cookie('hcp').indexOf(',') > -1) { hcps = $.cookie('hcp').split(','); } else { hcps.push($.cookie('hcp')); } // Create info bar var info = createInfoBar('Below are disks that are defined in the EXTENT CONTROL file.'); $('#zvmDiskResource').append(info); // Create a tab for each zVM LPAR var zvmDiskTab = new Tab(); zvmDiskTab.init(); $('#zvmDiskResource').append(zvmDiskTab.object()); for (var i in hcps) { var tabId = hcps[i] + 'Disks'; var diskPanel = $('
').append(createLoader('')); zvmDiskTab.add(tabId, hcp2zvm[hcps[i]], diskPanel, false); diskSpace[hcps[i]] = new Object(); // Create a hash to contain zVM pool } // Query disk pool on-select $('#zvmDiskResource').bind('tabsselect', function(event, ui) { var hcp = $(ui.panel).attr('id').replace('Disks', ''); // If disk pool is already loaded, do not load again if ($('#' + hcp2zvm[hcp] + 'DiskDataTable').length) { return; } $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--diskpoolnames', msg : hcp }, success : getDiskPool }); }); // Select the 1st tab if (!$('#' + hcp2zvm[hcps[0]] + 'DiskDataTable').length) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcps[0], args : '--diskpoolnames', msg : hcps[0] }, success : getDiskPool }); } }); // Create accordion panel for zFCP devices zfcpSpace = new Object(); var zfcpSection = $('
'); var zfcpLnk = $('

zFCP

').click(function () { // Do not load panel again if it is already loaded if ($('#zFcpResource').children().length) { return; } // Resize accordion $('#zvmResourceAccordion').accordion('resize'); // Create a array for hardware control points var hcps = new Array(); if ($.cookie('hcp').indexOf(',') > -1) { hcps = $.cookie('hcp').split(','); } else { hcps.push($.cookie('hcp')); } // Resource tab ID var info = createInfoBar('Below are devices that are defined internally in the zFCP pools.'); $('#zFcpResource').append(info); // Create a tab for each zVM LPAR var zFcpTab = new Tab(); zFcpTab.init(); $('#zFcpResource').append(zFcpTab.object()); for (var i in hcps) { var tabId = hcps[i] + 'Zfcps'; var zfcpPanel = $('
').append(createLoader('')); zFcpTab.add(tabId, hcp2zvm[hcps[i]], zfcpPanel, false); zfcpSpace[hcps[i]] = new Object(); // Create a hash to contain zVM pool } // Query zFcp pool on-select $('#zFcpResource').bind('tabsselect', function(event, ui) { var hcp = $(ui.panel).attr('id').replace('Zfcps', ''); // If zFcp pool is already loaded, do not load again if ($('#' + hcp2zvm[hcp] + 'ZfcpDataTable').length) { return; } $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--zfcppoolnames', msg : hcp }, success : getZfcpPool }); }); // Select the 1st tab if (!$('#' + hcp2zvm[hcps[0]] + 'ZfcpDataTable').length) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcps[0], args : '--zfcppoolnames', msg : hcps[0] }, success : getZfcpPool }); } }); // Create accordion panel for network var networkSection = $('
'); var networkLnk = $('

Networks

').click(function () { // Do not load panel again if it is already loaded if ($('#zvmNetworkResource').children().length) { return; } else { $('#zvmNetworkResource').append(createLoader('')); } // Resize accordion $('#zvmResourceAccordion').accordion('resize'); // Create a array for hardware control points var hcps = new Array(); if ($.cookie('hcp').indexOf(',') > -1) { hcps = $.cookie('hcp').split(','); } else { hcps.push($.cookie('hcp')); } for (var i in hcps) { // Gather networks from hardware control points $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcps[i], args : '--getnetworknames', msg : hcps[i] }, success : getNetwork }); } }); resourcesAccordion.append(diskLnk, diskSection, zfcpLnk, zfcpSection, networkLnk, networkSection); // Append accordion to tab $('#' + tabId).append(resourcesAccordion); resourcesAccordion.accordion(); networkLnk.trigger('click'); } } /** * Get node attributes from HTTP request data * * @param propNames Hash table of property names * @param keys Property keys * @param data Data from HTTP request * @return Hash table of property values */ function getAttrs(keys, propNames, data) { // Create hash table for property values var attrs = new Object(); // Go through inventory and separate each property out var curKey = null; // Current property key var addLine; // Add a line to the current property? for ( var i = 1; i < data.length; i++) { addLine = true; // Loop through property keys // Does this line contains one of the properties? for ( var j = 0; j < keys.length; j++) { // Find property name if (data[i].indexOf(propNames[keys[j]]) > -1) { attrs[keys[j]] = new Array(); // Get rid of property name in the line data[i] = data[i].replace(propNames[keys[j]], ''); // Trim the line data[i] = jQuery.trim(data[i]); // Do not insert empty line if (data[i].length > 0) { attrs[keys[j]].push(data[i]); } curKey = keys[j]; addLine = false; // This line belongs to a property } } // Line does not contain a property // Must belong to previous property if (addLine && data[i].length > 1) { data[i] = jQuery.trim(data[i]); attrs[curKey].push(data[i]); } } return attrs; } /** * Create add processor dialog * * @param node Node to add processor to */ function openAddProcDialog(node) { // Create form to add processor var addProcForm = $('
'); // Create info bar var info = createInfoBar('Add a temporary processor to this virtual server.'); addProcForm.append(info); addProcForm.append('
'); addProcForm.append('
'); // Create drop down for processor type var procType = $('
'); procType.append(''); var typeSelect = $(''); typeSelect.append('' + '' + '' + '' ); procType.append(typeSelect); addProcForm.append(procType); // Generate tooltips addProcForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add processor addProcForm.dialog({ title:'Add processor', modal: true, close: function(){ $(this).remove(); }, width: 400, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var node = $(this).find('input[name=procNode]').val(); var address = $(this).find('input[name=procAddress]').val(); var type = $(this).find('select[name=procType]').val(); // If inputs are not complete, show warning message if (!node || !address || !type) { var warn = createWarnBar('Please provide a value for each missing field.'); warn.prependTo($(this)); } else { // Add processor $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--addprocessoractive;' + address + ';' + type, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader var statusId = node + 'StatusBar'; var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).show(); $('#' + statusId).show(); // Close dialog $(this).dialog( "close" ); } }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Create add disk dialog * * @param node Node to add disk to * @param hcp Hardware control point of node */ function openAddDiskDialog(node, hcp) { // Get list of disk pools var cookie = $.cookie(hcp + 'diskpools'); var pools = new Array(); if (cookie) { pools = cookie.split(','); } // Create form to add disk var addDiskForm = $('
'); // Create info bar var info = createInfoBar('Add a ECKD|3390 or FBA|9336 disk to this virtual server.'); addDiskForm.append(info); addDiskForm.append('
'); addDiskForm.append('
'); addDiskForm.append('
'); addDiskForm.append('
'); // Create drop down for disk pool var diskPool = $('
'); diskPool.append(''); var poolSelect = $(''); for ( var i = 0; i < pools.length; i++) { poolSelect.append(''); } diskPool.append(poolSelect); addDiskForm.append(diskPool); // Create drop down for disk mode var diskMode = $('
'); diskMode.append(''); var modeSelect = $(''); modeSelect.append('' + '' + '' + '' + '' + '' + '' ); diskMode.append(modeSelect); addDiskForm.append(diskMode); addDiskForm.append('
'); // Generate tooltips addDiskForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add disk addDiskForm.dialog({ title:'Add disk', modal: true, close: function(){ $(this).remove(); }, width: 400, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var node = $(this).find('input[name=diskNode]').val(); var type = $(this).find('select[name=diskType]').val(); var address = $(this).find('input[name=diskAddress]').val(); var size = $(this).find('input[name=diskSize]').val(); var pool = $(this).find('select[name=diskPool]').val(); var mode = $(this).find('select[name=diskMode]').val(); var password = $(this).find('input[name=diskPassword]').val(); // If inputs are not complete, show warning message if (!node || !type || !address || !size || !pool || !mode) { var warn = createWarnBar('Please provide a value for each missing field.'); warn.prependTo($(this)); } else { // Add disk if (type == '3390') { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--add3390;' + pool + ';' + address + ';' + size + ';' + mode + ';' + password + ';' + password + ';' + password, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader var statusId = node + 'StatusBar'; var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).show(); $('#' + statusId).show(); } else if (type == '9336') { // Default block size for FBA volumes = 512 var blkSize = '512'; $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--add9336;' + pool + ';' + address + ';' + blkSize + ';' + size + ';' + mode + ';' + password + ';' + password + ';' + password, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader var statusId = node + 'StatusBar'; var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).show(); $('#' + statusId).show(); } // Close dialog $(this).dialog( "close" ); } // End of else }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Create add zFCP device dialog * * @param node Node to add disk to * @param hcp Hardware control point of node * @param zvm The z/VM system of node */ function openAddZfcpDialog(node, hcp, zvm) { // Get list of disk pools var cookie = $.cookie(hcp + 'zfcppools'); var pools = new Array(); if (cookie) { pools = cookie.split(','); } // Create form to add disk var addZfcpForm = $('
'); // Create info bar var info = createInfoBar('Add a SCSI|FCP disk to this virtual server.'); addZfcpForm.append(info); addZfcpForm.append('
'); addZfcpForm.append('
'); addZfcpForm.append('
'); addZfcpForm.append('
'); // Create drop down for disk pool var diskPool = $('
'); diskPool.append(''); var poolSelect = $(''); for ( var i = 0; i < pools.length; i++) { poolSelect.append(''); } diskPool.append(poolSelect); addZfcpForm.append(diskPool); // Tag to identify where device will be used addZfcpForm.append('
'); // Create advanced link to set advanced zFCP properties var advancedLnk = $('
'); addZfcpForm.append(advancedLnk); var advanced = $('
').hide(); addZfcpForm.append(advanced); var portName = $('
'); var unitNo = $('
'); advanced.append(portName, unitNo); // Toggle port name and unit number when clicking on advanced link advancedLnk.click(function() { advanced.toggle(); }); // Generate tooltips addZfcpForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add disk addZfcpForm.dialog({ title:'Add zFCP device', modal: true, close: function(){ $(this).remove(); }, width: 400, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var node = $(this).find('input[name=diskNode]').val(); var address = $(this).find('input[name=diskAddress]').val(); var loaddev = $(this).find('input[name=diskLoaddev]'); var size = $(this).find('input[name=diskSize]').val(); var pool = $(this).find('select[name=diskPool]').val(); var tag = $(this).find('input[name=diskTag]').val(); var portName = $(this).find('input[name=diskPortName]').val(); var unitNo = $(this).find('input[name=diskUnitNo]').val(); // If inputs are not complete, show warning message if (!node || !address || !size || !pool) { var warn = createWarnBar('Please provide a value for each missing field.'); warn.prependTo($(this)); } else { if (loaddev.attr('checked')) { loaddev = 1; } else { loaddev = 0; } var args = '--addzfcp||' + pool + '||' + address + '||' + loaddev + '||' + size; if (tag && tag != "null") { args += '||' + tag; } else { args += '|| ""'; } if ((portName && portName != "null") && (unitNo && unitNo != "null")) { args += '||' + portName + '||' + unitNo; } // Add zFCP device $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : args, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader var statusId = node + 'StatusBar'; var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).show(); $('#' + statusId).show(); // Close dialog $(this).dialog( "close" ); } }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Create dedicate device dialog * * @param node Node to dedicate device to * @param hcp Hardware control point of node */ function openDedicateDeviceDialog(node, hcp) { // Create form to add disk var dedicateForm = $('
'); // Create info bar var info = createInfoBar('Add a dedicated device to the configuration'); dedicateForm.append(info); dedicateForm.append('
'); dedicateForm.append('
'); dedicateForm.append('
'); dedicateForm.append('
'); // Generate tooltips dedicateForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add dedicated device dedicateForm.dialog({ title:'Add dedicated device', modal: true, close: function(){ $(this).remove(); }, width: 400, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var node = $(this).find('input[name=diskNode]').val(); var vAddress = $(this).find('input[name=virtualAddress]').val(); var rAddress = $(this).find('input[name=realAddress]').val() var mode = $(this).find('select[name=mode]').val(); // If inputs are not complete, show warning message if (!node || !vAddress || !rAddress || !mode) { var warn = createWarnBar('Please provide a value for each missing field.'); warn.prependTo($(this)); } else { var args = '--dedicatedevice;' + vAddress + ';' + rAddress + ';' + mode; // Add zFCP device $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : args, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader var statusId = node + 'StatusBar'; var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).show(); $('#' + statusId).show(); // Close dialog $(this).dialog( "close" ); } }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Create add ECKD to system dialog * * @param hcp Hardware control point of node */ function openAddEckd2SystemDialog(hcp) { var dialogId = 'zvmAddEckd2System'; // Create form to add disk var addE2SForm = $('
'); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); // Append options for hardware control points systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } // Create info bar var info = createInfoBar('Dynamically add an ECKD disk to a running z/VM system.'); addE2SForm.append(info); addE2SForm.append(system); addE2SForm.append('
'); // Generate tooltips addE2SForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add disk addE2SForm.dialog({ title:'Add ECKD to system', modal: true, close: function(){ $(this).remove(); }, width: 420, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); var system = $(this).find('select[name=system]').val(); var devnum = $(this).find('input[name=devNum]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'input[name=devNum]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } if (!ready) { // Show warning message var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : system, args : "--addeckd;" + devnum, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Create add page or spool dialog * * @param hcp Hardware control point of node */ function openAddPageSpoolDialog(hcp) { var dialogId = 'zvmAddPageSpool'; // Create form to add disk var addPageSpoolForm = $('
'); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); // Append options for hardware control points systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } // Create info bar var info = createInfoBar('Indicate a full-pack minidisk is to be shared by the users of many real and virtual systems.'); addPageSpoolForm.append(info); var diskFS = $('
Disk
'); addPageSpoolForm.append(diskFS); var diskAttr = $('
'); diskFS.append($('
')); diskFS.append(diskAttr); diskAttr.append(system); diskAttr.append('
'); diskAttr.append('
'); diskAttr.append('
'); // Generate tooltips addPageSpoolForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add disk addPageSpoolForm.dialog({ title:'Add page or spool', modal: true, close: function(){ $(this).remove(); }, width: 500, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); var system = $(this).find('select[name=system]').val(); var volAddr = $(this).find('input[name=volAddr]').val(); var volLabel = $(this).find('input[name=volLabel]').val(); var volUse = $(this).find('select[name=volUse]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'input[name=volAddr]', 'input[name=volLabel]', 'select[name=volUse]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } if (!ready) { // Show warning message var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); var pageSpoolArgs = volAddr + ";" + volLabel + ";" + volUse; $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : system, args : '--addpagespool;' + pageSpoolArgs, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Open dialog to share disk * * @param disks2share Disks selected in table */ function openShareDiskDialog(disks2share) { // Create form to share disk var dialogId = 'zvmShareDisk'; var shareDiskForm = $('
'); var args = disks2share.split(';'); var tgtHcp = args[0]; var tgtVol = args[1]; if (!tgtVol || tgtVol == "undefined") tgtVol = ""; // Create info bar var info = createInfoBar('Indicate a full-pack minidisk is to be shared by the users of many real and virtual systems.'); shareDiskForm.append(info); // Set region input based on those selected on table (if any) var node = $('
'); var volAddr = $('
'); var shareEnable = $('
'); shareDiskForm.append(node, volAddr, shareEnable); // Generate tooltips shareDiskForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to delete disk shareDiskForm.dialog({ title:'Share disk', modal: true, close: function(){ $(this).remove(); }, width: 500, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var node = $(this).find('input[name=node]').val(); var volAddr = $(this).find('input[name=volAddr]').val(); var shareEnable = $(this).find('select[name=shareEnable]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('input[name=node]', 'input[name=volAddr]', 'select[name=shareEnable]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } if (!ready) { // Show warning message var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); // Remove disk from pool $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : "--sharevolume;" + volAddr + ";" + shareEnable, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Create add SCSI 2 system dialog * * @param hcp Hardware control point of node */ function openAddScsi2SystemDialog(hcp) { var dialogId = 'zvmAddScsi2System'; // Create form to add disk var addS2SForm = $('
'); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); // Create info bar var info = createInfoBar('Dynamically add an SCSI disk to a running z/VM system as an EDEV.'); addS2SForm.append(info); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); // Append options for hardware control points systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } var devNo = $('
'); var devPathLabel = $(''); var devPathCount = 1; var pathDiv = $('
'); var devPathDiv = $('
'); var devPathTable = $('
'); var devPathHeader = $(' FCP Device WWPN LUN'); // Adjust header width devPathHeader.find('th').css({ 'width' : '120px' }); devPathHeader.find('th').eq(0).css({ 'width' : '20px' }); var devPathBody = $(''); var devPathFooter = $(''); // Create a row var devPathRow = $(''); // Add blank column (remove button replacement) devPathRow.append(''); // Create FCP device number input var fcpDevNum = $(''); devPathRow.append(fcpDevNum); // Create FCP WWPN input var fcpWwpn = $(''); devPathRow.append(fcpWwpn); if ($.cookie('zvms')) { zvms = $.cookie('zvms').split(','); var zvm; for (var i in zvms) { var args = zvms[i].split(':'); var zvm = args[0].toLowerCase(); var iHcp = args[1]; } } // Create FCP LUN input var fcpLun = $(''); devPathRow.append(fcpLun); devPathBody.append(devPathRow); var addDevPathLink = $('+ Add path'); addDevPathLink.bind('click', function(event){ devPathCount = devPathCount + 1; // Create a row var devPathRow = $(''); // Add remove button var removeBtn = $('').css({ "float": "left", "cursor": "pointer" }); var col = $('').append(removeBtn); removeBtn.bind('click', function(event) { $(this).parent().parent().remove(); }); devPathRow.append(col); // Create FCP device number input var fcpDevNum = $(''); devPathRow.append(fcpDevNum); // Create FCP WWPN input var fcpWwpn = $(''); devPathRow.append(fcpWwpn); // Create FCP LUN input var fcpLun = $(''); devPathRow.append(fcpLun); devPathBody.append(devPathRow); // Generate tooltips addS2SForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); }); devPathFooter.append(addDevPathLink); devPathTable.append(devPathHeader); devPathTable.append(devPathBody); devPathTable.append(devPathFooter); devPathDiv.append(devPathLabel); devPathDiv.append(devPathTable); var option = $('
'); var persist = $('
'); addS2SForm.append(system, devNo, devPathDiv, option, persist); // Generate tooltips addS2SForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); addS2SForm.find('div input[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.7, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" } }); // Open dialog to add disk addS2SForm.dialog({ title:'Add SCSI to running system', modal: true, close: function(){ $(this).remove(); }, width: 675, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); var system = $(this).find('select[name=system]').val(); var devNo = $(this).find('input[name=devNo]').val(); var pathArray = ""; $('.devPath').each(function(index) { pathArray += $(this).find('input[name=fcpDevNum]').val() + ','; pathArray += $(this).find('input[name=fcpWwpn]').val() + ','; pathArray += $(this).find('input[name=fcpLun]').val() + ';'; }); var option = $(this).find('select[name=option]').val(); var persist = $(this).find('select[name=persist]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'input[name=devNum]', 'select[name=option]', 'select[name=persist]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } // Show warning message if (!ready || !pathArray) { var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : system, args : "--addscsi||" + devNo + "||'" + pathArray + "'||" + option + "||" + persist, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Delete a real SCSI disk * * @param hcp Hardware control point of node */ function openRemoveScsiDialog(hcp) { var dialogId = 'zvmRemoveScsiDialog'; // Create form to add disk var removeScsiForm = $('
'); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); // Append options for hardware control points systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } // Create info bar var info = createInfoBar('Delete a real SCSI disk'); removeScsiForm.append(info, system); removeScsiForm.append('
'); removeScsiForm.append('
'); addNicForm.append('
'); // Create drop down for NIC types var nicType = $('
'); nicType.append(''); var nicTypeSelect = $(''); nicTypeSelect.append('' + '' + '' ); nicType.append(nicTypeSelect); addNicForm.append(nicType); // Create drop down for network types var networkType = $('
'); networkType.append(''); var networkTypeSelect = $(''); networkTypeSelect.append('' + '' + '' ); networkType.append(networkTypeSelect); addNicForm.append(networkType); // Create drop down for network names var gLansQdioSelect = $(''); var gLansHipersSelect = $(''); var vswitchSelect = $(''); for ( var i = 0; i < networks.length; i++) { var network = networks[i].split(' '); var networkOption = $(''); if (network[0] == 'VSWITCH') { vswitchSelect.append(networkOption); } else if (network[0] == 'LAN:QDIO') { gLansQdioSelect.append(networkOption); } else if (network[0] == 'LAN:HIPERS') { gLansHipersSelect.append(networkOption); } } // Hide network name drop downs until the NIC type and network type is selected // QDIO Guest LAN drop down var guestLanQdio = $('
').hide(); guestLanQdio.append(''); guestLanQdio.append(gLansQdioSelect); addNicForm.append(guestLanQdio); // HIPERS Guest LAN drop down var guestLanHipers = $('
').hide(); guestLanHipers.append(''); guestLanHipers.append(gLansHipersSelect); addNicForm.append(guestLanHipers); // VSWITCH drop down var vswitch = $('
').hide(); vswitch.append(''); vswitch.append(vswitchSelect); addNicForm.append(vswitch); // Show network names on change networkTypeSelect.change(function(){ // Remove any warning messages $(this).parent().parent().find('.ui-state-error').remove(); // Get NIC type and network type var nicType = $(this).parent().parent().find('select[name=nicType]').val(); var networkType = $(this).val(); // Hide network name drop downs var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent(); var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent(); var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent(); guestLanQdio.hide(); guestLanHipers.hide(); vswitch.hide(); // Show correct network name if (networkType == 'Guest LAN' && nicType == 'QDIO') { guestLanQdio.show(); } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') { guestLanHipers.show(); } else if (networkType == 'Virtual Switch') { if (nicType == 'QDIO') { vswitch.show(); } else { // No such thing as HIPERS VSWITCH var warn = createWarnBar('The selected choices are not valid.'); warn.prependTo($(this).parent().parent()); } } }); // Show network names on change nicTypeSelect.change(function(){ // Remove any warning messages $(this).parent().parent().find('.ui-state-error').remove(); // Get NIC type and network type var nicType = $(this).val(); var networkType = $(this).parent().parent().find('select[name=nicNetworkType]').val(); // Hide network name drop downs var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent(); var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent(); var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent(); guestLanQdio.hide(); guestLanHipers.hide(); vswitch.hide(); // Show correct network name if (networkType == 'Guest LAN' && nicType == 'QDIO') { guestLanQdio.show(); } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') { guestLanHipers.show(); } else if (networkType == 'Virtual Switch') { if (nicType == 'QDIO') { vswitch.show(); } else { // No such thing as HIPERS VSWITCH var warn = createWarnBar('The selected choices are not valid.'); warn.prependTo($(this).parent().parent()); } } }); // Generate tooltips addNicForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add NIC addNicForm.dialog({ title:'Add NIC', modal: true, close: function(){ $(this).remove(); }, width: 400, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); var ready = true; var errMsg = ''; // Get inputs var node = $(this).find('input[name=nicNode]').val(); var nicType = $(this).find('select[name=nicType]').val(); var networkType = $(this).find('select[name=nicNetworkType]').val(); var address = $(this).find('input[name=nicAddress]').val(); // If inputs are not complete, show warning message if (!node || !nicType || !networkType || !address) { errMsg = 'Please provide a value for each missing field.
'; ready = false; } // If a HIPERS VSWITCH is selected, show warning message if (nicType == 'HiperSockets' && networkType == 'Virtual Switch') { errMsg += 'The selected choices are not valid.'; ready = false; } // If there are errors if (!ready) { // Show warning message var warn = createWarnBar(errMsg); warn.prependTo($(this)); } else { // Add guest LAN if (networkType == 'Guest LAN') { var temp; if (nicType == 'QDIO') { temp = $(this).find('select[name=nicLanQdioName]').val().split(' '); } else { temp = $(this).find('select[name=nicLanHipersName]').val().split(' '); } var lanOwner = temp[0]; var lanName = temp[1]; $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--addnic;' + address + ';' + nicType + ';3', msg : 'node=' + node + ';addr=' + address + ';lan=' + lanName + ';owner=' + lanOwner }, success : connect2GuestLan }); } // Add virtual switch else if (networkType == 'Virtual Switch' && nicType == 'QDIO') { var temp = $(this).find('select[name=nicVSwitchName]').val().split(' '); var vswitchName = temp[1]; $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--addnic;' + address + ';' + nicType + ';3', msg : 'node=' + node + ';addr=' + address + ';vsw=' + vswitchName }, success : connect2VSwitch }); } // Increment node process incrementNodeProcess(node); // Show loader $('#' + node + 'StatusBarLoader').show(); $('#' + node + 'StatusBar').show(); // Close dialog $(this).dialog( "close" ); } // End of else }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Create add vSwitch/VLAN dialog * * @param hcp Hardware control point of node */ function openAddVswitchVlanDialog(hcp) { var dialogId = 'zvmAddVswitchVlan'; // Create form to add disk var addVswitchForm = $('
'); // Create info bar var info = createInfoBar('Create a virtual switch or virtual network LAN.'); var netFS = $('
'); var netLegend = $('Network'); netFS.append(netLegend); var typeFS = $('
').hide(); var typeLegend = $('Network'); typeFS.append(typeLegend); addVswitchForm.append(info, netFS, typeFS); var netAttr = $('
'); netFS.append($('
')); netFS.append(netAttr); var networkTypeDiv = $('
'); var networkType = $('
'); networkTypeDiv.append(networkType) netAttr.append(networkTypeDiv); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); netAttr.append(system); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } var typeAttr = $('
'); typeFS.append($('
')); typeFS.append(typeAttr); // Create vSwitch parameters var vswitchOptions = $('
').hide(); vswitchOptions.append($('
')); vswitchOptions.append($('
')); vswitchOptions.append($('
')); // Create an advanced link to configure optional network settings var advancedLnk = $('
'); vswitchOptions.append(advancedLnk); var advanced = $('
').hide(); vswitchOptions.append(advanced); // Show IP address and hostname inputs on-click advancedLnk.click(function() { advanced.toggle(); }); advanced.append($('
')); advanced.append($('
')); advanced.append($('
')); advanced.append($('
')); advanced.append($('
')); advanced.append($('
')); advanced.append($('
')); advanced.append($('
')); advanced.append($('
')); // Create VLAN parameters var vlanOptions = $('
').hide(); vlanOptions.append($('
')); vlanOptions.append($('
')); vlanOptions.append($('
')); vlanOptions.append($('
')); typeAttr.append(vswitchOptions, vlanOptions); networkType.change(function() { typeFS.show(); if ($(this).val() == "vswitch") { typeFS.find("legend").text("vSwitch"); vswitchOptions.show(); vlanOptions.hide(); } else if ($(this).val() == "vlan") { typeFS.find("legend").text("VLAN"); vswitchOptions.hide(); vlanOptions.show(); } else { typeFS.find("legend").text(""); vswitchOptions.hide(); vlanOptions.hide(); typeFS.hide(); } }); // Generate tooltips addVswitchForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add vSwitch or VLAN addVswitchForm.dialog({ title:'Add vSwitch or VLAN', modal: true, close: function() { $(this).remove(); }, width: 750, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); var networkType = $(this).find('select[name=networkType]').val(); if (networkType == "vswitch") { var networkArgs = "--addvswitch;"; var system = $(this).find('select[name=system]').val(); var switchName = $(this).find('input[name=switchName]').val(); var deviceAddress = $(this).find('input[name=deviceAddress]').val(); var portName = switchName; var controllerName = $(this).find('input[name=controllerName]').val(); var connection = $(this).find('select[name=connection]').val(); var queueMemoryLimit = $(this).find('input[name=queueMemoryLimit]').val(); var routingValue = $(this).find('select[name=routingValue]').val(); var transportType = $(this).find('select[name=transportType]').val(); var vlanId = $(this).find('input[name=vlanId]').val(); var portType = $(this).find('select[name=portType]').val(); var updateSysConfig = $(this).find('select[name=updateSysConfig]').val(); var gvrp = $(this).find('select[name=gvrp]').val(); var nativeVlanId = $(this).find('input[name=nativeVlanId]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'input[name=switchName]', 'input[name=deviceAddress]', 'input[name=controllerName]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } // Show warning message if (!ready) { var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } if (switchName) networkArgs += switchName + ";"; if (deviceAddress) networkArgs += deviceAddress + ";"; if (portName) networkArgs += portName + ";"; if (controllerName) networkArgs += controllerName + ";"; // Optional parameters if (connection) networkArgs += connection + ";"; if (queueMemoryLimit) networkArgs += queueMemoryLimit + ";"; if (routingValue) networkArgs += routingValue + ";"; if (transportType) networkArgs += transportType + ";"; if (vlanId) networkArgs += vlanId + ";"; if (portType) networkArgs += portType + ";"; if (updateSysConfig) networkArgs += updateSysConfig + ";"; if (gvrp) networkArgs += gvrp + ";"; if (nativeVlanId) networkArgs += nativeVlanId + ";"; networkArgs = networkArgs.substring(0, networkArgs.length - 1); // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : system, args : networkArgs, msg : dialogId }, success : updateResourceDialog }); } else if (networkType == "vlan") { var networkArgs = "--addvlan;"; var system = $(this).find('select[name=system]').val(); var vlanName = $(this).find('input[name=vlanName]').val(); var vlanOwner = $(this).find('input[name=vlanOwner]').val(); var vlanType = $(this).find('select[name=vlanType]').val(); var vlanTransport = $(this).find('select[name=vlanTransport]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'input[name=vlanName]', 'input[name=vlanOwner]', 'select[name=vlanType]', 'select[name=vlanTransport]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } // Show warning message if (!ready) { var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Ethernet Hipersockets are not supported if (vlanTransport == "2") { var warn = createWarnBar('Ethernet Hipersockets are not supported'); warn.prependTo($(this)); return; } networkArgs += vlanName + ";"; networkArgs += vlanOwner + ";"; networkArgs += vlanType + ";"; networkArgs += vlanTransport; // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : system, args : networkArgs, msg : dialogId }, success : updateResourceDialog }); } // End of else if }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Open dialog to delete network * * @param node type name for removing network */ function openRemoveVswitchVlanDialog(networkList) { var names = ''; for (var i in networkList) { var networkArgs = networkList[i].split(';'); networkArgs[2] = jQuery.trim(networkArgs[2]); names += networkArgs[2] + ', '; } names = names.substring(0, names.length - 2); // Delete last two characters var confirmDialog = $('

Are you sure you want to remove ' + names + '?

'); confirmDialog.dialog({ title: "Confirm", modal: true, width: 400, buttons: { "Ok": function() { for (var i in networkList) { var networkArgs = networkList[i].split(';'); var node = networkArgs[0]; var type = networkArgs[1]; var name = jQuery.trim(networkArgs[2]); var owner = networkArgs[3]; if (type.indexOf("VSWITCH") != -1) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : node, args : '--removevswitch;' + name, msg : '' }, success: function(data) { var infoMsg; // Create info message if (jQuery.isArray(data.rsp)) { infoMsg = ''; for (var i in data.rsp) { infoMsg += data.rsp[i] + '
'; } } else { infoMsg = data.rsp; } openDialog("info", infoMsg); } }); } else if (type.indexOf("LAN") != -1) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : node, args : '--removevlan;' + name + ';' + owner, msg : '' }, success: function(data) { var infoMsg; // Create info message if (jQuery.isArray(data.rsp)) { infoMsg = ''; for (var i in data.rsp) { infoMsg += data.rsp[i] + '
'; } } else { infoMsg = data.rsp; } openDialog("info", infoMsg); } }); } } $(this).dialog("close"); }, "Cancel": function() { $(this).dialog("close"); } } }); } /** * Remove processor * * @param node Node where processor is attached * @param address Virtual address of processor */ function removeProcessor(node, address) { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--removeprocessor;' + address, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader $('#' + node + 'StatusBarLoader').show(); $('#' + node + 'StatusBar').show(); } /** * Remove disk * * @param node Node where disk is attached * @param address Virtual address of disk */ function removeDisk(node, address) { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--removedisk;' + address, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader $('#' + node + 'StatusBarLoader').show(); $('#' + node + 'StatusBar').show(); } /** * Remove zFCP device * * @param node Node where disk is attached * @param address Virtual address of zFCP device * @param wwpn World wide port name of zFCP device * @param lun Logical unit number of zFCP device */ function removeZfcp(node, address, wwpn, lun) { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--removezfcp||' + address + '||' + wwpn + '||' + lun, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader $('#' + node + 'StatusBarLoader').show(); $('#' + node + 'StatusBar').show(); } /** * Remove NIC * * @param node Node where NIC is attached * @param address Virtual address of NIC */ function removeNic(node, nic) { var args = nic.split('.'); var address = args[0]; $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--removenic;' + address, msg : node }, success : updateZNodeStatus }); // Increment node process incrementNodeProcess(node); // Show loader $('#' + node + 'StatusBarLoader').show(); $('#' + node + 'StatusBar').show(); } /** * Set a cookie for the network names of a given node * * @param data Data from HTTP request */ function setNetworkCookies(data) { if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { var node = data.msg; var networks = data.rsp[0].split(node + ': '); // Set cookie to expire in 60 minutes var exDate = new Date(); exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); $.cookie(node + 'networks', networks, { expires: exDate }); } } /** * Get contents of each disk pool * * @param data HTTP request data */ function getDiskPool(data) { if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { var hcp = data.msg; var pools = data.rsp[0].split(hcp + ': '); // Get contents of each disk pool for (var i in pools) { pools[i] = jQuery.trim(pools[i]); if (pools[i]) { diskSpace[hcp][pools[i]] = new Object(); // Create hash to contain free and used space // Get used space $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--diskpool;' + pools[i] + ';used', msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=used' }, success : loadDiskPoolTable }); // Get free space $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--diskpool;' + pools[i] + ';free', msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=free' }, success : loadDiskPoolTable }); } // End of if } // End of for } else { // Load empty table var data = { msg : 'hcp=' + data.msg + ';', rsp : [] }; loadDiskPoolTable(data); } } /** * Get contents of each zFCP pool * * @param data HTTP request data */ function getZfcpPool(data) { if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { var hcp = data.msg; var pools = data.rsp[0].split(hcp + ': '); // Get contents of each disk pool for (var i in pools) { pools[i] = jQuery.trim(pools[i]); if (pools[i]) { zfcpSpace[hcp][pools[i]] = new Object(); // Create hash to contain free and used space // Query used and free space $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--zfcppool;' + pools[i] + ';all', msg : 'hcp=' + hcp + ';pool=' + pools[i] }, success : loadZfcpPoolTable }); } // End of if } // End of for } else { // Load empty table var data = { msg : 'hcp=' + data.msg + ';', rsp : [] }; loadZfcpPoolTable(data); } } /** * Get details of each network * * @param data HTTP request data */ function getNetwork(data) { if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { var hcp = data.msg; var networks = data.rsp[0].split(hcp + ': '); // Loop through each network for ( var i = 1; i < networks.length; i++) { var args = networks[i].split(' '); var type = args[0]; var name = args[2]; // Get network details $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--getnetwork;' + name, msg : 'hcp=' + hcp + ';type=' + type + ';network=' + name }, success : loadNetworkTable }); } // End of for } // End of if } /** * Load disk pool contents into a table * * @param data HTTP request data */ function loadDiskPoolTable(data) { var hcp2zvm = new Object(); var args, hcp, pool, stat, tmp; if (data.rsp.length) { // Do not continue if the call failed if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) { return; } // Obtain mapping for zHCP to zVM system hcp2zvm = getHcpZvmHash(); args = data.msg.split(';'); hcp = args[0].replace('hcp=', ''); pool = args[1].replace('pool=', ''); stat = jQuery.trim(args[2].replace('stat=', '')); tmp = data.rsp[0].split(hcp + ': '); // Initialize free or used space in hash diskSpace[hcp][pool][stat] = 0; } else { args = data.msg.split(';'); // Provide empty values so the table will be generated hcp = args[0].replace('hcp=', ''); pool = ''; stat = ''; tmp = new Array(); } // Remove loader var panelId = hcp + 'Disks'; $('#' + panelId).find('img[src="images/loader.gif"]').remove(); // Get datatable var tableId = hcp2zvm[hcp] + 'DiskDataTable'; var dTable; if (!$('#' + tableId).length) { // Create a datatable var table = new DataTable(tableId); // Resource headers: volume ID, device type, start address, and size table.init( [ '', 'z/VM', 'Pool', 'Status', 'Volume', 'Device type', 'Starting address', 'Size' ]); // Append datatable to panel $('#' + hcp + 'Disks').append(table.object()); // Turn into datatable dTable = $('#' + tableId).dataTable({ 'iDisplayLength': 50, "bScrollCollapse": true, "sScrollY": "400px", "sScrollX": "110%", "bAutoWidth": true, "oLanguage": { "oPaginate": { "sNext": "", "sPrevious": "" } } }); } else { dTable = $('#' + tableId).dataTable(); } // Skip index 0 and 1 because it contains nothing for (var i = 2; i < tmp.length; i++) { tmp[i] = jQuery.trim(tmp[i]); var diskAttrs = tmp[i].split(' '); var key = hcp2zvm[hcp] + "-" + pool + "-" + diskAttrs[0]; var type = diskAttrs[1]; // Calculate disk size var size; if (type.indexOf('3390') != -1) { size = convertCylinders2Gb(parseInt(diskAttrs[3])); } else if (type.indexOf('9336') != -1) { size = convertBlocks2Gb(parseInt(diskAttrs[3])) } else { size = 0; } dTable.fnAddData( [ '', hcp2zvm[hcp], pool, stat, diskAttrs[0], type, diskAttrs[2], diskAttrs[3] + " (" + size + "G)" ]); // Add up the free or used size diskSpace[hcp][pool][stat] += size; } // Plot bar chart when all data is gathered var plotBarChart = true; for (var p in diskSpace[hcp]) { if (!('free' in diskSpace[hcp][p]) || !('used' in diskSpace[hcp][p])) { plotBarChart = false; } } if (plotBarChart) { // Bar chart data points var ticks = new Array(); var free = new Array(); var used = new Array(); for (var p in diskSpace[hcp]) { ticks.push(p); free.push(diskSpace[hcp][p]['free']); used.push(diskSpace[hcp][p]['used']); } // Create bar chart, only when there is data var plot; var panelId = hcp + 'Disks'; $('#' + panelId).prepend($('
')); plot = $.jqplot(hcp + 'DiskChart', [used, free], { title: '', stackSeries: true, seriesDefaults: { renderer: $.jqplot.BarRenderer, rendererOptions: {barMargin: 25}, pointLabels: {show: true} }, series: [ {label: 'Used'}, {label: 'Free'} ], axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks }, yaxis: { tickOptions: {formatString: '%dG'} } }, legend: { show: true, placement: 'outsideGrid' } }); } // Create actions menu var menuId = hcp2zvm[hcp] + 'DiskResourceActions'; if (!$('#' + menuId).length) { // Empty filter area $('#' + tableId + '_length').empty(); // Add disk to pool var addLnk = $('Add'); addLnk.bind('click', function(event){ openAddDisk2PoolDialog(); }); // Delete disk from pool var removeLnk = $('Remove'); removeLnk.bind('click', function(event){ var disks = getNodesChecked(tableId); openRemoveDiskFromPoolDialog(disks); }); // Refresh table var refreshLnk = $('Refresh'); refreshLnk.bind('click', function(event) { $('#' + panelId).empty().append(createLoader('')); // Query the disk pools $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--diskpoolnames', msg : hcp }, success : getDiskPool }); }); // Add ECKD to system var addEckdLnk = $('Add ECKD'); addEckdLnk.bind('click', function(event){ openAddEckd2SystemDialog(hcp); }); // Add Page or Spool var addPageSpoolLnk = $('Add page/spool') addPageSpoolLnk.bind('click', function(event){ openAddPageSpoolDialog(hcp); }); // Add EDEV to system var addEdevLnk = $('Add EDEV'); addEdevLnk.bind('click', function(event){ openAddScsi2SystemDialog(hcp); }); // Remove EDEV var removeEdevLnk = $('Remove EDEV'); removeEdevLnk.bind('click', function(event){ openRemoveScsiDialog(hcp); }); // Indicate disk is to be shared with various users var shareLnk = $('Share disk'); shareLnk.bind('click', function(event){ var disks = getNodesChecked(tableId); openShareDiskDialog(disks); }); // Advanced menu var advancedLnk = 'Advanced'; var advancedMenu = createMenu([addEckdLnk, addPageSpoolLnk, addEdevLnk, removeEdevLnk, shareLnk]); // Create action bar var actionBar = $('').css("width", "450px"); // Create an action menu var actionsMenu = createMenu([refreshLnk, addLnk, removeLnk, [advancedLnk, advancedMenu]]); actionsMenu.superfish(); actionsMenu.css('display', 'inline-block'); actionBar.append(actionsMenu); // Set correct theme for action menu actionsMenu.find('li').hover(function() { setMenu2Theme($(this)); }, function() { setMenu2Normal($(this)); }); // Create a division to hold actions menu var menuDiv = $(''); $('#' + tableId + '_length').prepend(menuDiv); $('#' + tableId + '_length').css({ 'padding': '0px', 'width': '460px' }); $('#' + tableId + '_filter').css('padding', '10px'); menuDiv.append(actionBar); } // Resize accordion $('#zvmResourceAccordion').accordion('resize'); } /** * Load zFCP pool contents into a table * * @param data HTTP request data */ function loadZfcpPoolTable(data) { var hcp2zvm = new Object(); var args, hcp, pool, tmp; if (data.rsp.length) { // Do not continue if the call failed if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) { return; } // Obtain mapping for zHCP to zVM system hcp2zvm = getHcpZvmHash(); args = data.msg.split(';'); hcp = args[0].replace('hcp=', ''); pool = args[1].replace('pool=', ''); tmp = data.rsp[0].split(hcp + ': '); // Initialize free, reserved, and used space in hash zfcpSpace[hcp][pool]['free'] = 0; zfcpSpace[hcp][pool]['used'] = 0; zfcpSpace[hcp][pool]['reserved'] = 0; } else { args = data.msg.split(';'); // Provide empty values so the table will be generated hcp = args[0].replace('hcp=', ''); pool = ''; tmp = new Array(); } // Remove loader var panelId = hcp + 'Zfcps'; $('#' + panelId).find('img[src="images/loader.gif"]').remove(); // Get datatable var tableId = hcp2zvm[hcp] + 'ZfcpDataTable'; var dTable; if (!$('#' + tableId).length) { // Create a datatable var table = new DataTable(tableId); // Resource headers: status, WWPN, LUN, size, owner, channel, tag table.init([ '', 'z/VM', 'Pool', 'Status', 'Port name', 'Unit number', 'Size', 'Range', 'Owner', 'Channel', 'Tag' ]); // Append datatable to panel $('#' + panelId).append(table.object()); // Turn into datatable dTable = $('#' + tableId).dataTable({ 'iDisplayLength': 50, "bScrollCollapse": true, "sScrollY": "400px", "sScrollX": "110%", "bAutoWidth": true, "oLanguage": { "oPaginate": { "sNext": "", "sPrevious": "" } } }); } else { dTable = $('#' + tableId).dataTable(); } if (data.rsp.length) { // Skip index 0 and 1 because it contains nothing var key = ""; for (var i = 2; i < tmp.length; i++) { tmp[i] = jQuery.trim(tmp[i]); var diskAttrs = tmp[i].split(','); diskAttrs[0] = diskAttrs[0].toLowerCase(); var key = hcp2zvm[hcp] + '-' + pool + '-' + diskAttrs[2]; dTable.fnAddData([ '', hcp2zvm[hcp], pool, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3], diskAttrs[4], diskAttrs[5], diskAttrs[6], diskAttrs[7] ]); // Add up the free or used size zfcpSpace[hcp][pool][diskAttrs[0]] += convertString2Gb(diskAttrs[3]); } // Bar chart data points var ticks = new Array(); var free = new Array(); var used = new Array(); for (var pool in zfcpSpace[hcp]) { ticks.push(pool); free.push(zfcpSpace[hcp][pool]['free']); if ('reserved' in zfcpSpace[hcp][pool]) { used.push(zfcpSpace[hcp][pool]['used'] + zfcpSpace[hcp][pool]['reserved']); } else { used.push(zfcpSpace[hcp][pool]['used']); } } // Create bar chart, only when there is data if ((used.length || free.length) && ticks.length) { $('#' + panelId).prepend($('
')); var plot = $.jqplot(hcp + 'ZfcpChart', [used, free], { title: '', stackSeries: true, seriesDefaults: { renderer: $.jqplot.BarRenderer, rendererOptions: {barMargin: 25}, pointLabels: {show: true} }, series: [ {label: 'Used'}, {label: 'Free'} ], axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer, ticks: ticks }, yaxis: { tickOptions: {formatString: '%dG'} } }, legend: { show: true, placement: 'outsideGrid' } }); } } // Create actions menu var menuId = hcp2zvm[hcp] + 'ZfcpResourceActions'; if (!$('#' + menuId).length) { // Empty filter area $('#' + tableId + '_length').empty(); // Add disk to pool var addLnk = $('Add'); addLnk.bind('click', function(event){ openAddZfcp2PoolDialog(); }); // Delete disk from pool var removeLnk = $('Remove'); removeLnk.bind('click', function(event){ var disks = getNodesChecked(tableId); openRemoveZfcpFromPoolDialog(disks); }); // Refresh table var refreshLnk = $('Refresh'); refreshLnk.bind('click', function(event){ $('#' + panelId).empty().append(createLoader('')); // Query the disk pools $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcp, args : '--zfcppoolnames', msg : hcp }, success : getZfcpPool }); }); // Create action bar var actionBar = $('
').css("width", "450px"); // Create an action menu var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]); actionsMenu.superfish(); actionsMenu.css('display', 'inline-block'); actionBar.append(actionsMenu); // Set correct theme for action menu actionsMenu.find('li').hover(function() { setMenu2Theme($(this)); }, function() { setMenu2Normal($(this)); }); // Create a division to hold actions menu var menuDiv = $(''); $('#' + tableId + '_length').prepend(menuDiv); $('#' + tableId + '_length').css({ 'padding': '0px', 'width': '460px' }); $('#' + tableId + '_filter').css('padding', '10px'); menuDiv.append(actionBar); } // Resize accordion $('#zvmResourceAccordion').accordion('resize'); } /** * Open dialog to remove disk from pool * * @param disks2remove Disks selected in table */ function openRemoveDiskFromPoolDialog(disks2remove) { // Create form to delete disk from pool var dialogId = 'zvmDeleteDiskFromPool'; var deleteDiskForm = $('
'); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); var disks = new Array(); if (disks2remove.indexOf(',') > -1) disks = disks2remove.split(','); else disks.push(disks2remove); // Pick the last zHCP and pool it finds var args, tgtHcp = "", tgtPool = "", tgtVol = ""; for (var i in disks) { args = disks[i].split('-'); tgtHcp = args[0]; tgtPool = args[1]; tgtVol += args[2] + ','; } // Strip out last comma tgtVol = tgtVol.slice(0, -1); // Create info bar var info = createInfoBar('Remove a disk from a disk pool defined in the EXTENT CONTROL.'); deleteDiskForm.append(info); var action = $('
'); var actionSelect = $(''); action.append(actionSelect); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); // Set region input based on those selected on table (if any) var region = $('
'); var group = $('
'); deleteDiskForm.append(action, system, region, group); // Append options for hardware control points systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } systemSelect.val(tgtHcp); actionSelect.change(function() { if ($(this).val() == '1' || $(this).val() == '3') { region.show(); group.hide(); } else if ($(this).val() == '2') { region.show(); group.show(); } else if ($(this).val() == '7') { region.val('FOOBAR'); region.hide(); group.show(); } }); // Generate tooltips deleteDiskForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to delete disk deleteDiskForm.dialog({ title:'Delete disk from pool', modal: true, close: function(){ $(this).remove(); }, width: 500, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var action = $(this).find('select[name=action]').val(); var system = $(this).find('select[name=system]').val(); var region = $(this).find('input[name=region]').val(); var group = $(this).find('input[name=group]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'select[name=action]', 'input[name=region]', 'input[name=group]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } if (!ready) { // Show warning message var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); var args; if (action == '2' || action == '7') args = region + ';' + group; else args = group; // Remove disk from pool $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : system, args : '--removediskfrompool;' + action + ';' + args, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Open dialog to add disk to pool */ function openAddDisk2PoolDialog() { // Create form to add disk to pool var dialogId = 'zvmAddDisk2Pool'; var addDiskForm = $('
'); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); // Create info bar var info = createInfoBar('Add a disk to a disk pool defined in the EXTENT CONTROL. The disk has to already be attached to SYSTEM.'); addDiskForm.append(info); var action = $('
'); var actionSelect = $(''); action.append(actionSelect); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); var volume = $('
'); var group = $('
'); addDiskForm.append(action, system, volume, group); // Append options for hardware control points systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } // Generate tooltips addDiskForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add disk addDiskForm.dialog({ title:'Add disk to pool', modal: true, close: function(){ $(this).remove(); }, width: 500, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var action = $(this).find('select[name=action]').val(); var system = $(this).find('select[name=system]').val(); var volume = $(this).find('input[name=volume]').val(); var group = $(this).find('input[name=group]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'select[name=action]', 'input[name=volume]', 'input[name=group]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } if (!ready) { // Show warning message var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); var args; if (action == '4') args = volume + ';' + volume + ';' + group; else args = volume + ';' + group; // Add disk to pool $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : system, args : '--adddisk2pool;' + action + ';' + args, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Open dialog to remove zFCP from pool * * @param devices2remove Comman separated devices selected in table */ function openRemoveZfcpFromPoolDialog(devices2remove) { // Create form to delete device from pool var dialogId = 'zvmDeleteZfcpFromPool'; var deleteDiskForm = $('
'); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); // Verify disks are in the same zFCP pool var devices = devices2remove.split(','); var tmp, tgtPool, tgtHcp; var tgtUnitNo = ""; for (var i in devices) { tmp = devices[i].split('-'); if (tgtPool && tmp[1] != tgtPool) { openDialog("warn", "Please select devices in the same zFCP"); return; } else { tgtPool = tmp[1]; } tgtHcp = tmp[0]; // Assume it is just one zHCP. Otherwise, this cannot be done on multiple zHCPs. tgtUnitNo += tmp[2] + ","; } // Strip out last comma tgtUnitNo = tgtUnitNo.slice(0, -1); // Create info bar var info = createInfoBar('Remove a zFCP device that is defined in a zFCP pool.'); deleteDiskForm.append(info); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); var pool = $('
'); var unitNo = $('
'); var portName = $('
'); deleteDiskForm.append(system, pool, unitNo, portName); // Append options for hardware control points systemSelect.append($('')); for (var hcp in hcp2zvm) { systemSelect.append($('')); } systemSelect.val(tgtHcp); // Generate tooltips deleteDiskForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to delete device deleteDiskForm.dialog({ title:'Delete device from pool', modal: true, close: function(){ $(this).remove(); }, width: 500, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); var system = $(this).find('select[name=system]').val(); var pool = $(this).find('input[name=zfcpPool]').val(); var unitNo = $(this).find('input[name=zfcpUnitNo]').val(); var portName = $(this).find('input[name=zfcpPortName]').val(); // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'input[name=zfcpUnitNo]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } if (!ready) { // Show warning message var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); var args = '--removezfcpfrompool;' + pool + ';' + unitNo; if (portName) { args += ';' + portName; } $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : system, args : args, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Open dialog to add zFCP to pool */ function openAddZfcp2PoolDialog() { // Create form to add disk to pool var dialogId = 'zvmAddDisk2Pool'; var addDiskForm = $('
'); var info = createInfoBar('Add a device to a zFCP pool defined in xCAT.'); addDiskForm.append(info); // Obtain mapping for zHCP to zVM system var hcp2zvm = new Object(); hcp2zvm = getHcpZvmHash(); var system = $('
'); var systemSelect = $(''); system.append(systemSelect); var pool = $('
'); var status = $('
'); var portName = $('
'); var unitNo = $('
'); var size = $('
'); var range = $('
'); var owner = $('
'); addDiskForm.append(system, pool, status, portName, unitNo, size, range, owner); // Create a array for hardware control points systemSelect.append($('')); // Append options for hardware control points for (var hcp in hcp2zvm) { systemSelect.append($('')); } // Generate tooltips addDiskForm.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.8, delay: 0, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" }, // Change z index to show tooltip in front onBeforeShow: function() { this.getTip().css('z-index', $.topZIndex()); } }); // Open dialog to add disk addDiskForm.dialog({ title:'Add device to pool', modal: true, close: function(){ $(this).remove(); }, width: 500, buttons: { "Ok": function(){ // Delete any warning messages $(this).find('.ui-state-error').remove(); var tgtSystem = $(this).find('select[name=system]').val(); var tgtPool = $(this).find('input[name=zfcpPool]').val(); var tgtStatus = $(this).find('select[name=zfcpStatus]').val(); var tgtPortName = $(this).find('input[name=zfcpPortName]').val(); var tgtUnitNo = $(this).find('input[name=zfcpUnitNo]').val(); var tgtSize = $(this).find('input[name=zfcpSize]').val(); var tgtRange = $(this).find('input[name=zfcpRange]').val(); // Device owner is optional var tgtOwner = ""; if ($(this).find('input[name=zfcpOwner]').val()) { tgtOwner = $(this).find('input[name=zfcpOwner]').val(); } // If inputs are not complete, show warning message var ready = true; var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'select[name=zfcpStatus]', 'input[name=zfcpPortName]', 'input[name=zfcpUnitNo]'); for (var i in args) { if (!$(this).find(args[i]).val()) { $(this).find(args[i]).css('border', 'solid #FF0000 1px'); ready = false; } else { $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); } } if (!ready) { // Show warning message var warn = createWarnBar('Please provide a value for each required field.'); warn.prependTo($(this)); return; } // Change dialog buttons $(this).dialog('option', 'buttons', { 'Close': function() {$(this).dialog("close");} }); // zFCP range and owner are optional var args = '--addzfcp2pool||' + tgtPool + '||' + tgtStatus + '||"' + tgtPortName + '"||' + tgtUnitNo + '||' + tgtSize; if (tgtRange) { args += '||' + tgtRange; } if (tgtOwner) { args += '||' + tgtOwner; } $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chhypervisor', tgt : tgtSystem, args : args, msg : dialogId }, success : updateResourceDialog }); }, "Cancel": function() { $(this).dialog( "close" ); } } }); } /** * Update resource dialog * * @param data HTTP request data */ function updateResourceDialog(data) { var dialogId = data.msg; var infoMsg; // Create info message if (jQuery.isArray(data.rsp)) { infoMsg = ''; for (var i in data.rsp) { infoMsg += data.rsp[i] + '
'; } } else { infoMsg = data.rsp; } // Create info bar with close button var infoBar = $('
').css('margin', '5px 0px'); var icon = $('').css({ 'display': 'inline-block', 'margin': '10px 5px' }); // Create close button to close info bar var close = $('').css({ 'display': 'inline-block', 'float': 'right' }).click(function() { $(this).parent().remove(); }); var msg = $('
' + infoMsg + '
').css({ 'display': 'inline-block', 'width': '90%' }); infoBar.append(icon, msg, close); infoBar.prependTo($('#' + dialogId)); } /** * Select all checkboxes in the datatable * * @param event Event on element * @param obj Object triggering event */ function selectAllDisk(event, obj) { // This will ascend from var tableObj = obj.parents('.datatable'); var status = obj.attr('checked'); tableObj.find(' :checkbox').attr('checked', status); // Handle datatable scroll tableObj = obj.parents('.dataTables_scroll'); if (tableObj.length) { tableObj.find(' :checkbox').attr('checked', status); } event.stopPropagation(); } /** * Load network details into a table * * @param data HTTP request data */ function loadNetworkTable(data) { // Remove loader var panelId = 'zvmNetworkResource'; $('#' + panelId).find('img[src="images/loader.gif"]').remove(); // Get zVM host names if (!$.cookie('zvms')) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', async: false, data : { cmd : 'webportal', tgt : '', args : 'lszvm', msg : '' }, success : function(data) { setzVMCookies(data); } }); } var zvms = $.cookie('zvms').split(','); var hcp2zvm = new Object(); var args, zvm, iHcp, tmp; for (var i in zvms) { args = zvms[i].split(':'); zvm = args[0].toLowerCase(); if (args[1].indexOf('.') != -1) { tmp = args[1].split('.'); iHcp = tmp[0]; } else { iHcp = args[1]; } hcp2zvm[iHcp] = zvm; } var args = data.msg.split(';'); var hcp = args[0].replace('hcp=', ''); var type = args[1].replace('type=', ''); var name = jQuery.trim(args[2].replace('network=', '')); tmp = data.rsp[0].split(hcp + ': '); // Resource tab ID var info = $('#' + panelId).find('.ui-state-highlight'); // If there is no info bar if (!info.length) { // Create info bar info = createInfoBar('Below are LANs/VSWITCHes available to use.'); $('#' + panelId).append(info); } // Get datatable var dTable = getNetworkDataTable(); if (!dTable) { // Create table var tableId = 'zNetworkDataTable'; var table = new DataTable(tableId); table.init( [ '', 'z/VM', 'Type', 'Name', 'Layer', 'Owner', 'Controller', 'Details' ]); // Append datatable to tab $('#' + panelId).append(table.object()); // Turn into datatable dTable = $('#' + tableId).dataTable({ 'iDisplayLength': 50, "bScrollCollapse": true, "sScrollY": "400px", "sScrollX": "110%", "bAutoWidth": true, "oLanguage": { "oPaginate": { "sNext": "", "sPrevious": "" } } }); setNetworkDataTable(dTable); // Set the column width var cols = table.object().find('thead tr th'); cols.eq(0).css('width', '20px'); // HCP column cols.eq(1).css('width', '20px'); // Type column cols.eq(2).css('width', '20px'); // Name column cols.eq(3).css({'width': '600px'}); // Details column } // Skip index 0 because it contains nothing var details = '
';
    for ( var i = 1; i < tmp.length; i++) {
        details += tmp[i];
    }
    details += '
'; // Determine the OSI layer var layer = "3"; if (details.indexOf("ETHERNET") != -1) { layer = "2"; } // Find the vSwitch/VLAN owner var regex = /(LAN|VSWITCH) (.*?)(?:\s|$)/g; var owner = ""; var match = ""; owner = regex.exec(details)[2]; // Find the vSwitch controller regex = /(?:^|\s)Controller: (.*?)(?:\s|$)/g; var controllers = ""; match = ""; while (match = regex.exec(details)) { controllers += match[1] + ","; } controllers = controllers.substring(0, controllers.length - 1); // Delete last two characters dTable.fnAddData(['', '
' + hcp2zvm[hcp] + '
', '
' + type + '
', '
' + name + '
', '
' + layer + '
', '
' + owner + '
', '
' + controllers + '
', details]); // Create actions menu if (!$('#networkResourceActions').length) { // Empty filter area $('#' + tableId + '_length').empty(); // Add Vswitch/Vlan var addLnk = $('Add'); addLnk.bind('click', function(event){ openAddVswitchVlanDialog(); }); // Remove Vswitch/Vlan var removeLnk = $('Remove'); removeLnk.bind('click', function(event){ var networkList = getNodesChecked(tableId).split(','); if (networkList) { openRemoveVswitchVlanDialog(networkList); } }); // Refresh table var refreshLnk = $('Refresh'); refreshLnk.bind('click', function(event){ $('#zvmNetworkResource').empty().append(createLoader('')); setNetworkDataTable(''); // Create a array for hardware control points var hcps = new Array(); if ($.cookie('hcp').indexOf(',') > -1) hcps = $.cookie('hcp').split(','); else hcps.push($.cookie('hcp')); // Query networks for (var i in hcps) { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : hcps[i], args : '--getnetworknames', msg : hcps[i] }, success : getNetwork }); } }); // Create action bar var actionBar = $('
').css("width", "450px"); // Create an action menu var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]); actionsMenu.superfish(); actionsMenu.css('display', 'inline-block'); actionBar.append(actionsMenu); // Set correct theme for action menu actionsMenu.find('li').hover(function() { setMenu2Theme($(this)); }, function() { setMenu2Normal($(this)); }); // Create a division to hold actions menu var menuDiv = $(''); $('#' + tableId + '_length').prepend(menuDiv); $('#' + tableId + '_length').css({ 'padding': '0px', 'width': '500px' }); $('#' + tableId + '_filter').css('padding', '10px'); menuDiv.append(actionBar); } // Resize accordion $('#zvmResourceAccordion').accordion('resize'); } /** * Connect a NIC to a Guest LAN * * @param data Data from HTTP request */ function connect2GuestLan(data) { var rsp = data.rsp; var args = data.msg.split(';'); var node = args[0].replace('node=', ''); var address = args[1].replace('addr=', ''); var lanName = args[2].replace('lan=', ''); var lanOwner = args[3].replace('owner=', ''); // Write ajax response to status bar var prg = writeRsp(rsp, node + ': '); $('#' + node + 'StatusBar').find('div').append(prg); // Connect NIC to Guest LAN $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--connectnic2guestlan;' + address + ';' + lanName + ';' + lanOwner, msg : node }, success : updateZNodeStatus }); } /** * Connect a NIC to a VSwitch * * @param data Data from HTTP request */ function connect2VSwitch(data) { var rsp = data.rsp; var args = data.msg.split(';'); var node = args[0].replace('node=', ''); var address = args[1].replace('addr=', ''); var vswitchName = args[2].replace('vsw=', ''); // Write ajax response to status bar var prg = writeRsp(rsp, node + ': '); $('#' + node + 'StatusBar').find('div').append(prg); // Connect NIC to VSwitch $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--connectnic2vswitch;' + address + ';' + vswitchName, msg : node }, success : updateZNodeStatus }); } /** * Create provision existing node division * * @param inst Provision tab instance * @return Provision existing node division */ function createZProvisionExisting(inst) { // Create provision existing and hide it var provExisting = $('
').hide(); var vmFS = $('
'); var vmLegend = $('Virtual Machine'); vmFS.append(vmLegend); provExisting.append(vmFS); var vmAttr = $('
'); vmFS.append($('
')); vmFS.append(vmAttr); var osFS = $('
'); var osLegend = $('Operating System'); osFS.append(osLegend); provExisting.append(osFS); var osAttr = $('
'); osFS.append($('
')); osFS.append(osAttr); // Create group input var group = $('
'); var groupLabel = $(''); group.append(groupLabel); // Turn on auto complete for group var groupNames = $.cookie('groups'); if (groupNames) { // Split group names into an array var tmp = groupNames.split(','); // Create drop down for groups var groupSelect = $(''); groupSelect.append(''); for (var i in tmp) { // Add group into drop down var opt = $(''); groupSelect.append(opt); } group.append(groupSelect); // Create node datatable groupSelect.change(function(){ // Get group selected var thisGroup = $(this).val(); // If a valid group is selected if (thisGroup) { createNodesDatatable(thisGroup, 'zNodesDatatableDIV' + inst); } }); } else { // If no groups are cookied var groupInput = $(''); group.append(groupInput); } vmAttr.append(group); // Create node input var node = $('
'); var nodeLabel = $(''); var nodeDatatable = $('

Select a group to view its nodes

'); node.append(nodeLabel); node.append(nodeDatatable); vmAttr.append(node); // Create operating system image input var os = $('
'); var osLabel = $(''); var osSelect = $(''); osSelect.append($('')); var imageNames = $.cookie('imagenames').split(','); if (imageNames) { imageNames.sort(); for (var i in imageNames) { osSelect.append($('')); } } os.append(osLabel); os.append(osSelect); osAttr.append(os); // Create boot method drop down var bootMethod = $('
'); var methoddLabel = $(''); var methodSelect = $(''); methodSelect.append('' + '' + '' + '' + '' ); bootMethod.append(methoddLabel); bootMethod.append(methodSelect); osAttr.append(bootMethod); // Generate tooltips provExisting.find('div input[title],select[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.7, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" } }); /** * Provision existing */ var provisionBtn = createButton('Provision'); provisionBtn.bind('click', function(event) { // Remove any warning messages $(this).parent().parent().find('.ui-state-error').remove(); var ready = true; var errMsg = ''; // Get provision tab ID var thisTabId = $(this).parent().parent().parent().attr('id'); // Get provision tab instance var inst = thisTabId.replace('zvmProvisionTab', ''); // Get nodes that were checked var dTableId = 'zNodesDatatable' + inst; var tgts = getNodesChecked(dTableId); if (!tgts) { errMsg += 'You need to select a node.
'; ready = false; } // Check operating system image var os = $('#' + thisTabId + ' select[name=os]:visible'); if (!os.val()) { errMsg += 'You need to select a operating system image.'; os.css('border', 'solid #FF0000 1px'); ready = false; } else { os.css('border', 'solid #BDBDBD 1px'); } // If all inputs are valid, ready to provision if (ready) { // Disable provision button $(this).attr('disabled', 'true'); // Show loader $('#zProvisionStatBar' + inst).show(); $('#zProvisionLoader' + inst).show(); // Disable all inputs var inputs = $('#' + thisTabId + ' input:visible'); inputs.attr('disabled', 'disabled'); // Disable all selects var selects = $('#' + thisTabId + ' select'); selects.attr('disabled', 'disabled'); // Get operating system image var osImage = $('#' + thisTabId + ' select[name=os]:visible').val(); var tmp = osImage.split('-'); var os = tmp[0]; var arch = tmp[1]; var profile = tmp[3]; /** * (1) Set operating system */ $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : tgts + ';noderes.netboot=zvm;nodetype.os=' + os + ';nodetype.arch=' + arch + ';nodetype.profile=' + profile, msg : 'cmd=nodeadd;out=' + inst }, success : updateZProvisionExistingStatus }); } else { // Show warning message var warn = createWarnBar(errMsg); warn.prependTo($(this).parent().parent()); } }); provExisting.append(provisionBtn); return provExisting; } /** * Create provision new node division * * @param inst Provision tab instance * @return Provision new node division */ function createZProvisionNew(inst) { // Create provision new node division var provNew = $('
'); // Create VM fieldset var vmFS = $('
'); var vmLegend = $('Virtual Machine'); vmFS.append(vmLegend); provNew.append(vmFS); var vmAttr = $('
'); vmFS.append($('
')); vmFS.append(vmAttr); // Create OS fieldset var osFS = $('
'); var osLegend = $('Operating System'); osFS.append(osLegend); provNew.append(osFS); // Create hardware fieldset var hwFS = $('
'); var hwLegend = $('Hardware'); hwFS.append(hwLegend); provNew.append(hwFS); var hwAttr = $('
'); hwFS.append($('
')); hwFS.append(hwAttr); // Create tabs for basic and advanced hardware configuration var hwTab = new Tab('hwConfig' + inst); hwTab.init(); hwAttr.append(hwTab.object()); var osAttr = $('
'); osFS.append($('
')); osFS.append(osAttr); // Create group input var group = $('
'); var groupLabel = $(''); var groupInput = $(''); // Get groups on-focus groupInput.one('focus', function(){ var groupNames = $.cookie('groups'); if (groupNames) { // Turn on auto complete $(this).autocomplete({ source: groupNames.split(',') }); } }); group.append(groupLabel); group.append(groupInput); vmAttr.append(group); // Create node input var nodeName = $('
'); var nodeLabel = $(''); var nodeInput = $(''); nodeName.append(nodeLabel); nodeName.append(nodeInput); vmAttr.append(nodeName); // Create user ID input var userId = $('
'); vmAttr.append(userId); // Create hardware control point input var hcpDiv = $('
'); var hcpLabel = $(''); var hcpInput = $(''); hcpInput.blur(function() { if ($(this).val()) { var args = $(this).val().split('.'); if (!$.cookie(args[0] + 'diskpools')) { // Get disk pools $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : args[0], args : '--diskpoolnames', msg : args[0] }, success : setDiskPoolCookies }); } if (!$.cookie(args[0] + 'zfcppools')) { // Get zFCP pools $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : args[0], args : '--zfcppoolnames', msg : args[0] }, success : setZfcpPoolCookies }); } if (!$.cookie(args[0] + 'userprofiles')) { // Get zFCP pools $.ajax({ url : 'lib/cmd.php', dataType : 'json', async: false, data : { cmd : 'lsvm', tgt : args[0], args : '--userprofilenames', msg : args[0] }, success : setUserProfilesCookies }); } if (!$.cookie(args[0] + 'networks') || $.cookie(args[0] + 'networks') === null) { // Get network names $.ajax( { url : 'lib/cmd.php', dataType : 'json', async: false, data : { cmd : 'lsvm', tgt : args[0], args : '--getnetworknames', msg : args[0] }, success : setNetworkCookies }); } // Reset user profile and network drop down box var thisTabId = $(this).parents('.tab').attr('id'); var thisUserProfile = $('#' + thisTabId + ' select[name=userProfile]'); thisUserProfile.children().remove(); var definedUserProfiles = $.cookie(args[0] + 'userprofiles').split(','); for (var i in definedUserProfiles) { thisUserProfile.append(''); } var thisNetwork = $('#' + thisTabId + ' select[name=network]'); thisNetwork.children().remove(); thisNetwork.append(''); // No profile option var definedNetworks = $.cookie(args[0] + 'networks').split(','); for (var i in definedNetworks) { if (!jQuery.trim(definedNetworks[i])) continue; var directoryEntry, interfaceName; // Generate directory entry statement for vSwitch, hipersocket, and guest LAN if (definedNetworks[i].indexOf('VSWITCH ') != -1) { interfaceName = jQuery.trim(definedNetworks[i].replace('VSWITCH ', '')); directoryEntry = "TYPE QDIO LAN " + interfaceName; } else if (definedNetworks[i].indexOf('LAN:HIPERS ') != -1) { interfaceName = jQuery.trim(definedNetworks[i].replace('LAN:HIPERS ', '')); directoryEntry = "TYPE HIPERSOCKETS LAN " + interfaceName; } else { interfaceName = jQuery.trim(definedNetworks[i].replace('LAN:QDIO ', '')); directoryEntry = "TYPE QDIO LAN " + interfaceName; } thisNetwork.append(''); } // Update user entry on change thisNetwork.change(function() { updateUserEntry(thisTabId); }); thisUserProfile.change(function() { updateUserEntry(thisTabId); }); } }); hcpDiv.append(hcpLabel); hcpDiv.append(hcpInput); vmAttr.append(hcpDiv); // Create an advanced link to set IP address and hostname var advancedLnk = $('
'); vmAttr.append(advancedLnk); var advanced = $('
').hide(); vmAttr.append(advanced); var ip = $('
'); advanced.append(ip); var hostname = $('
'); advanced.append(hostname); // Show IP address and hostname inputs on-click advancedLnk.click(function() { advanced.toggle(); }); // Create operating system image input var os = $('
'); var osLabel = $(''); var osSelect = $(''); osSelect.append($('')); var imageNames = $.cookie('imagenames').split(','); if (imageNames) { imageNames.sort(); for (var i in imageNames) { osSelect.append($('')); } } os.append(osLabel); os.append(osSelect); osAttr.append(os); // Create user entry input var defaultChkbox = $('').click(function() { // Remove any warning messages $(this).parents('.form').find('.ui-state-error').remove(); // Get tab Id var thisTabId = $(this).parents('.ui-tabs-panel').parents('.ui-tabs-panel').attr('id'); // Get objects for HCP, user ID, and OS var userId = $('#' + thisTabId + ' input[name=userId]'); var os = $('#' + thisTabId + ' select[name=os]'); // Get default user entry when clicked if ($(this).attr('checked')) { if (!os.val() || !userId.val()) { // Show warning message var warn = createWarnBar('Please specify the operating system and user ID before checking this box'); warn.prependTo($(this).parents('.form')); // Highlight empty fields jQuery.each([os, userId], function() { if (!$(this).val()) { $(this).css('border', 'solid #FF0000 1px'); } }); } else { // Un-highlight empty fields jQuery.each([os, userId], function() { $(this).css('border', 'solid #BDBDBD 1px'); }); // Get profile name var tmp = os.val().split('-'); var profile = tmp[3]; $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'webrun', tgt : '', args : 'getdefaultuserentry;' + profile, msg : thisTabId }, success:function(data) { // Populate user entry var tabId = data.msg; var entry = new String(data.rsp); var userId = $('#' + tabId + ' input[name=userId]').val(); entry = entry.replace(new RegExp('LXUSR', 'g'), userId); $('#' + tabId + ' textarea:visible').val(entry); } }); } } else { $('#' + thisTabId + ' textarea:visible').val(''); // Un-highlight empty fields jQuery.each([os, userId], function() { $(this).css('border', 'solid #BDBDBD 1px'); }); } }); var userEntry = $('
'); userEntry.append($('').append(defaultChkbox, 'Use default')); // Add division on basic tab for specifying: memory, # of CPUs, privilege, user profile, and network. var basicConfig = $('
'); var userProfile = $('
'); var cpuSelect = $('').change(function() { updateUserEntry('zvmProvisionTab' + inst); }); var cpuCount = $('
').append(cpuSelect); var memorySlider = $('
'); var memorySize = $(''); var memory = $('
').append(memorySlider, memorySize); var acceptableMemorySize = ['512M', '1024M', '2G', '3G', '4G', '5G', '6G', '7G', '8G']; memorySlider.slider({ value: 0, min: 0, max: 8, step: 1, slide: function(event, ui) { $('#basicConfig' + inst + ' input[name=memory]').val(acceptableMemorySize[ui.value]); // Update user entry on change updateUserEntry('zvmProvisionTab' + inst); } }); // Initialize storage size memorySize.val(acceptableMemorySize[0]); var privilege = $('
' + '
' + ' A - Primary system operator
' + ' B - System resource operator
' + ' C - System programmer
' + ' D - Spooling operator
' + ' E - System analyst
' + ' F - IBM service representative
' + ' G - General user
' + '
' + '
'); privilege.find('input').change(function() { updateUserEntry('zvmProvisionTab' + inst); }); var network = $('
'); basicConfig.append(userProfile, cpuCount, memory, privilege, network); hwTab.add('basicConfig' + inst, 'Basic', basicConfig, false); // Add division on advanced tab for specifying user directory entry hwTab.add('advancedConfig' + inst, 'Advanced', userEntry, false); // Create disk table var diskDiv = $('
'); var diskLabel = $(''); var diskTable = $('
'); var diskHeader = $(' Type Address Size Mode Pool Password IPL'); // Adjust header width diskHeader.find('th').css( { 'width' : '80px' }); diskHeader.find('th').eq(0).css( { 'width' : '20px' }); var diskBody = $(''); var diskFooter = $(''); /** * Add disks */ var addDiskLink = $('Add disk'); addDiskLink.bind('click', function(event) { // Get list of disk pools var thisTabId = $(this).parents('.tab').attr('id'); var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val(); var definedPools = null; if (thisHcp) { // Get node without domain name var temp = thisHcp.split('.'); definedPools = $.cookie(temp[0] + 'diskpools').split(','); } // Create a row var diskRow = $(''); // Add remove button var removeBtn = $(''); var col = $('').append(removeBtn); removeBtn.bind('click', function(event) { diskRow.remove(); }); diskRow.append(col); // Create disk type drop down var diskType = $(''); var diskTypeSelect = $(''); diskTypeSelect.append('' + '' ); diskType.append(diskTypeSelect); diskRow.append(diskType); // Create disk address input var diskAddr = $(''); diskRow.append(diskAddr); // Create disk size input var diskSize = $(''); diskRow.append(diskSize); // Create disk mode input var diskMode = $(''); var diskModeSelect = $(''); diskModeSelect.append('' + '' + '' + '' + '' + '' + '' ); diskMode.append(diskModeSelect); diskRow.append(diskMode); // Create disk pool drop down var diskPool = $(''); var diskPoolSelect = $(''); for (var i in definedPools) { diskPoolSelect.append(''); } diskPool.append(diskPoolSelect); diskRow.append(diskPool); // Create disk password input var diskPw = $(''); diskRow.append(diskPw); // Create IPL checkbox var diskIpl = $(''); diskRow.append(diskIpl); diskIpl.find('input').change(function() { updateUserEntry(thisTabId); }); diskBody.append(diskRow); // Generate tooltips diskBody.find('td input[title],select[title]').tooltip({ position: "top right", offset: [-4, 4], effect: "fade", opacity: 0.7, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" } }); }); // Create disk table diskFooter.append(addDiskLink); diskTable.append(diskHeader); diskTable.append(diskBody); diskTable.append(diskFooter); diskDiv.append(diskLabel); diskDiv.append(diskTable); hwAttr.append(diskDiv); // Create zFCP table var zfcpDiv = $('
'); var zfcpLabel = $(''); var zfcpTable = $('
'); var zfcpHeader = $(' Address Size Pool Tag Port Name Unit # LOADDEV'); // Adjust header width zfcpHeader.find('th').css({ 'width' : '80px' }); zfcpHeader.find('th').eq(0).css({ 'width' : '20px' }); var zfcpBody = $(''); var zfcpFooter = $(''); /** * Add zFCP devices */ var addZfcpLink = $('Add zFCP'); addZfcpLink.bind('click', function(event) { // Get list of disk pools var thisTabId = $(this).parents('.tab').attr('id'); var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val(); var definedPools = null; if (thisHcp) { // Get node without domain name var temp = thisHcp.split('.'); definedPools = $.cookie(temp[0] + 'zfcppools').split(','); } // Create a row var zfcpRow = $(''); // Add remove button var removeBtn = $(''); var col = $('').append(removeBtn); removeBtn.bind('click', function(event) { zfcpRow.remove(); }); zfcpRow.append(col); // Create disk address input var zfcpAddr = $(''); zfcpRow.append(zfcpAddr); // Create disk size input var zfcpSize = $(''); zfcpRow.append(zfcpSize); // Create zFCP pool drop down var zfcpPool = $(''); var zfcpPoolSelect = $(''); for (var i in definedPools) { zfcpPoolSelect.append(''); } zfcpPool.append(zfcpPoolSelect); zfcpRow.append(zfcpPool); // Create disk tag var zfcpTag = $(''); zfcpRow.append(zfcpTag); // Create device port name var zfcpPortName = $(''); zfcpRow.append(zfcpPortName); // Create device unit number var zfcpUnitNo = $(''); zfcpRow.append(zfcpUnitNo); // Create LOADDEV checkbox var zfcpLoaddev = $(''); zfcpRow.append(zfcpLoaddev); zfcpBody.append(zfcpRow); // Generate tooltips zfcpBody.find('td input[title],select[title]').tooltip({ position: "top right", offset: [-4, 4], effect: "fade", opacity: 0.7, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" } }); }); zfcpFooter.append(addZfcpLink); zfcpTable.append(zfcpHeader); zfcpTable.append(zfcpBody); zfcpTable.append(zfcpFooter); zfcpDiv.append(zfcpLabel); zfcpDiv.append(zfcpTable); hwAttr.append(zfcpDiv); // Generate tooltips provNew.find('div input[title],select[title],textarea[title]').tooltip({ position: "center right", offset: [-2, 10], effect: "fade", opacity: 0.7, predelay: 800, events: { def: "mouseover,mouseout", input: "mouseover,mouseout", widget: "focus mouseover,blur mouseout", tooltip: "mouseover,mouseout" } }); // Disable IPL column if advanced tab is selected hwTab.object().tabs({ select: function(event, ui) { // Get provision tab instance var thisTabId = $(this).parents('.ui-tabs-panel').attr('id'); var inst = thisTabId.replace('zvmProvisionTab', ''); // Disable and de-select IPL device if (ui.index == 1) { $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').attr('disabled','disabled'); } else { $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').removeAttr('disabled'); } $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').removeAttr('checked'); } }); /** * Provision new */ var provisionBtn = createButton('Provision'); provisionBtn.bind('click', function(event) { // Remove any warning messages $(this).parent().parent().find('.ui-state-error').remove(); var ready = true; var errMsg = ''; // Get tab ID var thisTabId = $(this).parents('.ui-tabs-panel').attr('id'); // Get provision tab instance var inst = thisTabId.replace('zvmProvisionTab', ''); // Get the selected hardware configuration tab // Basic tab index = 0 & advanced tab index = 1 var hwTabIndex = $("#hwConfig" + inst).tabs('option', 'selected'); // Check node name, userId, hardware control point, and group // Check disks and zFCP devices var inputs = $('#' + thisTabId + ' input:visible'); for (var i = 0; i < inputs.length; i++) { // Do not check some inputs if (inputs.eq(i).attr('name') == 'memory') { // There should always be a value for memory // Do not change the border continue; } else if (!inputs.eq(i).val() && inputs.eq(i).attr('type') != 'password' && inputs.eq(i).attr('name') != 'zfcpTag' && inputs.eq(i).attr('name') != 'zfcpPortName' && inputs.eq(i).attr('name') != 'zfcpUnitNo') { inputs.eq(i).css('border', 'solid #FF0000 1px'); ready = false; } else { inputs.eq(i).css('border', 'solid #BDBDBD 1px'); } } var selects = $('#' + thisTabId + ' select:visible'); for (var i = 0; i < selects.length; i++) { if (!selects.eq(i).val() && selects.eq(i).attr('name') != 'os' && selects.eq(i).attr('name') != 'userProfile' && selects.eq(i).attr('name') != 'network') { selects.eq(i).css('border', 'solid #FF0000 1px'); ready = false; } else { selects.eq(i).css('border', 'solid #BDBDBD 1px'); } } if (hwTabIndex == 1) { // Check user entry var thisUserEntry = $('#' + thisTabId + ' textarea:visible'); thisUserEntry.val(thisUserEntry.val().toUpperCase()); if (!thisUserEntry.val()) { thisUserEntry.css('border', 'solid #FF0000 1px'); ready = false; } else { thisUserEntry.css('border', 'solid #BDBDBD 1px'); } // Check if user entry contains user ID var thisUserId = $('#' + thisTabId + ' input[name=userId]:visible'); var pos = thisUserEntry.val().indexOf('USER ' + thisUserId.val().toUpperCase()); if (pos < 0) { pos = thisUserEntry.val().indexOf('IDENTITY ' + thisUserId.val().toUpperCase()); if (pos < 0) { errMsg = errMsg + 'The directory entry does not contain the correct user/identity ID.
'; ready = false; } } } // Show error message for missing inputs if (!ready) { errMsg = errMsg + 'Please provide a value for each missing field.
'; } // If no operating system is specified, create only user entry os = $('#' + thisTabId + ' select[name=os]:visible'); // Check number of disks var diskRows = $('#' + thisTabId + ' table tr'); // If an OS is given, disks are needed if (os.val() && (diskRows.length < 1)) { errMsg = errMsg + 'You need to add at some disks.
'; ready = false; } // If inputs are valid, ready to provision if (ready) { // Generate user directory entry if basic tab is selected if (hwTabIndex == 0) { updateUserEntry(thisTabId); } if (!os.val()) { // If no OS is given, create a virtual server var msg = ''; if (diskRows.length > 0) { msg = 'Do you want to create a virtual server without an operating system?'; } else { // If no disks are given, create a virtual server (no disk) msg = 'Do you want to create a virtual server without an operating system or disks?'; } // Open dialog to confirm var confirmDialog = $('

' + msg + '

'); confirmDialog.dialog({ title:'Confirm', modal: true, close: function(){ $(this).remove(); }, width: 400, buttons: { "Ok": function(){ // Disable provision button provisionBtn.attr('disabled', 'true'); // Show loader $('#zProvisionStatBar' + inst).show(); $('#zProvisionLoader' + inst).show(); // Disable add disk button addDiskLink.attr('disabled', 'true'); // Disable close button on disk table $('#' + thisTabId + ' table span').unbind('click'); // Disable all inputs var inputs = $('#' + thisTabId + ' input'); inputs.attr('disabled', 'disabled'); // Disable all selects var selects = $('#' + thisTabId + ' select'); selects.attr('disabled', 'disabled'); // Add a new line at the end of the user entry var textarea = $('#' + thisTabId + ' textarea'); var tmp = jQuery.trim(textarea.val()); textarea.val(tmp + '\n'); textarea.attr('readonly', 'readonly'); textarea.css( { 'background-color' : '#F2F2F2' }); // Get node name var node = $('#' + thisTabId + ' input[name=nodeName]').val(); // Get userId var userId = $('#' + thisTabId + ' input[name=userId]').val(); // Get hardware control point var hcp = $('#' + thisTabId + ' input[name=hcp]').val(); // Get group var group = $('#' + thisTabId + ' input[name=group]').val(); // Get IP address and hostname var ip = $('#' + thisTabId + ' input[name=ip]').val(); var hostname = $('#' + thisTabId + ' input[name=hostname]').val(); // Generate arguments to sent var args = node + ';zvm.hcp=' + hcp + ';zvm.userid=' + userId + ';nodehm.mgt=zvm' + ';groups=' + group; if (ip) args += ';hosts.ip=' + ip; if (hostname) args += ';hosts.hostnames=' + hostname; /** * (1) Define node */ $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : args, msg : 'cmd=nodeadd;out=' + inst }, success : updateZProvisionNewStatus }); $(this).dialog("close"); }, "Cancel": function() { $(this).dialog("close"); } } }); } else { /** * Create a virtual server and install OS */ // Disable provision button $(this).attr('disabled', 'true'); // Show loader $('#zProvisionStatBar' + inst).show(); $('#zProvisionLoader' + inst).show(); // Disable add disk button addDiskLink.attr('disabled', 'true'); // Disable close button on disk table $('#' + thisTabId + ' table span').unbind('click'); // Disable all inputs var inputs = $('#' + thisTabId + ' input'); inputs.attr('disabled', 'disabled'); inputs.css( { 'background-color' : '#F2F2F2' }); // Disable all selects var selects = $('#' + thisTabId + ' select'); selects.attr('disabled', 'disabled'); selects.css( { 'background-color' : '#F2F2F2' }); // Add a new line at the end of the user entry var textarea = $('#' + thisTabId + ' textarea'); var tmp = jQuery.trim(textarea.val()); textarea.val(tmp + '\n'); textarea.attr('readonly', 'readonly'); textarea.css( { 'background-color' : '#F2F2F2' }); // Get node name var node = $('#' + thisTabId + ' input[name=nodeName]').val(); // Get userId var userId = $('#' + thisTabId + ' input[name=userId]').val(); // Get hardware control point var hcp = $('#' + thisTabId + ' input[name=hcp]').val(); // Get group var group = $('#' + thisTabId + ' input[name=group]').val(); // Get IP address and hostname var ip = $('#' + thisTabId + ' input[name=ip]').val(); var hostname = $('#' + thisTabId + ' input[name=hostname]').val(); // Generate arguments to sent var args = node + ';zvm.hcp=' + hcp + ';zvm.userid=' + userId + ';nodehm.mgt=zvm' + ';groups=' + group; if (ip) args += ';hosts.ip=' + ip; if (hostname) args += ';hosts.hostnames=' + hostname; /** * (1) Define node */ $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : args, msg : 'cmd=nodeadd;out=' + inst }, success : updateZProvisionNewStatus }); } } else { // Show warning message var warn = createWarnBar(errMsg); warn.prependTo($(this).parent().parent()); } }); provNew.append(provisionBtn); return provNew; } /** * Load zVMs into column (service page) * * @param col Table column where OS images will be placed */ function loadzVMs(col) { // Get group names and description and append to group column if (!$.cookie('zvms')) { var infoBar = createInfoBar('No selectable z/VM available'); col.append(infoBar); return; } var zNames = $.cookie('zvms').split(','); var radio, zBlock, args, zvm, hcp; for (var i in zNames) { args = zNames[i].split(':'); zvm = args[0]; hcp = args[1]; // Create block for each group zBlock = $('
').css({ 'border': '1px solid', 'max-width': '200px', 'margin': '5px auto', 'padding': '5px', 'display': 'block', 'vertical-align': 'middle', 'cursor': 'pointer', 'white-space': 'normal' }).click(function(){ $(this).children('input:radio').attr('checked', 'checked'); $(this).parents('td').find('div').attr('class', 'ui-state-default'); $(this).attr('class', 'ui-state-active'); }); radio = $('').css('display', 'none'); zBlock.append(radio, $('' + zvm + ' managed by ' + hcp + '')); zBlock.children('span').css({ 'display': 'block', 'margin': '5px', 'text-align': 'left' }); col.append(zBlock); } } /** * Load groups into column * * @param col Table column where OS images will be placed */ function loadSrvGroups(col) { // Get group names and description and append to group column if (!$.cookie('srv_groups')) { var infoBar = createInfoBar('No selectable group available'); col.append(infoBar); return; } var groupNames = $.cookie('srv_groups').split(','); var groupBlock, radio, args, name, ip, hostname, desc; for (var i in groupNames) { args = groupNames[i].split(':'); name = args[0]; ip = args[1]; hostname = args[2]; desc = args[3]; // Create block for each group groupBlock = $('
').css({ 'border': '1px solid', 'max-width': '200px', 'margin': '5px auto', 'padding': '5px', 'display': 'block', 'vertical-align': 'middle', 'cursor': 'pointer', 'white-space': 'normal' }).click(function(){ $(this).children('input:radio').attr('checked', 'checked'); $(this).parents('td').find('div').attr('class', 'ui-state-default'); $(this).attr('class', 'ui-state-active'); }); radio = $('').css('display', 'none'); groupBlock.append(radio, $('' + name + ': ' + desc + '')); groupBlock.children('span').css({ 'display': 'block', 'margin': '5px', 'text-align': 'left' }); col.append(groupBlock); } } /** * Load OS images into column * * @param col Table column where OS images will be placed */ function loadOSImages(col) { // Get group names and description and append to group column if (!$.cookie('srv_imagenames')) { var infoBar = createInfoBar('No selectable image available'); col.append(infoBar); return; } var imgNames = $.cookie('srv_imagenames').split(','); var imgBlock, radio, args, name, desc; for (var i in imgNames) { args = imgNames[i].split(':'); name = args[0]; desc = args[1]; // Create block for each image imgBlock = $('
').css({ 'border': '1px solid', 'max-width': '200px', 'margin': '5px auto', 'padding': '5px', 'display': 'block', 'vertical-align': 'middle', 'cursor': 'pointer', 'white-space': 'normal' }).click(function(){ $(this).children('input:radio').attr('checked', 'checked'); $(this).parents('td').find('div').attr('class', 'ui-state-default'); $(this).attr('class', 'ui-state-active'); $('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').attr('checked', ''); $('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').parents('td').find('div').attr('class', 'ui-state-default'); }); radio = $('').css('display', 'none'); imgBlock.append(radio, $('' + name + ': ' + desc + '')); imgBlock.children('span').css({ 'display': 'block', 'margin': '5px', 'text-align': 'left' }); col.append(imgBlock); } } /** * Load golden images into column * * @param col Table column where master copies will be placed */ function loadGoldenImages(col) { // Get group names and description and append to group column if (!$.cookie('srv_goldenimages')) { var infoBar = createInfoBar('No selectable master copies available'); col.append(infoBar); return; } var imgNames = $.cookie('srv_goldenimages').split(','); var imgBlock, radio, args, name, desc; for (var i in imgNames) { args = imgNames[i].split(':'); name = args[0]; desc = args[1]; // Create block for each image imgBlock = $('
').css({ 'border': '1px solid', 'max-width': '200px', 'margin': '5px auto', 'padding': '5px', 'display': 'block', 'vertical-align': 'middle', 'cursor': 'pointer', 'white-space': 'normal' }).click(function(){ $(this).children('input:radio').attr('checked', 'checked'); $(this).parents('td').find('div').attr('class', 'ui-state-default'); $(this).attr('class', 'ui-state-active'); // Un-select zVM and image $('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').attr('checked', ''); $('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').parents('td').find('div').attr('class', 'ui-state-default'); $('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').attr('checked', ''); $('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').parents('td').find('div').attr('class', 'ui-state-default'); }); radio = $('').css('display', 'none'); imgBlock.append(radio, $('' + name + ': ' + desc + '')); imgBlock.children('span').css({ 'display': 'block', 'margin': '5px', 'text-align': 'left' }); col.append(imgBlock); } } /** * Set a cookie for zVM host names (service page) * * @param data Data from HTTP request */ function setzVMCookies(data) { if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { var zvms = new Array(); var hosts = data.rsp[0].split("\n"); for ( var i = 0; i < hosts.length; i++) { if (hosts[i] != null && hosts[i] != "") { zvms.push(hosts[i]); } } // Set cookie to expire in 60 minutes var exDate = new Date(); exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); $.cookie('zvms', zvms, { expires: exDate }); } } /** * Set a cookie for master copies (service page) * * @param data Data from HTTP request */ function setGoldenImagesCookies(data) { if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { var copies = new Array(); var tmp = data.rsp[0].split(","); for ( var i = 0; i < tmp.length; i++) { if (tmp[i] != null && tmp[i] != "") { copies.push(tmp[i]); } } // Set cookie to expire in 60 minutes var exDate = new Date(); exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); $.cookie('srv_goldenimages', copies, { expires: exDate }); } } /** * Set a cookie for disk pool names of a given node * * @param data Data from HTTP request */ function setDiskPoolCookies(data) { if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { var node = data.msg; var pools = data.rsp[0].split(node + ': '); for (var i in pools) { pools[i] = jQuery.trim(pools[i]); } // Set cookie to expire in 60 minutes var exDate = new Date(); exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); $.cookie(node + 'diskpools', pools, { expires: exDate }); } } /** * Set a cookie for zFCP pool names of a given node * * @param data Data from HTTP request */ function setZfcpPoolCookies(data) { if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { var node = data.msg; var pools = data.rsp[0].split(node + ': '); for (var i in pools) { pools[i] = jQuery.trim(pools[i]); } // Set cookie to expire in 60 minutes var exDate = new Date(); exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); $.cookie(node + 'zfcppools', pools, { expires: exDate }); } } /** * Set a cookie for zHCP host names * * @param zhcps List of zHCPs known */ function setzHcpCookies(zhcps) { if (zhcps.length) { // Set cookie to expire in 60 minutes var exDate = new Date(); exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); $.cookie('zhcps', zhcps, { expires: exDate }); } } /** * Set a cookie for z/VM user profile names of a given node * * @param data Data from HTTP request */ function setUserProfilesCookies(data) { if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { var node = data.msg; var profiles = data.rsp[0].split(node + ': '); for (var i in profiles) { profiles[i] = jQuery.trim(profiles[i]); } // Set cookie to expire in 60 minutes var exDate = new Date(); exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); $.cookie(node + 'userprofiles', profiles, { expires: exDate }); } } /** * Create virtual machine (service page) * * @param tabId Tab ID * @param group Group * @param hcp Hardware control point * @param img OS image */ function createzVM(tabId, group, hcp, img, owner) { // Submit request to create VM // webportal provzlinux [group] [hcp] [image] [owner] var iframe = createIFrame('lib/srv_cmd.php?cmd=webportal&tgt=&args=provzlinux;' + group + ';' + hcp + ';' + img + ';' + owner + '&msg=&opts=flush'); iframe.prependTo($('#' + tabId)); } /** * Query the profiles that exists * * @param panelId Panel ID */ function queryProfiles(panelId) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'tabdump', tgt : '', args : 'osimage', msg : panelId }, success : function(data) { var panelId = data.msg; setOSImageCookies(data); configProfilePanel(panelId); } }); } /** * Panel to configure directory entries and disks for a profile * * @param panelId Panel ID */ function configProfilePanel(panelId) { // Wipe panel clean $('#' + panelId).empty(); // Add info bar $('#' + panelId).append(createInfoBar('Create, edit, and delete profiles for the self-service portal. It is important to note the default z/VM user ID for any profile should be LXUSR.')); // Create table var tableId = 'zvmProfileTable'; var table = new DataTable(tableId); table.init(['', 'Profile', 'Disk pool', 'Disk size', 'Directory entry']); // Insert profiles into table var profiles = $.cookie('profiles').split(','); profiles.push('default'); // Add default profile for (var i in profiles) { if (profiles[i]) { // Columns are: profile, selectable, description, disk pool, disk size, and directory entry var cols = new Array(profiles[i], '', '', ''); // Add remove button where id = user name cols.unshift(''); // Add row table.add(cols); } } // Append datatable to tab $('#' + panelId).append(table.object()); // Turn into datatable $('#' + tableId).dataTable({ 'iDisplayLength': 50, 'bLengthChange': false, "bScrollCollapse": true, "sScrollY": "400px", "sScrollX": "110%", "bAutoWidth": true, "oLanguage": { "oPaginate": { "sNext": "", "sPrevious": "" } } }); // Create action bar var actionBar = $('
').css("width", "450px"); // Create a profile var createLnk = $('Create'); createLnk.click(function() { profileDialog(); }); // Edit a profile var editLnk = $('Edit'); editLnk.click(function() { var profiles = $('#' + tableId + ' input[type=checkbox]:checked'); for (var i in profiles) { var profile = profiles.eq(i).attr('name'); if (profile) { // Column order is: profile, selectable, disk pool, disk size, and directory entry var cols = profiles.eq(i).parents('tr').find('td'); var pool = cols.eq(2).text(); var size = cols.eq(3).text(); var entry = cols.eq(4).html().replace(new RegExp('
', 'g'), '\n'); editProfileDialog(profile, pool, size, entry); } } }); // Delete a profile var deleteLnk = $('Delete'); deleteLnk.click(function() { var profiles = getNodesChecked(tableId); if (profiles) { deleteProfileDialog(profiles); } }); // Refresh profiles table var refreshLnk = $('Refresh'); refreshLnk.click(function() { queryProfiles(panelId); }); // Create an action menu var actionsMenu = createMenu([refreshLnk, createLnk, editLnk, deleteLnk]); actionsMenu.superfish(); actionsMenu.css('display', 'inline-block'); actionBar.append(actionsMenu); // Set correct theme for action menu actionsMenu.find('li').hover(function() { setMenu2Theme($(this)); }, function() { setMenu2Normal($(this)); }); // Create a division to hold actions menu var menuDiv = $(''); $('#' + tableId + '_wrapper').prepend(menuDiv); menuDiv.append(actionBar); $('#' + tableId + '_filter').appendTo(menuDiv); // Resize accordion $('#' + tableId).parents('.ui-accordion').accordion('resize'); // Query directory entries and disk pool/size for each profile for (var i in profiles) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'webrun', tgt : '', args : 'getdefaultuserentry;' + profiles[i], msg : 'out=' + panelId + ';profile=' + profiles[i] }, success: insertDirectoryEntry }); $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'webrun', tgt : '', args : 'getzdiskinfo;' + profiles[i], msg : 'out=' + panelId + ';profile=' + profiles[i] }, success: insertDiskInfo }); } } /** * Insert the directory entry into the profile table * * @param data Data from HTTP request */ function insertDirectoryEntry(data) { var tableId = 'zvmProfileTable'; var args = data.msg.split(';'); var profile = args[1].replace('profile=', ''); // Do not continue if there is nothing if (!data.rsp.length) return; var entry = data.rsp[0].replace(new RegExp('\n', 'g'), '
'); // Get the row containing the profile var rowPos = findRow(profile, '#' + tableId, 1); if (rowPos < 0) return; // Update the directory entry column var dTable = $('#' + tableId).dataTable(); dTable.fnUpdate(entry, rowPos, 4, false); // Adjust table styling $('#' + tableId + ' td:nth-child(5)').css({ 'text-align': 'left' }); adjustColumnSize(tableId); } /** * Insert the disk info into the profile table * * @param data Data from HTTP request */ function insertDiskInfo(data) { var tableId = 'zvmProfileTable'; var args = data.msg.split(';'); var profile = args[1].replace('profile=', ''); // Do not continue if there is nothing if (!data.rsp.length) return; // Get the row containing the profile var rowPos = findRow(profile, '#' + tableId, 1); if (rowPos < 0) return; // Update the disk info columns var dTable = $('#' + tableId).dataTable(); var tmp = ""; var pool = ""; var eckdSize = 0; var info = data.rsp[0].split('\n'); for (var i in info) { if (info[i].indexOf('diskpool') > -1) { tmp = info[i].split('='); pool = jQuery.trim(tmp[1]); dTable.fnUpdate(pool, rowPos, 2, false); } if (info[i].indexOf('eckd_size') > -1) { tmp = info[i].split('='); eckdSize = jQuery.trim(tmp[1]); dTable.fnUpdate(eckdSize, rowPos, 3, false); } } // Adjust table styling adjustColumnSize(tableId); } /** * Open profile dialog */ function profileDialog() { // Create form to add profile var dialogId = 'zvmCreateProfile'; var profileForm = $('
'); // Create info bar var info = createInfoBar('Configure the default settings for a profile'); profileForm.append(info); // Insert profiles into select var profileSelect = $(''); var profiles = $.cookie('profiles').split(','); profiles.push('default'); // Add default profile for (var i in profiles) { if (profiles[i]) { profileSelect.append($('')); } } profileForm.append($('
').append(profileSelect)); profileForm.append('
'); profileForm.append('
'); profileForm.append('