Name

global.SubAccountsDiscoveryAjax

Description

Handles ajax requests for running patterns to discover sub accounts

Script

var SubAccountsDiscoveryAjax = Class.create();

SubAccountsDiscoveryAjax.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
  ajaxFunction_triggerMemberAccountsDiscovery: function() {
  	try {
  		var credentialSysId = this.getParameter('sysparm_service_account_credential_sys_id'),
  			serviceAccountId = this.getParameter('sysparm_service_account_id'),
  			datacenterType = this.getParameter('sysparm_service_account_datacenter_type'),
  			serviceAccountSysId = this.getParameter('sysparm_service_account_sys_id'),
  			datacenterUrl = this.getParameter('sysparm_service_account_datacenter_url'),
  			answerObject = {};

  		var cloudProvider = "",
  			subAccountsDiscoveryPatternSysId = "" ;
  		if (datacenterType == 'cmdb_ci_aws_datacenter')
  			cloudProvider = 'AWS';
  		else if (datacenterType == 'cmdb_ci_azure_datacenter')
  			cloudProvider = 'Azure';
  		else if (datacenterType == 'cmdb_ci_google_datacenter')
  			cloudProvider = 'Google';
  		else {
  			answerObject.errorMessage = gs.getMessage('Please select a valid cloud provider.');
  			return JSON.stringify(answerObject);
  		}

  		// Shouldn't happen
  		if (!serviceAccountId) {
  			answerObject.errorMessage = gs.getMessage('Missing account id');
  			return JSON.stringify(answerObject);
  		}

          var invocationContext = {};
          invocationContext['service_account_id'] = serviceAccountId;

  		var midServerSysId = (new CloudMidSelectionApi()).selectMid('Discovery', cloudProvider, '', JSON.stringify(invocationContext));
  		var midServerGlideRecord = new GlideRecord('ecc_agent');

  		if (!midServerSysId || !midServerGlideRecord.get(midServerSysId)){
  			answerObject.errorMessage = gs.getMessage('No MID found');
  			return JSON.stringify(answerObject);
  		}
  		var preExecutionDataObject = new SNC.PrePatternExecutionData(),
  			discoveryStatus = this.createDiscoveryStatus(),
  			probeParams = { agent_correlator: discoveryStatus },
  			probeValues = { ecc_high_priority: true },
  			patternLauncher = new SNC.PatternLauncherManager();


  		if (cloudProvider == 'AWS') {
  			subAccountsDiscoveryPatternSysId = 'ff9b1a44672703008ec4a4db2685ef68';  //Pattern - Amazon AWS Organization
  			preExecutionDataObject.addString('serviceAccountId', serviceAccountId);
  			preExecutionDataObject.addString('credentialSysId', credentialSysId);
  			preExecutionDataObject.addString('datacenter_url', datacenterUrl);
  		} else if (cloudProvider == 'Azure') {
  			subAccountsDiscoveryPatternSysId = '361bdd2c531b001046dfddeeff7b1271'; // Pattern - Azure Subscriptions Discovery For Management group
  			this._buildPPE(serviceAccountId,preExecutionDataObject);
  		} else if (cloudProvider == 'Google') {
  			subAccountsDiscoveryPatternSysId = 'ee00609867d0001022646c706785efe0'; // Pattern - Google Cloud Platform (GCP) - Discover Related Projects
  			this._buildPPE(serviceAccountId,preExecutionDataObject);
  		}

  		patternLauncher.launchPattern(discoveryStatus, '', midServerGlideRecord.name + '', 'No Source', subAccountsDiscoveryPatternSysId, probeParams, probeValues, preExecutionDataObject);
  		answerObject.discoveryStatus = discoveryStatus;
  		answerObject.inputEccQueueSysId = this.getInputEccQueueSysId(discoveryStatus);
  		answerObject.agent = midServerGlideRecord.name + '';
  		answerObject.cloudProvider = cloudProvider;
  		return JSON.stringify(answerObject);
  	} catch (e) {
  		answerObject.errorMessage = e.message;
  		return JSON.stringify(answerObject);
  	}
  },

  _buildPPE: function(serviceAccountId,ppe) {
  	if (serviceAccountId) {
  		var gr = new GlideRecord("cmdb_ci_cloud_service_account");
  		gr.addQuery('account_id', serviceAccountId);
  		gr.query();
  		if (gr.next()) {
  			ppe.addGlideRecordEntry("service_account", gr);    //Add GlideRecord as a Table of the SA
  			ppe.addString('service_account_id', String(serviceAccountId));
  		}
  	}
  },

  getInputEccQueueSysId: function(discoveryStatus) {
  	var eccQueueGlideRecord = new GlideRecord('ecc_queue');

  	eccQueueGlideRecord.addQuery('agent_correlator', discoveryStatus);
  	eccQueueGlideRecord.query();
  	eccQueueGlideRecord.next();

  	return eccQueueGlideRecord.getUniqueValue();
  },

  createDiscoveryStatus: function(preExecutionJson) {
  	var discoveryStatusGlideRecord = new GlideRecord('discovery_status');

  	discoveryStatusGlideRecord.setValue('state', 'Starting');
  	discoveryStatusGlideRecord.setValue('discover', 'CIs');

  	return discoveryStatusGlideRecord.insert();
  },

  ajaxFunction_cancelDiscovery: function() {
  	var discoveryStatusSysId = this.getParameter('sysparm_discovery_status_sys_id'),
  		discoveryStatusGlideRecord = new GlideRecord('discovery_status');

  	if (!discoveryStatusGlideRecord.get(discoveryStatusSysId))
  		return;

  	if (discoveryStatusGlideRecord.state != 'Completed')
  		(new SncDiscoveryCancel()).cancelAll(discoveryStatusSysId);
  },

  ajaxFunction_parsePatternResult: function() {
  	var ecc_sys_id = this.getParameter('sysparm_ecc_sys_id'),
  		eccQueueGlideRecord = new GlideRecord('ecc_queue'),
  		XMLUtil = GlideXMLUtil,
  		xmlDocument,
  		xmlRootElement,
  		patternPayload;

  	eccQueueGlideRecord.get(ecc_sys_id);
  	xmlDocument = XMLUtil.parse(eccQueueGlideRecord.payload);
  	xmlRootElement = xmlDocument.getDocumentElement();
  	patternPayload = JSON.parse(XMLUtil.getElementValueByTagName(xmlRootElement, 'output'));
  	//check service account mandatory field has value or not
  	if(patternPayload.results && patternPayload.results.items && patternPayload.results.items.length) {
          //code to refresh the datacenters
          if (patternPayload.status == 'SUCCEED') {
              var data = patternPayload.results.items;
              var scheduleConfig = new CloudDiscoveryScheduleConfig();
              for (i = 0; i < data.length; i++) {
                  var obj = data[i].values;
                  if (obj["is_master_account"] == "0" && !JSUtil.nil(obj["account_id"])) { // is_master_account = 0 indicates the account is member account 
                      var subAccGr = new GlideRecord("cmdb_ci_cloud_service_account");
                      subAccGr.addQuery("account_id", obj["account_id"]);
                      subAccGr.query();
                      if (subAccGr.next()) {
                          var accountSysId = subAccGr.getValue('sys_id') + '';
                          var result = {};
                          try {
                              result = scheduleConfig.discoverDatacenters(accountSysId);
                              if (result.datacentersList.length == 0) {
                                  gs.warn("SubAccountsDiscoveryAjax datacenter not discovered for accountSysId: " + JSON.stringify(result));
                              }
                          } catch (err) {
                              gs.error("SubAccountsDiscoveryAjax error in datacenter discovery for accountSysId: " + err);
                          }
                      }
                  }
              }
          }
          var mandatoryFieldsNotEmpty = this.findMandatoryFieldsNotEmpty(patternPayload.results.items);
          return (patternPayload.status == 'SUCCEED' && mandatoryFieldsNotEmpty) ? 'success' : 'mandatory_field_empty';
      }
      return (patternPayload.status == 'SUCCEED') ? 'success' : 'failed';
  },

  checkMid: function(agent) {
  	if (JSUtil.notNil(agent)) {
  		// If MID Server is down, bail
  		var mid = MIDServer.getByName(agent);

  		if (!mid)
  			return 'error:Could not find MID Server: ' + agent;

  		if (mid.status == 'Down' || mid.status == 'Upgrade Failed')
  			return 'error:MID Server: ' + agent + ' is not up';

  		if (!JSUtil.toBoolean(mid.validated))
  			return 'error:MID Server: ' + agent + ' is not validated';

  		return 'processing';
  	} else {
  		return 'error:Could not find MID Server';
  	}
  },

  ajaxFunction_checkProgress: function() {
  	var ecc_sys_id = this.getParameter('sysparm_ecc_sys_id'),
  		eccQueueGlideRecord = new GlideRecord('ecc_queue');

  	eccQueueGlideRecord.addQuery('response_to', ecc_sys_id);
  	eccQueueGlideRecord.query();

  	if (!eccQueueGlideRecord.next())
  		return this.checkMid(this.getParameter('sysparm_agent'));

  	if (eccQueueGlideRecord.state == 'processed' ||
  		eccQueueGlideRecord.state == 'error')
  		return eccQueueGlideRecord.sys_id;
  	else
  		return 'processing';
  },

  getServiceAccMandatoryFields: function() {
  	var mandatoryFields=[];
  	var grSysDictionary = new GlideRecord('sys_dictionary');
  	grSysDictionary.addQuery('name', 'cmdb_ci_cloud_service_account');
  	grSysDictionary.query();

  	while(grSysDictionary.next())
  	{
  		if(grSysDictionary.mandatory)
  			mandatoryFields.push(grSysDictionary.element.toString());
  	}
  	return mandatoryFields;
  },

  findMandatoryFieldsNotEmpty: function(memberAccList) {
  	var mandatoryFieldNotEmpty = true;
  	var serviceAccMandatoryFields = this.getServiceAccMandatoryFields();
  	//ignoring company dictionary, as this becomes manadatory in case of domain separated environment.
  	serviceAccMandatoryFields = serviceAccMandatoryFields.filter(function(e){return e !== 'company';});
  	if(serviceAccMandatoryFields.length) {
  		for(var i= 0; i < memberAccList.length; i++) {
  			for(var j= 0; j < serviceAccMandatoryFields.length; j++) {
  				var fieldName = serviceAccMandatoryFields[j] + '';
  				if(JSUtil.nil(memberAccList[i].values[serviceAccMandatoryFields[j]])) {
  					mandatoryFieldNotEmpty = false;
  					break;
  				}
  			}
  		}
  	}
  	return mandatoryFieldNotEmpty;
  },

  ajaxFunction_getMandatoryFieldErrorMessage: function() {
  	var discoveryStatusSysId = this.getParameter('sysparm_discovery_status_sys_id');
  	var discoveryLogGlideRecord = new GlideRecord('discovery_log');
  	discoveryLogGlideRecord.addQuery('level', 2);
  	discoveryLogGlideRecord.addQuery('status', discoveryStatusSysId);
  	discoveryLogGlideRecord.orderBy('sys_created_on');
  	discoveryLogGlideRecord.query();
  	if (discoveryLogGlideRecord.next())
  		return discoveryLogGlideRecord.getValue('short_message');
  },

  type: 'SubAccountsDiscoveryAjax'
});

Sys ID

5b8852bf9f33030055063758442e7096

Offical Documentation

Official Docs: