Name

sn_cmp.CMPAzureAlertRuleMgr

Description

No description available

Script

var CMPAzureAlertRuleMgr = Class.create();
CMPAzureAlertRuleMgr.prototype = {
  initialize: function() {
  },

  handleConfigurationChange: function(current, previous, operation) {
  	if (operation == 'create') {
  		updateCurrent('updating');
  		createRules();
  	}
  	else if (operation == 'delete')
  		deleteRules();
  	else if (operation == 'update') {
  		//remove inactive rule
  		if (previous.active && !current.active) {
  			updateCurrent('deleting');
  			deleteRules();
  		}
  		//activate rule
  		else if (!previous.active && current.active) {
  			updateCurrent('updating');
  			createRules();
  		}
  		//remove old rules and create new rules
  		else if (previous.active && current.active) {
  			var resourceGroupNameOld = previous.resource_group.name;
  			var subscriptionIdOld = previous.subscription.account_id;
  			var resourceGroupNameNew = current.resource_group.name;
  			var subscriptionIdNew = current.subscription.account_id;
  			updateCurrent('updating');
  			if (resourceGroupNameOld != resourceGroupNameNew || subscriptionIdOld != subscriptionIdNew)
  				deleteRules();
  			createRules();
  		}
  	}


  	function executeCAPI(resourceGroupName, subscriptionId, operationName, credential) {
  		var region = "westus"; //region of the rules doesn't matter, set it to westus
  		var result = {};
  		result.userId = gs.getUserID();
  		result.operationName = "Event Interface."+operationName;
  		result.entityType = "Resource";
  		result.resource = "Azure Datacenter";
  		result.status = "Initialized";
  		result.ownerTable = "sn_cmp_azure_alert_configuration";
  		result.ownerInstanceId = current.sys_id+'';
  		result.contextTable = "sn_cmp_rb_resourceblock";
  		result.contextInstance = "ddf5cd6bd722220097eb6ccf6e610346";//azure DC
  		var date = new GlideDateTime();
  		result.orderDate = date.getValue();
  		var orderFormData = {};
  		orderFormData.CloudServiceAccountId = subscriptionId;
  		orderFormData.ResourceGroup = resourceGroupName;
  		orderFormData.Location = region;
  		orderFormData.Interface = "Event Interface";
  		orderFormData.Credential = credential;
  		orderFormData.InstanceName = gs.getProperty('instance_name');

  		if (operationName == "CreateAlertRules") {
  			var userName = current.user.user_name;
  			var password = current.user_password.getDecryptedValue();
  			var instanceUrl = gs.getProperty('glide.servlet.uri');
  			var regex = /(https?:\/\/)(.*)/;
  			var match = regex.exec(instanceUrl);
      		var serviceUri;
  			if (match.length !=3) {
  				gs.addErrorMessage(gs.getMessage("Invalid instance uri: {0}",instanceUrl));
  				return;
  			}

  			var ws = new GlideRecord('sys_ws_operation');
  			//Cloud Config Event Post API
  			if (!ws.get("ec64b45ad741320097eb6ccf6e610393"))
  				return;
  			var path = ws.getValue("operation_uri");
  			//TODO: Azure doesn't support basic auth so password is not sent in the URL. Once Azure starts
  			//supporting it, we should send real password

  			//PRB1302579 : since real password is not sent, While trying to authenticate it fails and logs continuously.
      		if (gs.nil(password)) {
                  serviceUri = match[1] + match[2].substring(0, match[2].length - 1) + path;
              } else {
                  var credes = userName + ":" + password + "@";
                  serviceUri = match[1] + credes + match[2].substring(0, match[2].length - 1) + path;
              }
  			orderFormData.ServiceURI = serviceUri;

  			var ruleMap = [];
  			var ruleGr = new GlideRecord('azure_alert_rule');
  			ruleGr.addActiveQuery();
  			ruleGr.query();
  			while (ruleGr.next()) {
  				var rule = {};
  				rule.ruleAction = ruleGr.getValue('action');
  				rule.ruleName = ruleGr.getValue('rule_name');
  				ruleMap.push(rule);
  			}
  			if (!ruleMap)
  				return;
  			orderFormData.RuleMap = new global.JSON().encode(ruleMap);

  			var gr = new GlideRecord('sn_cmp_rb_resourcescript');
  			gr.addQuery('name', 'Azure alert template');
  			gr.addQuery('resource.name', 'Azure Datacenter');
  			gr.addQuery('type', 18); //ARM Template
  			gr.query();
  			if (gr.next())
  				orderFormData.Template = gr.getValue('script');
  		}

  		result.orderFormData = orderFormData;
  		var os = new sn_cmp_api.OrderServiceScript();
  		var order = os.submitOrder(new global.JSON().encode(result));
  	}

  	function deleteRules() {
  		var resourceGroupName = previous.resource_group.name + '';
  		var subscriptionId = previous.subscription.account_id + '';
  		var subscriptionName = previous.subscription.name + '';
  		var credential = previous.subscription.discovery_credentials.sys_id+'';
  		var operationName = "DeleteAlertRules";

  		executeCAPI(resourceGroupName, subscriptionId, operationName, credential);

  		gs.addInfoMessage(gs.getMessage("Alert rules will be deleted for service account: {0}, resource group: {1}",[subscriptionName, resourceGroupName]));
  	}

  	function createRules() {
  		var resourceGroupName = current.resource_group.name+'';
  		var subscriptionId = current.subscription.account_id+'';
  		var subscriptionName = current.subscription.name+'';
  		var credential = current.subscription.discovery_credentials.sys_id+'';
  		var operationName = "CreateAlertRules";

  		executeCAPI(resourceGroupName, subscriptionId, operationName, credential);

  		gs.addInfoMessage(gs.getMessage("Alert rules will be created or updated for service account: {0}, resource group: {1}",[subscriptionName, resourceGroupName]));
  	}

  	function updateCurrent(status) {
  		current.setWorkflow(false);
  		current.status = status;
  		current.update();
  		current.setWorkflow(true);
  	}
  },

  type: 'CMPAzureAlertRuleMgr'
};

Sys ID

44a54f53d760320097eb6ccf6e6103be

Offical Documentation

Official Docs: