# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml

trigger:
- master

resources:
  repositories:
  - repository: sonic-swss
    type: github
    name: sonic-net/sonic-swss
    endpoint: sonic-net

variables:
  - name: BUILD_BRANCH
    ${{ if eq(variables['Build.Reason'], 'PullRequest') }}:
      value: $(System.PullRequest.TargetBranch)
    ${{ else }}:
      value: $(Build.SourceBranchName)

stages:
- stage: Pretest
  jobs:
  - job: static_analysis
    displayName: "Static Analysis"
    timeoutInMinutes: 10
    continueOnError: true
    pool: sonic-ubuntu-1c
    steps:
    - template: .azure-pipelines/pre-commit-check.yml

- stage: Build

  jobs:
  - job:
    displayName: "Python3"
    variables:
      DIFF_COVER_CHECK_THRESHOLD: 80
      DIFF_COVER_ENABLE: 'true'
    pool:
      vmImage: ubuntu-20.04

    container:
      image: sonicdev-microsoft.azurecr.io:443/sonic-slave-bookworm:$(BUILD_BRANCH)

    steps:
    - script: |
        set -ex
        sudo apt-get update
        sudo apt-get install -y python3-pip
        sudo pip3 install requests==2.31.0
        sudo apt-get install -y python3-protobuf
      displayName: "Install dependencies"

    - script: |
        sourceBranch=$(Build.SourceBranchName)
        if [[ "$(Build.Reason)" == "PullRequest" ]];then
          sourceBranch=$(System.PullRequest.TargetBranch)
        fi
        echo "Download artifact branch: $sourceBranch"
        echo "##vso[task.setvariable variable=sourceBranch]$sourceBranch"
      displayName: "Get correct artifact downloading branch"
    - task: DownloadPipelineArtifact@2
      inputs:
        source: specific
        project: build
        pipeline: 142
        artifact: sonic-buildimage.vs
        runVersion: 'latestFromBranch'
        runBranch: 'refs/heads/$(sourceBranch)'
        patterns: |
          **/*.deb
          **/*.whl
      displayName: "Download artifacts from latest sonic-buildimage build"

    - script: |
        set -xe
        sudo apt-get -y purge libnl-3-dev libnl-route-3-dev || true
        sudo dpkg -i libnl-3-200_*.deb
        sudo dpkg -i libnl-genl-3-200_*.deb
        sudo dpkg -i libnl-route-3-200_*.deb
        sudo dpkg -i libnl-nf-3-200_*.deb
        sudo dpkg -i libyang_1.0.73_amd64.deb
        sudo dpkg -i libyang-cpp_1.0.73_amd64.deb
        sudo dpkg -i python3-yang_1.0.73_amd64.deb
      workingDirectory: $(Pipeline.Workspace)/target/debs/bookworm/
      displayName: 'Install Debian dependencies'

    - task: DownloadPipelineArtifact@2
      inputs:
        source: specific
        project: build
        pipeline: 9
        artifact: sonic-swss-common-bookworm
        runVersion: 'latestFromBranch'
        runBranch: 'refs/heads/$(sourceBranch)'
      displayName: "Download sonic swss common deb packages"

    - script: |
        set -xe
        sudo dpkg -i libswsscommon_1.0.0_amd64.deb
        sudo dpkg -i python3-swsscommon_1.0.0_amd64.deb
      workingDirectory: $(Pipeline.Workspace)/
      displayName: 'Install swss-common dependencies'


    - task: DownloadPipelineArtifact@2
      inputs:
        source: specific
        project: build
        pipeline: sonic-net.sonic-dash-api
        artifact: sonic-dash-api
        runVersion: 'latestFromBranch'
        runBranch: 'refs/heads/$(BUILD_BRANCH)'
        path: $(Build.ArtifactStagingDirectory)/download
        patterns: |
          libdashapi*.deb
      displayName: "Download dash api"

    - script: |
        set -xe
        sudo apt-get update
        sudo dpkg -i $(Build.ArtifactStagingDirectory)/download/libdashapi_*.deb
      workingDirectory: $(Pipeline.Workspace)/
      displayName: 'Install libdashapi libraries'

    - script: |
        set -xe
        sudo pip3 install swsssdk-2.0.1-py3-none-any.whl
        sudo pip3 install sonic_py_common-1.0-py3-none-any.whl
        sudo pip3 install sonic_yang_mgmt-1.0-py3-none-any.whl
        sudo pip3 install sonic_yang_models-1.0-py3-none-any.whl
        sudo pip3 install sonic_config_engine-1.0-py3-none-any.whl
        sudo pip3 install sonic_platform_common-1.0-py3-none-any.whl
      workingDirectory: $(Pipeline.Workspace)/target/python-wheels/bookworm/
      displayName: 'Install Python dependencies'

    - script: |
        set -ex
        # Install .NET CORE
        curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
        sudo apt-add-repository https://packages.microsoft.com/debian/12/prod
        sudo apt-get update
        sudo apt-get install -y dotnet-sdk-8.0
      displayName: "Install .NET CORE"

    - script: |
        pip3 install ".[testing]"
        pip3 uninstall --yes sonic-utilities
        pytest
      displayName: 'Test Python 3'

    - task: PublishTestResults@2
      inputs:
        testResultsFiles: '$(System.DefaultWorkingDirectory)/test-results.xml'
        testRunTitle: Python 3
        failTaskOnFailedTests: true
      condition: succeededOrFailed()
      displayName: 'Publish Python 3 test results'

    - task: PublishCodeCoverageResults@1
      inputs:
        codeCoverageTool: Cobertura
        summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage.xml'
        reportDirectory: '$(System.DefaultWorkingDirectory)/htmlcov/'
      displayName: 'Publish Python 3 test coverage'

    - script: |
        set -e
        python3 -m build -n
      displayName: 'Build Python 3 wheel'

    - publish: '$(System.DefaultWorkingDirectory)/dist/'
      artifact: wheels
      displayName: "Publish Python wheels"