import groovy.json.JsonSlurperClassic

env.IGNORE_LIST = ["All-Users"]

env.approvers = 'ali@onlab.us,andy@onlab.us,llp@onlab.us'
env.recipients = 'cord-discuss@opencord.org'

@NonCPS
def jsonParseList(def json) {
    j = json.minus(")]}'")
    resp = new groovy.json.JsonSlurperClassic().parseText(j)
    list = []
    for (i in resp.keySet()) {
        list << i
    }
    return list
}

@NonCPS
def jsonParseMap(def json) {
    def j = json.minus(")]}'")
    return new groovy.json.JsonSlurperClassic().parseText(j)
}

def createBranch(def proj, def branch, def parent) {
    cmd = 'ssh -p 29418 gerrit.opencord.org gerrit create-branch ' + proj + " " + branch + " " + parent
    sh returnStdout: true, script: cmd
}

def validateXMLwithDTD() {
    sh returnStdout: true, script 'validate_manifest.sh'
}

int checkBranchExists(def proj) {
    if (env.IGNORE_LIST.contains(proj)) {
        return 0
    }
    url = 'https://gerrit.opencord.org/projects/' + proj + '/branches/' + env.BRANCH_NAME
    response = httpRequest url: url, validResponseCodes: '200,404'
    if (response.status == 404) {
        createBranch(proj, env.BRANCH_NAME, 'master')
        return 1
    }
    return 0
}

node ('master') {

    stage 'Validate default.xml with DTD'
    validateXMLwithDTD()

    stage 'Check and create support branches'
    def url = 'https://gerrit.opencord.org/projects/?type=CODE'
    def response = httpRequest url: url, validResponseCodes: '200'
    def info = jsonParseList(response.content)
    int created = 0
    for (index = 0; index < info.size(); index++) {
        created += checkBranchExists(info[index])
    }

    if (created == 0) {

        def now = new Date()
        def metadata = 'None'
        branch = 'cord-' + now.format("yyyyMMddHHmm", TimeZone.getTimeZone('UTC'))

        stage 'Release?'
        timeout(time: 12, unit: 'HOURS') {
            mail to: env.approvers,
                subject: "Job '${JOB_NAME}' is waiting up for promotion",
                body: "Please go to ${BUILD_URL}input and promote or abort the release. It will timeout after 12 hours."
            metadata = input id: 'release-build', message: 'Should I perform a release?',
                parameters: [booleanParam(defaultValue: true,
                description: 'Release onos applications (assumes versions have been updated)', name: 'build_onos_apps'),
                string(defaultValue: branch, description: 'Release version', name: 'release_version')], submitter: 'ash,llp,acb'
        }

        if (metadata['release_version'] == 'None') {
            error 'Release version cannot be None'
        }

        stage 'Create new manifest branch'
        createBranch('manifest', metadata['release_version'], env.BRANCH_NAME)
        checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: metadata['release_version'] ]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'WipeWorkspace'], [$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'dd9d4677-2415-4f82-8e79-99dcd530f023', url: 'ssh://jenkins@gerrit.opencord.org:29418/manifest']]]
        sh returnStdout: true, script: 'git checkout ' + metadata['release_version']
        sh returnStdout: true, script: 'git pull origin ' + metadata['release_version']
        sh returnStdout: true, script: 'cp ' + env.JENKINS_HOME + '/tmp/manifest-' + env.BRANCH_NAME + '.xml default.xml'

        sh returnStdout: true, script: 'git commit -a -m "JENKINS: Updating manifest"'
        sh returnStdout: true, script: 'git push origin ' + metadata['release_version']

        stage 'Build and Release ONOS applications'

        if (metadata['build_onos_apps']) {
            checkout changelog: false, poll: false, scm: [$class: 'RepoScm', currentBranch: true,
                manifestBranch: env.BRANCH_NAME, manifestGroup: 'onos',
                manifestRepositoryUrl: 'https://gerrit.opencord.org/manifest', quiet: true]
            if (env.BRANCH_NAME == 'master') {
                sh returnStdout: true, script: 'cd onos-apps/apps && mvn clean deploy'
            } else {
                sh returnStdout: true, script: 'cd onos-apps/apps && mvn -Prelease clean deploy'
            }
        }

        mail to: env.recipients,
            subject: 'Nightly bleeding edge ' + metadata['release_version'] + ' released',
            replyTo: 'cord-dev@opencord.org',
            body: '''Hi CORD Community,

                        |A new bleeding edge version of cord is available, feel free to test it.
                        |You can obtain it using the following commands:

                        |repo init -u https://gerrit.opencord.org/manifest -b '''.stripMargin() + metadata['release_version'] + '''
                        |repo sync

                        |Have fun!

                        |--
                        |CORD Automated Release
                    '''.stripMargin()
    }
}
