Name

global.DiscoveryWindowsClusterBaseSensor

Description

Base class for Windows Classify and Windows Cluster sensors.

Script

// Discovery class

/*
* Base class for Windows Classify and Windows Cluster sensors.
*/

var DiscoveryWindowsClusterBaseSensor = Class.create();

DiscoveryWindowsClusterBaseSensor.prototype = Object.extendsObject(DiscoverySensor, {
  prepare: function() {
      this.clusters = {};
      this.nodes = {};
      this.resources = {};
      this.rsrcData = {};  // a place to put resource data that won't pollute the resources...
      this.isVIP = false;
      this.isCluster = null;
  },
  
  findClusters: function(result) {
      var clusterEntries = g_array_util.ensureArray(result.MSCluster_Cluster);
      for (var i = 0; i < clusterEntries.length; i++) {
          var clusterEntry = clusterEntries[i];
          var cluster = {};
          cluster[ 'name'              ] = this.primStr( clusterEntry.Name        ).toLowerCase();
          cluster[ 'cluster_status'    ] = this.primStr( clusterEntry.Status      );
          cluster[ 'short_description' ] = this.primStr( clusterEntry.Description );
          cluster[ 'caption'           ] = this.primStr( clusterEntry.Caption     );
          cluster[ 'cmdb_ci_win_cluster_node' ]     = [];
          cluster[ 'cmdb_ci_win_cluster_resource' ] = [];
          cluster[ 'cmdb_ci_cluster_vip' ]          = [];
          this.clusters[cluster.name] = cluster;
      }
  },
  
  findNodes: function(result) {
      var nodeEntries = g_array_util.ensureArray(result.MSCluster_Node);
      for (var i = 0; i < nodeEntries.length; i++) {
          var nodeEntry = nodeEntries[i];
          var node = {};
          node[ 'name'              ] = this.primStr( nodeEntry.Name        ).toLowerCase();
          node[ 'node_status'       ] = this.primStr( nodeEntry.Status      );
          node[ 'short_description' ] = this.primStr( nodeEntry.Description );
          node[ 'node_state'        ] = this.primStr( nodeEntry.State       );
          node[ 'caption'           ] = this.primStr( nodeEntry.Caption     );
          node[ 'server'            ] = null;
          
          // find the associated server, if we can...
          var gr = new GlideRecord('cmdb_ci_win_server');
          if (gr.get('host_name', node.name))
              node.server = gr.sys_id;
          else if (gr.get('name', node.name))
              node.server = gr.sys_id;
          
          // stuff it away for later use...
          this.nodes[node.name] = node;
      }
  },
  
  findResources: function(result) {
      var resourceEntries = g_array_util.ensureArray(result.MSCluster_Resource);
      for (var i = 0; i < resourceEntries.length; i++) {
          var resourceEntry = resourceEntries[i];
          var resource = {};
          var rsrcDatum = {};
          resource [ 'name'              ] = this.primStr( resourceEntry.Name              );
          resource [ 'short_description' ] = this.primStr( resourceEntry.Description       );
          resource [ 'caption'           ] = this.primStr( resourceEntry.Caption           );
          resource [ 'resource_type'     ] = this.primStr( resourceEntry.Type              );
          resource [ 'resource_status'   ] = this.primStr( resourceEntry.Status            );
          resource [ 'properties'        ] = this.propertiesToHumanReadable( resourceEntry.PrivateProperties );
          rsrcDatum[ '_private_props'    ] = this.primStr( resourceEntry.PrivateProperties );
          rsrcDatum[ '_nodes'            ] = [];
          this.resources[resource.name] = resource;
          this.rsrcData[resource.name] = rsrcDatum;
      }
  },
  
  associateClustersToNodes: function(result) {
      var c2nEntries = g_array_util.ensureArray(result.MSCluster_ClusterToNode);
      for (var i = 0; i < c2nEntries.length; i++) {
          var c2nEntry = c2nEntries[i];
          var ant = this.getPropValue( 'MSCluster_Cluster.Name', c2nEntry.Antecedent ).toLowerCase();
          var dep = this.getPropValue( 'MSCluster_Node.Name',    c2nEntry.Dependent  ).toLowerCase();
          var cluster = this.clusters[ant];
          var node = this.nodes[dep];

          if (cluster && node)
              cluster.cmdb_ci_win_cluster_node.push(node);
      }
  },
  
  associateClustersToResources: function(result) {
      var c2rEntries = g_array_util.ensureArray(result.MSCluster_ClusterToResource);
      var source = this.primStr(this.getSource());
      for (var i = 0; i < c2rEntries.length; i++) {
          var c2rEntry = c2rEntries[i];
          var grp = this.getPropValue( 'MSCluster_Cluster.Name',  c2rEntry.GroupComponent ).toLowerCase();
          var prt = this.getPropValue( 'MSCluster_Resource.Name', c2rEntry.PartComponent  );
          var cluster = this.clusters[grp];
          var resource = this.resources[prt];
          var rsrcDatum = this.rsrcData[prt];
          if (cluster && resource) {
              cluster.cmdb_ci_win_cluster_resource.push(resource);
          
              // if we've got an IP Address resource, we may need to add a VIP as well...
              if (resource.resource_type != 'IP Address')
                  continue;

              var ip = this.getPropValue('Address', rsrcDatum._private_props);
  			
              if (!ip)
                  continue;

              if (resource.name == 'Cluster IP Address') 				
                  cluster['ip_address'] = ip;
  												
              var vip = {};
              vip['name'] = resource.name;
              vip['ip_address'] = ip;
              cluster.cmdb_ci_cluster_vip.push(vip);

              if (ip != source)
                  continue;

              this.isVIP = true;
              this.isCluster = cluster;
          }
      }
  },
  
  associateResourcesToNodes: function(result) {
      var r2nEntries = g_array_util.ensureArray(result.MSCluster_ResourceToPossibleOwner);
      for (var i = 0; i < r2nEntries.length; i++) {
          var r2nEntry = r2nEntries[i];
          var grp = this.getPropValue( 'MSCluster_Resource.Name',  r2nEntry.GroupComponent );
          var prt = this.getPropValue( 'MSCluster_Node.Name',      r2nEntry.PartComponent  ).toLowerCase();
          var resource = this.resources[grp];
          var rsrcDatum = this.rsrcData[grp];
          var node = this.nodes[prt];

          if (resource && node)
              rsrcDatum._nodes.push(node);
      }
  },
  
  propertiesToHumanReadable: function(properties) {
      var nvp = new NameValuePairs(this.primStr(properties));
      var pps = nvp.map;
      var props = '';
      for (var propName in pps) {
          var propValue = pps[propName];
          props += propName;
          props += ': ';
          props += propValue;
          props += '\n';
      }

      return props;
  },
  
  changeCI: function(newCIGR) {
      g_device.changeCI(newCIGR);
      // hack the probe so DeviceHistory returns the right CI sys_id...
      g_probe.addParameter('cmdb_ci', newCIGR.getValue('sys_id'));
  },
  
  findCluster: function(name) {
      var gr = this.queryForCluster(name);
      return gr.next() ? gr : null;
  },
  
  findOrCreateCluster: function(name) {
  	var currentTime = new GlideDateTime();
  	var hn = new HostnameJS(); 
  	hn.format(name);		
  	var newName =  hn.getFQDN(); // Follow the case property
  	
      var gr = this.queryForCluster(newName);
      if (gr.next()) {
  		//Compare case...
  		if (gr.name != newName)
  			gr.name = newName;				

  		gr.last_discovered = currentTime;
  		if (gs.nil(gr.first_discovered))
  			gr.first_discovered = gr.sys_created_on;

  		gr.update();
          return gr;
  	}

      gr.initialize();
      gr.name = newName;
      gr.discovery_source = gs.getProperty('glide.discovery.source_name', "ServiceNow");
      gr.last_discovered = currentTime;
      gr.first_discovered = currentTime;
      gr.insert();

      return gr;
  },
  
  queryForCluster: function(name) {
      var gr = new GlideRecord('cmdb_ci_win_cluster');
      gr.addQuery('name', name);
      gr.query();

      return gr;
  },
  
  getPropValue: function(name, source) {
      var safeSource = this.primStr(source);
      if (!safeSource)
          return '';

      var nvp = new NameValuePairs(safeSource);

      return nvp.map[name];
  },
  
  primStr: function(value) {
      return (value) ? new String(value).toString() : null;
  },
  
  type: 'DiscoveryWindowsClusterBaseSensor'
});

Sys ID

8f51841a0a0a0b8200f999dd21e5d105

Offical Documentation

Official Docs: