var provisionClock; /** * Create nodes datatable for a given group * * @param group * Group name * @param outId * Division ID to append datatable * @return Nodes datatable */ function createNodesDatatable(group, outId) { // Get group nodes $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsdef', tgt : '', args : group, msg : outId }, /** * Create nodes datatable * * @param data * Data returned from HTTP request * @return Nothing */ success : function(data) { // Data returned var rsp = data.rsp; // Get output ID var outId = data.msg; // Get datatable ID var dTableId = outId.replace('DIV', ''); // Node attributes hash var attrs = new Object(); // Node attributes var headers = new Object(); // Clear nodes datatable division $('#' + outId).empty(); // Create nodes datatable var node, args; for ( var i in rsp) { // Get node var pos = rsp[i].indexOf('Object name:'); if (pos > -1) { var temp = rsp[i].split(': '); node = jQuery.trim(temp[1]); // Create a hash for the node attributes attrs[node] = new Object(); i++; } // Get key and value args = rsp[i].split('='); var key = jQuery.trim(args[0]); var val = jQuery.trim(args[1]); // Create hash table attrs[node][key] = val; headers[key] = 1; } // Sort headers var sorted = new Array(); for ( var key in headers) { sorted.push(key); } sorted.sort(); // Add column for check box and node sorted.unshift('', 'node'); // Create nodes datatable var dTable = new DataTable(dTableId); dTable.init(sorted); // Go through each node for ( var node in attrs) { // Create a row var row = new Array(); // Create a check box var checkBx = ''; row.push(checkBx, node); // Go through each header for ( var i = 2; i < sorted.length; i++) { // Add node attributes to the row var key = sorted[i]; var val = attrs[node][key]; if (val) { row.push(val); } else { row.push(''); } } // Add row to table dTable.add(row); } $('#' + outId).append(dTable.object()); $('#' + dTableId).dataTable(); } // End of function(data) }); } /** * Create provision existing node division * * @param plugin * Plugin name to create division for * @param inst * Provision tab instance * @return Provision existing node division */ function createProvisionExisting(plugin, inst) { // Create provision existing division and hide it var provExisting = $('
').hide(); // Create group input var group = $('
'); var groupLabel = $(''); group.append(groupLabel); // Turn on auto complete for group var dTableDivId = plugin + 'NodesDatatableDIV' + inst; // Division ID where nodes datatable will be appended 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, dTableDivId); } // End of if (thisGroup) }); } else { // If no groups are cookied var groupInput = $(''); group.append(groupInput); } provExisting.append(group); // Create node input var node = $('
'); var nodeLabel = $(''); var nodeDatatable = $('

Select a group to view its nodes

'); node.append(nodeLabel); node.append(nodeDatatable); provExisting.append(node); // Create boot method drop down var method = $('
'); var methodLabel = $(''); var methodSelect = $(''); methodSelect.append('' + '' + '' + '' + '' ); method.append(methodLabel); method.append(methodSelect); provExisting.append(method); // Create boot type drop down var type = $('
'); var typeLabel = $(''); var typeSelect = $(''); typeSelect.append('' + '' + '' ); type.append(typeLabel); type.append(typeSelect); provExisting.append(type); // Create operating system input var os = $('
'); var osLabel = $(''); var osInput = $(''); osInput.one('focus', function() { var tmp = $.cookie('osvers'); if (tmp) { // Turn on auto complete $(this).autocomplete({ source: tmp.split(',') }); } }); os.append(osLabel); os.append(osInput); provExisting.append(os); // Create architecture input var arch = $('
'); var archLabel = $(''); var archInput = $(''); archInput.one('focus', function() { var tmp = $.cookie('osarchs'); if (tmp) { // Turn on auto complete $(this).autocomplete({ source: tmp.split(',') }); } }); arch.append(archLabel); arch.append(archInput); provExisting.append(arch); // Create profile input var profile = $('
'); var profileLabel = $(''); var profileInput = $(''); profileInput.one('focus', function() { var tmp = $.cookie('profiles'); if (tmp) { // Turn on auto complete $(this).autocomplete({ source: tmp.split(',') }); } }); profile.append(profileLabel); profile.append(profileInput); provExisting.append(profile); /** * Provision existing */ var provisionBtn = createButton('Provision'); provisionBtn.bind('click', function(event) { // TODO Insert provision code here openDialog('info', 'Under construction'); }); provExisting.append(provisionBtn); return provExisting; } /** * Create provision new node division * * @param inst * Provision tab instance * @return Provision new node division */ function createProvisionNew(plugin, inst) { // Create provision new node division var provNew = $('
'); // Create node input var nodeName = $('
'); provNew.append(nodeName); // Create group input var group = $('
'); var groupLabel = $(''); var groupInput = $(''); 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); provNew.append(group); // Create boot method drop down var method = $('
'); var methodLabel = $(''); var methodSelect = $(''); methodSelect.append('' + '' + '' + '' + '' ); method.append(methodLabel); method.append(methodSelect); provNew.append(method); // Create boot type drop down var type = $('
'); var typeLabel = $(''); var typeSelect = $(''); typeSelect.append('' + '' + '' ); type.append(typeLabel); type.append(typeSelect); provNew.append(type); // Create operating system input var os = $('
'); var osLabel = $(''); var osInput = $(''); osInput.one('focus', function() { var tmp = $.cookie('osvers'); if (tmp) { // Turn on auto complete $(this).autocomplete({ source: tmp.split(',') }); } }); os.append(osLabel); os.append(osInput); provNew.append(os); // Create architecture input var arch = $('
'); var archLabel = $(''); var archInput = $(''); archInput.one('focus', function() { var tmp = $.cookie('osarchs'); if (tmp) { // Turn on auto complete $(this).autocomplete({ source: tmp.split(',') }); } }); arch.append(archLabel); arch.append(archInput); provNew.append(arch); // Create profile input var profile = $('
'); var profileLabel = $(''); var profileInput = $(''); profileInput.one('focus', function() { var tmp = $.cookie('profiles'); if (tmp) { // Turn on auto complete $(this).autocomplete({ source: tmp.split(',') }); } }); profile.append(profileLabel); profile.append(profileInput); provNew.append(profile); /** * Provision new node */ var provisionBtn = createButton('Provision'); provisionBtn.bind('click', function(event) { // TODO Insert provision code here openDialog('info', 'Under construction'); }); provNew.append(provisionBtn); return provNew; } /** * Create provision node division * * @param plugin * Plugin name to create division for * @param container * Container to hold provisioning form * @return Nothing */ function createProvision(plugin, container){ // Group, nodes, arch if ('quick' == plugin) { container.append(createProvWithUrl()); } else { container.append(createProvNoUrl(plugin)); container.find('#' + plugin + 'group').bind('change', function() { var pluginName = $(this).attr('id').replace('group', ''); $('#' + pluginName + 'SelectNodesTable').html(''); createNodesArea($(this).val(), pluginName + 'SelectNodesTable'); }); } // Advanced options container.append('
'); // Add provision button var provisionBtn = createButton('Provision'); provisionBtn.bind('click', function(){ var plugin = $(this).parent().parent().attr('id').replace('ProvisionTab', ''); quickProvision(plugin); }); provisionBtn.hide(); container.append(provisionBtn); // Bind image select to change event container.find('#' + plugin + 'image').bind('change', function(){ var temp = $(this).attr('id'); temp = temp.replace('image', ''); $('#' + temp + 'ProvisionTab #advoption').html(''); provAdvOption($(this).val(), temp); }); $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsdef', tgt : '', args : '-t;osimage', msg : plugin }, success : function(data){ var containerId = data.msg + 'ProvisionTab'; var i = 0; var imageName = 0; var position = 0; var imageSelect = $('#' + containerId + ' #' + data.msg + 'image'); $('#' + containerId + ' img').remove(); if (!data.rsp.length) { $('#' + containerId).prepend(createWarnBar('Please run copycds and genimage in provision page before continuing!')); return; } for (i in data.rsp) { imageName = data.rsp[i]; position = imageName.indexOf(' '); imageName = imageName.substr(0, position); imageSelect.append($('')); } // Trigger select change event imageSelect.trigger('change'); // Show provision button $('#' + containerId + ' button').show(); } }); } /** * Create provision node division using URL * * @returns Provisiong node division */ function createProvWithUrl(){ var queryStr = window.location.search; var argArray = queryStr.substr(1).split('&'); var tempHash = new Object(); var i = 0; var tempArray; var provHtml = ''; var master = ''; var tftpserver = ''; var nfsserver = ''; for (i = 0; i < argArray.length; i++) { tempArray = argArray[i].split('='); tempHash[tempArray[0]] = tempArray[1]; } provHtml += '
'; provHtml += '
'; provHtml += '
' + '
' + '
' ; if (tempHash['master']) { master = tempHash['master']; } if (tempHash['nfsserver']) { nfsserver = tempHash['nfsserver']; } if (tempHash['tftpserver']) { tftpserver = tempHash['tftpserver']; } provHtml += '
'; provHtml += '
'; provHtml += '
'; return provHtml; } /** * Create provision node division without using URL * * @param plugin * Plugin name to create division for * @returns {String} */ function createProvNoUrl(plugin){ // Select group var groupHtml = '
'; var groupNames = $.cookie('groups'); if (groupNames) { groupHtml += ''; } groupHtml += '
'; // Select nodes var nodesHtml = '
Select a group to view its nodes
'; // Select architecture var archHtml = '
'; var archName = $.cookie('osarchs'); if (archName) { archHtml += ''; } else { archHtml += ''; } archHtml += '
'; // Add static input part var staticHtml = '
' + '
' + '
' + '
' + '
' + '
'; return groupHtml + nodesHtml + archHtml + staticHtml; } /** * Get needed fields for provsioning and send command to server * * @param plugin * Plugin name of platform to provision * @return Nothing */ function quickProvision(plugin){ var errorMessage = ''; var argsArray = new Array(); var nodesName = ''; var provisionArg = ''; var provisionFrame; var imageName = ''; var url = ''; var softwareArg = ''; var containerId = plugin + 'ProvisionTab'; $('#' + containerId + ' .ui-state-error').remove(); $('#' + containerId + ' input[type!="checkbox"]').each(function() { if (!$(this).val()) { errorMessage = 'You are missing some inputs!'; return false; } else { argsArray.push($(this).val()); } }); if (errorMessage) { $('#' + containerId).prepend('

' + errorMessage + '

'); return; } // If jumped from nodes page, get node names if ('quick' == plugin) { nodesName = argsArray.shift(); } // Select platform, get node names from table checkbox else { // Should unshift the arch type argsArray.unshift($('#' + containerId + ' #arch').val()); nodesName = getCheckedByObj($('#' + containerId + ' #' + plugin + 'SelectNodesTable')); } if (!nodesName) { $('#' + containerId).prepend('

Please select a node

'); return; } softwareArg = getCheckedByObj($('#' + containerId + ' #advoption')); imageName = $('#' + containerId + ' #' + plugin + 'image').val(); provisionArg = argsArray.join(','); url = 'lib/cmd.php?cmd=webrun&tgt=&args=provision;' + nodesName + ';' + imageName + ';' + provisionArg + ';' + softwareArg + '&msg=&opts=flush'; // Show output var deployDia = $('
'); deployDia.append(createLoader()).append('
'); deployDia.append(''); deployDia.dialog({ modal: true, width: 600, height: 480, title:'Provision return', close: function(){$(this).remove();}, buttons: { Close : function(){$(this).dialog('close');} } }); provisionStopCheck(); } /** * Create provisioning advance option * * @param imagename * Image name * @param plugin * Plugin name of platform to provision * @return Nothing */ function provAdvOption(imagename, plugin) { $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'lsdef', tgt : '', args : '-t;osimage;' + imagename + ';-i;osname,provmethod', msg : plugin }, success : function(data) { var containerId = data.msg + 'ProvisionTab'; var i = 0; var osName = ''; var provMethod = ''; var tempStr = ''; var position = 0; for (i = 0; i < data.rsp.length; i++) { tempStr = data.rsp[i]; if (tempStr.indexOf('osname') != -1) { position = tempStr.indexOf('='); osName = tempStr.substr(position + 1); } if (tempStr.indexOf('provmethod') != -1) { position = tempStr.indexOf('='); provMethod = tempStr.substr(position + 1); } } $('#' + containerId + ' #advoption').empty(); if ('aix' == osName.toLowerCase()) { return; } if ('install' == provMethod){ $('#' + containerId + ' #advoption').html('Install Ganglia.'); } } }); } /** * Refresh nodes area base on group selected * * @param groupName * Group name * @param areaId * Area ID to refresh * @return Nothing */ function createNodesArea(groupName, areaId) { // Get group nodes $.ajax({ url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodels', tgt : groupName, args : '', msg : areaId }, success : function(data) { var areaObj = $('#' + data.msg); var nodes = data.rsp; var index; var nodesHtml = ''; nodesHtml += ''; for (index in nodes) { var node = nodes[index][0]; if (!node) { continue; } nodesHtml += ''; } nodesHtml += '
Node
' + node + '
'; areaObj.empty().append(nodesHtml); if (index > 10) { areaObj.css('height', '300px'); } else { areaObj.css('height', 'auto'); } } // End of function(data) }); } function provisionStopCheck(){ var content = $('#provisionFrame').contents().find('body').text(); if (content.indexOf('provision stop') != -1) { $('#deployDia img').remove(); clearTimeout(provisionClock); } else { provisionClock = setTimeout('provisionStopCheck()', 5000); } } /** * Get select element names * * @param obj * Object to get selected element names * @return Nodes name seperate by a comma */ function getCheckedByObj(obj) { var str = ''; // Get nodes that were checked obj.find('input:checked').each(function() { if ($(this).attr('name')) { str += $(this).attr('name') + ','; } }); if (str) { str = str.substr(0, str.length - 1); } return str; }