getBinaryBuildProperties
------------------------

1. getBinaryBuildProperties() should be used to define mandatory
properties for binary artifact, which are:

    "gerritProject=${env.GERRIT_PROJECT}",
    "gerritChangeNumber=${env.GERRIT_CHANGE_NUMBER}",
    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}",
    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
    "gitSha=${env.GERRIT_PATCHSET_REVISION}"

2. User can add some custom properties, e.g:

def properties = tools.getBinaryBuildProperties(
   ["test=123",
    "prop1=val1",
     prop2=val2"
   ])

3. The resulting values will be the string in props format with
namespace com.mirantis, e.g:

  com.mirantis.gerritProject=asd;com.mirantis.gerritChangeNumber=123;com.mirantis.gerritChangeId=ddd

4. How to use:

    def tools = new ci.mcp.Tools()
    ...
    def buildInfo = Artifactory.newBuildInfo()
    ...
    def properties = tools.getBinaryBuildProperties()
    ...
    // Create the upload spec.
    def uploadSpec = """{
        "files": [
                {
                    "pattern": "**",
                    "target": "some/target",
                    "props": "${properties}"
                }
            ]
        }"""
    server.upload(uploadSpec, buildInfo)
    server.publishBuildInfo buildInfo


setDockerfileLabels
-------------------
// simple usage, which adds mandatory properties to Dockerfile which is
// located in current directory
tools.setDockerfileLabels()

// extended usage
// add Labels to calico ctl and node images
  def properties = [
    "CALICO_NODE_IMAGE_REPO=${calicoNodeImageRepo}",
    "CALICOCTL_IMAGE_REPO=${calicoCtlImageRepo}",
    "CALICO_VERSION=${calicoVersion}"
  ]
  tools.setDockerfileLabels("./calicoctl/Dockerfile", properties)
  tools.setDockerfileLabels("./calico_node/Dockerfile", properties)



uriByProperties
---------------

1. uriByProperties() should be used to get URL for some artifact
with specified properties, like:

    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}"

2. Also can be used custom user' properties.

3. The resulting value will be the string in URL format, e.g:

    "https://ci.mcp-ci.local/artifactory/mcp-k8s-ci/images-info/conformance_image_v1.4.1-5_1476965708283.yaml"

4. How to use:

    def tools = new ci.mcp.Tools()
    ...
    def properties = ['com.mirantis.changeid': "${env.GERRIT_CHANGE_ID}",
                      'com.mirantis.patchset_number': "${env.GERRIT_PATCHSET_NUMBER}" ]
    def artifact_uri = tools.uriByProperties(properties)

5. Important notes:

    - if specified properties are set for few artifacts will be taken last.


setProperties
-------------

1. setProperties() should be used to set some properties to specified artifact in repo, like:

    "gerritChangeId=${env.GERRIT_CHANGE_ID}",
    "gerritPatchsetNumber=${env.GERRIT_PATCHSET_NUMBER}"

2. How to use:

    def tools = new ci.mcp.Tools()
    ...
    def artifact_url = "${env.ARTIFACTORY_URL}/api/storage/${repository}/${tag}/${version}"
    // for example: https://ci.mcp-ci.local/artifactory/api/storage/mcp-k8s-local/hyperkube-amd64/v1.4.1-5
    def properties = ['com.mirantis.build_name':"${env.JOB_NAME}",
                      'com.mirantis.build_id': "${env.BUILD_NUMBER}",
                      'com.mirantis.changeid': "${env.GERRIT_CHANGE_ID}",
                      'com.mirantis.patchset_number': "${env.GERRIT_PATCHSET_NUMBER}"]

    tools.setProperties(artifact_url, properties)

3. As result provided artifact in repo will be tagged by specified properties.


getPropertiesForArtifact
------------------------

1. getPropertiesForArtifact() should be used to get properties for specified artifact in repo, like:

    "https://ci.mcp-ci.local:443/artifactory/api/storage/mcp-k8s-ci/hyperkube-amd64/v1.4.1-5"

2. As a result will be returned LinkedHashMap of properties for specified artifact URL.

3. How to use:

    def tools = new ci.mcp.Tools()
    ...
    //
    def artifact_url = "${env.ARTIFACTORY_URL}/api/storage/${repository}/${tag}"
    def properties = tools.getPropertiesForArtifact(artifact_url)

4. Important notes:

    - will be returned LinkedHashMap of properties key-value pairs. Each value is an Array by default,
      because each key can have few values.
    - each key is available by get() method.


uploadImageToArtifactory
------------------------

1. uploadImageToArtifactory() should be used to upload Docker image to Artifactory.

2. How to use:

    def tools = new ci.mcp.Tools()
    ...
    // Docker registry for binaries and images
    def docker_registry = 'ci.mcp-ci.local:5001'
    def docker_image_name = 'hyperkube-amd64'
    def docker_image_version = 'some_version'
    def docker_repo = 'mcp-ci-local'
    ...
    <docker build steps>
    ...
    tools.uploadImageToArtifactory(docker_registry, docker_image_name, docker_image_version, docker_repo)

3. As a result specified image will be pushed to artifactory docker repo.


uploadBinariesToArtifactory
---------------------------

1. uploadBinariesToArtifactory() should be used to upload binaries to Artifactory, like:

    - some executive binaries, which were built during job execution;
    - *.yml files, etc.

2. How to use:

    def tools = new ci.mcp.Tools()
    ...
    def server = Artifactory.server('mcp-ci')
    def buildInfo = Artifactory.BuildInfo()
    ...
    def uploadSpec = """{
        "files": [
            {
                "pattern": "hyperkube*.yaml",
                "target": "${artifactory_dev_repo}/images-info/"
            },
            {
                "pattern": "artifacts/hyperkube**",
                "target": "${artifactory_dev_repo}/hyperkube-binaries/"
            }
        ]
    }"""
    tools.uploadBinariesToArtifactory(server, buildInfo, uploadSpec)


promoteDockerArtifact
---------------------

1. promoteDockerArtifact() should be used to promote docker image to production repo,
because native promotion mechanism is not allow to do it due to Artifactory bug.

2. How to use:

    def tools = new ci.mcp.Tools()
    ...
    def artifactory_dev_repo = 'docker-local'
    def artifactory_prod_repo = 'docker-prod'
    def docker_repo = 'hyperkube-amd64'
    ...
    // functions above shall be used
    <getting all tag's and artifact's information>
    ...
    def artifactImageTag = 'v1.4.0-XXXX'
    def targetArtifactImageTag = 'v1.4.0'
    ...
    tools.promoteDockerArtifact(artifactory_dev_repo,
                                artifactory_prod_repo,
                                docker_repo,
                                artifactImageTag,
                                targetArtifactImageTag)