package com.mirantis.mcp-qa

/**
 * Get latest artifacts
 * @param imageRepoName is the repo name where image is located
 * @param imageTagName is the name of the image tag to be used
 */

def getLatestArtifacts(imageRepoName, imageTagName) {
    def imageRepo = env.getAt(imageRepoName)
    def imageTag = env.getAt(imageTagName)
    if ( imageTag != null && (! imageTag || imageTag.equals('latest')) ) {
        if ( imageRepo ) {
            def registry = imageRepo.replaceAll(/\/.*/, '')
            def image = imageRepo.minus(registry + '/')
            def hyperkubeImageTag = latestImageTagLookup(registry, image)
            return "${imageTagName}=${hyperkubeImageTag}"
        } else {
            echo "${imageRepoName} variable isn't set, can't inspect 'latest' image!"
            return null
        }
    }
}

def jsonParse(def json) {
    new groovy.json.JsonSlurperClassic().parseText(json)
}

/**
 * Get digest metadata
 * @param tag is the image tag to be used
 * @param registry is the url of registry
 * @param image is the image which info is looked for
 */

def get_digest(def tag, def registry, def image) {
    def digest_link = sprintf('https://%1$s/v2/%2$s/manifests/%3$s', [registry, image, tag])
    def digest_url = new URL(digest_link)
    def connection = digest_url.openConnection()
    connection.setRequestProperty('Accept', 'application/vnd.docker.distribution.manifest.v2+json')
    def digest = connection.getHeaderField("Docker-Content-Digest")
    return digest
}

/**
 * Get latest tag metadata
 * @param registry is the url of registry
 * @param image is the image which tags are looked for
 */

def latestImageTagLookup(registry, image) {
    def tags_link = sprintf('https://%1$s/v2/%2$s/tags/list', [registry, image])
    def tags_url = new URL(tags_link)
    def tags = jsonParse(tags_url.getText())['tags']
    def latest_digest = get_digest('latest', registry, image)
    def same_digest_tags = []

    for (tag in tags) {
        if (tag == 'latest') {
            continue
        }
        if (get_digest(tag, registry, image) == latest_digest) {
            same_digest_tags<< tag
        }
    }

    return same_digest_tags[0] ?: 'latest'
}


/**
 * Fetch custom refs
 * @param gerritUrl is url of gerrit
 * @param project is the name of project in gerrit
 * @param targetDir is dir where to fetch changes
 * @param refs is refs that need to be fetched
 */

def getCustomRefs(gerritUrl, project, targetDir, refs) {
    def remote = "${gerritUrl}/${project}"
    dir(targetDir) {
        for(int i=0; i<refs.size(); i++) {
            sh "git fetch ${remote} ${refs[i]} && git checkout FETCH_HEAD"
        }
    }
}

/**
 * Set downstream k8s artifacts
 * @param jobSetParameters are current job parameters that can be extended with kubernetes tag
 */

def set_downstream_k8s_artifacts(jobSetParameters) {
    def k8sTag = getLatestArtifacts('HYPERKUBE_IMAGE_REPO', 'HYPERKUBE_IMAGE_TAG')
    if (k8sTag) {
        jobSetParameters.add(k8sTag)
    }
    return jobSetParameters
}
