Skip to content

Commit 247ec83

Browse files
committed
e2e for windows
1 parent a25e517 commit 247ec83

File tree

9 files changed

+159
-19
lines changed

9 files changed

+159
-19
lines changed

Makefile

+7
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ EXP_DIR := exp
4545
GO_INSTALL = ./scripts/go_install.sh
4646
E2E_DATA_DIR ?= $(ROOT_DIR)/test/e2e/data
4747
KUBETEST_CONF_PATH ?= $(abspath $(E2E_DATA_DIR)/kubetest/conformance.yaml)
48+
KUBETEST_WINDOWS_CONF_PATH ?= $(abspath $(E2E_DATA_DIR)/kubetest/upstream-windows.yaml)
49+
KUBETEST_REPO_LIST_PATH ?= $(abspath $(E2E_DATA_DIR)/kubetest/repo-list.yaml)
4850

4951
# set --output-base used for conversion-gen which needs to be different for in GOPATH and outside GOPATH dev
5052
ifneq ($(abspath $(ROOT_DIR)),$(GOPATH)/src/sigs.k8s.io/cluster-api-provider-azure)
@@ -194,6 +196,11 @@ test-conformance: ## Run conformance test on workload cluster.
194196
test-conformance-fast: ## Run conformance test on workload cluster using a subset of the conformance suite in parallel.
195197
$(MAKE) test-conformance CONFORMANCE_E2E_ARGS="-kubetest.config-file=$(KUBETEST_FAST_CONF_PATH) -kubetest.ginkgo-nodes=5 $(E2E_ARGS)"
196198

199+
.PHONY: test-windows-upstream
200+
test-windows-upstream: ## Run windows upstream tests on workload cluster.
201+
curl https://raw.githubusercontent.com/kubernetes-sigs/windows-testing/master/images/image-repo-list -o $(KUBETEST_REPO_LIST_PATH)
202+
$(MAKE) test-conformance CONFORMANCE_E2E_ARGS="-kubetest.config-file=$(KUBETEST_WINDOWS_CONF_PATH) -kubetest.repo-list-file=$(KUBETEST_REPO_LIST_PATH) $(E2E_ARGS)"
203+
197204
$(KUBE_APISERVER) $(ETCD): ## install test asset kubectl, kube-apiserver, etcd
198205
source ./scripts/fetch_ext_bins.sh && fetch_tools
199206

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ require (
4141
)
4242

4343
replace github.com/Azure/go-autorest => github.com/Azure/go-autorest v14.2.0+incompatible
44+
45+
replace sigs.k8s.io/cluster-api => github.com/jsturtevant/cluster-api v0.2.6-0.20210120232809-7c370ce76bb2

go.sum

+3-12
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TR
198198
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
199199
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
200200
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
201-
github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U=
202201
github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
203202
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
204203
github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
@@ -477,12 +476,13 @@ github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62F
477476
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
478477
github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
479478
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
480-
github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns=
481479
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
482480
github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
483481
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
484482
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
485483
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
484+
github.com/jsturtevant/cluster-api v0.2.6-0.20210120232809-7c370ce76bb2 h1:TPnWcrVPbNmM1krJtcM5orJAjSYkjw1TrZdlI0kuq9A=
485+
github.com/jsturtevant/cluster-api v0.2.6-0.20210120232809-7c370ce76bb2/go.mod h1:KuUGKyD9+8TwYIcwoqDaScWKsee74/bpPo2sqQMwy8o=
486486
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
487487
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
488488
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
@@ -633,7 +633,6 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf
633633
github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
634634
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
635635
github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
636-
github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA=
637636
github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
638637
github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
639638
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
@@ -654,7 +653,6 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
654653
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
655654
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
656655
github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
657-
github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U=
658656
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
659657
github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
660658
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
@@ -668,7 +666,6 @@ github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNG
668666
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
669667
github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8=
670668
github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
671-
github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI=
672669
github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
673670
github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
674671
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
@@ -706,7 +703,6 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd
706703
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
707704
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
708705
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
709-
github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
710706
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
711707
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
712708
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
@@ -716,7 +712,6 @@ github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
716712
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
717713
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
718714
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
719-
github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M=
720715
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
721716
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
722717
github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E=
@@ -1016,7 +1011,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw
10161011
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
10171012
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
10181013
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
1019-
golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72 h1:bw9doJza/SFBEweII/rHQh338oozWyiFsBRHtrflcws=
10201014
golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
10211015
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
10221016
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1187,7 +1181,6 @@ gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
11871181
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
11881182
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
11891183
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
1190-
gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71 h1:Xe2gvTZUJpsvOWUnvmL/tmhVBZUmHSvLbMjRj6NUUKo=
11911184
gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
11921185
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
11931186
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -1241,7 +1234,6 @@ k8s.io/kubectl v0.17.14 h1:P/1R44yK296p8H6vV0nSSWHCscykP1vhc7niZFgO46c=
12411234
k8s.io/kubectl v0.17.14/go.mod h1:odRYqp1ZCsHThLHdLwK82jvZA3mvbGS75fsztgZd9X0=
12421235
k8s.io/metrics v0.17.14/go.mod h1:qCUP0y61az03uIIMv1SytuMb/77iR8NuHnAptA5I6jo=
12431236
k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
1244-
k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19 h1:7Nu2dTj82c6IaWvL7hImJzcXoTPz1MsSCH7r+0m6rfo=
12451237
k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
12461238
k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw=
12471239
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
@@ -1253,13 +1245,12 @@ modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
12531245
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
12541246
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
12551247
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
1256-
sigs.k8s.io/cluster-api v0.3.12 h1:iogA3mXvwRfNU3ZCZXbqM1ZVWUxtWobgu3zRd5IkMTM=
1257-
sigs.k8s.io/cluster-api v0.3.12/go.mod h1:KuUGKyD9+8TwYIcwoqDaScWKsee74/bpPo2sqQMwy8o=
12581248
sigs.k8s.io/controller-runtime v0.5.14 h1:lmoRaPvLg9877ZOnjFivjtyIdqyLbWfcCEilxHXTEj4=
12591249
sigs.k8s.io/controller-runtime v0.5.14/go.mod h1:OTqxLuz7gVcrq+BHGUgedRu6b2VIKCEc7Pu4Jbwui0A=
12601250
sigs.k8s.io/kind v0.7.1-0.20200303021537-981bd80d3802 h1:L6/8hETA7jvdx3xBcbDifrIN2xaYHE7tA58n+Kdp2Zw=
12611251
sigs.k8s.io/kind v0.7.1-0.20200303021537-981bd80d3802/go.mod h1:HIZ3PWUezpklcjkqpFbnYOqaqsAE1JeCTEwkgvPLXjk=
12621252
sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
1253+
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ=
12631254
sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
12641255
sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE=
12651256
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=

