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 (smile) ).

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