diff --git a/xCAT-UI/js/custom/zvmUtils.js b/xCAT-UI/js/custom/zvmUtils.js index 6d69fc69b..48619270f 100644 --- a/xCAT-UI/js/custom/zvmUtils.js +++ b/xCAT-UI/js/custom/zvmUtils.js @@ -363,7 +363,7 @@ function updateZProvisionNewStatus(data) { // Parse ajax response var rsp = data.rsp; var args = data.msg.split(';'); - var cmd = args[0].replace('cmd=', ''); + var lastCmd = args[0].replace('cmd=', ''); var out2Id = args[1].replace('out=', ''); // IDs for status bar, tab, and loader @@ -374,16 +374,50 @@ function updateZProvisionNewStatus(data) { var node = $('#' + tabId + ' input[name=nodeName]').val(); /** - * (2) Update /etc/hosts + * (2) Create user entry */ - if (cmd == 'nodeadd') { - // If there was an error, do not continue - if (rsp.length) { + 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 + '
'); - $.ajax( { + $('#' + 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 : { @@ -399,16 +433,16 @@ function updateZProvisionNewStatus(data) { } /** - * (3) Update DNS + * (4) Update DNS */ - else if (cmd == 'makehosts') { - // If there was an error, do not continue + 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( { + $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { @@ -423,72 +457,18 @@ function updateZProvisionNewStatus(data) { } } - /** - * (4) Create user entry - */ - else if (cmd == 'makedns') { - // Reset number of tries - $.cookie('tries4' + tabId, 0); - - // 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 - }); - } - /** * (5) Add disk */ - else if (cmd == 'mkvm') { + else if (lastCmd == 'makedns') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); - // If there was an error, try again - if (prg.html().indexOf('Error') > -1) { - var tries = parseInt($.cookie('tries4' + tabId)); - if (tries < 2) { - $('#' + statBarId).find('div').append('
Trying again...
'); - tries++; - $.cookie('tries4' + tabId, tries); - - // 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 - }); - } else { - $('#' + loaderId).hide(); - } + // If there was an error, quit + if (containErrors(prg.html())) { + $('#' + loaderId).hide(); } else { - // Reset number of tries - $.cookie('tries4' + tabId, 0); - // Set cookie for number of disks var diskRows = $('#' + tabId + ' table:eq(0):visible tbody tr'); $.cookie('disks2add' + out2Id, diskRows.length); @@ -514,9 +494,9 @@ function updateZProvisionNewStatus(data) { + blkSize + ';' + size + ';' + mode + ';' + password + ';' + password + ';' + password; } - + // Attach disk to node - $.ajax( { + $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { @@ -529,228 +509,120 @@ function updateZProvisionNewStatus(data) { success : updateZProvisionNewStatus }); } - } else { - $('#' + loaderId).hide(); - } - } - } - - /** - * (6) Add zFCP devices - */ - else if (cmd == 'chvm-disk') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // If there was an error, try again - if (prg.html().indexOf('Error') > -1) { - $('#' + loaderId).hide(); - - var tries = parseInt($.cookie('tries4' + tabId)); - if (tries < 2) { - $('#' + statBarId).find('div').append('
Trying again...
'); - tries++; - $.cookie('tries4' + tabId, tries); - - // Set cookie for number of disks - var diskRows = $('#' + tabId + ' table: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 - }); - } - } else { - $('#' + loaderId).hide(); - } - } else { - $('#' + loaderId).hide(); - } - } else { - // Reset number of tries - $.cookie('tries4' + tabId, 0); + } - // Set cookie for number of disks - // One less disk to add - var disks2add = $.cookie('disks2add' + out2Id); - disks2add--; - $.cookie('disks2add' + out2Id, disks2add); - - if (disks2add < 1) { - // 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(); - - // Create ajax arguments - var args = '--addzfcp;' + pool + ';' + address + ';' + 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 - }); - } - } else { - $('#' + loaderId).hide(); - } - } - } - } - - /** - * (7) Set operating system for given node - */ - else if (cmd == 'chvm-zfcp') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // If there was an error, try again - if (prg.html().indexOf('Error') > -1) { - $('#' + loaderId).hide(); - - var tries = parseInt($.cookie('tries4' + tabId)); - if (tries < 2) { - $('#' + statBarId).find('div').append('
Trying again...
'); - tries++; - $.cookie('tries4' + tabId, tries); - - 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(); - - // Create ajax arguments - var args = '--addzfcp;' + pool + ';' + address + ';' + 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 - }); + // 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; } - } else { - $('#' + loaderId).hide(); + + // 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 + }); } - } else { - $('#' + loaderId).hide(); } - } else { - // Reset number of tries - $.cookie('tries4' + tabId, 0); - // Set cookie for number of disks - // One less disk to add + // Done if no disks to add var zfcp2add = $.cookie('zfcp2add' + out2Id); - zfcp2add--; - $.cookie('zfcp2add' + out2Id, zfcp2add); - - if (zfcp2add < 1) { + var zfcp2add = $.cookie('zfcp2add' + out2Id); + if (disks2add < 1 && zfcp2add < 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 + ' input[name=os]:visible').val(); + var osImage = $('#' + tabId + ' select[name=os]:visible').val(); if (osImage) { // Get operating system, architecture, provision method, and profile - var tmp = osImage.split('-'); + var tmp = osImage.split('-'); var os = tmp[0]; var arch = tmp[1]; var profile = tmp[3]; // If the last disk is added - if (disks2add < 1) { - $.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 - }, + $.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 - }); - } + success : updateZProvisionNewStatus + }); } else { $('#' + loaderId).hide(); } @@ -759,9 +631,9 @@ function updateZProvisionNewStatus(data) { } /** - * (8) Update DHCP + * (7) Update DHCP */ - else if (cmd == 'noderes') { + else if (lastCmd == 'noderes') { // If there was an error, do not continue if (rsp.length) { $('#' + loaderId).hide(); @@ -784,9 +656,9 @@ function updateZProvisionNewStatus(data) { } /** - * (9) Prepare node for boot + * (8) Prepare node for boot */ - else if (cmd == 'makedhcp') { + else if (lastCmd == 'makedhcp') { // Prepare node for boot $.ajax( { url : 'lib/cmd.php', @@ -803,16 +675,16 @@ function updateZProvisionNewStatus(data) { } /** - * (10) Boot node to network + * (9) Boot node to network */ - else if (cmd == 'nodeset') { + 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 (prg.html().indexOf('Error') > -1) { + if (containErrors(prg.html())) { $('#' + loaderId).hide(); } else { $.ajax( { @@ -831,9 +703,9 @@ function updateZProvisionNewStatus(data) { } /** - * (11) Done + * (10) Done */ - else if (cmd == 'rnetboot') { + else if (lastCmd == 'rnetboot') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).find('div').append(prg); @@ -900,7 +772,7 @@ function updateZProvisionExistingStatus(data) { $('#' + statBarId).find('div').append(prg); // If there was an error, do not continue - if (prg.html().indexOf('Error') > -1) { + if (containErrors(prg.html())) { var loaderId = 'zProvisionLoader' + inst; $('#' + loaderId).remove(); return; @@ -3345,19 +3217,18 @@ function createZProvisionNew(inst) { // Create operating system image input var os = $('
'); var osLabel = $(''); - var osInput = $(''); - // Get image names on focus - osInput.one('focus', function(){ - var imageNames = $.cookie('imagenames'); - if (imageNames) { - // Turn on auto complete - $(this).autocomplete({ - source: imageNames.split(',') - }); - } - }); + 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(osInput); + os.append(osSelect); osAttr.append(os); // Create user entry input @@ -3370,7 +3241,7 @@ function createZProvisionNew(inst) { // Get objects for HCP, user ID, and OS var userId = $('#' + thisTabId + ' input[name=userId]'); - var os = $('#' + thisTabId + ' input[name=os]'); + var os = $('#' + thisTabId + ' select[name=os]'); // Get default user entry when clicked if ($(this).attr('checked')) { @@ -3545,7 +3416,7 @@ function createZProvisionNew(inst) { var zfcpDiv = $('
'); var zfcpLabel = $(''); var zfcpTable = $('
'); - var zfcpHeader = $(' Address Size Pool Tag Port Name Unit #'); + var zfcpHeader = $(' Address Size Pool Tag Port Name Unit # LOADDEV'); // Adjust header width zfcpHeader.find('th').css( { 'width' : '80px' @@ -3610,6 +3481,10 @@ function createZProvisionNew(inst) { // Create device unit number var zfcpUnitNo = $(''); zfcpRow.append(zfcpUnitNo); + + // Create LOADDEV checkbox + var zfcpLoaddev = $(''); + zfcpRow.append(zfcpLoaddev); zfcpBody.append(zfcpRow); @@ -3673,9 +3548,8 @@ function createZProvisionNew(inst) { // Check disks and zFCP devices var inputs = $('#' + thisTabId + ' input:visible'); for ( var i = 0; i < inputs.length; i++) { - // Do not check OS or disk password + // Do not check some inputs if (!inputs.eq(i).val() - && inputs.eq(i).attr('name') != 'os' && inputs.eq(i).attr('type') != 'password' && inputs.eq(i).attr('name') != 'zfcpTag' && inputs.eq(i).attr('name') != 'zfcpPortName' @@ -3686,6 +3560,16 @@ function createZProvisionNew(inst) { 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).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + selects.eq(i).css('border', 'solid #BDBDBD 1px'); + } + } // Check user entry var thisUserEntry = $('#' + thisTabId + ' textarea:visible'); @@ -3711,7 +3595,7 @@ function createZProvisionNew(inst) { } // If no operating system is specified, create only user entry - os = $('#' + thisTabId + ' input[name=os]:visible'); + os = $('#' + thisTabId + ' select[name=os]:visible'); // Check number of disks var diskRows = $('#' + thisTabId + ' table tr'); diff --git a/xCAT-UI/js/ui.js b/xCAT-UI/js/ui.js index 73371e4f7..2568f22c7 100644 --- a/xCAT-UI/js/ui.js +++ b/xCAT-UI/js/ui.js @@ -1056,3 +1056,18 @@ function getNodesChecked(datatableId) { return tgts; } + +/** + * Check if return message contains errors + * + * @param msg Return message + * @return 0 If return message contains no errors + * -1 If return message contains errors + */ +function containErrors(msg) { + if (msg.indexOf('Failed') > -1 || msg.indexOf('Error') > -1) { + return -1; + } else { + return 0; + } +} diff --git a/xCAT-server/lib/xcat/plugins/zvm.pm b/xCAT-server/lib/xcat/plugins/zvm.pm index b97667d6b..f3ab6c489 100644 --- a/xCAT-server/lib/xcat/plugins/zvm.pm +++ b/xCAT-server/lib/xcat/plugins/zvm.pm @@ -554,7 +554,9 @@ sub removeVM { $out = `ssh $hcp "sed --in-place -e $expression $::ZFCPPOOL/$pool.conf"`; } - xCAT::zvmUtils->printLn($callback, "$node: Updating FCP device pool $pool... Done"); + if (@luns) { + xCAT::zvmUtils->printLn($callback, "$node: Updating FCP device pool $pool... Done"); + } } # Check for errors @@ -837,7 +839,7 @@ sub changeVM { $out = xCAT::zvmUtils->appendHostname( $node, $out ); } - # addzfcp [pool] [device address] [size] [tag] [wwpn] [lun] + # addzfcp [pool] [device address] [loaddev (0 or 1)] [size] [tag (optional)] [wwpn (optional)] [lun (optional)] elsif ( $args->[0] eq "--addzfcp" ) { # Find a free disk in the pool # zFCP devices are contained in /var/opt/zhcp/zfcp/.conf @@ -845,13 +847,19 @@ sub changeVM { my $device = $args->[2]; my $argsSize = @{$args}; - if ($argsSize < 4 || $argsSize > 7) { + if ($argsSize < 5 || $argsSize > 8) { xCAT::zvmUtils->printLn( $callback, "$node: (Error) Wrong number of parameters" ); return; } + my $loaddev = int($args->[3]); + if ($loaddev != 0 && $loaddev != 1) { + xCAT::zvmUtils->printLn( $callback, "$node: (Error) The loaddev can be 0 or 1" ); + return; + } + # Size can be M(egabytes) or G(igabytes) - my $size = $args->[3]; + my $size = $args->[4]; if ($size =~ m/G/i) { # Convert to MegaBytes $size =~ s/\D//g; @@ -865,7 +873,7 @@ sub changeVM { # Tag specifies what to replace in the autoyast/kickstart template, e.g. $root_device$ # This argument is optional - my $tag = $args->[4]; + my $tag = $args->[5]; # Check if WWPN and LUN are given my $wwpn; @@ -873,8 +881,8 @@ sub changeVM { my $useWwpnLun = 0; if ($argsSize == 7) { $useWwpnLun = 1; - $wwpn = $args->[5]; - $lun = $args->[6]; + $wwpn = $args->[6]; + $lun = $args->[7]; # Make sure WWPN and LUN do not have 0x prefix $wwpn = xCAT::zvmUtils->replaceStr($wwpn, "0x", ""); @@ -1029,6 +1037,13 @@ sub changeVM { } xCAT::zvmUtils->printLn($callback, "$node: Adding FCP device... Done"); + + # Set loaddev statement in directory entry + if ($loaddev) { + $out = `chvm $node --setloaddev $wwpn $lun`; + xCAT::zvmUtils->printLn($callback, "$out"); + } + $out = ""; }