Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test e2e fixes #694

Open
wants to merge 23 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
9fe8b76
Fix e2e tests and add more logging
kylewuolle Nov 27, 2024
3e9c974
fix up logging, ensure we get a public subnet for the hosted deploy o…
kylewuolle Nov 27, 2024
903682e
Add version parameter to test-apply call
kylewuolle Nov 28, 2024
aaa5b1d
fix linting
kylewuolle Nov 28, 2024
4942d50
Add merge_commit_sha to build outputs step
kylewuolle Nov 28, 2024
da9f5f5
For testing only, run a duplicate of the regular workflow
kylewuolle Nov 28, 2024
ea7b8e1
Formatting change
kylewuolle Nov 28, 2024
0378b05
Add tmate to help debug
kylewuolle Nov 28, 2024
1677463
Add force push of templates
kylewuolle Nov 29, 2024
d99663f
Ensure the subnet name is set
kylewuolle Nov 29, 2024
eabb23e
Add all AWS subnets to hosted deploy
kylewuolle Nov 29, 2024
1044e80
Fix up AWS validation, update Azure template as a test
kylewuolle Nov 29, 2024
3d53672
Set the indentation in the yaml encoding of aws subnets
kylewuolle Nov 30, 2024
53613cd
Format the yaml
kylewuolle Nov 30, 2024
f92fc36
Change hosted azure template to include control plane subnet
kylewuolle Dec 2, 2024
9822ec1
Update schema
kylewuolle Dec 2, 2024
510c6df
Add debug logging to ccm check
kylewuolle Dec 2, 2024
469f79d
Fix up azure env var processing
kylewuolle Dec 2, 2024
4f72ce6
attempt to remove subnet spec as a test
kylewuolle Dec 3, 2024
d57597b
Add additional networking info
kylewuolle Dec 4, 2024
6dc051f
Do not set gateway id unless it exists and fix up zone
kylewuolle Dec 4, 2024
70f2321
Revert azure networking change
kylewuolle Dec 4, 2024
f83cff8
Add template check
kylewuolle Dec 9, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
269 changes: 269 additions & 0 deletions .github/workflows/test_e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,269 @@
name: CI
on:
pull_request:
types:
- labeled
- opened
- synchronize
- reopened
paths-ignore:
- 'config/**'
- '**.md'
push:
tags:
- '*'

env:
GO_VERSION: '1.22'
REGISTRY_REPO: 'oci://ghcr.io/mirantis/hmc/charts-ci'

jobs:
build:
concurrency:
group: build-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
name: Build and Unit Test
runs-on: ubuntu-latest
outputs:
version: ${{ steps.vars.outputs.version }}
clustername: ${{ steps.vars.outputs.clustername }}
pr: ${{ steps.pr.outputs.result }}
steps:
- name: Get PR ref
uses: actions/github-script@v7
id: pr
with:
script: |
const { data: pullRequest } = await github.rest.pulls.get({
...context.repo,
pull_number: context.payload.pull_request.number,
});
return pullRequest
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: ${{fromJSON(steps.pr.outputs.result).merge_commit_sha}}
fetch-depth: 0
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
cache: false
- name: Lint
run: GOLANGCI_LINT_TIMEOUT=10m make lint
- name: Verify all generated pieces are up-to-date
run: make generate-all && git add -N . && git diff --exit-code
- name: Unit tests
run: |
make test
- name: Set up Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GHCR
uses: docker/[email protected]
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get outputs
id: vars
run: |
GIT_VERSION=$(git describe --tags --always)
echo "version=${GIT_VERSION:1}" >> $GITHUB_OUTPUT
echo "clustername=ci-$(date +%s | cut -b6-10)" >> $GITHUB_OUTPUT
- name: Build and push HMC controller image
uses: docker/build-push-action@v6
with:
build-args: |
LD_FLAGS=-s -w -X github.com/Mirantis/hmc/internal/build.Version=${{ steps.vars.outputs.version }}
context: .
platforms: linux/amd64
tags: |
ghcr.io/mirantis/hmc/controller-ci:${{ steps.vars.outputs.version }}
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Prepare and push HMC template charts
run: |
make hmc-chart-release
make helm-push
make FORCE_PUSH=true test-hmc-version helm-push

controller-e2etest:
name: E2E Controller
runs-on: ubuntu-latest
needs: build
concurrency:
group: controller-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
outputs:
clustername: ${{ needs.build.outputs.clustername }}
version: ${{ needs.build.outputs.version }}
pr: ${{ needs.build.outputs.pr }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{fromJSON(needs.build.outputs.pr).merge_commit_sha}}
- name: Setup kubectl
uses: azure/setup-kubectl@v4
- name: Run E2E tests
env:
GINKGO_LABEL_FILTER: 'controller'
MANAGED_CLUSTER_NAME: ${{ needs.build.outputs.clustername }}
IMG: 'ghcr.io/mirantis/hmc/controller-ci:${{ needs.build.outputs.version }}'
VERSION: ${{ needs.build.outputs.version }}
run: |
make test-e2e
- name: Archive test results
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: cloud-e2etest-logs
path: |
test/e2e/*.log

provider-cloud-e2etest:
name: E2E Cloud Providers
runs-on: ubuntu-latest
if: ${{ contains( github.event.pull_request.labels.*.name, 'test e2e') }}
needs: build
concurrency:
group: cloud-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
outputs:
clustername: ${{ needs.build.outputs.clustername }}
version: ${{ needs.build.outputs.version }}
pr: ${{ needs.build.outputs.pr }}
env:
AWS_REGION: us-west-2
AWS_ACCESS_KEY_ID: ${{ secrets.CI_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_AWS_SECRET_ACCESS_KEY }}
AZURE_REGION: westus2
AZURE_SUBSCRIPTION_ID: ${{ secrets.CI_AZURE_SUBSCRIPTION_ID }}
AZURE_TENANT_ID: ${{ secrets.CI_AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.CI_AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.CI_AZURE_CLIENT_SECRET }}
steps:
- name: Setup tmate session
uses: mxschmitt/action-tmate@v3
with:
detached: true
timeout-minutes: 90
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{fromJSON(needs.build.outputs.pr).merge_commit_sha}}
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Setup kubectl
uses: azure/setup-kubectl@v4
- uses: actions/checkout@v4
- name: Run E2E tests
env:
GINKGO_LABEL_FILTER: 'provider:cloud'
MANAGED_CLUSTER_NAME: ${{ needs.build.outputs.clustername }}
IMG: 'ghcr.io/mirantis/hmc/controller-ci:${{ needs.build.outputs.version }}'
VERSION: ${{ needs.build.outputs.version }}
run: |
make test-e2e
- name: Archive test results
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: cloud-e2etest-logs
path: |
test/e2e/*.log

provider-onprem-e2etest:
name: E2E On-Prem Providers
runs-on: self-hosted
if: ${{ contains( github.event.pull_request.labels.*.name, 'test e2e') }}
needs: build
concurrency:
group: onprem-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
outputs:
clustername: ${{ needs.build.outputs.clustername }}
version: ${{ needs.build.outputs.version }}
pr: ${{ needs.build.outputs.pr }}
env:
VSPHERE_USER: ${{ secrets.CI_VSPHERE_USER }}
VSPHERE_PASSWORD: ${{ secrets.CI_VSPHERE_PASSWORD }}
VSPHERE_SERVER: ${{ secrets.CI_VSPHERE_SERVER }}
VSPHERE_THUMBPRINT: ${{ secrets.CI_VSPHERE_THUMBPRINT }}
VSPHERE_DATACENTER: ${{ secrets.CI_VSPHERE_DATACENTER }}
VSPHERE_DATASTORE: ${{ secrets.CI_VSPHERE_DATASTORE }}
VSPHERE_RESOURCEPOOL: ${{ secrets.CI_VSPHERE_RESOURCEPOOL }}
VSPHERE_FOLDER: ${{ secrets.CI_VSPHERE_FOLDER }}
VSPHERE_CONTROL_PLANE_ENDPOINT: ${{ secrets.CI_VSPHERE_CONTROL_PLANE_ENDPOINT }}
VSPHERE_VM_TEMPLATE: ${{ secrets.CI_VSPHERE_VM_TEMPLATE }}
VSPHERE_NETWORK: ${{ secrets.CI_VSPHERE_NETWORK }}
VSPHERE_SSH_KEY: ${{ secrets.CI_VSPHERE_SSH_KEY }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{fromJSON(needs.build.outputs.pr).merge_commit_sha}}
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: Setup kubectl
uses: azure/setup-kubectl@v4
- name: Run E2E tests
env:
GINKGO_LABEL_FILTER: 'provider:onprem'
MANAGED_CLUSTER_NAME: ${{ needs.build.outputs.clustername }}
IMG: 'ghcr.io/mirantis/hmc/controller-ci:${{ needs.build.outputs.version }}'
VERSION: ${{ needs.build.outputs.version }}
run: |
make test-e2e
- name: Archive test results
if: ${{ failure() }}
uses: actions/upload-artifact@v4
with:
name: onprem-e2etest-logs
path: |
test/e2e/*.log

cleanup:
name: Cleanup
needs:
- build
- provider-cloud-e2etest
runs-on: ubuntu-latest
if: ${{ always() && !contains(needs.provider-cloud-e2etest.result, 'skipped') && contains(needs.build.result, 'success') }}
timeout-minutes: 15
outputs:
clustername: ${{ needs.build.outputs.clustername }}
version: ${{ needs.build.outputs.version }}
pr: ${{ needs.build.outputs.pr }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{fromJSON(needs.build.outputs.pr).merge_commit_sha}}
- name: Setup Go
uses: actions/setup-go@v5
with:
go-version: ${{ env.GO_VERSION }}
- name: AWS Test Resources
env:
AWS_REGION: us-west-2
AWS_ACCESS_KEY_ID: ${{ secrets.CI_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.CI_AWS_SECRET_ACCESS_KEY }}
AZURE_REGION: westus2
AZURE_SUBSCRIPTION_ID: ${{ secrets.CI_AZURE_SUBSCRIPTION_ID }}
AZURE_TENANT_ID: ${{ secrets.CI_AZURE_TENANT_ID }}
AZURE_CLIENT_ID: ${{ secrets.CI_AZURE_CLIENT_ID }}
AZURE_CLIENT_SECRET: ${{ secrets.CI_AZURE_CLIENT_SECRET }}
CLUSTER_NAME: '${{ needs.build.outputs.clustername }}'
run: |
make dev-aws-nuke
make dev-azure-nuke
33 changes: 29 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,33 @@ set-hmc-version: yq
$(YQ) eval '.metadata.name = "hmc-$(FQDN_VERSION)"' -i $(PROVIDER_TEMPLATES_DIR)/hmc-templates/files/release.yaml
$(YQ) eval '.spec.hmc.template = "hmc-$(FQDN_VERSION)"' -i $(PROVIDER_TEMPLATES_DIR)/hmc-templates/files/release.yaml

.PHONY: test-hmc-version
test-hmc-version: yq
@TEMPLATE_DIR=templates/provider/hmc-templates/files/templates/*; \
cutversion=$$(echo $(VERSION) | sed "s/.*-//g"); \
echo "cutversion = $cutversion"; \
for template in $$TEMPLATE_DIR; do \
if [ $$($(YQ) eval '.kind' $$template) = 'ClusterTemplate' ]; then \
if grep --quiet "chartVersion:.*-"$$cutversion $$template; then \
echo "skipping already processed templates $$template"; \
else \
echo $$template; \
sed -i "s/chartVersion:.*[^$$cutversion].*/&-$$cutversion/g" "$$template"; \
fi \
fi; \
done; \
CHART_DIR=templates/cluster/**/Chart.yaml; \
for chart in $$CHART_DIR; do \
if grep --quiet "version:.*-$$cutversion" $$chart; then \
echo "skipping already processed templates $$chart"; \
else \
echo $$chart; \
sed -i "s/version:.*[^$$cutversion]*./&-$$cutversion/g" "$$chart"; \
fi \
done

.PHONY: hmc-chart-release
hmc-chart-release: set-hmc-version templates-generate ## Generate hmc helm chart
hmc-chart-release: set-hmc-version test-hmc-version templates-generate ## Generate hmc helm chart

.PHONY: hmc-dist-release
hmc-dist-release: $(HELM) $(YQ)
Expand Down Expand Up @@ -110,7 +135,7 @@ test: generate-all fmt vet envtest tidy external-crd ## Run tests.

# Utilize Kind or modify the e2e tests to load the image locally, enabling
# compatibility with other vendors.
.PHONY: test-e2e # Run the e2e tests using a Kind k8s instance as the management cluster.
.PHONY: test-e2e test-hmc-version# Run the e2e tests using a Kind k8s instance as the management cluster.
test-e2e: cli-install
@if [ "$$GINKGO_LABEL_FILTER" ]; then \
ginkgo_label_flag="-ginkgo.label-filter=$$GINKGO_LABEL_FILTER"; \
Expand Down Expand Up @@ -297,7 +322,7 @@ helm-push: helm-package
else \
chart_exists=$$($(HELM) pull $$repo_flag $(REGISTRY_REPO) $$chart_name --version $$chart_version --destination /tmp 2>&1 | grep "not found" || true); \
fi; \
if [ -z "$$chart_exists" ]; then \
if [ -z "$$chart_exists" ] && [ -z $$FORCE_PUSH ]; then \
echo "Chart $$chart_name version $$chart_version already exists in the repository."; \
else \
if $(REGISTRY_IS_OCI); then \
Expand Down Expand Up @@ -352,7 +377,7 @@ dev-eks-creds: dev-aws-creds
dev-apply: kind-deploy registry-deploy dev-push dev-deploy dev-templates dev-release

.PHONY: test-apply
test-apply: set-hmc-version helm-package dev-deploy dev-templates dev-release
test-apply: set-hmc-version test-hmc-version helm-package dev-deploy dev-templates dev-release

.PHONY: dev-destroy
dev-destroy: kind-undeploy registry-undeploy ## Destroy the development environment by deleting the kind cluster and local registry.
Expand Down
10 changes: 8 additions & 2 deletions templates/cluster/azure-hosted-cp/templates/azurecluster.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,15 @@ spec:
- name: {{ .Values.network.nodeSubnetName }}
role: node
routeTable:
name: {{ .Values.network.routeTableName }}
name: {{ .Values.network.nodeRouteTableName }}
securityGroup:
name: {{ .Values.network.securityGroupName }}
name: {{ .Values.network.nodeSecurityGroupName }}
- name: {{ .Values.network.cpSubnetName }}
role: control-plane
routeTable:
name: {{ .Values.network.cpRouteTableName }}
securityGroup:
name: {{ .Values.network.cpSecurityGroupName }}
location: {{ .Values.location }}
{{- if .Values.bastion.enabled }}
{{- with .Values.bastion.bastionSpec }}
Expand Down
7 changes: 5 additions & 2 deletions templates/cluster/azure-hosted-cp/values.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,11 @@
"required": [
"vnetName",
"nodeSubnetName",
"routeTableName",
"securityGroupName"
"nodeRouteTableName",
"nodeSecurityGroupName",
"cpSubnetName",
"cpRouteTableName",
"cpSecurityGroupName"
],
"properties": {
"vnetName": {
Expand Down
7 changes: 5 additions & 2 deletions templates/cluster/azure-hosted-cp/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,11 @@ resourceGroup: ""
network:
vnetName: ""
nodeSubnetName: ""
routeTableName: ""
securityGroupName: ""
nodeRouteTableName: ""
nodeSecurityGroupName: ""
cpSubnetName: ""
cpRouteTableName: ""
cpSecurityGroupName: ""
# Azure machines parameters

sshPublicKey: ""
Expand Down
Loading
Loading