/* Copyright ETSI Contributors and Others
 *
 * All Rights Reserved.
 *
 *   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 KIND, either express or implied. See the
 *   License for the specific language governing permissions and limitations
 *   under the License.
 */

pipeline {
    parameters {
        // string(defaultValue: 'artifactory-osm', description: '', name: 'ARTIFACTORY_SERVER')

        // Parameters to define the specific OSM version to test
        // --> Defaults to latest stable version of Release FOURTEEN
        string(defaultValue: 'https://osm-download.etsi.org/ftp/osm-16.0-sixteen/install_osm.sh', description: 'URL to OSM installer', name: 'INSTALLER_URL')
        string(defaultValue: 'testing-daily', description: 'Release for OSM binaries (REPO_BASE)', name: 'REPO_BASE')
        string(defaultValue: 'testing-daily', description: 'OSM docker tag (DOCKER_TAG)', name: 'DOCKER_TAG')
        string(defaultValue: 'testing', description: 'Repository name for OSM packages (REPO_NAME)', name: 'REPO_NAME')

        // Parameters for docker run
        string(defaultValue: 'opensourcemano/tests', description: 'Name of docker image for client-side of Robot tests', name: 'TEST_IMAGE')
        string(defaultValue: 'testing-daily', description: 'Tag of docker image for client-side', name: 'TEST_TAG')

        // Parameters to define SSH keys (Jenkins secret) used when creating VMs
        string(defaultValue: '', description: 'Jenkins credential containing SSH private key used in VMs', name: 'SSH_PRIVATE_KEY')
        string(defaultValue: '', description: 'Jenkins credential containing SSH public key used in VMs', name: 'SSH_PUBLIC_KEY')

        // Parameter to set the target environment
        // Parameter to set the name of secret in Jenkins for Azure JSON credentials
        string(defaultValue: 'azure-credentials', description: 'Jenkins secret that contains Azure JSON credentials', name: 'AZURE_CREDENTIALS')
        // File format (take care of brackets in clientId):
        // {
        // "clientId": "{<client-id>}",
        // "clientSecret": "<secret>",
        // "subscriptionId": "<subscription-id>",
        // "tenantId": "<tenant-id>",
        // "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
        // "resourceManagerEndpointUrl": "https://management.azure.com/",
        // "activeDirectoryGraphResourceId": "https://graph.windows.net/",
        // "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
        // "galleryEndpointUrl": "https://gallery.azure.com/",
        // "managementEndpointUrl": "https://management.core.windows.net/"
        // }

        // Parameter to set the tag for selecting Robot test to be run
        string(defaultValue: 'azure', description: 'Tag for selecting Robot test to be run', name: 'ROBOT_RUN_TAG')

        // Configuration of thresholds for Robot tests
        string(defaultValue: '99.0', description: '% passed Robot tests to mark the build as passed', name: 'ROBOT_PASS_THRESHOLD')
        string(defaultValue: '80.0', description: '% passed Robot tests to mark the build as unstable (if lower, it will be failed)', name: 'ROBOT_UNSTABLE_THRESHOLD')
    }
    environment {
        // Azure environment
        CLOUD_TYPE                 = 'azure'
        SOURCE_IMAGE_NAME          = 'Canonical:0001-com-ubuntu-server-jammy:22_04-lts:latest'
        FLAVOR_NAME                = 'Standard_D4as_v4'
        K8S_FLAVOR_NAME            = 'Standard_A2_v2'
        USE_PAAS_K8S               = 'FALSE'
        PRIORITY                   = 'Regular'
        RESOURCE_GROUP             = 'OSM_CICD_GROUP'
        VNET_NAME                  = 'OSM-CICD-net'
        VIM_MGMT_NET               = 'OSM-CICD-subnet'
        VIM_TARGET                 = 'azure-etsi'
        AZURE_FLAVORS_PATTERN      = '^Standard'
        AZURE_REGION               = 'westeurope'
        OSM_VIM_MULTIPLIER_TIMEOUT = '4.0'

    /*
        // Openstack environment
        CLOUD_TYPE                 = 'openstack'
        OS_CLOUD                   = 'etsi-vim-telefonica'
        OS_DOMAIN_NAME             = 'Default'
        VIM_TARGET                 = 'etsi-vim-telefonica'
        VIM_MGMT_NET               = 'osm-ext'
        VIM_EXT_NET                = 'osm-ext'
        OVERRIDES                  = '--override-epa'
        FLAVOR_NAME                = 'osm.sanity'
        SOURCE_IMAGE_NAME          = 'ubuntu22.04'
        SSH_KEY_NAME               = 'niv2020'
        SDNC_USER                  = 'karaf'
        SDNC_PASSWORD              = 'karaf'
        SDNC_URL                   = 'http://172.21.248.11:8181'
        SDNC_TYPE                  = 'onos_vpls'

        // Google Cloud environment
        CLOUD_TYPE                 = 'gcp'
        GCP_PROJECT                = 'telcocloudpocs'
        GCP_ZONE                   = 'europe-west1-b'
        GCP_MACHINE_TYPE           = 'e2-standard-4'
        GCP_DISK_SIZE              = '40'
        GCP_IMAGE_PROJECT          = 'ubuntu-os-cloud'
        GCP_IMAGE_FAMILY           = 'ubuntu-2204-lts'
        VIM_TARGET                 = 'gcp'
        VIM_MGMT_NET               = 'default'
        OSM_VIM_MULTIPLIER_TIMEOUT = '4.0'
    */
    }
    agent {
        docker {
            label 'osm4'
            image "${params.TEST_IMAGE}:${params.TEST_TAG}"
            args "-u root:root --entrypoint=''"
        }
    }
    stages {
        stage('Set environment') {
            steps {
                script {
                    if (params.SSH_PUBLIC_KEY == '') {
                        // Gererate SSH private and public keys
                        sh "mkdir -m 700 ~/.ssh"
                        sh "ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''"
                    }
                    else {
                        // SSH private and public keys from Jenkins credentials
                        sh "mkdir -m 700 ~/.ssh"
                        withCredentials([file(credentialsId: "${params.SSH_PRIVATE_KEY}", variable: 'SSHPATH')]) {
                            sh "cp ${SSHPATH} ~/.ssh/id_rsa"
                        }
                        withCredentials([file(credentialsId: "${params.SSH_PUBLIC_KEY}", variable: 'SSHPATH')]) {
                            sh "cp ${SSHPATH} ~/.ssh/id_rsa.pub"
                        }
                        sh "chmod 400 ~/.ssh/id_rsa ~/.ssh/id_rsa.pub"
                    }
                    // This file is used by some Robot test (BASIC12)
                    sh "cp ~/.ssh/id_rsa ~/osm_id_rsa"
                    sh "echo Reading credential ${params.AZURE_CREDENTIALS}"
                }
                // Azure credentials
                withCredentials([file(credentialsId: "${params.AZURE_CREDENTIALS}", variable: 'FILE')]) {
                    sh "cp ${FILE} ~/azure-creds.json"
                    sh """
                    set +x; \
                    AZURE_CLIENT_ID=\$(cat ~/azure-creds.json | jq -r .clientId  | sed s/[{}]//g) ; \
                    AZURE_SECRET=\$(cat ~/azure-creds.json | jq -r .clientSecret) ; \
                    AZURE_TENANT=\$(cat ~/azure-creds.json | jq -r .tenantId) ; \
                    az login --service-principal --username \$AZURE_CLIENT_ID --password \$AZURE_SECRET --tenant \$AZURE_TENANT
                    """
                    sh "az vm list -o table"
                }
            }
        }
        stage('Create k8s cluster') {
            steps {
                sh "/robot-systest/cloud-scripts/create-k8s.sh"
                sh "cat /robot-systest/results/k8s_environment.rc"
            }
        }
        stage('Install OSM') {
            steps {
                sh "/robot-systest/cloud-scripts/create-osm-vm.sh"
                sh "cat /robot-systest/results/osm_environment.rc"
                sh ". /robot-systest/results/osm_environment.rc ; /robot-systest/cloud-scripts/remote-install-osm.sh"
            }
        }
        stage('Add VIM and K8s cluster to OSM') {
            steps {
                sh """
                    . /robot-systest/results/osm_environment.rc ; \
                    . /robot-systest/results/k8s_environment.rc ; \
                    osm version ; \
                    set +x; \
                    export AZURE_CLIENT_ID=\$(cat ~/azure-creds.json | jq -r .clientId  | sed s/[{}]//g) ; \
                    export AZURE_SECRET=\$(cat ~/azure-creds.json | jq -r .clientSecret) ; \
                    export AZURE_TENANT=\$(cat ~/azure-creds.json | jq -r .tenantId) ; \
                    export AZURE_SUBSCRIPTION_ID=\$(cat ~/azure-creds.json | jq -r .subscriptionId) ; \
                    /robot-systest/cloud-scripts/add-vim-and-k8scluster.sh
                    """
            }

        }
        stage('Run Robot tests') {
            steps {
                sh """
                    . /robot-systest/results/osm_environment.rc ; \
                    . /robot-systest/results/k8s_environment.rc ; \
                    /robot-systest/run_test.sh -t ${params.ROBOT_RUN_TAG}
                    """
            }
        }
    }
    post {
        always {
            echo "Retrieve container logs"
            sh """
            . /robot-systest/results/osm_environment.rc ; \
            /robot-systest/cloud-scripts/remote-extract-logs.sh
            """

            echo "Save results"
            sh "rm -rf results"
            sh "cp -var /robot-systest/results /robot-systest/reports/* ."
            archiveArtifacts artifacts: 'results/**/*', fingerprint: true

            echo "Updates the Robot dashboard in Jenkins"
            robot outputPath: '.', passThreshold: "${params.ROBOT_PASS_THRESHOLD}", unstableThreshold: "${params.ROBOT_UNSTABLE_THRESHOLD}"

            echo "Destroy the K8s cluster"
            sh '. /robot-systest/results/k8s_environment.rc ; /robot-systest/cloud-scripts/delete-k8s.sh'

            echo "Destroy the OSM host"
            sh '. /robot-systest/results/osm_environment.rc ; /robot-systest/cloud-scripts/delete-osm-vm.sh'
            sh "az vm list -o table"
        }
    }
}

