azurepipelines/e2e_test/templates/e2e_vm_setup.yaml (165 lines of code) (raw):

# Template: Steps to setup the virtual machines for running the ADU Agent E2E Tests parameters: - name: distroName type: string - name: vm_size type: string - name: image_publisher type: string - name: image_offer type: string - name: image_sku type: string - name: image_version type: string - name: packagePattern type: string - name: package_pipeline type: string - name: du_tarball_script type: string - name: image_working_directory type: string - name: device_id_under_test type: string - name: provisioning_type type: string steps: - task: PipAuthenticate@1 displayName: 'Pip Authenticate' inputs: artifactFeeds: 'adu-linux-client/ADUTestFeed' - task: DownloadPipelineArtifact@2 displayName: "Download DeviceUpdate Package from pipeline" inputs: source: "current" project: "adu-linux-client" pipeline: ${{parameters.package_pipeline}} itemPattern: "${{parameters.packagePattern}}" path: ${{parameters.image_working_directory}}/ - script: | mkdir -p ./scenarios/test_runner/vm_setup/testsetup/ displayName: "Create the test setup directory that will contain all of the values needed for the setup tarball" continueOnError: false workingDirectory: ${{parameters.image_working_directory}}/ - script: | cp `find . -name '*.deb'` ./scenarios/test_runner/vm_setup/testsetup/deviceupdate-package.deb displayName: Stage DU Artifact for Preparing the VM Tarball continueOnError: false workingDirectory: ${{parameters.image_working_directory}}/ - script: | chmod u=rwx,g=rwx,o=rx ./scenarios/test_runner/vm_setup/create_x509_certificates.sh ./scenarios/test_runner/vm_setup/create_x509_certificates.sh -d ${{parameters.device_id_under_test}} -p ${{parameters.image_working_directory}}/scenarios/test_runner/vm_setup/testsetup/ workingDirectory: ${{parameters.image_working_directory}}/ displayName: Creating x509 device certificates for device under test condition: eq('${{ parameters.provisioning_type }}', 'x509') - task: UsePythonVersion@0 displayName: Using Python version 3.10 inputs: versionSpec: 3.10 - script: | python3 -m pip install -r scenarios/testingtoolkit/requirements.txt workingDirectory: ${{parameters.image_working_directory}}/ displayName: Installing the toolkits requirements # SAS Device Setup - task: PythonScript@0 displayName: "Run the script to create a sas device and output a configuration file" condition: eq('${{ parameters.provisioning_type }}', 'sas') inputs: scriptSource: "filePath" scriptPath: "${{parameters.image_working_directory}}/scenarios/test_runner/vm_setup/sas_devicesetup.py" workingDirectory: ${{parameters.image_working_directory}}/ env: IOTHUB_URL: $(IOTHUB_URL) IOTHUB_CONNECTION_STRING: $(IOTHUB_CONNECTION_STRING) ADU_ENDPOINT: $(ADU_ENDPOINT) ADU_INSTANCE_ID: $(ADU_INSTANCE_ID) AAD_REGISTRAR_CLIENT_ID: $(AAD_REGISTRAR_CLIENT_ID) AAD_REGISTRAR_TENANT_ID: $(AAD_REGISTRAR_TENANT_ID) AAD_CLIENT_SECRET: $(AAD_CLIENT_SECRET) DISTRONAME: ${{ parameters.distroName }} DEVICEID: ${{ parameters.device_id_under_test }} # X509 Device Setup - task: PythonScript@0 displayName: "Run the script to create a x509 device and output a configuration file" condition: eq('${{ parameters.provisioning_type }}', 'x509') inputs: scriptSource: "filePath" scriptPath: "${{parameters.image_working_directory}}/scenarios/test_runner/vm_setup/x509_devicesetup.py" workingDirectory: ${{parameters.image_working_directory}}/ arguments: "-p ${{parameters.image_working_directory}}/scenarios/test_runner/vm_setup/testsetup/${{parameters.device_id_under_test}}-primary-thumbprint.txt -s ${{parameters.image_working_directory}}/scenarios/test_runner/vm_setup/testsetup/${{parameters.device_id_under_test}}-secondary-thumbprint.txt -d ${{parameters.device_id_under_test}} -k /etc/prov_info/${{parameters.device_id_under_test}}-primary-key.pem -c /etc/prov_info/${{parameters.device_id_under_test}}-primary.pem" env: IOTHUB_URL: $(IOTHUB_URL) IOTHUB_CONNECTION_STRING: $(IOTHUB_CONNECTION_STRING) ADU_ENDPOINT: $(ADU_ENDPOINT) ADU_INSTANCE_ID: $(ADU_INSTANCE_ID) AAD_REGISTRAR_CLIENT_ID: $(AAD_REGISTRAR_CLIENT_ID) AAD_REGISTRAR_TENANT_ID: $(AAD_REGISTRAR_TENANT_ID) AAD_CLIENT_SECRET: $(AAD_CLIENT_SECRET) DISTRONAME: ${{ parameters.distroName }} DEVICEID: ${{ parameters.device_id_under_test }} - script: | if [ "${{ parameters.distroName }}" = "debian-10-amd64" ]; then mv du-config-connectionstr.json ./scenarios/test_runner/vm_setup/testsetup/du-config.json else mv du-config-ais.json ./scenarios/test_runner/vm_setup/testsetup/du-config.json fi displayName: Copy the DU configuration file to the same location as the artifact continueOnError: False workingDirectory: ${{parameters.image_working_directory}}/ - script: | mv config.toml ./scenarios/test_runner/vm_setup/testsetup/ displayName: Copy the AIS configuration file to the same location as the artifact if it exists continueOnError: True workingDirectory: ${{parameters.image_working_directory}}/ - script: | cp ./scenarios/test_runner/vm_setup/sas_vm_setup.sh ./scenarios/test_runner/vm_setup/testsetup/ displayName: Copy the setup script to the same location as the artifact continueOnError: False workingDirectory: ${{parameters.image_working_directory}}/ condition: eq('${{ parameters.provisioning_type }}', 'sas') - script: | cp ./scenarios/test_runner/vm_setup/x509_vm_setup.sh ./scenarios/test_runner/vm_setup/testsetup/ displayName: Copy the setup script to the same location as the artifact continueOnError: False workingDirectory: ${{parameters.image_working_directory}}/ condition: eq('${{ parameters.provisioning_type }}', 'x509') - script: | tar -czvf ./scenarios/test_runner/vm_setup/testsetup/adu_srcs_repo.tar.gz -C $(Build.SourcesDirectory) ./src ./scripts ./tools displayName: Taring the repo for access on the virtual machine continueOnError: False workingDirectory: ${{parameters.image_working_directory}} # # At this point /testsetup/ # du-agent.deb # du-config.json # setup.sh # adu_srcs_repo.tar.gz - script: | tar -czvf ./scenarios/test_runner/testsetup.tar.gz -C ./scenarios/test_runner/vm_setup ./testsetup/ displayName: Creating the test scenario tar ball with just the contents of ./scenarios/<scenario-name>/vm_setup/testsetup/ continueOnError: False workingDirectory: ${{parameters.image_working_directory}}/ - script: | cp ./scenarios/test_runner/testsetup.tar.gz terraform/host/ workingDirectory: ${{parameters.image_working_directory}} continueOnError: False displayName: "Copying tarball over to the terraform host" - script: | while pgrep apt > /dev/null; do sleep 1; done; sudo apt update && sudo apt install curl curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - sudo apt-add-repository "deb [arch=$(dpkg --print-architecture)] https://apt.releases.hashicorp.com $(lsb_release -cs) main" sudo apt install terraform displayName: "Installing Terraform" - script: "terraform init" displayName: terraform init (VM) continueOnError: False workingDirectory: ${{parameters.image_working_directory}}/terraform/host/ - script: terraform apply -var subscription_id="$(SUBSCRIPTION_ID)" -var tenant_id="$(TERRAFORM_TENANT_ID)" -var client_id="$(TERRAFORM_CLIENT_ID)" -var client_secret="$(TERRAFORM_CLIENT_SECRET)" -var key_vault_id="$(Azure_Key_Vault_ID)" -var resource_group_name=$(TERRAFORM_RESOURCE_GROUP_NAME) -var vm_name=${{parameters.device_id_under_test}} -var vm_size=${{parameters.vm_size}} -var image_offer=${{parameters.image_offer}} -var image_publisher=${{parameters.image_publisher}} -var image_sku=${{parameters.image_sku}} -var image_version=${{parameters.image_version}} -var test_setup_tarball="./testsetup.tar.gz" -var vm_du_tarball_script="${{parameters.du_tarball_script}}" -auto-approve displayName: Creating the Virtual Machines continueOnError: False workingDirectory: ${{parameters.image_working_directory}}/terraform/host/ - script: | mkdir -p $(Build.ArtifactStagingDirectory)/terraform/host cp -R ./terraform/host/* $(Build.ArtifactStagingDirectory)/terraform/host displayName: Copy terraform state (vm) continueOnError: False workingDirectory: ${{parameters.image_working_directory}} - task: 1ES.PublishPipelineArtifact@1 inputs: targetPath: '$(Build.ArtifactStagingDirectory)/terraform/host' artifactName: 'terraformStateVM_${{parameters.device_id_under_test}}' publishLocation: 'pipeline' displayName: 'Publish Terraform state for destroy stage (vm)' continueOnError: False