← Back to team overview

canonical-ubuntu-qa team mailing list archive

Re: [Merge] qa-jenkins-jobs:hardware-installer-testing-refactor into qa-jenkins-jobs:master

 

@paride I've left an inline comment at the bottom of this MP for you to respond to, please :) 

Diff comments:

> diff --git a/jobs/hardware-iso-testing/jobs.yaml b/jobs/hardware-iso-testing/jobs.yaml
> index 91d2d2a..3981c70 100644
> --- a/jobs/hardware-iso-testing/jobs.yaml
> +++ b/jobs/hardware-iso-testing/jobs.yaml
> @@ -18,78 +18,127 @@
>  
>  # The project stanza describes all jobs and parameters
>  
> +
> +# Potential future improvements:
> +# - throttle concurrent builds
> +# - lockable resources
> +# - exclusion
> +
>  - project:
>      name: 'hardware-iso-testing'
>      release:
> -      - 'noble'
> -    dut-id:
> -      - '202101-28611'
> -      - '202207-30464'
> -      - '202203-30106'
> +        - 'noble'
> +    dut_id:
> +        # - '202101-28611'  # dell optiplex 5090 - inconsistent machine, crashes sometimes
> +        - '202207-30464'  # hp pro sff 400 g9 - also gone AWOL this morn 28/01/2025 :(
> +        # - '202203-30106'  # dell precision 7865 - connection refused
> +        # - '202102-28694'  # lenovo thinkstation p350 - No signal after booting from usb - could be nvidia driver issue
> +    test_case:
> +        - 'erase-and-reinstall'
> +        - 'entire-disk-with-zfs'
> +        # - 'entire-disk-with-zfs-plus-encryption'  # needs wait_for_text
> +        - 'entire-disk-with-installer-update'
> +        # - 'entire-disk-with-lvm-and-encryption'  # needs wait_for_text
> +        - 'entire-disk-no-internet'
> +        - 'oem-install'
> +        - 'entire-disk-with-nvidia-drivers'
>      jobs:
> -      - 'desktop-hardware-installer-tests-{release}-{dut-id}'
> +        - 'hit-{release}-dut-test-case-mapping'
> +        - 'hit-{release}-desktop-{test_case}'
>  
> -# builder stanzas describe reusable build steps
> -- builder:
> -    name: run-hardware-installer-test
> +- job-template:
> +    name: 'hit-{release}-dut-test-case-mapping'
> +    description: |
> +        Maps a test case to a DUT id - preferring to do so in a manner to parallelise as much as poss
> +    parameters:
> +        - string:
> +            name: 'DUT_IDS'
> +            description: 'Space separated list of c3 DUT ids'
> +            default:
> +                !j2: '{{ " ".join(dut_id) }}'
> +        - string:
> +            name: 'TEST_CASES'
> +            description: 'Space separated list of test case names'
> +            default:
> +                !j2: '{{ " ".join(test_case) }}'
> +    wrappers:
> +      - timestamps
> +      - timeout:
> +          timeout: 15
> +          fail: true
>      builders:
> -      - shell: |
> -            set -e
> -            retry -t 3 -d 180 -- git clone -b "${{HW_INSTALLER_TESTING_BRANCH}}" --depth 1 https://github.com/canonical/hardware-installer-testing.git hardware-installer-testing
> -            retry -t 3 -d 180 -- git clone --depth 1 https://github.com/canonical/testflinger
> -            python3 -m venv env
> -            . env/bin/activate
> -            pip install testflinger/cli
> -            pip install -r hardware-installer-testing/requirements.txt
> -            cd hardware-installer-testing/
> -            development_release=$(distro-info --devel || echo UNKNOWN)
> -            if [ {release} = $development_release ]; then
> -                # iso_url="https://tel-image-cache.canonical.com/cdimage/daily-live/current/{release}-desktop-amd64.iso";
> -                iso_url="https://cdimage.ubuntu.com/daily-live/current/{release}-desktop-amd64.iso";
> -            else
> -                # iso_url="https://tel-image-cache.canonical.com/cdimage/{release}/daily-live/current/{release}-desktop-amd64.iso";
> -                iso_url="https://cdimage.ubuntu.com/{release}/daily-live/current/{release}-desktop-amd64.iso";
> -            fi
> -            python3 ./scripts/call_testflinger_job.py --job-config test-definitions/{release}/$TEST_CASE.json --c3-machine-id {dut-id} --iso-url $iso_url
> +        - python: |
> +            import os
> +            import json
> +            import random
> +            import sys
> +            duts = os.environ.get("DUT_IDS").split(" ")
> +            test_cases = os.environ.get("TEST_CASES").split(" ")
> +            if not duts or not test_cases:
> +                sys.exit(1)
> +            used_duts = []
> +            op_json = {{}}
> +            while len(test_cases) > 0:
> +                if len(duts) == 0:
> +                    duts = used_duts
> +                    used_duts = []
> +                duts = random.shuffle(duts)
> +                idx = random.randrange(len(duts))
> +                op_json[test_cases[0]] = duts[idx]
> +                used_duts.append(duts[idx])
> +                del duts[idx]
> +                del test_cases[0]
> +            with open("{release}-dut-test-case-mapping.json", "w") as f:
> +                json.dump(op_json, f)
> +    publishers:
> +        - archive:
> +            artifacts: '{release}-dut-test-case-mapping.json'
>  
> -# job templates
>  - job-template:
> -    name: 'desktop-hardware-installer-tests-{release}-{dut-id}'
> -    project-type: matrix
> -    axes:
> -      - axis:
> -          type: user-defined
> -          name: TEST_CASE
> -          values:
> -            - erase-and-reinstall
> -            - entire-disk-with-zfs
> -            # - entire-disk-with-zfs-plus-encryption
> -            - entire-disk-with-installer-update
> -            # - entire-disk-with-lvm-and-encryption
> -            - entire-disk-no-internet
> -            - oem-install
> -            - entire-disk-with-nvidia-drivers
> -    execution-strategy:
> -      sequential: true
> -      touchstone:
> -        expr: 'TEST_CASE == "erase-and-reinstall"'
> +    name: 'hit-{release}-desktop-{test_case}'
>      description: |
> -        Runs a test defined in gh:/canonical/hardware-installer-testing
> +        Runs a test case on a DUT as specified by dut-test-case-mapping
> +    triggers:
> +        - reverse:
> +            jobs: '{release}-dut-test-case-mapping'
> +            result: success
>      parameters:
>        - string:
> -          name: HW_INSTALLER_TESTING_BRANCH
> -          default: main
> -          description: "github branch of hardware-installer-testing from which to run the tests from."
> +          name: HIT_BRANCH
> +          default: 'installer-test-suite'
> +          description: branch of HIT to run tests from
>      wrappers:
> -      - timeout:
> -          timeout: 10800
> -          fail: true
>        - timestamps
> +      - credentials-binding:
> +          - text:
> +              credential-id: GH_PAT
> +              variable: GH_PAT
>      builders:
> -      - clear-artifacts:
> -      - run-hardware-installer-test:
> -          release: '{release}'
> -          dut-id: '{dut-id}'
> -    publishers:
> -      - archive:
> -          artifacts: 'hardware-installer-testing/artifacts/*'
> +        - copyartifact:
> +            project: '{release}-dut-test-case-mapping'
> +            filter: '{release}-dut-test-case-mapping.json'
> +            which-build: last-successful
> +        - shell: |
> +            #!/bin/bash
> +            # get DUT_ID
> +            DUT_ID=$(jq -r '."{test_case}"' {release}-dut-test-case-mapping.json)
> +            # clone HIT and testflinger
> +            retry -t 3 -d 180 -- git clone -b $HIT_BRANCH https://oauth2:$GH_PAT@xxxxxxxxxx/canonical/hardware-installer-testing.git
> +            retry -t 3 -d 180 -- git clone https://github.com/canonical/testflinger
> +            # set up venv
> +            python3 -m venv env
> +            . env/bin/activate
> +            pip install testflinger/cli
> +            pip install -r hardware-installer-testing/requirements.txt
> +            # determine ISO url
> +            development_release=$(distro-info --devel || echo UNKNOWN)
> +            if [ {release} = $development_release ]; then
> +                ISO_URL="https://tel-image-cache.canonical.com/cdimage/daily-live/current/{release}-desktop-amd64.iso";
> +            else
> +                ISO_URL="https://tel-image-cache.canonical.com/cdimage/{release}/daily-live/current/{release}-desktop-amd64.iso";
> +            fi
> +            # call job!
> +            # Like this for now, just to test!
> +            cd hardware-installer-testing/
> +            echo "Would call:"
> +            echo "./scripts/call_testflinger_job_w_yarf.py --test-case {test_case} --c3-machine-id $DUT_ID --iso-url $ISO_URL --github-pat-token $GH_PAT --hit-branch $HIT_BRANCH --yarf-branch main"

I can change this to **actually** run the command, but I think it's best to do that in another commit later.
- No machines in the lab are currently functional enough to run tests
- I'd to first ensure that everything is functional in this jjb config before spamming testflinger with test requests



-- 
https://code.launchpad.net/~canonical-platform-qa/qa-jenkins-jobs/+git/qa-jenkins-jobs/+merge/480247
Your team Canonical Platform QA Team is requested to review the proposed merge of qa-jenkins-jobs:hardware-installer-testing-refactor into qa-jenkins-jobs:master.



References