/** * Execute when the DOM is fully loaded */ $(document).ready(function() { // Load utility scripts includeJs("js/custom/zvmUtils.js"); }); /** * Constructor * * @return Nothing */ var zvmPlugin = function() { }; /** * Load clone page * * @param node * Source node to clone * @return Nothing */ zvmPlugin.prototype.loadClonePage = function(node) { // Get nodes tab var tab = getNodesTab(); var newTabId = node + 'CloneTab'; // If there is no existing clone tab if (!$('#' + newTabId).length) { // Get table headers var table = $('#' + node).parent().parent().parent().parent(); var headers = table.find('thead th'); var cols = new Array(); for ( var i = 0; i < headers.length; i++) { var col = headers.eq(i).text(); cols.push(col); } // Get hardware control point column var hcpCol = $.inArray('hcp', cols); // Get hardware control point var nodeRow = $('#' + node).parent().parent(); var datatable = $('#' + getNodesTableId()).dataTable(); var rowPos = datatable.fnGetPosition(nodeRow.get(0)); var aData = datatable.fnGetData(rowPos); var hcp = aData[hcpCol]; // Create status bar and hide it var statBarId = node + 'CloneStatusBar'; var statBar = createStatusBar(statBarId).hide(); // Create info bar var infoBar = createInfoBar('Clone a zvm node.'); // Create clone form var cloneForm = $('<div class="form"></div>'); cloneForm.append(statBar); cloneForm.append(infoBar); cloneForm.append('<div><label>Target node range:</label><input type="text" id="tgtNode" name="tgtNode" title="You must give a node or a node range. A node range must be given as: node1-node9 or node[1-9]."/></div>'); cloneForm.append('<div><label>Target user ID range:</label><input type="text" id="tgtUserId" name="tgtUserId" title="You must give a user ID or a user ID range. A user ID range must be given as: user1-user9 or user[1-9]."/></div>'); cloneForm.append('<div><label>Clone source:</label><input type="text" id="srcNode" name="srcNode" readonly="readonly" value="' + node + '" title="The source node to be cloned"/></div>'); cloneForm.append('<div><label>Hardware control point:</label><input type="text" id="newHcp" name="newHcp" readonly="readonly" value="' + hcp + '" title="The System z hardware control point (zHCP) responsible for managing the node(s). It must be the same as the source node."/></div>'); // Create group input var group = $('<div></div>'); var groupLabel = $('<label for="group">Group:</label>'); var groupInput = $('<input type="text" id="newGroup" name="newGroup" title="You must give the group where the new node(s) will be placed under."/>'); 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); cloneForm.append(group); // Get list of disk pools var temp = hcp.split('.'); var diskPools = $.cookie(temp[0] + 'diskpools'); // Create disk pool input var poolDiv = $('<div></div>'); var poolLabel = $('<label>Disk pool:</label>'); var poolInput = $('<input type="text" id="diskPool" name="diskPool" title="You must give a disk pool. xCAT relies on DirMaint to allocate minidisks out of a pool of DASD volumes. These DASD volume pools are defined in the EXTENT CONTROL file."/>').autocomplete({ source: diskPools.split(',') }); poolDiv.append(poolLabel); poolDiv.append(poolInput); cloneForm.append(poolDiv); cloneForm.append('<div><label>Disk password:</label><input type="password" id="diskPw" name="diskPw" title="The password that will be used for accessing the disk. This input is optional."/></div>'); // Generate tooltips cloneForm.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" } }); /** * Clone node */ var cloneBtn = createButton('Clone'); cloneBtn.bind('click', function(event) { // Remove any warning messages $(this).parent().parent().find('.ui-state-error').remove(); var ready = true; var errMsg = ''; // Check node name, userId, hardware control point, group, and password var inputs = $('#' + newTabId + ' input'); for ( var i = 0; i < inputs.length; i++) { if (!inputs.eq(i).val() && inputs.eq(i).attr('name') != 'diskPw' && inputs.eq(i).attr('name') != 'diskPool') { inputs.eq(i).css('border', 'solid #FF0000 1px'); ready = false; } else { inputs.eq(i).css('border', 'solid #BDBDBD 1px'); } } // Write error message if (!ready) { errMsg = errMsg + 'You are missing some inputs.<br>'; } // Get target node var nodeRange = $('#' + newTabId + ' input[name=tgtNode]').val(); // Get target user ID var userIdRange = $('#' + newTabId + ' input[name=tgtUserId]').val(); // Check node range and user ID range if (nodeRange.indexOf('-') > -1 || userIdRange.indexOf('-') > -1) { if (nodeRange.indexOf('-') < 0 || userIdRange.indexOf('-') < 0) { errMsg = errMsg + 'A user ID range and node range needs to be given.<br>'; ready = false; } else { var tmp = nodeRange.split('-'); // Get node base name var nodeBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var nodeStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var nodeEnd = parseInt(tmp[1].match(/\d+/)); tmp = userIdRange.split('-'); // Get user ID base name var userIdBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var userIdStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var userIdEnd = parseInt(tmp[1].match(/\d+/)); // If starting and ending index do not match if (!(nodeStart == userIdStart) || !(nodeEnd == userIdEnd)) { // Not ready to provision errMsg = errMsg + 'The node range and user ID range does not match.<br>'; ready = false; } } } // Get source node, hardware control point, group, disk pool, and disk password var srcNode = $('#' + newTabId + ' input[name=srcNode]').val(); var hcp = $('#' + newTabId + ' input[name=newHcp]').val(); var group = $('#' + newTabId + ' input[name=newGroup]').val(); var diskPool = $('#' + newTabId + ' input[name=diskPool]').val(); var diskPw = $('#' + newTabId + ' input[name=diskPw]').val(); // If a value is given for every input if (ready) { // Disable all inputs var inputs = $('#' + newTabId + ' input'); inputs.attr('disabled', 'disabled'); // If a node range is given if (nodeRange.indexOf('-') > -1) { var tmp = nodeRange.split('-'); // Get node base name var nodeBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var nodeStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var nodeEnd = parseInt(tmp[1].match(/\d+/)); tmp = userIdRange.split('-'); // Get user ID base name var userIdBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var userIdStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var userIdEnd = parseInt(tmp[1].match(/\d+/)); // Loop through each node in the node range for ( var i = nodeStart; i <= nodeEnd; i++) { var node = nodeBase + i.toString(); var userId = userIdBase + i.toString(); var inst = i + '/' + nodeEnd; /** * (1) Define node */ $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : node + ';zvm.hcp=' + hcp + ';zvm.userid=' + userId + ';nodehm.mgt=zvm' + ';groups=' + group, msg : 'cmd=nodeadd;inst=' + inst + ';out=' + statBarId + ';node=' + node }, success : updateZCloneStatus }); } } else { /** * (1) Define node */ $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : nodeRange + ';zvm.hcp=' + hcp + ';zvm.userid=' + userIdRange + ';nodehm.mgt=zvm' + ';groups=' + group, msg : 'cmd=nodeadd;inst=1/1;out=' + statBarId + ';node=' + nodeRange }, success : updateZCloneStatus }); } // Create loader var loader = createLoader(''); $('#' + statBarId).find('div').append(loader); $('#' + statBarId).show(); // Disable clone button $(this).attr('disabled', 'true'); } else { // Show warning message var warn = createWarnBar(errMsg); warn.prependTo($(this).parent().parent()); } }); cloneForm.append(cloneBtn); // Add clone tab tab.add(newTabId, 'Clone', cloneForm, true); } tab.select(newTabId); }; /** * Load node inventory * * @param data * Data from HTTP request * @return Nothing */ zvmPlugin.prototype.loadInventory = function(data) { var args = data.msg.split(','); // Get tab ID var tabId = args[0].replace('out=', ''); // Get node var node = args[1].replace('node=', ''); // Get node inventory var inv = data.rsp[0].split(node + ':'); // Remove loader $('#' + tabId).find('img').remove(); // Create status bar var statBarId = node + 'StatusBar'; var statBar = createStatusBar(statBarId); // Add loader to status bar and hide it var loader = createLoader(node + 'StatusBarLoader').hide(); statBar.find('div').append(loader); statBar.hide(); // Create array of property keys var keys = new Array('userId', 'host', 'os', 'arch', 'hcp', 'priv', 'memory', 'proc', 'disk', 'nic'); // Create hash table for property names var attrNames = new Object(); attrNames['userId'] = 'z/VM UserID:'; attrNames['host'] = 'z/VM Host:'; attrNames['os'] = 'Operating System:'; attrNames['arch'] = 'Architecture:'; attrNames['hcp'] = 'HCP:'; attrNames['priv'] = 'Privileges:'; attrNames['memory'] = 'Total Memory:'; attrNames['proc'] = 'Processors:'; attrNames['disk'] = 'Disks:'; attrNames['nic'] = 'NICs:'; // Create hash table for node attributes var attrs = getAttrs(keys, attrNames, inv); // Create division to hold user entry var ueDivId = node + 'UserEntry'; var ueDiv = $('<div class="userEntry" id="' + ueDivId + '"></div>'); // Create division to hold inventory var invDivId = node + 'Inventory'; var invDiv = $('<div class="inventory" id="' + invDivId + '"></div>'); /** * Show user entry */ var toggleLinkId = node + 'ToggleLink'; var toggleLink = $('<a id="' + toggleLinkId + '">Show directory entry</a>'); toggleLink.one('click', function(event) { // Toggle inventory division $('#' + invDivId).toggle(); // Create loader var loader = createLoader(node + 'TabLoader'); loader = $('<center></center>').append(loader); ueDiv.append(loader); // Get user entry var msg = 'out=' + ueDivId + ';node=' + node; $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsvm', tgt : node, args : '', msg : msg }, success : loadUserEntry }); // Change text $(this).text('Show inventory'); // Disable toggle link $(this).unbind(event); }); // Align toggle link to the right var toggleLnkDiv = $('<div class="toggle"></div>').css( { 'text-align' : 'right' }); toggleLnkDiv.append(toggleLink); /** * General info section */ var fieldSet = $('<fieldset></fieldset>'); var legend = $('<legend>General</legend>'); fieldSet.append(legend); var oList = $('<ol></ol>'); var item, label, input, args; // Loop through each property for ( var k = 0; k < 5; k++) { // Create a list item for each property item = $('<li></li>'); // Create a label - Property name label = $('<label>' + attrNames[keys[k]] + '</label>'); item.append(label); for ( var l = 0; l < attrs[keys[k]].length; l++) { // Create a input - Property value(s) // Handle each property uniquely item.append(attrs[keys[k]][l]); } oList.append(item); } // Append to inventory form fieldSet.append(oList); invDiv.append(fieldSet); /** * Hardware info section */ var hwList, hwItem; fieldSet = $('<fieldset></fieldset>'); legend = $('<legend>Hardware</legent>'); fieldSet.append(legend); oList = $('<ol></ol>'); // Loop through each property var label; for (k = 5; k < keys.length; k++) { // Create a list item item = $('<li></li>'); // Create a list to hold the property value(s) hwList = $('<ul></ul>'); hwItem = $('<li></li>'); /** * Privilege section */ if (keys[k] == 'priv') { // Create a label - Property name label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>'); item.append(label); // Loop through each line for (l = 0; l < attrs[keys[k]].length; l++) { // Create a new list item for each line hwItem = $('<li></li>'); // Determine privilege args = attrs[keys[k]][l].split(' '); if (args[0] == 'Directory:') { label = $('<label>' + args[0] + '</label>'); hwItem.append(label); hwItem.append(args[1]); } else if (args[0] == 'Currently:') { label = $('<label>' + args[0] + '</label>'); hwItem.append(label); hwItem.append(args[1]); } hwList.append(hwItem); } item.append(hwList); } /** * Memory section */ else if (keys[k] == 'memory') { // Create a label - Property name label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>'); item.append(label); // Loop through each value line for (l = 0; l < attrs[keys[k]].length; l++) { // Create a new list item for each line hwItem = $('<li></li>'); hwItem.append(attrs[keys[k]][l]); hwList.append(hwItem); } item.append(hwList); } /** * Processor section */ else if (keys[k] == 'proc') { // Create a label - Property name label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>'); item.append(label); // Create a table to hold processor data var procTable = $('<table></table>'); var procBody = $('<tbody></tbody>'); var procFooter = $('<tfoot></tfoot>'); // Table columns - Type, Address, ID, Base, Dedicated, and Affinity var procTabRow = $('<thead> <th>Type</th> <th>Address</th> <th>ID</th> <th>Base</th> <th>Dedicated</th> <th>Affinity</th> </thead>'); procTable.append(procTabRow); var procType, procAddr, procId, procAff; /** * Remove processor */ var contextMenu = [{ 'Remove' : function(menuItem, menu) { var addr = $(this).text(); // Open dialog to confirm var confirmDialog = $('<div><p>Are you sure you want to remove this processor?</p></div>'); confirmDialog.dialog({ modal: true, width: 300, buttons: { "Ok": function(){ removeProcessor(node, addr); $(this).dialog("close"); }, "Cancel": function() { $(this).dialog("close"); } } }); } }]; // Loop through each processor var closeBtn; var n, temp; var procType, procAddr, procLink; for (l = 0; l < attrs[keys[k]].length; l++) { if (attrs[keys[k]][l]) { args = attrs[keys[k]][l].split(' '); // Get processor type, address, ID, and affinity n = 3; temp = args[args.length - n]; while (!jQuery.trim(temp)) { n = n + 1; temp = args[args.length - n]; } procType = $('<td>' + temp + '</td>'); procAddr = $('<td></td>'); procLink = $('<a>' + args[1] + '</a>'); // Append context menu to link procLink.contextMenu(contextMenu, { theme : 'vista' }); procAddr.append(procLink); procId = $('<td>' + args[5] + '</td>'); procAff = $('<td>' + args[args.length - 1] + '</td>'); // Base processor if (args[6] == '(BASE)') { baseProc = $('<td>' + true + '</td>'); } else { baseProc = $('<td>' + false + '</td>'); } // Dedicated processor if (args[args.length - 3] == 'DEDICATED') { dedicatedProc = $('<td>' + true + '</td>'); } else { dedicatedProc = $('<td>' + false + '</td>'); } // Create a new row for each processor procTabRow = $('<tr></tr>'); procTabRow.append(procType); procTabRow.append(procAddr); procTabRow.append(procId); procTabRow.append(baseProc); procTabRow.append(dedicatedProc); procTabRow.append(procAff); procBody.append(procTabRow); } } procTable.append(procBody); /** * Add processor */ var addProcLink = $('<a>Add temporary processor</a>'); addProcLink.bind('click', function(event) { openAddProcDialog(node); }); procFooter.append(addProcLink); procTable.append(procFooter); item.append(procTable); } /** * Disk section */ else if (keys[k] == 'disk') { // Create a label - Property name label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>'); item.append(label); // Create a table to hold disk (DASD) data var dasdTable = $('<table></table>'); var dasdBody = $('<tbody></tbody>'); var dasdFooter = $('<tfoot></tfoot>'); /** * Remove disk */ contextMenu = [{ 'Remove' : function(menuItem, menu) { var addr = $(this).text(); // Open dialog to confirm var confirmDialog = $('<div><p>Are you sure you want to remove this disk?</p></div>'); confirmDialog.dialog({ modal: true, width: 300, buttons: { "Ok": function(){ removeDisk(node, addr); $(this).dialog("close"); }, "Cancel": function() { $(this).dialog("close"); } } }); } }]; // Table columns - Virtual Device, Type, VolID, Type of Access, and Size var dasdTabRow = $('<thead> <th>Virtual Device #</th> <th>Type</th> <th>VolID</th> <th>Type of Access</th> <th>Size</th> </thead>'); dasdTable.append(dasdTabRow); var dasdVDev, dasdType, dasdVolId, dasdAccess, dasdSize; // Loop through each DASD for (l = 0; l < attrs[keys[k]].length; l++) { if (attrs[keys[k]][l]) { args = attrs[keys[k]][l].split(' '); // Get DASD virtual device, type, volume ID, access, and size dasdVDev = $('<td></td>'); dasdLink = $('<a>' + args[1] + '</a>'); // Append context menu to link dasdLink.contextMenu(contextMenu, { theme : 'vista' }); dasdVDev.append(dasdLink); dasdType = $('<td>' + args[2] + '</td>'); dasdVolId = $('<td>' + args[3] + '</td>'); dasdAccess = $('<td>' + args[4] + '</td>'); dasdSize = $('<td>' + args[args.length - 9] + ' ' + args[args.length - 8] + '</td>'); // Create a new row for each DASD dasdTabRow = $('<tr></tr>'); dasdTabRow.append(dasdVDev); dasdTabRow.append(dasdType); dasdTabRow.append(dasdVolId); dasdTabRow.append(dasdAccess); dasdTabRow.append(dasdSize); dasdBody.append(dasdTabRow); } } dasdTable.append(dasdBody); /** * Add disk */ var addDasdLink = $('<a>Add disk</a>'); addDasdLink.bind('click', function(event) { var hcp = attrs['hcp'][0].split('.'); openAddDiskDialog(node, hcp[0]); }); dasdFooter.append(addDasdLink); dasdTable.append(dasdFooter); item.append(dasdTable); } /** * NIC section */ else if (keys[k] == 'nic') { // Create a label - Property name label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>'); item.append(label); // Create a table to hold NIC data var nicTable = $('<table></table>'); var nicBody = $('<tbody></tbody>'); var nicFooter = $('<tfoot></tfoot>'); /** * Remove NIC */ contextMenu = [ { 'Remove' : function(menuItem, menu) { var addr = $(this).text(); // Open dialog to confirm var confirmDialog = $('<div><p>Are you sure you want to remove this NIC?</p></div>'); confirmDialog.dialog({ modal: true, width: 300, buttons: { "Ok": function(){ removeNic(node, addr); $(this).dialog("close"); }, "Cancel": function() { $(this).dialog("close"); } } }); } } ]; // Table columns - Virtual device, Adapter Type, Port Name, # of Devices, MAC Address, and LAN Name var nicTabRow = $('<th>Virtual Device #</th> <th>Adapter Type</th> <th>Port Name</th> <th># of Devices</th> <th>LAN Name</th>'); nicTable.append(nicTabRow); var nicVDev, nicType, nicPortName, nicNumOfDevs, nicMacAddr, nicLanName; // Loop through each NIC (Data contained in 2 lines) for (l = 0; l < attrs[keys[k]].length; l = l + 2) { if (attrs[keys[k]][l]) { args = attrs[keys[k]][l].split(' '); // Get NIC virtual device, type, port name, and number of devices nicVDev = $('<td></td>'); nicLink = $('<a>' + args[1] + '</a>'); // Append context menu to link nicLink.contextMenu(contextMenu, { theme : 'vista' }); nicVDev.append(nicLink); nicType = $('<td>' + args[3] + '</td>'); nicPortName = $('<td>' + args[10] + '</td>'); nicNumOfDevs = $('<td>' + args[args.length - 1] + '</td>'); args = attrs[keys[k]][l + 1].split(' '); nicLanName = $('<td>' + args[args.length - 2] + ' ' + args[args.length - 1] + '</td>'); // Create a new row for each DASD nicTabRow = $('<tr></tr>'); nicTabRow.append(nicVDev); nicTabRow.append(nicType); nicTabRow.append(nicPortName); nicTabRow.append(nicNumOfDevs); nicTabRow.append(nicLanName); nicBody.append(nicTabRow); } } nicTable.append(nicBody); /** * Add NIC */ var addNicLink = $('<a>Add NIC</a>'); addNicLink.bind('click', function(event) { var hcp = attrs['hcp'][0].split('.'); openAddNicDialog(node, hcp[0]); }); nicFooter.append(addNicLink); nicTable.append(nicFooter); item.append(nicTable); } oList.append(item); } // Append inventory to division fieldSet.append(oList); invDiv.append(fieldSet); // Append to tab $('#' + tabId).append(statBar); $('#' + tabId).append(toggleLnkDiv); $('#' + tabId).append(ueDiv); $('#' + tabId).append(invDiv); }; /** * Load provision page * * @param tabId * The provision tab ID * @return Nothing */ zvmPlugin.prototype.loadProvisionPage = function(tabId) { // Get OS image names $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'tabdump', tgt : '', args : 'osimage', msg : '' }, success : setOSImageCookies }); // Get groups $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'extnoderange', tgt : '/.*', args : 'subgroups', msg : '' }, success : setGroupsCookies }); // Error message string var errMsg; // Get provision tab instance var inst = tabId.replace('zvmProvisionTab', ''); // Create provision form var provForm = $('<div class="form"></div>'); // Create status bar var statBarId = 'zProvisionStatBar' + inst; var statBar = createStatusBar(statBarId).hide(); provForm.append(statBar); // Create loader var loader = createLoader('zProvisionLoader' + inst).hide(); statBar.find('div').append(loader); // Create info bar var infoBar = createInfoBar('Provision a node on System z.'); provForm.append(infoBar); // Append to provision tab $('#' + tabId).append(provForm); // Create provision type drop down var provType = $('<div></div>'); var typeLabel = $('<label>Provision:</label>'); var typeSelect = $('<select></select>'); var provNewNode = $('<option value="new">New node</option>'); var provExistNode = $('<option value="existing">Existing node</option>'); typeSelect.append(provNewNode); typeSelect.append(provExistNode); provType.append(typeLabel); provType.append(typeSelect); provForm.append(provType); /** * Create provision new node division */ var provNew = createZProvisionNew(inst); provForm.append(provNew); /** * Create provision existing node division */ var provExisting = createZProvisionExisting(inst); provForm.append(provExisting); // Toggle provision new/existing on select typeSelect.change(function(){ var selected = $(this).val(); if (selected == 'new') { provNew.toggle(); provExisting.toggle(); } else { provNew.toggle(); provExisting.toggle(); } }); }; /** * Load the resources * * @return Nothing */ zvmPlugin.prototype.loadResources = function() { // Reset resource table setDiskDataTable(''); setNetworkDataTable(''); // Get hardware control points $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodels', tgt : 'mgt==zvm', args : 'zvm.hcp', msg : '' }, success : getZResources }); }; /** * Add node range * * @return Nothing */ zvmPlugin.prototype.addNode = function() { // Create form to add node range var addNodeForm = $('<div class="form"></div>'); var info = createInfoBar('Add a node range'); addNodeForm.append(info); addNodeForm.append('<div><label for="node">Node range:</label><input type="text" id="node" name="node"/></div>'); addNodeForm.append('<div><label for="userId">User ID range:</label><input type="text" id="userId" name="userId"/></div>'); addNodeForm.append('<div><label for="hcp">Hardware control point:</label><input type="text" id="hcp" name="hcp"/></div>'); addNodeForm.append('<div><label for="group">Group:</label><input type="text" id="group" name="group"/></div>'); // Open form as a dialog addNodeForm.dialog({ modal: true, width: 400, buttons: { "Ok": function(){ // Remove any warning messages $(this).find('.ui-state-error').remove(); // Get inputs var nodeRange = $(this).find('input[name=node]').val(); var userIdRange = $(this).find('input[name=userId]').val(); var group = $(this).find('input[name=group]').val(); var hcp = $(this).find('input[name=hcp]').val(); // Show warning message if inputs are not complete if (!nodeRange || !userIdRange || !group || !hcp) { var warn = createWarnBar('You are missing inputs.'); warn.prependTo($(this)); } else { // Check node range and user ID range // Range can be given as gpok10-gpok20, gpok[10-20], or gpok10+10 var errMsg = ''; var ready = true; if (nodeRange.indexOf('-') > -1 || userIdRange.indexOf('-') > -1) { if (nodeRange.indexOf('-') < 0 || userIdRange.indexOf('-') < 0) { errMsg = errMsg + 'A user ID range and node range needs to be given. '; ready = false; } else { var tmp = nodeRange.split('-'); // Get node base name var nodeBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var nodeStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var nodeEnd = parseInt(tmp[1].match(/\d+/)); tmp = userIdRange.split('-'); // Get user ID base name var userIdBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var userIdStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var userIdEnd = parseInt(tmp[1].match(/\d+/)); // If starting and ending index do not match if (!(nodeStart == userIdStart) || !(nodeEnd == userIdEnd)) { // Not ready errMsg = errMsg + 'The node range and user ID range does not match. '; ready = false; } } } // If there are no errors if (ready) { // If a node range is given if (nodeRange.indexOf('-') > -1 && userIdRange.indexOf('-') > -1) { var tmp = nodeRange.split('-'); // Get node base name var nodeBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var nodeStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var nodeEnd = parseInt(tmp[1].match(/\d+/)); tmp = userIdRange.split('-'); // Get user ID base name var userIdBase = tmp[0].match(/[a-zA-Z]+/); // Get starting index var userIdStart = parseInt(tmp[0].match(/\d+/)); // Get ending index var userIdEnd = parseInt(tmp[1].match(/\d+/)); // Loop through each node in the node range for ( var i = nodeStart; i <= nodeEnd; i++) { var node = nodeBase + i.toString(); var userId = userIdBase + i.toString(); var inst = i + '/' + nodeEnd; /** * (1) Define node */ $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : node + ';zvm.hcp=' + hcp + ';zvm.userid=' + userId + ';nodehm.mgt=zvm' + ';groups=' + group, msg : 'cmd=addnewnode;inst=' + inst + ';noderange=' + nodeRange }, /** * Return function on successful AJAX call * * @param data * Data returned from HTTP request * @return Nothing */ success : function (data) { // Get ajax response var rsp = data.rsp; var args = data.msg.split(';'); // Get command invoked var cmd = args[0].replace('cmd=', ''); var inst = args[1].replace('inst=', ''); var nodeRange = args[2].replace('noderange=', ''); // If the last node was added var tmp = inst.split('/'); if (tmp[0] == tmp[1]) { // If there was an error, do not continue if (rsp.length) { openDialog('warn', '(Error) Failed to create node definitions'); } else { openDialog('info', 'Node definitions created for ' + nodeRange); } } } }); } } else { // Only one node to add $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : nodeRange + ';zvm.hcp=' + hcp + ';zvm.userid=' + userIdRange + ';nodehm.mgt=zvm' + ';groups=' + group, msg : 'cmd=addnewnode;node=' + nodeRange }, /** * Return function on successful AJAX call * * @param data * Data returned from HTTP request * @return Nothing */ success : function (data) { // Get ajax response var rsp = data.rsp; var args = data.msg.split(';'); // Get command invoked var cmd = args[0].replace('cmd=', ''); var node = args[1].replace('node=', ''); // If there was an error, do not continue if (rsp.length) { openDialog('warn', '(Error) Failed to create node definition'); } else { openDialog('info', 'Node definitions created for ' + node); } } }); } // Close dialog $(this).dialog( "close" ); } else { // Show warning message var warn = createWarnBar(errMsg); warn.prependTo($(this)); } } // End of else }, "Cancel": function(){ $(this).dialog( "close" ); } } }); };