Name

global.InstanceCloneManagerAjax

Description

Instance Clone Management Functionality

Script

var InstanceCloneManagerAjax = Class.create();

InstanceCloneManagerAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  canClone: function() {
  	var instanceId = this.getParameter('sysparm_instance_id');
  	
  	var cloneAPI = new CloneAPI();
  	if (cloneAPI.isCloneRunning()) {
  		this.setError("An active clone is already running");
  		return false;
  	}
  	
  	return true;
  },

  getCalendarParams: function() {
  	var response = {},
  		cloneDuration = '',
  		start_date = new GlideDateTime(),
  		end_date,
  		tgtInstance = this.getParameter('sysparm_tgtInstance'),
  		scheduled = this.getParameter('sysparm_scheduled'),
  		cloneRecSysId = this.getParameter('sysparm_cloneRecSysId');

  	if (JSUtil.nil(tgtInstance))
  		return;

  	if(JSUtil.notNil(cloneRecSysId)) {
  		var cloneInstanceGr = new GlideRecord('clone_instance');
  		if(cloneInstanceGr.get(cloneRecSysId))
  			cloneDuration = cloneInstanceGr.getValue('estimated_clone_duration');
  	}

  	if (JSUtil.notNil(scheduled))
  		start_date.setDisplayValue(scheduled);

  	response.start_date = start_date.getValue();
  	if (JSUtil.notNil(cloneDuration)) {
  		start_date.addSeconds(cloneDuration * 60);
  		end_date = start_date.getValue();
  	} else
  		end_date = start_date.getValue().split(' ')[0] + ' 23:59:59';

  	response.end_date = end_date;

  	var gr = new GlideRecordSecure('instance');
  	if (gr.get(tgtInstance))
  		response.instanceId = gr.getValue('instance_id');

  	var data = '';
  	try {
  		var json = new JSON();
  		data = json.encode(response);
  	} catch (e) {
  		gs.error("Exception occured in getCalendarParams : " + e);
  	}
  	return data;
  },

  // deprecated
  determineNodeOrder: function() {
  	// deprecated
  },

  getCloneOptionsFromProfile: function() {
  	var response = {};
  	var cloneProfileSysId = this.getParameter('sysparm_cloneProfile');
  	if(!gs.nil(cloneProfileSysId)) {
  		var cloneProfileGr = new GlideRecord('clone_profile');
  		if(cloneProfileGr.get(cloneProfileSysId)) {
  			var preserve_in_progress_update_sets = cloneProfileGr.getValue('preserve_in_progress_update_sets');
  			if(gs.nil(preserve_in_progress_update_sets)) {
  				preserve_in_progress_update_sets = '';
  			}
  			
  			response.target_instance = cloneProfileGr.getValue('target_instance');
  			response.exclude_all_from_exclusion_list = cloneProfileGr.getValue('exclude_all_from_exclusion_list');
  			response.exclude_large_data = cloneProfileGr.getValue('exclude_large_data');
  			response.filter_attachment_data = cloneProfileGr.getValue('filter_attachment_data');
  			response.amount_of_data_copied_from_large_tables = cloneProfileGr.getValue('amount_of_data_copied_from_large_tables');
  			response.preserve_theme = cloneProfileGr.getValue('preserve_theme');
  			response.preserve_in_progress_update_sets = preserve_in_progress_update_sets;
  		}
  	}
  	
  	var json = new JSON();
  	var encodedResponseString = json.encode(response);
  	return encodedResponseString;
  },
  
  isDefaultProfileAllowed: function() {
  	var cloneProfileGr = CloneProfileUtil.getDefaultProfile();
  	var cloneProfileSysId = this.getParameter('sysparm_profile');
  	
  	if(gs.nil(cloneProfileGr) || cloneProfileSysId == cloneProfileGr.getValue('sys_id')) 
  		return true;

  	return false;
  },
  
  getDefaultCloneProfile: function() {
  	var json = new JSON();
  	var response = {};
  	var cloneProfileGr = CloneProfileUtil.getDefaultProfile();
  	if(!gs.nil(cloneProfileGr)) 
  		response.profile = cloneProfileGr.getValue('sys_id');
  	
  	var encodedResponseString = json.encode(response);
  	return encodedResponseString;
  },
  
  getRecurringCloneEndDate: function() {
  	var cloneStartTime = this.getParameter('sysparm_cloneStartTime');
  	var cloneFrequency = this.getParameter('sysparm_cloneFrequency');
  	var occurrence = this.getParameter('sysparm_occurrence');
  	var response = {};
  	response.cloneEndTime = InstanceCloneUtil.getRecurringCloneEndDate(cloneStartTime, cloneFrequency, occurrence) + '';
  	
  	var json = new JSON();
  	var encodedResponseString = json.encode(response);
  	return encodedResponseString;
  },

  getCloneStatus: function() {
  	var response = {};
  	var cloneSysId = this.getParameter('sysparm_clone_id');
  	new InstanceCloneScheduler().checkCloneStatus(cloneSysId);
  },

  getMinDate: function() {
  	var response = {};
  	var instanceId = this.getParameter('sysparm_instance_id');
  	var tokenId = this.getParameter('sysparm_security_token');
  	var profile = this.getParameter('sysparm_profile');
  	var isAuthenticated = !gs.nil(tokenId);
  	var scheduleDisplayValue = this.getParameter('sysparm_schedule_date');
  	var scheduled = new GlideDateTime();
  	if (!gs.nil(scheduleDisplayValue))
  		scheduled.setDisplayValue(scheduleDisplayValue);

  	var cloneRecord = new GlideRecord("clone_instance");
  	cloneRecord.initialize();
  	cloneRecord.setWorkflow(false); // don't run business rules, this is a temporary record
  	cloneRecord.setValue("name", instanceId);
  	cloneRecord.setValue("scheduled", scheduled);
  	cloneRecord.setValue("state", "Draft");
  	cloneRecord.setValue("target_instance", instanceId);
  	cloneRecord.setValue("security_token", tokenId);
  	cloneRecord.setValue("profile",profile);
  	var sysId = cloneRecord.insert();
  	//After this call scheduled will be updated from webservice response
  	try {
  		if (new InstanceCloneScheduler().notifyServer(cloneRecord)) {
  			// if the user has successfully authenticated the target,
  			// check if the server is not letting us proceed and possibly just error out.
  			// This could happen if the server rejects certain client requests, war version mismatch, etc
  			if (isAuthenticated && cloneRecord.state == 'Hold') {
  				this.error = cloneRecord.message;
  				this.setError(this.error);
  				return;
  			}

  			// otherwise we're good to go
  			//Changing the type of response object from string to object
  			response.scheduledStartTime = cloneRecord.scheduled.getDisplayValue();
  			// send as user time zone
  			response.cloneEstimationMessage = cloneRecord.getValue('clone_estimation_message');
  			response.minimumCloneStartTime = new GlideDateTime().getDisplayValue();//user time zone
  		}
  	} catch(e) {
  		gs.log("Error checking clone schedule:" + e.toString());
  		this.error = "Exception while checking clone schedule: " + e.toString();
  		this.setError(this.error);
  	} finally {
  		response.cloneRecordSysId = sysId;
  		this.addRecurringCloneParamsToResponse(cloneRecord, response);
  	}
  	var json = new JSON();
  	var encodedResponseString = json.encode(response);
  	return encodedResponseString;
  },

  addRecurringCloneParamsToResponse: function(cloneRecord, response) {
  	var validationRules = cloneRecord.getValue('clone_request_validation_rules');
  	if (!gs.nil(validationRules)) {
  		validationRules = new JSON().decode(validationRules);
  		var maxRecurringCloneDuration = validationRules.maxRecurringCloneDuration;
  		response.maxRecurringCloneDuration = maxRecurringCloneDuration;
  	}
  	if(response.maxRecurringCloneDuration == undefined || gs.nil(response.maxRecurringCloneDuration)) 
  		response.maxRecurringCloneDuration = CloneConstants.cloneOptions.DEFAULT_MAX_CLONE_DURATION;
  },

  startClone: function() {
  	var instanceId = this.getParameter('sysparm_instance_id');
  	var scheduled = "" + this.getParameter('sysparm_scheduled');
  	var preserveTheme = this.getParameter('sysparm_preserve_theme');
  	var excludeLargeData = this.getParameter('sysparm_exclude_large_data');
  	var sourceInstance = this.getParameter('sysparm_source_instance');
  	var clusterNode = this.getParameter('sysparm_cluster_node');
  	var email = this.getParameter('sysparm_email');
  	return this.scheduleClone(instanceId, scheduled, preserveTheme, excludeLargeData, sourceInstance, clusterNode, email);
  },

  scheduleClone: function(instanceId, scheduled, preserveTheme, excludeLargeData, sourceInstance, clusterNode, email) {
  	if (gs.nil(instanceId)) {
  		this.setError("Invalid instance");
  		return false;
  	}

  	var igr = this.getInstanceRecord(instanceId);
  	if (igr == null) {
  		this.setError("Invalid instance record");
  		return false;
  	}

  	var instanceName = igr.database_name;
  	gs.log("InstanceClone: Scheduling instance clone to " + instanceName + " (" + instanceId + " on " + scheduled + ")");

  	var newClone = new GlideRecord("clone_instance");
  	newClone.setValue("name", instanceName);
  	newClone.setValue("target_instance", instanceId);
  	newClone.setValue("preserve_theme", preserveTheme);
  	newClone.setValue("exclude_large_data", excludeLargeData);
  	if (!gs.nil(sourceInstance))
  		newClone.setValue("source_instance", sourceInstance);

  	if (!gs.nil(clusterNode))
  		newClone.setValue("cluster_node", clusterNode);

  	newClone.setValue("email", email);
  	newClone.setDisplayValue("scheduled", scheduled);
  	newClone.setValue("state", "Requested");
  	
  	var newCloneId = newClone.insert();
  	return newCloneId;
  },

  isReservationAvailable: function() {
  	var response = {};
  	var scheduleDisplayValue = this.getParameter('sysparm_clone_start_date');
  	var cloneSysId = this.getParameter('sysparam_clone_record_sys_id');
  	var scheduled = new GlideDateTime();
  	if (!gs.nil(scheduleDisplayValue))
  		scheduled.setDisplayValue(scheduleDisplayValue);

  	var cloneRecord = new GlideRecord("clone_instance");
  	if (cloneRecord.get(cloneSysId)) {
  		var oldCloneStartTime = cloneRecord.getDisplayValue('scheduled');
  		if (scheduled.getDisplayValue() != oldCloneStartTime) {
  			cloneRecord.setValue("scheduled", scheduled);
  			cloneRecord.update();
  			try {
  				//After this call scheduled will be updated from webservice response
  				if (new InstanceCloneScheduler().notifySchedulingServerForCheckingReservation(cloneRecord)) {
  					// if the user has successfully authenticated the target,
  					// check if the server is not letting us proceed and possibly just error out.
  					// This could happen if the server rejects certain client requests, war version mismatch, etc
  					if (isAuthenticated && cloneRecord.state == 'Hold') {
  						this.error = cloneRecord.message;
  						this.setError(this.error);
  						return;
  					}
  				} else {
  					//cloneRecord.get(cloneSysId);
  					response.scheduledStartTime = cloneRecord.scheduled.getDisplayValue();
  					gs.log("After Update Message " + cloneRecord.getValue('clone_estimation_message'));
  					gs.log("Is Reservation " + cloneRecord.getValue('is_reservation_available'));
  					response.cloneEstimationMessage = cloneRecord.getValue('clone_estimation_message');
  					response.isReservationAvailable = cloneRecord.getValue('is_reservation_available');
  				}
  			} catch(e) {
  				gs.log("Error checking clone schedule:" + e.toString());
  				this.error = "Exception while checking clone schedule: " + e.toString();
  				this.setError(this.error);
  			}
  		}
  	}

  	var json = new JSON();
  	var encodedResponseString = json.encode(response);
  	return encodedResponseString;
  },

  getInstanceRecord: function(instanceId) {
  	var gr = new GlideRecord('instance');
  	if (gr.get(instanceId))
  		return gr;

  	return null;
  },
  
  cancelClone: function() {
  	var table = this.getParameter("sysparm_table");
  	var sysId = this.getParameter("sysparm_sys_id");

  	if(gs.nil(table) || gs.nil(sysId)) 
  		return false;

  	var cancelReason = this.getParameter("sysparm_cancel_reason");
  	if(cancelReason == "Other")
  		cancelReason = this.getParameter("sysparm_cancel_other_reason");

  	var cloneGr = new GlideRecord(table);
  	if(cloneGr.get(sysId)) {
  		var telemetry = cloneGr.getValue("telemetry");
  		if(gs.nil(telemetry))
  			telemetry = {};
  		else {
  				try {
  					telemetry = JSON.parse(telemetry);
  				} catch(e) {
  					gs.logError("Error in Parsing telemetry value : " + e);
  				}
  			}

  		telemetry["cancelReason"] = cancelReason;

  		cloneGr.setValue("state", "Canceled");
  		cloneGr.setValue("telemetry", JSON.stringify(telemetry));
  		cloneGr.setValue("canceled", new GlideDateTime()); // GMT

  		cloneGr.update();

  		return true;
  	}

  	return false;
  },

  rollbackClone: function() {
var table = this.getParameter("sysparm_table");
  	var sysId = this.getParameter("sysparm_sys_id");

  	if(gs.nil(table) || gs.nil(sysId)) 
  		return false;

  	var rollbackReason = this.getParameter("sysparm_rollback_reason");
  	if(rollbackReason == "Others")
  		rollbackReason = this.getParameter("sysparm_other_reason");

  	var cloneGr = new GlideRecord(table);
  	if(cloneGr.get(sysId)) {
  		var telemetry = cloneGr.getValue("telemetry");
  		if(gs.nil(telemetry))
  			telemetry = {};
  		else {
  			try {
  				telemetry = JSON.parse(telemetry);
  			} catch(e) {
  				gs.logError("Error in Parsing telemetry value : " + e);
  			}
  		}

  		telemetry["rollbackReason"] = rollbackReason;
  		cloneGr.setValue("telemetry", JSON.stringify(telemetry));
  		cloneGr.setValue("state", "Rollback Requested");
  		cloneGr.update();
  		return true;
  	}

  	return false;
  },

  _addResponse: function(name, node) {
  	var item = this.newItem(name);
  	var tn = this.getDocument().createTextNode(new JSON().encode(node));
  	item.appendChild(tn);
  },
  		
  isPublic: function() {
  	return false;
  },

  logLargePreserverReason: function() {
  	var table = this.getParameter("sysparm_table");
  	var sysId = this.getParameter("sysparm_sys_id");
  	if(gs.nil(table) || gs.nil(sysId)) 
  		return false;
  	var preserveReason = this.getParameter("sysparm_preserve_reason");
  	if(preserveReason == "Others")
  		preserveReason = this.getParameter("sysparm_preserve_other_reason");

  	var cloneGr = new GlideRecord(table);
  	if(cloneGr.get(sysId)) {
  		var telemetry = cloneGr.getValue("telemetry");
  		if(gs.nil(telemetry))
  			telemetry = {};
  		else {
  			try {
  				telemetry = JSON.parse(telemetry);
  			} catch(e) {
  				gs.logError("Error in Parsing telemetry value : " + e);
  				gs.addInfoMessage("Error in Parsing telemetry value");
  			}
  		}
  		telemetry["largePreserverReason"] = preserveReason;
  		cloneGr.setValue("telemetry", JSON.stringify(telemetry));
  		cloneGr.update();	
  		return true;
  	}
  	return true;	
  },

  		type: "InstanceCloneManagerAjax"
  	});

Sys ID

9d1cead60a0006650673708705aac810

Offical Documentation

Official Docs: