Search assets and update status with ScriptRunner and AIP Java Api
This example searches for assets with asset type "Server" and asset ids between 100 and 22500, and Memory is 128 gb. And then updates status and substatus.
If you would like to override security use aipIndexService.queryDocsForObjectOverrideSecurity, if you want permission check with current user use aipIndexService.queryDocsForObject.
Script fetches 1000 assets, it is possible to do paging to process more files, or increase the pageLimit 1000 (think Server memory ).
Please inspect and configure TODO lines in the script!
Script
import com.atlassian.jira.component.ComponentAccessor import com.onresolve.scriptrunner.runner.customisers.PluginModule import com.onresolve.scriptrunner.runner.customisers.WithPlugin import groovy.transform.Field import inventoryplugin.dto.portable.InventoryDto import inventoryplugin.helper.JipUtilityHelper import inventoryplugin.service.index.AipIndexService import inventoryplugin.service.index.search.QueryIndexParam import inventoryplugin.service.index.search.QueryIndexResult import inventoryplugin.service.index.search.QueryIndexSearchParam import inventoryplugin.service.rest.dto.SystemFieldDto import inventoryplugin.service.controller.InventoryController import org.apache.log4j.Level import org.apache.log4j.Logger @Field Logger logger = Logger.getLogger("snapbytes.inventoryplugin.groovy.script") logger.setLevel(Level.DEBUG) @WithPlugin("plugin.jip") @PluginModule AipIndexService aipIndexService @PluginModule InventoryController inventoryController try { QueryIndexParam queryIndexParam = new QueryIndexParam(); queryIndexParam.setQuerySource(QueryIndexParam.QuerySource.GENERIC_SEARCH); queryIndexParam.setSortField("asset.name"); queryIndexParam.setSortDirection("asc"); queryIndexParam.setSortType("STRING"); queryIndexParam.setSearchType("basic"); queryIndexParam.setPageNumber(1); // TODO: Increase or do paging to process records more than 1000 queryIndexParam.setPageSize(1000); queryIndexParam.setQueryIndexSearchParams(new ArrayList<>()); // TODO: Adjust 3 filtering options // filter by asset type QueryIndexSearchParam query = new QueryIndexSearchParam(); query.setField("form.name"); query.setKeywords(new ArrayList<>()); query.getKeywords().add("Server"); queryIndexParam.getQueryIndexSearchParams().add(query); QueryIndexSearchParam query2 = new QueryIndexSearchParam(); query2.setField("asset.id"); query2.setMinNum(100); query2.setMaxNum(22500); query2.setRange(true); queryIndexParam.getQueryIndexSearchParams().add(query2); QueryIndexSearchParam query3 = new QueryIndexSearchParam(); query3.setField("Memory"); query3.setKeyword("128 gb"); queryIndexParam.getQueryIndexSearchParams().add(query3); def user = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser() //QueryIndexResult queryIndexResult = aipIndexService.queryDocsForObject(queryIndexParam, user); QueryIndexResult queryIndexResult = aipIndexService.queryDocsForObjectOverrideSecurity(queryIndexParam, user); def queryIndexResultAsTxt = JipUtilityHelper.convertObjectToJsonStringSafe(queryIndexResult); List<InventoryDto> assets = JipUtilityHelper.convertJsonStringToListSafe(queryIndexResult.getAssets(), InventoryDto.class); if (assets != null) { logger.debug(assets.size() + ' assets found') for (InventoryDto oneAsset : assets) { logger.debug('----------------------------------------------------') logger.debug('Asset id: ' + oneAsset.id + ', Asset name: ' + oneAsset.name) // set status and substatus of the asset inventoryplugin.service.rest.dto.InventoryDto inventoryDtoToSave = new inventoryplugin.service.rest.dto.InventoryDto(); inventoryDtoToSave.setFormId(oneAsset.formId); List<SystemFieldDto> systemFields = new ArrayList<>(); // TODO: Adjust status and substatus values (1 and 3) systemFields.add(new SystemFieldDto("asset.status", "3")); systemFields.add(new SystemFieldDto("asset.substatus", "1")); inventoryDtoToSave.setSystemFields(systemFields); inventoryController.updateInventoryAssetOverrideSecurity(InventoryController.VERSION_2, "", oneAsset.id, inventoryDtoToSave, null, false, false, false, InventoryController.ReferenceAssetFetchMethod.ID_THEN_NAME); } } return assets.size; } catch (Exception e) { logger.debug(e.getMessage()) return e.getMessage(); }
Output
2022-06-23 11:11:22,087 DEBUG [groovy.script]: 5 assets found 2022-06-23 11:11:22,088 DEBUG [groovy.script]: ---------------------------------------------------- 2022-06-23 11:11:22,088 DEBUG [groovy.script]: Asset id: 20741, Asset name: Confluence Server 2022-06-23 11:11:22,482 DEBUG [groovy.script]: ---------------------------------------------------- 2022-06-23 11:11:22,482 DEBUG [groovy.script]: Asset id: 20742, Asset name: Oracle 19c Server 2022-06-23 11:11:22,909 DEBUG [groovy.script]: ---------------------------------------------------- 2022-06-23 11:11:22,910 DEBUG [groovy.script]: Asset id: 20745, Asset name: PostgreSQL Confluence Server 2022-06-23 11:11:23,284 DEBUG [groovy.script]: ---------------------------------------------------- 2022-06-23 11:11:23,285 DEBUG [groovy.script]: Asset id: 21748, Asset name: test import 2022-06-23 11:11:23,612 DEBUG [groovy.script]: ---------------------------------------------------- 2022-06-23 11:11:23,612 DEBUG [groovy.script]: Asset id: 21747, Asset name: test import