Name

sn_agent.AgentPolicyDBView

Description

No description available

Script

var AgentPolicyDBView = Class.create();
AgentPolicyDBView.prototype = {
  
  AGENT_POLICY_DB_VIEW_PREFIX: "sn_agent_agents_connected_to_",

  RUNS_ON_RELATIONSHIP_SYS_ID: "60bc4e22c0a8010e01f074cbe6bd73c3",
  MANAGED_BY_RELATIONSHIP_SYS_ID: "bf83653c0ab30150761028c73a4de0f4",
  
  initialize: function() {
  },

  generateDBView: function(policyGR) {
  	
  	var utils;
  	try {
  		utils = new global.AgentGlobalUtils();
  		if (!utils) 
  			throw "AgentGlobalUtil class undefined.";
  	} catch (e) {
  		gs.warn("AgentPolicyDBView: " + e + " Cannot create DB View. ");
  		return;
  	}
  	
  	// If proxy policy, no DB view needed as user defines a known relationship
  	// Existing DB views for this policy will remain
  	if (policyGR.single_proxy_agent || policyGR.proxy_advanced || policyGR.proxy_script_advanced || policyGR.proxy_cluster)
  		return;
  	
  	var supportedCIBaseTypes = ['cmdb_ci_computer', 'cmdb_ci_appl', 'cmdb_ci_docker_container'];
  	var table;
  	// If filter policy, take table directly from policy record, and validate result
  	if (policyGR.monitored_ci_type_filter) {
  		table = policyGR.getValue('table');
  	} else if (policyGR.monitored_ci_type_script) {
  		var ciTypeGR = (new GlideScopedEvaluator).evaluateScript(policyGR, "monitored_ci_script");
  		if (!ciTypeGR || !ciTypeGR.isValid()) {
  			gs.warn("AgentPolicyDBView: monitored CI script for policy " + policyGR.getUniqueValue() +
  					" failed to return a valid GlideRecord. Cannot generate DB view.");
  			return;
  		}
  		table = ciTypeGR.getTableName();
  	} else if (policyGR.monitored_ci_type_group) {
  		
  		var groupName = policyGR.monitored_ci_group;
  		var groupRecord = new GlideRecord('cmdb_group');
  		groupRecord.addQuery("group_name", groupName);
  		groupRecord.query();
  		if (!groupRecord.next()) {
  			gs.warn("AgentPolicyDBView: could not find monitored CI group named " + groupName +". Cannot generate DB view.");
  			return;
  		}
  		
  		var groupID = groupRecord.getValue("sys_id");
  		var cis = JSON.parse(sn_cmdbgroup.CMDBGroupAPI.getAllCI(groupID));
  		if (!cis || !cis.idList || cis.idList.length < 1) {
  			gs.warn("AgentPolicyDBView: Unable to find CIs of group " + groupName + ". Cannot extract class name to generate DB view.");
  			return;
  		}
  		
  		var ciRecord = new GlideRecord('cmdb_ci');
  		if (!ciRecord.get('sys_id', cis.idList[0])) {
  			gs.warn("AgentPolicyDBView: Cannot find CI with sys_id: " + cis.idList[0] +". Cannot extract class name to generate DB view.");
  			return;
  		}
  		table = utils.getBaseTable(ciRecord.getValue('sys_class_name'), supportedCIBaseTypes);
  	} else {
  		gs.warn("AgentPolicyDBView: No policy type was selected. Cannot generate DB view.");
  		return;
  	}

  	var ciGr = new GlideRecord(table);
  	if (!ciGr.isValid()) {
  		gs.warn("AgentPolicyDBView: The table: " + table + " is not a valid table. Cannot Generate DB View.");
  		return;
  	}

  	// If CI type is agent we can return
  	if (table == 'sn_agent_cmdb_ci_agent')
  		return;

  	var baseTable = utils.getBaseTable(table, supportedCIBaseTypes);
  	if (!baseTable) {
  		gs.warn("AgentPolicyDBView: CI base type is not supported. Cannot create DB View.");
  		return;
  	}
  	
  	var dbViewObj = {};
  	dbViewObj.name = this.AGENT_POLICY_DB_VIEW_PREFIX + table;
  	dbViewObj.description = 'Automatically generated by ACC-F policy calculation.';
  	dbViewObj.label = "Database view relating " + table + " and sn_agent_ci_extended_info";
  	dbViewObj.view_tables = [];

  	// Populate related table info		
  	// db view CI table variable prefix will be ci type with underscores removed, e.g. cmdbcicomputer
  	var tableWithoutUnderscore = table.split("_").join("");
  	var dbViewCITable = {};
  	dbViewCITable.table = table;
  	dbViewCITable.order = 100;
  	dbViewCITable.var_prefix = tableWithoutUnderscore;
  	dbViewCITable.where_clause = "";
  	dbViewObj.view_tables.push(dbViewCITable);

  	// cmdb_ci_computer extensions don't require rel table for view
  	if (baseTable != "cmdb_ci_computer") {
  		// add rel table info
  		var dbViewRelTable = {};
  		dbViewRelTable.table = 'cmdb_rel_ci';
  		dbViewRelTable.order = 200;
  		dbViewRelTable.var_prefix = 'rel';
  		dbViewRelTable.where_clause = "rel_parent=" + tableWithoutUnderscore + "_sys_id && rel_type='" + this.RUNS_ON_RELATIONSHIP_SYS_ID + "'";
  		// docker container can have managed by relationship
  		if (baseTable == "cmdb_ci_docker_container") {
  			dbViewRelTable.where_clause = "rel_parent=" + tableWithoutUnderscore + "_sys_id && " +
  			"(rel_type='" + this.RUNS_ON_RELATIONSHIP_SYS_ID + "' || rel_type='" + this.MANAGED_BY_RELATIONSHIP_SYS_ID + "')";
  		}
  		dbViewObj.view_tables.push(dbViewRelTable);
  	}
  	
  	// Agent table is created for every view
  	var dbViewAgentTable = {};
  	dbViewAgentTable.table = 'sn_agent_ci_extended_info';
  	dbViewAgentTable.order = 300;
  	dbViewAgentTable.var_prefix = 'agent';
  	if (baseTable == "cmdb_ci_computer") {
  			dbViewAgentTable.where_clause = "agent_cmdb_ci=" + table.split("_").join("") + "_sys_id";
  	} else if (baseTable == "cmdb_ci_docker_container") {
  		dbViewAgentTable.where_clause = "agent_cmdb_ci=rel_child &&  " + 
  		"(rel_type='" + this.RUNS_ON_RELATIONSHIP_SYS_ID + "' || rel_type='" + this.MANAGED_BY_RELATIONSHIP_SYS_ID + "')";
  	} else {
  		dbViewAgentTable.where_clause = "agent_cmdb_ci=rel_child && rel_type='" + this.RUNS_ON_RELATIONSHIP_SYS_ID + "'";
  	}
  		
  	dbViewObj.view_tables.push(dbViewAgentTable);
  	
  	// Create/validate DB Views
  	if (!utils.ensureDBView) {
  		gs.warn("AgentPolicyDBView: cannot find function AgentGlobalUtil.ensureDBView(). Cannot create DB View.");
  		return;
  	}
  	var viewID = utils.ensureDBView(dbViewObj);

  	if (!viewID) {
  		gs.warn("AgentPolicyDBView: failed to create/validate DB view.");
  	}
  },
  
  type: 'AgentPolicyDBView'
};

Sys ID

77e76a13ff3251102abec787d53bf16a

Offical Documentation

Official Docs: