In this example we will get attribute values of assets with asset custom field value. We assume you get the asset custom field value with script runner. For example; If 3 assets are selected in asset custom field, custom fields inner value will be ,187,189,208, please notice leading and trailing commas. So, for each asset Id, search API is called and asset object will is obtained.
To use this script you need to set the following parameters according to your environment.
- def attributeName = 'Serial Number'; // attribute name to search
- def AUTH_HASH = 'Basic YWRtaW46YWRtaW4='; // auth hash for authorization. this sample is for user=admin, and password=admin
- def assetCustomFieldId = "customfield_10227"; // id of the asset custom field. To find it quickly, right click on issue edit screen where asset custom field appears and find the id of it.
- def issueKey = "KTP-28";
ScriptRunner groovy script - Tested on Script Console
import com.atlassian.jira.component.ComponentAccessor import com.atlassian.jira.issue.CustomFieldManager import com.atlassian.jira.issue.ModifiedValue import com.atlassian.jira.issue.util.DefaultIssueChangeHolder import groovy.json.JsonSlurper import org.apache.http.client.methods.CloseableHttpResponse import org.apache.http.client.methods.HttpPost import org.apache.http.entity.StringEntity import org.apache.http.impl.client.CloseableHttpClient import org.apache.http.impl.client.HttpClients import org.apache.http.util.EntityUtils import org.apache.log4j.Logger import org.apache.log4j.Level import com.atlassian.jira.issue.IssueManager; import com.atlassian.jira.issue.MutableIssue; import org.apache.commons.lang3.StringUtils; /*********************************************************************************************************/ /* IMPORTANT: /* Configure these settings according to your environment /* AUTH_HASH value must be changed according to the user who has Browse Assets for all types */ /*********************************************************************************************************/ def attributeName = 'Serial Number'; // attribute name to search def AUTH_HASH = 'Basic YWRtaW46YWRtaW4='; // auth hash for authorization. this sample is for user=admin, and password=admin def assetCustomFieldId = "customfield_10227"; // id of the asset custom field. To find it quickly, right click on issue edit screen where asset custom field appears and find the id of it. def issueKey = "KTP-28"; /*********************************************************************************************************/ Logger logger = Logger.getLogger("inventoryplugin.groovy.script") logger.setLevel(Level.DEBUG) /** * Get Asset custom field value */ def getCustomFieldValue(issueObj, assetCustomFieldId) { def customFieldManager = ComponentAccessor.getCustomFieldManager() def cField = customFieldManager.getCustomFieldObject(assetCustomFieldId) return issueObj.getCustomFieldValue(cField); } def getAssetAttributeValue(authHash, assetId, attributeName) { Logger logger = Logger.getLogger("inventoryplugin.groovy.script") try { if (assetId != null) { // get asset ID(s) def baseurl = ComponentAccessor.getApplicationProperties().getString("jira.baseurl") // this is the search query parameters. It searches for an asset exact asset ID. When you search assets on Asset Navigator, // same parameters appear on Developer tools-> Network Tab. You can make different searches and get the parameters from there when you need. def queryToPostJson = " {\"searchType\" : \"basic\" ," + " \"listType\" : \"detail\" ," + " \"queryIndexSearchParams\" : [" + " {\n" + " \"field\" : \"asset.id\" ," + " \"keyword\" : \"\" , " + " \"keywords\" : [] ," + " \"fieldType\" : \"LONG\" ," + " \"minNum\" : \"" + assetId + "\" ," + " \"range\" : false" + " } " + " ] ," + " \"pageNumber\" : 1 , " + " \"pageSize\" : 10000 , " + " \"sortDirection\" : \"asc\" , " + " \"sortField\" : \"asset.id\" " + "} " CloseableHttpClient httpclient = HttpClients.createDefault(); def httpPost = new HttpPost(baseurl + "/rest/jip-api/1.0/index/query"); httpPost.setHeader("Accept", "application/json"); httpPost.setHeader("Content-type", "application/json"); httpPost.setHeader("Authorization", authHash); def entity = new StringEntity(queryToPostJson); httpPost.setEntity(entity); CloseableHttpResponse response = httpclient.execute(httpPost); try { if (response.getStatusLine().getStatusCode() == 200) { BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuilder sb = new StringBuilder(); String line; while ((line = br.readLine()) != null) { sb.append(line + "\n"); } br.close(); EntityUtils.consume(response.getEntity()) def jsonSlurper = new JsonSlurper() def json = jsonSlurper.parseText(sb.toString()) def assets = json.assets; def returnValue= null; if(assets != null){ assets.each { asset -> asset.inventoryItems.each{ assetItem -> if(StringUtils.equalsIgnoreCase(assetItem.attributeName, attributeName)){ // displayValue will return enhanced value. For asset refefence types (InventoryListByForm or InventoryList) inventoryRefs attribute. // example: inventoryRefs: [{id: 26, name: "MOUSE-0001"}] returnValue = assetItem.value; } } } } return returnValue; } else { return null; } } finally { httpclient.close(); } } } catch (Exception e) { logger.error("Error while searching assets: " + e.getMessage()); return null; } } try { IssueManager issueMgr = ComponentAccessor.getIssueManager(); MutableIssue issue = issueMgr.getIssueObject(issueKey) logger.debug('Issue key: ' + issueKey); logger.debug('Attribute name to search: ' + attributeName); def assetCfValue = getCustomFieldValue(issue, assetCustomFieldId) logger.debug('Asset CF Value: ' + assetCfValue); // i.e: ,217,123,124, if(StringUtils.isNotBlank(assetCfValue)){ def assetIdArray = StringUtils.split(assetCfValue, ','); for(def assetId: assetIdArray){ if(StringUtils.isNotBlank(assetId)){ logger.debug('Asset Id: ' + assetId); def attbiuteValue = getAssetAttributeValue(AUTH_HASH, assetId, attributeName); logger.debug('Attribute value: ' + attbiuteValue); // Here you can use the attribute value to set as another custom field's value } } } } catch (Exception e) { logger.error("Error occurred: " + e.getMessage()); } return null;
ScriptRunner console logs
2019-09-11 17:55:16,770 DEBUG [groovy.script]: Issue key: KTP-28 2019-09-11 17:55:16,770 DEBUG [groovy.script]: Attribute name to search: Serial Number 2019-09-11 17:55:16,770 DEBUG [groovy.script]: Asset CF Value: ,217,123,124, 2019-09-11 17:55:16,771 DEBUG [groovy.script]: Asset Id: 217 2019-09-11 17:55:16,824 DEBUG [groovy.script]: Attribute value: Example serial 00001 2019-09-11 17:55:16,824 DEBUG [groovy.script]: Asset Id: 123 2019-09-11 17:55:16,870 DEBUG [groovy.script]: Attribute value: 1254-4432-3455-6642 2019-09-11 17:55:16,870 DEBUG [groovy.script]: Asset Id: 124 2019-09-11 17:55:16,911 DEBUG [groovy.script]: Attribute value: 3434-4567-322-23445