0
votes

I am using this below script to delete some artifacts in Artifactory based on certain criteria by AQL query. I am a newbie to groovy script but I would like to know if its possible to import the AQL query from an external file so we don't have to edit this script everytime for any change in AQL query. This below query currently works as expected but any help would be appreciated if call AQL from external file.

Thanks in advance

import groovyx.net.http.RESTClient
import groovyx.net.http.HttpResponseException
import org.apache.http.conn.HttpHostConnectException


 def query = '**items.find({"repo": "xxx-repo-for-poc","created_by" :  "xxx","name" :{"$match": "*.nupkg"})**' // replace this with your AQL query
    def artifactoryURL = 'http://Servername:8081/artifactory/' // replace this with Artifactory server
    def restClient = new RESTClient(artifactoryURL)
    restClient.setHeaders(['Authorization': 'Basic ' + "admin:password".getBytes('iso-8859-1').encodeBase64()]) //replace the 'admin:password' with your own credentials
    def dryRun = true //set the value to false if you want the script to actually delete the artifacts

    def itemsToDelete = this.&getAqlQueryResult(restClient, query)
    if (itemsToDelete != null && itemsToDelete.size() > 0) {
         this.&delete(restClient, itemsToDelete, dryRun)
    } else {
        println('NOTHING TO DELETE')
    }

    /**
     * Send the AQL to Artifactory and collect the response.
     */
    public List getAqlQueryResult(RESTClient restClient, String query) {
        def response
        try {
            response = restClient.post(path: 'api/search/aql',
                    body: query,
                    requestContentType: 'text/plain'
            )
        } catch (Exception e) {
            println(e.message)
        }
        if (response != null && response.getData()) {
            def results = [];
            response.getData().results.each {
                results.add(constructPath(it))
            }
            return results;
        } else return null
    }

    /**
     * Construct the full path form the returned items.
     * If the path is '.' (file is on the root) we ignores it and construct the full path from the repo and the file name only
     */
    public constructPath(groovy.json.internal.LazyMap item) {
        if (item.path.toString().equals(".")) {
            return item.repo + "/" + item.name
        }
        return item.repo + "/" + item.path + "/" + item.name
    }

    /**
     * Send DELETE request to Artifactory for each one of the returned items
     */
    public delete(RESTClient restClient, List itemsToDelete, def dryRun) {
        dryMessage = (dryRun) ? "*** This is a dry run ***" : "";
        itemsToDelete.each {
            println("Trying to delete artifact: '$it'. $dryMessage")
            try {
                if (!dryRun) {
                    restClient.delete(path: it)
                }
                println("Artifact '$it' has been successfully deleted. $dryMessage")
            } catch (HttpResponseException e) {
                println("Cannot delete artifact '$it': $e.message" +
                        ", $e.statusCode")
            } catch (HttpHostConnectException e) {
                println("Cannot delete artifact '$it': $e.message")
            }
        }
    }
1

1 Answers

0
votes

The searches api exposes the aql method that enables you to execute AQL queries and act on the results as you see fit.

You should also check the user plugins documentation, it provides useful information and usage examples.