scripts/ci-conformance.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,4 @@ cleanup() {
9595

9696
trap cleanup EXIT
9797

98-
make test-conformance
98+
make test-windows-upstream

test/e2e/conformance_test.go

+35-4
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ import (
2424
"os"
2525
"path/filepath"
2626
"strconv"
27+
"strings"
28+
29+
"sigs.k8s.io/cluster-api-provider-azure/test/e2e/kubernetes/node"
30+
31+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2732

2833
. "github.com/onsi/ginkgo"
2934
. "github.com/onsi/gomega"
@@ -70,12 +75,19 @@ var _ = Describe("Conformance Tests", func() {
7075

7176
kubernetesVersion := e2eConfig.GetVariable(capi_e2e.KubernetesVersion)
7277
flavor := clusterctl.DefaultFlavor
78+
if strings.Contains(kubetestConfigFilePath, "windows") {
79+
flavor = "windows"
80+
}
7381
if useCIArtifacts {
7482
flavor = "conformance-ci-artifacts"
83+
if strings.Contains(kubetestConfigFilePath, "windows") {
84+
flavor = "conformance-ci-artifacts-windows"
85+
}
7586
kubernetesVersion, err = kubernetesversions.LatestCIRelease()
7687
Expect(err).NotTo(HaveOccurred())
7788
Expect(os.Setenv("CI_VERSION", kubernetesVersion)).To(Succeed())
7889
}
90+
7991
workerMachineCount, err := strconv.ParseInt(e2eConfig.GetVariable("CONFORMANCE_WORKER_MACHINE_COUNT"), 10, 64)
8092
Expect(err).NotTo(HaveOccurred())
8193
controlPlaneMachineCount, err := strconv.ParseInt(e2eConfig.GetVariable("CONFORMANCE_CONTROL_PLANE_MACHINE_COUNT"), 10, 64)
@@ -105,14 +117,33 @@ var _ = Describe("Conformance Tests", func() {
105117

106118
b.RecordValue("cluster creation", runtime.Seconds())
107119
workloadProxy := bootstrapClusterProxy.GetWorkloadCluster(ctx, namespace.Name, clusterName)
120+
121+
// Windows requires a taint on control nodes nodes since not all conformance tests have ability to run
122+
if strings.Contains(kubetestConfigFilePath, "windows") {
123+
options := v1.ListOptions{
124+
LabelSelector: "kubernetes.io/os=linux",
125+
}
126+
127+
noScheduleTaint := &corev1.Taint{
128+
Key: "node-role.kubernetes.io/master",
129+
Value: "",
130+
Effect: "NoSchedule",
131+
}
132+
133+
err := node.TaintNode(workloadProxy.GetClientSet(), options, noScheduleTaint)
134+
Expect(err).NotTo(HaveOccurred())
135+
}
136+
108137
runtime = b.Time("conformance suite", func() {
109-
kubetest.Run(
138+
err := kubetest.Run(
110139
kubetest.RunInput{
111-
ClusterProxy: workloadProxy,
112-
NumberOfNodes: int(workerMachineCount),
113-
ConfigFilePath: kubetestConfigFilePath,
140+
ClusterProxy: workloadProxy,
141+
NumberOfNodes: int(workerMachineCount),
142+
ConfigFilePath: kubetestConfigFilePath,
143+
KubeTestRepoListPath: kubetestRepoListPath,
114144
},
115145
)
146+
Expect(err).NotTo(HaveOccurred())
116147
})
117148
b.RecordValue("conformance suite run time", runtime.Seconds())
118149
}, 1)

test/e2e/data/kubetest/repo-list.yaml

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
dockerLibraryRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
2+
e2eRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
3+
promoterE2eRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
4+
etcdRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
5+
gcRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
6+
hazelcastRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
7+
PrivateRegistry: e2eteam
8+
sampleRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
9+
stormRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
10+
zookeeperRegistry: k8sprow.azurecr.io/kubernetes-e2e-test-images
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
ginkgo.focus: \[Conformance\]|\[NodeConformance\]|\[sig-windows\]|\[sig-apps\].CronJob|\[sig-api-machinery\].ResourceQuota|\[sig-scheduling\].SchedulerPreemption
2+
ginkgo.skip: \[LinuxOnly\]|\[Serial\]|Guestbook.application.should.create.and.stop.a.working.application|device.plugin.for.Windows
3+
disable-log-dump: true
4+
ginkgo.progress: true
5+
ginkgo.slowSpecThreshold: 120.0
6+
ginkgo.flakeAttempts: 3
7+
ginkgo.trace: true
8+
ginkgo.v: true
9+
node-os-distro: windows

test/e2e/e2e_suite_test.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ var (
8282
// kubetestConfigFilePath is the path to the kubetest configuration file
8383
kubetestConfigFilePath string
8484

85+
// kubetestRepoListPath
86+
kubetestRepoListPath string
87+
8588
// useCIArtifacts specifies whether or not to use the latest build from the main branch of the Kubernetes repository
8689
useCIArtifacts bool
8790
)
@@ -158,7 +161,7 @@ func init() {
158161
flag.BoolVar(&skipCleanup, "e2e.skip-resource-cleanup", false, "if true, the resource cleanup after tests will be skipped")
159162
flag.BoolVar(&useExistingCluster, "e2e.use-existing-cluster", false, "if true, the test uses the current cluster instead of creating a new one (default discovery rules apply)")
160163
flag.StringVar(&kubetestConfigFilePath, "kubetest.config-file", "", "path to the kubetest configuration file")
161-
164+
flag.StringVar(&kubetestRepoListPath, "kubetest.repo-list-file", "", "path to the kubetest repo-list file")
162165
}
163166

164167
func TestE2E(t *testing.T) {

test/e2e/kubernetes/node/node.go

+88-1
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,19 @@ limitations under the License.
1919
package node
2020

2121
import (
22+
"encoding/json"
2223
"fmt"
24+
"strings"
25+
26+
"k8s.io/apimachinery/pkg/api/equality"
27+
28+
"k8s.io/apimachinery/pkg/types"
29+
"k8s.io/apimachinery/pkg/util/strategicpatch"
30+
31+
corev1 "k8s.io/api/core/v1"
2332
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2433
"k8s.io/client-go/kubernetes"
2534
"sigs.k8s.io/cluster-api-provider-azure/test/e2e/kubernetes/windows"
26-
"strings"
2735
)
2836

2937
func GetWindowsVersion(clientset *kubernetes.Clientset) (windows.OSVersion, error) {
@@ -52,3 +60,82 @@ func GetWindowsVersion(clientset *kubernetes.Clientset) (windows.OSVersion, erro
5260
return windows.LTSC2019, nil
5361
}
5462
}
63+
64+
func TaintNode(clientset *kubernetes.Clientset, options v1.ListOptions, taint *corev1.Taint) error {
65+
result, err := clientset.CoreV1().Nodes().List(options)
66+
if err != nil {
67+
return err
68+
}
69+
70+
if len(result.Items) == 0 {
71+
return fmt.Errorf("No Nodes found.")
72+
}
73+
74+
for _, n := range result.Items {
75+
newNode, needsUpdate := addOrUpdateTaint(&n, taint)
76+
if !needsUpdate {
77+
continue
78+
}
79+
80+
err = PatchNodeTaints(clientset, newNode.Name, &n, newNode)
81+
if err != nil {
82+
return err
83+
}
84+
}
85+
86+
return nil
87+
}
88+
89+
// From https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/cloud-provider/node/helpers/taints.go#L116
90+
func PatchNodeTaints(clientset *kubernetes.Clientset, nodeName string, oldNode *corev1.Node, newNode *corev1.Node) error {
91+
oldData, err := json.Marshal(oldNode)
92+
if err != nil {
93+
return fmt.Errorf("failed to marshal old node %#v for node %q: %v", oldNode, nodeName, err)
94+
}
95+
96+
newTaints := newNode.Spec.Taints
97+
newNodeClone := oldNode.DeepCopy()
98+
newNodeClone.Spec.Taints = newTaints
99+
newData, err := json.Marshal(newNodeClone)
100+
if err != nil {
101+
return fmt.Errorf("failed to marshal new node %#v for node %q: %v", newNodeClone, nodeName, err)
102+
}
103+
104+
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(oldData, newData, corev1.Node{})
105+
if err != nil {
106+
return fmt.Errorf("failed to create patch for node %q: %v", nodeName, err)
107+
}
108+
109+
_, err = clientset.CoreV1().Nodes().Patch(nodeName, types.StrategicMergePatchType, patchBytes)
110+
return err
111+
}
112+
113+
// From https://github.com/kubernetes/kubernetes/blob/master/staging/src/k8s.io/cloud-provider/node/helpers/taints.go#L116
114+
// addOrUpdateTaint tries to add a taint to annotations list. Returns a new copy of updated Node and true if something was updated
115+
// false otherwise.
116+
func addOrUpdateTaint(node *corev1.Node, taint *corev1.Taint) (*corev1.Node, bool) {
117+
newNode := node.DeepCopy()
118+
nodeTaints := newNode.Spec.Taints
119+
120+
var newTaints []corev1.Taint
121+
updated := false
122+
for i := range nodeTaints {
123+
if taint.MatchTaint(&nodeTaints[i]) {
124+
if equality.Semantic.DeepEqual(*taint, nodeTaints[i]) {
125+
return newNode, false
126+
}
127+
newTaints = append(newTaints, *taint)
128+
updated = true
129+
continue
130+
}
131+
132+
newTaints = append(newTaints, nodeTaints[i])
133+
}
134+
135+
if !updated {
136+
newTaints = append(newTaints, *taint)
137+
}
138+
139+
newNode.Spec.Taints = newTaints
140+
return newNode, true
141+
}

0 commit comments

Comments
 (0)