We often get questions about automating common processes with vendor solutions. Today, we’re covering a Run Rule task to help you manage the Task Results list in SailPoint IIQ. This rule will allow you to manage the Task Results list by searching for specific taskresult names deleting taskresults that are past the specified retention date.
Steps
- Import the rule into SailPoint IIQ
- Go to Setup -> Tasks -> New Task -> create a new Run Rule task
- Assign Rule to Task -> Save and Execute
Rule
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE Rule PUBLIC "sailpoint.dtd" "sailpoint.dtd"> <Rule created="" id="" language="beanshell" modified="" name="Prune Task Results"> <Source> import java.util.*; import sailpoint.object.Filter; import sailpoint.object.TaskResult; import sailpoint.object.QueryOptions; import sailpoint.api.Terminator; import sailpoint.object.TaskResult; import sailpoint.object.TaskItem; import sailpoint.tools.*; import sailpoint.object.Attributes; Map taskRetention = new HashMap(); List taskResultList = new ArrayList(); Date zero = new Date(0); int totalcount = 0; boolean DEBUG_ONLY = true; int batchCount = 100; //List of Task Results that we want to prune taskResultList.add("Task1"); taskResultList.add("Task2"); taskResultList.add("Task3"); //List of retention time for each type of Task Result we want to prune taskRetention.put("Task1", "90"); taskRetention.put("Task2", "180"); taskRetention.put("Task3", "365"); System.out.println("taskResults : "+taskRetention); System.out.println("taskResults Lists : "+taskResultList); if(DEBUG_ONLY){ System.out.println("Running in Debug Mode...NO OBJECTS WILL BE PRUNED.."); } StringBuilder details = new StringBuilder(); for (int i = 0; i @lt taskResultList.size(); i++) { String task = taskResultList.get(i); int maxAge = Integer.valueOf(taskRetention.get(task)); //int maxAge = 1095; // Delete objects older than this date. Set this as per your retention policy if (/*!DEBUG_ONLY &&*/ (totalcount == batchCount)) { break; } System.out.println("TaskResult Type: " +task); System.out.println("In TaskResult cleanup with age more than days:" +maxAge+ " for " +task); Calendar c = Calendar.getInstance(); c.add(Calendar.DAY_OF_MONTH, -maxAge); Date threshold = c.getTime(); QueryOptions ops = new QueryOptions(); ops.addFilter(Filter.notnull("completed")); ops.addFilter(Filter.eq("pendingSignoffs", Integer.valueOf(0))); ops.addFilter(Filter.or(Filter.isnull("expiration"), Filter.eq("expiration", zero))); // ops.addFilter(Filter.isnull("report")); // Lets skip the report TaskResults ops.addFilter(Filter.le("created", threshold)); ops.addFilter(Filter.like("name", task, Filter.MatchMode.START)); // No need for a terminator here as we are only deleting TaskResults which do not have a report object linked int count = 0; List props = new ArrayList(); props.add("id"); int pruneTotal = context.countObjects(TaskResult.class, ops); System.out.println("Total TaskResults to be pruned:" +pruneTotal+ " for " +task); Iterator it = context.search(TaskResult.class, ops, props); while (it.hasNext()) { String id = (String)(it.next()[0]); TaskResult obj = context.getObjectById(TaskResult.class, id); if (obj != null) { System.out.println("Pruning TaskResult: "+obj.getName() + " Created: "+obj.getCreated()); context.removeObject(obj); count++; totalcount++; if(count % 100 == 0){ System.out.println("Deleted TaskResults:" +count+ " for " +task); if(!DEBUG_ONLY){ context.commitTransaction(); context.decache(); } } } if (/*!DEBUG_ONLY &&*/ (totalcount == batchCount)) { break; } } // Commit the remaining < 100 if(!DEBUG_ONLY){ context.commitTransaction(); context.decache(); } System.out.println("Total TaskResults pruned:"+count+ " for " +task); details.append("Total TaskResults pruned:"+count+ " for " +task); details.append("n"); } Attributes attributes = new Attributes(); if(!DEBUG_ONLY){ System.out.println("Total TaskResults pruned:" +totalcount+ " for EVERYTHING"); //return "Total TaskResults pruned:" +totalcount+ " for EVERYTHING"; attributes.put("messages", "Total TaskResults pruned:" +totalcount+ " for EVERYTHING"); } else{ System.out.println("Running in Debug Mode...NO OBJECTS WERE PRUNED.."); System.out.println("Total TaskResults pruned:" +totalcount+ " for EVERYTHING"); //return "Running in Debug Mode...NO OBJECTS WERE PRUNED.."; StringBuilder msg = new StringBuilder(); msg.append("Running in Debug Mode...NO OBJECTS WERE PRUNED.."); msg.append("n"); msg.append("Total TaskResults pruned:" +totalcount+ " for EVERYTHING"); attributes.put("messages", msg.toString()); } attributes.put("details", details.toString()); //System.out.println(attributes); return taskResult.setAttributes(attributes); </Source> </Rule>
Have a specific process or question about SailPoint that you like us to help you tackle? Reach out to our SailPoint IAM Pros.