/*
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY, either express or
  implied.
  See the License for the specific language governing permissions and
  limitations under the License.
*/

pipeline {
    agent none
    parameters {
        string(defaultValue: env.BRANCH_NAME, description: '', name: 'GERRIT_BRANCH')
        string(defaultValue: 'osm/NBI', description: '', name: 'GERRIT_PROJECT')
        string(defaultValue: env.GERRIT_REFSPEC, description: '', name: 'GERRIT_REFSPEC')
        string(defaultValue: env.GERRIT_PATCHSET_REVISION, description: '', name: 'GERRIT_PATCHSET_REVISION')
        string(defaultValue: 'https://osm.etsi.org/gerrit', description: '', name: 'PROJECT_URL_PREFIX')
        booleanParam(defaultValue: false, description: '', name: 'TEST_INSTALL')
        // string(defaultValue: 'artifactory-osm', description: '', name: 'ARTIFACTORY_SERVER')
        // New parameters for Docker image build
        string(defaultValue: 'opensourcemano/nbi', description: 'Docker Image Name', name: 'IMAGENAME')
        string(defaultValue: 'localhost:5000', description: 'Docker Registry', name: 'DOCKER_REGISTRY')
        string(defaultValue: 'http://', description: 'Docker Registry protocol', name: 'DOCKER_REGISTRY_PROTOCOL')
        string(defaultValue: '', description: 'ID of Docker Registry Credentials', name: 'DOCKER_CREDENTIALS') // `defaultValue` to be updated with actual ID in Jenkins whenever needed
    }
    stages {
        stage('TEST') {
            agent { label 'system' }
            steps {
                echo "HELLO"
            }
        }
    }
}

