pipeline {
    // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
    // SPDX-License-Identifier: MIT-0

    agent any

    options {
        disableConcurrentBuilds()
    }
    environment {
        // Credentials for AWS
        AWS_ACCOUNT_CREDENTIALS = credentials("AWS_ACCOUNT_CREDENTIALS")
        AWS_REGION = credentials("AWS_REGION")
       
        // Credentials for Ansible
        SSH_KEYPAIR_NAME = credentials("SSH_KEYPAIR_NAME")
        SSH_KEYPAIR_FILE = credentials("SSH_KEYPAIR_FILE")
        
        // Credentials for Terraform
        PRIVATE_DNS_ZONE_NAME = credentials("PRIVATE_DNS_ZONE_NAME")
        EC2_INSTANCES_NAME_PREFIX = credentials("EC2_INSTANCES_NAME_PREFIX")
        ASE_INSTANCE_TYPE = credentials("ASE_INSTANCE_TYPE")
        ASCS_INSTANCE_TYPE = credentials("ASCS_INSTANCE_TYPE")
        ERS_INSTANCE_TYPE = credentials("ERS_INSTANCE_TYPE")
        PAS_INSTANCE_TYPE = credentials("PAS_INSTANCE_TYPE")
        VPC_ID = credentials("VPC_ID")
        SUBNET_IDS = credentials("SUBNET_IDS")
        SECURITY_GROUP_ID = credentials("SECURITY_GROUP_ID")
        ENABLE_HA = credentials("ENABLE_HA")
        AMI_ID = credentials("AMI_ID")
        KMS_KEY_ARN = credentials("KMS_KEY_ARN")
        APPLICATION_CODE = credentials("APPLICATION_CODE")
        APPLICATION_NAME = credentials("APPLICATION_NAME")
        ENVIRONMENT_TYPE = credentials("ENVIRONMENT_TYPE")
        INPUT_CUSTOM_TIMEZONE = credentials("INPUT_CUSTOM_TIMEZONE")

        // Credentials for installation
        S3_ROOT_FOLDER_INSTALL_FILES = credentials("S3_ROOT_FOLDER_INSTALL_FILES")
        ASE_INSTANCE_NUMBER = credentials("ASE_INSTANCE_NUMBER")
        ASCS_INSTANCE_NUMBER = credentials("ASCS_INSTANCE_NUMBER")
        ERS_INSTANCE_NUMBER = credentials("ERS_INSTANCE_NUMBER")
        PAS_INSTANCE_NUMBER = credentials("PAS_INSTANCE_NUMBER")
        MASTER_PASSWORD = credentials("MASTER_PASSWORD")
        SAP_SID = credentials("SAP_SID")
        ASE_SID = credentials("ASE_SID")
        PRODUCT_ID_ASCS = credentials("PRODUCT_ID_ASCS")
        PRODUCT_ID_ERS = credentials("PRODUCT_ID_ERS")
        PRODUCT_ID_PAS_DB = credentials("PRODUCT_ID_PAS_DB")
        PRODUCT_ID_PAS = credentials("PRODUCT_ID_PAS")

        // Credentials to CD in and out
        TERRAFORM_FOLDER_NAME="terraform-aws-sap-netweaver-on-ase"
    }

    stages {
        stage('Prepare'){
            steps {
                script {
                    // -------------------------------------------------
                    // Check credentials
                    // -------------------------------------------------
                    env.STAGES_FOLDER="./jenkins-pipelines/sap-pipeline-ase-pas-ascs/stages"
                    env.PREPARE_FOLDER=STAGES_FOLDER+"/prepare"
                    env.DEPENDENCIES_FOLDER=PREPARE_FOLDER+"/dependencies"
                    env.GLOBAL_VARS_PATH=PREPARE_FOLDER+"/check_global_variables"

                    // Credentials for AWS
                    sh(script: GLOBAL_VARS_PATH+'/check_AWS_ACCOUNT_CREDENTIALS.sh', returnStdout: false)
                    env.AWS_REGION_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_AWS_REGION.sh', returnStdout: true).trim()
                    env.CLI_PROFILE_CHKD = "sapinstall"
                    
                    // Credentials for Ansible
                    env.SSH_KEYPAIR_NAME_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_SSH_KEYPAIR_NAME.sh', returnStdout: true).trim()
                    env.SSH_KEYPAIR_FILE_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_SSH_KEYPAIR_FILE.sh', returnStdout: true).trim()

                    // Credentials for Terraform
                    env.PRIVATE_DNS_ZONE_NAME_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_PRIVATE_DNS_ZONE_NAME.sh', returnStdout: true).trim()
                    env.EC2_INSTANCES_NAME_PREFIX_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_EC2_INSTANCES_NAME_PREFIX.sh', returnStdout: true).trim()
                    env.PAS_INSTANCES_NAME_CHKD = "$EC2_INSTANCES_NAME_PREFIX_CHKD"+"-pas"
                    env.ASCS_INSTANCES_NAME_CHKD = "$EC2_INSTANCES_NAME_PREFIX_CHKD"+"-ascs"
                    env.ERS_INSTANCES_NAME_CHKD = "$EC2_INSTANCES_NAME_PREFIX_CHKD"+"-ers"
                    env.ASE_INSTANCES_NAME_CHKD = "$EC2_INSTANCES_NAME_PREFIX_CHKD"+"-ase"
                    env.ASE_INSTANCE_TYPE_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_EC2_INSTANCE_TYPE_ASE.sh', returnStdout: true).trim()
                    env.ASCS_INSTANCE_TYPE_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_EC2_INSTANCE_TYPE_ASCS.sh', returnStdout: true).trim()
                    env.ERS_INSTANCE_TYPE_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_EC2_INSTANCE_TYPE_ERS.sh', returnStdout: true).trim()
                    env.PAS_INSTANCE_TYPE_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_EC2_INSTANCE_TYPE_PAS.sh', returnStdout: true).trim()
                    env.SUBNET_IDS_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_SUBNET_IDS.sh', returnStdout: true).trim()
                    env.VPC_ID_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_VPC_ID.sh', returnStdout: true).trim()
                    env.SECURITY_GROUP_ID_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_SECURITY_GROUP_ID.sh', returnStdout: true).trim()
                    env.ENABLE_HA_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_ENABLE_HA.sh', returnStdout: true).trim()
                    env.AMI_ID_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_AMI_ID.sh', returnStdout: true).trim()
                    env.KMS_KEY_ARN_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_KMS_KEY_ARN.sh', returnStdout: true).trim()
                    env.APPLICATION_CODE_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_APPLICATION_CODE.sh', returnStdout: true).trim()
                    env.APPLICATION_NAME_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_APPLICATION_NAME.sh', returnStdout: true).trim()
                    env.INPUT_CUSTOM_TIMEZONE_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_INPUT_CUSTOM_TIMEZONE.sh', returnStdout: true).trim()
                    
                    
                    // Credentials for installation
                    env.S3_ROOT_FOLDER_INSTALL_FILES_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_S3_ROOT_FOLDER_INSTALL_FILES.sh', returnStdout: true).trim()
                    env.ASE_INSTANCE_NUMBER_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_INSTANCE_NUMBER_ASE.sh', returnStdout: true).trim()
                    env.ASCS_INSTANCE_NUMBER_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_INSTANCE_NUMBER_ASCS.sh', returnStdout: true).trim()
                    env.ERS_INSTANCE_NUMBER_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_INSTANCE_NUMBER_ERS.sh', returnStdout: true).trim()
                    env.PAS_INSTANCE_NUMBER_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_INSTANCE_NUMBER_PAS.sh', returnStdout: true).trim()
                    env.MASTER_PASSWORD_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_MASTER_PASSWORD.sh', returnStdout: true).trim()
                    env.SAP_SID_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_SID_SAP.sh', returnStdout: true).trim()
                    env.ASE_SID_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_SID_ASE.sh', returnStdout: true).trim()
                    env.PRODUCT_ID_ASCS_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_PRODUCT_ID_ASCS.sh', returnStdout: true).trim()
                    env.PRODUCT_ID_ERS_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_PRODUCT_ID_ERS.sh', returnStdout: true).trim()
                    env.PRODUCT_ID_PAS_DB_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_PRODUCT_ID_PAS_DB.sh', returnStdout: true).trim()
                    env.PRODUCT_ID_PAS_CHKD = sh(script: GLOBAL_VARS_PATH+'/check_PRODUCT_ID_PAS.sh', returnStdout: true).trim()
                    
                    // -------------------------------------------------
                    // Configure AWS CLI
                    // -------------------------------------------------
                    sh '''
                        $PREPARE_FOLDER/common/configure_cli.sh

                        if [ $? -gt 0 ]; then
                            exit 1
                        fi
                    '''
                    env.BUCKET_NAME_CHKD = sh(script: PREPARE_FOLDER+'/check_aws_resources/check_s3_bucket_name.sh', returnStdout: true).trim()
                    
                    // -------------------------------------------------
                    // Check if user information is valid on AWS
                    // -------------------------------------------------
                    sh '''
                        $PREPARE_FOLDER/check_aws_resources/check_user_info.sh
                        if [ $? -gt 0 ]; then
                            exit 1
                        fi
                    '''

                    // -------------------------------------------------
                    // Prepare shared roles
                    // -------------------------------------------------
                    sh '''
                        $DEPENDENCIES_FOLDER/prepare_roles.sh
                        if [ $? -gt 0 ]; then
                            exit 1
                        fi

                        $DEPENDENCIES_FOLDER/install_galaxy_dependencies.sh
                        if [ $? -gt 0 ]; then
                            exit 1
                        fi
                    '''

                    // Check if there's an available bucket on S3 and DynamoDB table to store Terraform states. If not, creates it
                    sh '''
                        $STAGES_FOLDER/env_states/check_create_env_dependencies.sh

                        if [ $? -gt 0 ]; then
                            exit 1
                        fi
                    '''
                }
            }
        }

        stage('Create Infrastructure'){
            steps {
                script {
                    // Terraform infrastructure
                    sh '''
                        $STAGES_FOLDER/create_env/run_terraform.sh
                        if [ $? -gt 0 ]; then
                            exit 1
                        fi
                    '''
                }
            }
        }

        stage('Install ASCS/ERS'){
            steps {
                script {
                        // Ansible for installing ASCS
                    sh '''
                        $STAGES_FOLDER/install_sap/install_ascs_ers.sh
                        if [ $? -gt 0 ]; then
                            exit 1
                        fi 
                    '''
                }
            }
        }
      
        stage('Install ASE'){
            options {timeout(time: 2, unit: 'HOURS')}       
            steps {
                script {
                        // Ansible for installing ASE
                    sh '''
                        $STAGES_FOLDER/install_sap/install_ase.sh
                        if [ $? -gt 0 ]; then
                            exit 1
                        fi 
                    '''
                }
            }
        }

        stage('Install PAS'){
            options {timeout(time: 2, unit: 'HOURS')}
            steps {
                script {
                    // Ansible for installing PAS
                    sh '''
                        $STAGES_FOLDER/install_sap/install_pas.sh
                        if [ $? -gt 0 ]; then
                            exit 1
                        fi 
                    '''
                }
            }
        }

        stage('Post Install Activities'){
            options {timeout(time: 2, unit: 'HOURS')}
            steps {
                script {
                    echo 'Post installation completed successfully'
                }
            }
        }
    }
    post {
        unsuccessful {
            echo 'Error'
        }
        success {
            echo 'Write everything to a file and store it to the S3 bucket'
        }
    }
}