Pull CMDB data from one instance to another instance

Gowtham29
Tera Expert

Hi Team,

I have to move the cmdb_ci table and cmdb_rel_ci table data from the PROD instance to the UAT instance on a scheduled basis. Daily I need to run a scheduled job to pull data from PROD to UAT instance whenever the records in PROD get updated or created. If the same record exists in UAT and PROD and any update is made in PROD then I need to update the same in UAT instead of creating a new record and if it is a new record then I need to create a record. Please help me to do the coding for this requirement.

1 ACCEPTED SOLUTION

Hello Gowtham,

My apologize I pasted the wrong code. Please check with below script:

(function () {
	var TABLE_NAME = "cmdb_ci_server";
	var RESOURCE_PATH = "/api/now/table/" + TABLE_NAME;
	var request = new sn_ws.RESTMessageV2();
	request.setEndpoint("https://<INSTANCE_NAME>.service-now.com/"+RESOURCE_PATH );
	request.setHttpMethod('GET');
	request.setQueryParameter("sysparm_query", "name=ApplicationServerHelpdesk");

	//Eg. UserName="admin", Password="admin" for this code sample.
	var user = 'admin';
	var password = 'admin';
	request.setBasicAuth(user,password);

	request.setRequestHeader("Accept","application/json");
	var response = request.execute();
	var responseBody = response.getBody();
	//gs.info(responseBody);
	var jsonResponse = JSON.parse(responseBody);
	var responseResult = jsonResponse["result"];
	for (var record in responseResult) {
		var recordOperation = "";
		var recordGuidValue = responseResult[record]["sys_id"];
		var cmdbServer = new GlideRecord(TABLE_NAME);
		cmdbServer.addEncodedQuery("sys_id=" + recordGuidValue);
		cmdbServer.query();
		if (!cmdbServer.hasNext()) {
		recordOperation = "insert";
		cmdbServer.newRecord();
		} else {
		recordOperation = "update";
		cmdbServer.next();
		}
		var updateRecord = false;
		var recordData = responseResult[record];
		for (var data in recordData) {
			var fieldName = data;
			var fieldValue = "";
			if (fieldName == "sys_id" && recordOperation == "insert") {
				fieldValue = recordData[data];
				cmdbServer.setNewGuidValue(fieldValue);
			} else if (typeof recordData[data] == "object") {
				fieldValue = recordData[data]["value"];
				//gs.info(fieldName + " : " + fieldValue);
			} else {
				if (fieldName != "sys_id") {
					fieldValue = recordData[data];
					//gs.info(fieldName + " : " + fieldValue);
				}
			}
			if (fieldName && fieldValue) {
				updateRecord = true;
				cmdbServer.setValue(fieldName, fieldValue);
			}
		}
		if (updateRecord) {
			if (recordOperation == "insert")
			cmdbServer.insert();
			else if (recordOperation == "update")
			cmdbServer.update();
		}
	}
})();

If it answered your question then please mark it correct and helpful. 

Also I would appreciate if you can mark the above responses as well helpful.

Thanks

View solution in original post

12 REPLIES 12

Mahendra RC
Mega Sage

Hello Gowtham,

I cannot provide you the exact script for your requirement, but below is the sample script you can refer and you can improve it as per your requirement. You can use this script in your scheduled job on UAT instance to fetch the data from Prod instance.

You need to replace the <INSTANCE_NAME>, Username, Password, TABLE_NAME, sysparm_query in the below script with actual value as per your requirement. Test this script once by runing it once in background script on UAT instance.

(function () {
	var TABLE_NAME = "cmdb_ci_server";
	var RESOURCE_PATH = "/api/now/table/" + TABLE_NAME;
	var request = new sn_ws.RESTMessageV2();
	request.setEndpoint("https://<INSTANCE_NAME>.service-now.com/"+RESOURCE_PATH );
	request.setHttpMethod('GET');
	request.setQueryParameter("sysparm_query", "name=ApplicationServerHelpdesk");

	//Eg. UserName="admin", Password="admin" for this code sample.
	var user = 'admin';
	var password = 'admin';
	request.setBasicAuth(user,password);

	request.setRequestHeader("Accept","application/json");
	var response = request.execute();
	var responseBody = response.getBody();
	//gs.info(responseBody);
	var jsonResponse = JSON.parse(responseBody);
	var responseResult = jsonResponse["result"];
	for (var record in responseResult) {
		var recordOperation = "";
		var recordGuidValue = responseResult[record]["sys_id"];
		var cmdbServer = new GlideRecord(TABLE_NAME);
		cmdbServer.addQuery("sys_id=" + recordGuidValue);
		cmdbServer.query();
		if (!cmdbServer.hasNext()) {
		recordOperation = "insert";
		cmdbServer.newRecord();
		} else {
		recordOperation = "update";
		cmdbServer.next();
		}
		var updateRecord = false;
		var recordData = responseResult[record];
		for (var data in recordData) {
			var fieldName = "";
			var fieldValue = "";
			if (fieldName == "sys_id") {
				cmdbServer.setNewGuidValue(fieldValue);
			} else if (typeof recordData[data] == "object") {
				fieldName = data;
				fieldValue = recordData[data]["value"];
				//gs.info(fieldName + " : " + fieldValue);
			} else {
				fieldName = data;
				fieldValue = recordData[data];
				//gs.info(fieldName + " : " + fieldValue);
			}
			if (fieldName && fieldValue) {
				updateRecord = true;
				cmdbServer.setValue(fieldName, fieldValue);
			}
		}
		if (updateRecord) {
			if (recordOperation == "insert")
			cmdbServer.insert();
			else if (recordOperation == "update")
			cmdbServer.update();
		}
	}
})();

If my answer helped you in any way then please do mark it as helpful. If it answered your question then please mark it correct and helpful. This will help others with similar issue to find the correct answer.

Thanks

Thanks for the reply Mahendra. Can you send me a demo pic of the Rest Message Configuration form? This script should be written as a scheduled job right ?

Yes.. you can right this script in scheduled Job.. I have not created any Rest Message.. Directly used the Rest Message API to fetch the data.. without creating any Rest Message..

Okay, new learning from me. I was trying to create a REST Message API. I will try this and let you know Mahendra.