#! /usr/bin/env python

# Spot checks some published artifacts to be sure that they uploaded correctly
# to the release repository

import requests
import sys
import sha
import os


from requests.auth import HTTPBasicAuth

if len(sys.argv) != 4:
    print "usage: check-uploaded-maven-artifact version buildRoot repoRoot"
    sys.exit(1)

version = sys.argv[1]
buildRoot = sys.argv[2]
repoRoot = sys.argv[3]

def checkArtifact(localPath, remoteUrl):

    repoResponse = requests.head(remoteUrl)

    if repoResponse.status_code != 200:
        print 'Cannot find jar file artifact'
        print repoResponse.text
        sys.exit(1)

    remoteSize = int(repoResponse.headers['content-length'])
    etag = repoResponse.headers['etag']

    localSize = os.path.getsize(localPath)

    localArtifact = open(localPath)
    localArtifactSha = sha.new(localArtifact.read())
    expectedSha1 = localArtifactSha.hexdigest()

    if localSize != remoteSize:
        print 'Size is wrong local ' + str(localSize) + ' but found remote ' + str(remoteSize)
        sys.exit(1)

    sha1 = ''
    if '{SHA1{' in etag:
        # this is a sonatype style artifact
        sha1 = etag[7:len(etag)-3]
    else:
        sha1 = repoResponse.headers['x-checksum-sha1']

    if sha1 != expectedSha1:
        print 'SHA1 hash is wrong expected ' + expectedSha1 + ' but found ' + sha1
        sys.exit(1)

def checkArtifactsForComponent(version, name, component, buildRoot, repoRoot):
    localArtifactRootPath = buildRoot + '/buck-out/gen/' + component
    localArtifactJarPath = localArtifactRootPath + '/lib__' + name + '__output/' + name + '.jar'
    localArtifactJavadocPath = localArtifactRootPath + '/' + name + '#javadoc,maven-sources.jar'
    localArtifactSourcesPath = localArtifactRootPath + '/' + name + '#maven,src-sources.jar'

    remoteArtifactBaseUrl = repoRoot + '/org/onosproject/' + name + '/' + version + '/' + name + '-' + version
    remoteArtifactJarUrl = remoteArtifactBaseUrl + '.jar'
    remoteArtifactJavadocUrl = remoteArtifactBaseUrl + '-javadoc.jar'
    remoteArtifactSourcesUrl = remoteArtifactBaseUrl + '-sources.jar'

    checkArtifact(localArtifactJarPath, remoteArtifactJarUrl)
    checkArtifact(localArtifactJavadocPath, remoteArtifactJavadocUrl)
    checkArtifact(localArtifactSourcesPath, remoteArtifactSourcesUrl)

checkArtifactsForComponent(version, 'onos-api', 'core/api', buildRoot, repoRoot)
checkArtifactsForComponent(version, 'onos-protocols-openflow-api', 'protocols/openflow/api', buildRoot, repoRoot)
checkArtifactsForComponent(version, 'onos-drivers-ciena', 'drivers/ciena', buildRoot, repoRoot)
checkArtifactsForComponent(version, 'onos-providers-lldp', 'providers/lldp', buildRoot, repoRoot)
checkArtifactsForComponent(version, 'onos-apps-bgprouter', 'apps/bgprouter', buildRoot, repoRoot)

