Name

global.PatternCMDBExporter

Description

Export to Current DataSet the CMDB metadata the pattern use. the following data exported (can be controlled by options JSON) Pattern main CI table. Pattern Specific Identifier. Pattern Specific Lookup Tables. Pattern Specific Related Tables. Pattern Specific Hosting Rules. Pattern Specific Containment Rules. Pattern Entry Point CI s. The data relevant only for the CI s the pattern use and not for the inheritence, because we do not want to change existing rule to the customer.

Script

var PatternCMDBExporter = Class.create();

PatternCMDBExporter.prototype = {
  initialize: function(patternList, publisher, tracker, intervalPercent, logger) {
  	this.patternList = patternList;
  	this.publisher = publisher;
  	this.logger = logger;
  	this.tracker = tracker;
      this.intervalPercent = intervalPercent;
  	this.ACTIVE = '1';
  },
  
  exportData : function(options) {
      var patternCIs = this.getPatternCis();
  	var patternRelatedCIs = this.getRelatedCis();
  	if (this.logger !== undefined)
          this.logger.log("Exporting CMDB items for patterns: " + this._getPatternNames());
  	if (options == null || options == undefined || options.exportMainCiMetadata)
  		this.exportMainCiMetadata();
  	if (options == null || options == undefined || options.exportRelatedCiMetadata)
  		this.exportRelatedCiMetadata();
  	if (options == null || options == undefined || options.exportIdentifiers){
  		this.exportIdentifiers(patternCIs);
  		this.exportIdentifiers(patternRelatedCIs);
  	}
  	if (options == null || options == undefined || options.exportLookups){
  		this.exportLookups(patternCIs);
  		this.exportLookups(patternRelatedCIs);
  	}
  	if (options == null || options == undefined || options.exportRelated){
  		this.exportRelated(patternCIs);
  		this.exportRelated(patternRelatedCIs);
  	}
  	if (options == null || options == undefined || options.exportHostingRules){
  		this.exportHostingRules(patternCIs);
  		this.exportHostingRules(patternRelatedCIs);
  	}
  	if (options == null || options == undefined || options.exportContainmentRules){
  		this.exportContainmentRules(patternCIs);
  		this.exportContainmentRules(patternRelatedCIs);
  	}
  	if (options == null || options == undefined || options.exportReconciliationDefinition) {
  		this.exportReconciliationDefinition(patternCIs);
  		this.exportReconciliationDefinition(patternRelatedCIs);
  	}
  	if (options == null || options == undefined || options.exportPatternEntryPointCIsIdentifications)
  		this.exportPatternEntryPointCIsIdentifications();

      if (options == null || options == undefined || options.exportPatternConnectionEntryPointsAndCis)
          this.exportPatternConnectionEntryPointsAndCis();
           
  },
  
  exportTable : function(tableName) {
  	var tableElements =  SNC.ClassModel.getUniqueClassElementDescriptors(tableName);
      var columnsToExport = [''];
      for(var i=0; i< tableElements.size(); i++) {
        var ed = tableElements.get(i);
        columnsToExport.push(ed.getName());
      }
  	var dbObject = new GlideRecord('sys_db_object');
  	dbObject.addQuery('name', tableName);
  	dbObject.query();
  	this.publisher.publishSingle(dbObject, true);
  	
  	var dictionary = new GlideRecord('sys_dictionary');
  	dictionary.addQuery('name', tableName);
      dictionary.addNullQuery('element').addOrCondition('element', 'IN', columnsToExport.join());
  	if (!GlidePluginManager.isActive("com.glide.domain.msp_extensions.installer")) {
  		dictionary.addQuery('internal_type', 'NOT IN', 'domain_path,domain_id,domain');
      }
  	dictionary.query();
  	this.publisher.publishSingle(dictionary, true);
  	
  	var doc = new GlideRecord('sys_documentation');
  	doc.addQuery('name', tableName);
      doc.addNullQuery('element').addOrCondition('element', 'IN', columnsToExport.join());
  	doc.query();
  	this.publisher.publishSingle(doc, true);
  	
  	var acl = new GlideRecord('sys_security_acl');
  	acl.addQuery('name',tableName);
  	acl.query();
  	this.publisher.publishSingle(acl, true);
  },
  
  exportMainCiMetadata : function() {
  	var patternCIs = this.getPatternCis();
      if (patternCIs.length === 0) {
          this.tracker.incrementPercentComplete(this.intervalPercent);
          return;
      }
      var internalInterval = this.intervalPercent / patternCIs.length;
  	for (var idx in patternCIs) {
  		var ciType = patternCIs[idx];
  		this.exportTable(ciType);
          this.logger.log('Exporting: CI Type [' + ciType + ']');
          this.tracker.incrementPercentComplete(internalInterval);
  	}
  },
  
  exportRelatedCiMetadata : function() {
  	var patternRelatedCIs = this.getRelatedCis();
      if (patternRelatedCIs.length === 0) {
          this.tracker.incrementPercentComplete(this.intervalPercent);
          return;
      }
      var internalInterval = this.intervalPercent / patternRelatedCIs.length;
  	for (var idx in patternRelatedCIs) {
  		var ciType = patternRelatedCIs[idx];
  		this.exportTable(ciType);
          this.logger.log('Exporting: CI Type [' + ciType + ']');
          this.tracker.incrementPercentComplete(internalInterval);
  	}
  },
  
  exportNonCisTable : function(noneCiTable, patternCIs) {
  	if (patternCIs.length === 0) {
          this.tracker.incrementPercentComplete(this.intervalPercent);
          return;
      }
      var internalInterval = this.intervalPercent / patternCIs.length;
  	for (var idx in patternCIs) {
  		var ciType = patternCIs[idx];
  		
  		var iGr = this.getIdentifierGr(ciType);
  		
  		while (iGr.next()) {
  			var igrSysID = iGr.getValue('sys_id');
  			var identifierEntryGr = new GlideRecord(noneCiTable);
  			identifierEntryGr.addQuery('identifier', igrSysID);
  			identifierEntryGr.addQuery('active', this.ACTIVE);
  			identifierEntryGr.query();
  			while (identifierEntryGr.next()) {
  				var tableName = identifierEntryGr.getValue('table');
  				if (tableName !== ciType) {
                      this.logger.log('Exporting: Non CI table [' + tableName + ']');
  					this.exportTable(tableName);
  				}
  			}
  		}
          this.tracker.incrementPercentComplete(internalInterval);
  	}
  },
  
  exportLookups : function(patternCIs) {
  	this.exportNonCisTable('cmdb_identifier_entry',patternCIs);
  },
  
  exportRelated : function(patternCIs) {
  	this.exportNonCisTable('cmdb_related_entry',patternCIs);
  },
  
  exportIdentifiers : function(patternCIs) {
      
      if (patternCIs.length === 0) {
          this.tracker.incrementPercentComplete(this.intervalPercent);
          return;
      }
  	
      var internalInterval = this.intervalPercent / patternCIs.length;
      var patternIdentifiers = [];
      var patternIdentifierEntries = [];
  	for (var idx in patternCIs) {
  		var ciType = patternCIs[idx];
  		
  		//force the identifier to work with the specific CI.
  		var fgr = this.getIdentifierGr(ciType);
  		patternIdentifiers.push(fgr);
  		var iGr = this.getIdentifierGr(ciType);
  		
  		while (iGr.next()) {
  			var igrSysID = iGr.getValue('sys_id');
  			var identifierEntryGr = new GlideRecord('cmdb_identifier_entry');
  			identifierEntryGr.addQuery('identifier', igrSysID);
  			identifierEntryGr.query();
  			patternIdentifierEntries.push(identifierEntryGr);
  		}
          this.tracker.incrementPercentComplete(internalInterval);
  	}
      
      if (patternIdentifierEntries.length > 0) {
          this.publisher.publishMultiple(patternIdentifierEntries, true);
      }
      
      if (patternIdentifiers.length > 0) {
          this.publisher.publishMultiple(patternIdentifiers);
      }
      
      
  },
  
  exportHostingRules : function(patternCIs) {
  	
      if (patternCIs.length === 0) {
          this.tracker.incrementPercentComplete(this.intervalPercent);
          return;
      }
      var internalInterval = this.intervalPercent / patternCIs.length;
      var hostingRules = [];
  	for (var idx in patternCIs) {
  		var ciType = patternCIs[idx];
  		var hostingRuleGr = new GlideRecord('cmdb_metadata_hosting');
  		hostingRuleGr.addQuery('parent_type', ciType);
  		hostingRuleGr.query();
  		if (hostingRuleGr.hasNext()) {
  			hostingRules.push(hostingRuleGr);
  		}
  		hostingRuleGr.initialize();
  		
  		hostingRuleGr.addQuery('child_type', ciType);
  		hostingRuleGr.query();
  		if (hostingRuleGr.hasNext()) {
  			hostingRules.push(hostingRuleGr);
  		}
          this.tracker.incrementPercentComplete(internalInterval);
  	}
      
      if (hostingRules.length > 0) {
          this.publisher.publishMultiple(hostingRules, false, true, 'parent_type', 'child_type');
      }
      
  },
  
  exportContainmentRules : function(patternCIs) {
  	if (patternCIs.length === 0) {
          this.tracker.incrementPercentComplete(this.intervalPercent);
          return;
      }
  	var internalInterval = this.intervalPercent / patternCIs.length;
      for (var idx in patternCIs) {
  		var ciType = patternCIs[idx];
  		var containmentRuleGr = new GlideRecord('cmdb_metadata_containment');
  		containmentRuleGr.addQuery('ci_type', ciType);
  		containmentRuleGr.query();
  		if (containmentRuleGr.hasNext()) {
  			this.publisher.publishSingle(containmentRuleGr);
  		}
          this.tracker.incrementPercentComplete(internalInterval);     
  	}
  },
  exportReconciliationDefinition : function(patternCIs) {
  	
      if (patternCIs.length === 0) {
          this.tracker.incrementPercentComplete(this.intervalPercent);
          return;
      }
      
      var internalInterval = this.intervalPercent / patternCIs.length;
  	for (var idx in patternCIs) {
  		var ciType = patternCIs[idx];
  		
  		var reconciliationDefGr = new GlideRecord('cmdb_reconciliation_definition');
  		reconciliationDefGr.addQuery('applies_to', ciType);
  		reconciliationDefGr.query();
  		if (reconciliationDefGr.hasNext()) {
  			this.publisher.publishSingle(reconciliationDefGr);
  		}
          this.tracker.incrementPercentComplete(internalInterval);
  	}
      
  },
  
  exportPatternEntryPointCIsIdentifications : function() {
  	var ptl = new SNC.GlidePatternLibrary();
  	var internalInterval = this.intervalPercent / this.patternList.length;
  	for (var idx in this.patternList) {
  		var patternID = this.patternList[idx];
  		var patternIdentifications = ptl.getPatternIdentifications(patternID);
          if (patternIdentifications.indexOf(',') > -1){
              var patternIdentificationsCIs = patternIdentifications.split(',');
              for (var ciIdx in patternIdentificationsCIs) {
                  var ciType = patternIdentificationsCIs[ciIdx];
                  this.exportTable(ciType);
                  this.logger.log('Exporting: Entry Point CI Type [' + ciType + ']');
              }
          }
       this.tracker.incrementPercentComplete(internalInterval);    
  	}
  },
  
  exportPatternConnectionEntryPointsAndCis : function() {
  	var ptl = new SNC.GlidePatternLibrary();
  	var internalInterval = this.intervalPercent / this.patternList.length;
      for (var idx in this.patternList) {
          var patternID = this.patternList[idx];
          var entryPointsAndCis = JSON.parse(ptl.getPatternConnectionEntryPointsAndCis(patternID));
          var connEntryPoints = entryPointsAndCis.entryPointTypes;
          var connCiTypes = entryPointsAndCis.ciTypes;
          
          if(connCiTypes.length > 0)
              for (var ciIdx in connCiTypes) {
                  var ciType = connCiTypes[ciIdx];
                  this.exportTable(ciType);
                  this.logger.log('Exporting: CI Type from CreateConnection step [' + ciType + ']');
              }

          if(connEntryPoints.length > 0)
              for (var epIdx in connEntryPoints) {
                  var entryPoint = connEntryPoints[epIdx];
                  this.exportTable(entryPoint);
                  this.logger.log('Exporting: Entry Point from CreateConnection step [' + entryPoint + ']');
              }
      }
      
      this.tracker.incrementPercentComplete(internalInterval);    

  },
  
  getIdentifierGr : function(ciType) {
      var fgr = new GlideRecord('cmdb_identifier');
  	fgr.addQuery('applies_to', ciType);
  	fgr.addActiveQuery();
  	fgr.orderBy('order');
  	fgr.query();
  	return fgr;
  },
  
  getPatternCis : function() {
  	var patternCis = [];
  	var patternGr = new GlideRecord("sa_pattern");
  	patternGr.addQuery('sys_id',this.patternList);
  	patternGr.query();
  	while (patternGr.next()) {
  		patternCis.push(patternGr.getValue('ci_type'));
  		
  	}
  	return patternCis;
  },
  
  getRelatedCis : function() {
  	var patternRelatedCis = [];
  	for (var idx in this.patternList) {
  		var patternID = this.patternList[idx];
  		var patternGr = new GlideRecord("sa_ci_to_pattern");
  		patternGr.addQuery('pattern',patternID);
  		patternGr.query();
  		while (patternGr.next()) {
  			patternRelatedCis.push(patternGr.getValue('ci_type'));
  		}
  	}
  	return patternRelatedCis;
  },
  
  _getPatternNames: function(){
      var patternNames = [];
      for (var idx in this.patternList) {
  		var patternID = this.patternList[idx];
          var gr = new GlideRecord('sa_pattern');
          if (gr.get(patternID))
              patternNames.push(gr.name);
      }
  	return patternNames;
  },
  
  
  type: 'PatternCMDBExporter'
};

Sys ID

68b582e19f02030082c091aec32e704c

Offical Documentation

Official Docs: