/* 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 {
    agent none
    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-14.0-fourteen/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
        // string(defaultValue: 'azure-etsi-environment', description: 'Defines the VIM target', name: 'VIM_TARGET_ENVIRONMENT')
        // string(defaultValue: 'azure/azure.rc', description: 'Cloud config environment file', name: 'CLOUD_ENV_FILE')
        // 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'
    */
    }
    stages {
        stage('E2E TESTS') {
            agent {
                docker {
                    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"
                        }
                        // Azure credentials
                        withCredentials([file(credentialsId: "${params.AZURE_CREDENTIALS}", variable: 'PATH')]) {
                            sh "cp ${PATH} ~/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"
                }
            }
        }
    }
}

