Skip to content

Commit cc9227e

Browse files
authored
Merge pull request #3670 from Lauquik/laukik
✨ Add e2e tests scaffolded in default layout
2 parents 8c7074e + 981dd3c commit cc9227e

File tree

38 files changed

+2551
-9
lines changed

38 files changed

+2551
-9
lines changed

.github/workflows/lint-sample.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,3 @@ jobs:
5151
working-directory: testdata/project-v4-multigroup-with-deploy-image
5252
args: --config .golangci.yml ./...
5353
skip-cache: true # first lint action will handle
54-

.github/workflows/test-sample-go.yml

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
name: project-v4-sample
2+
3+
on:
4+
push:
5+
pull_request:
6+
7+
jobs:
8+
test:
9+
name: Run on Ubuntu
10+
runs-on: ubuntu-latest
11+
env:
12+
KIND_K8S_VERSION: v1.28.0
13+
tools_k8s_version: 1.28.0
14+
kind_version: 0.15.0
15+
steps:
16+
- name: Clone the code
17+
uses: actions/checkout@v4
18+
19+
- name: Setup Go
20+
uses: actions/setup-go@v4
21+
with:
22+
go-version: '~1.20'
23+
24+
- name: Install Kind
25+
run: go install sigs.k8s.io/kind@v$kind_version
26+
27+
28+
- name: Install setup-envtest
29+
run: go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest
30+
31+
- name: Install e2e tools with setup-envtest
32+
run: setup-envtest use $tools_k8s_version
33+
34+
- name: Create kind cluster
35+
run: kind create cluster
36+
37+
- name: Prepare the environment
38+
run: |
39+
KUSTOMIZATION_FILE_PATH="testdata/project-v4/config/default/kustomization.yaml"
40+
sed -i '25s/^#//' $KUSTOMIZATION_FILE_PATH
41+
sed -i '27s/^#//' $KUSTOMIZATION_FILE_PATH
42+
sed -i '42s/^#//' $KUSTOMIZATION_FILE_PATH
43+
sed -i '46,143s/^#//' $KUSTOMIZATION_FILE_PATH
44+
45+
- name: Test
46+
run: |
47+
cd testdata/project-v4
48+
go get -u ./...
49+
go mod tidy
50+
make test-e2e
51+

docs/book/src/component-config-tutorial/testdata/project/Makefile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,13 @@ vet: ## Run go vet against code.
6262

6363
.PHONY: test
6464
test: manifests generate fmt vet envtest ## Run tests.
65-
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test ./... -coverprofile cover.out
65+
KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test $$(go list ./... | grep -v /e2e) -coverprofile cover.out
6666

67+
# Utilize Kind or modify the e2e tests to load the image locally, enabling compatibility with other vendors.
68+
.PHONY: test-e2e # Run the e2e tests against a Kind k8s instance that is spun up.
69+
test-e2e:
70+
go test ./test/e2e/ -v -ginkgo.v
71+
6772
GOLANGCI_LINT = $(shell pwd)/bin/golangci-lint
6873
GOLANGCI_LINT_VERSION ?= v1.54.2
6974
golangci-lint:

docs/book/src/component-config-tutorial/testdata/project/go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module tutorial.kubebuilder.io/project
33
go 1.20
44

55
require (
6+
github.com/onsi/ginkgo/v2 v2.11.0
7+
github.com/onsi/gomega v1.27.10
68
k8s.io/apimachinery v0.28.3
79
k8s.io/client-go v0.28.3
810
sigs.k8s.io/controller-runtime v0.16.3
@@ -20,12 +22,14 @@ require (
2022
github.com/go-openapi/jsonpointer v0.19.6 // indirect
2123
github.com/go-openapi/jsonreference v0.20.2 // indirect
2224
github.com/go-openapi/swag v0.22.3 // indirect
25+
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
2326
github.com/gogo/protobuf v1.3.2 // indirect
2427
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
2528
github.com/golang/protobuf v1.5.3 // indirect
2629
github.com/google/gnostic-models v0.6.8 // indirect
2730
github.com/google/go-cmp v0.5.9 // indirect
2831
github.com/google/gofuzz v1.2.0 // indirect
32+
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
2933
github.com/google/uuid v1.3.0 // indirect
3034
github.com/imdario/mergo v0.3.6 // indirect
3135
github.com/josharian/intern v1.0.0 // indirect
@@ -50,6 +54,7 @@ require (
5054
golang.org/x/term v0.13.0 // indirect
5155
golang.org/x/text v0.13.0 // indirect
5256
golang.org/x/time v0.3.0 // indirect
57+
golang.org/x/tools v0.9.3 // indirect
5358
gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect
5459
google.golang.org/appengine v1.6.7 // indirect
5560
google.golang.org/protobuf v1.30.0 // indirect

docs/book/src/component-config-tutorial/testdata/project/go.sum

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
44
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
55
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
66
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
7+
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
8+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
9+
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
710
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
811
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
912
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -27,6 +30,7 @@ github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En
2730
github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
2831
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
2932
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
33+
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
3034
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
3135
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
3236
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
@@ -45,8 +49,10 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
4549
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
4650
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
4751
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
52+
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
4853
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
4954
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
55+
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
5056
github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
5157
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
5258
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
@@ -75,7 +81,9 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY
7581
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
7682
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
7783
github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
84+
github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
7885
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
86+
github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
7987
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
8088
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
8189
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -96,6 +104,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
96104
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
97105
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
98106
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
107+
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
99108
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
100109
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
101110
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
@@ -122,6 +131,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl
122131
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
123132
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
124133
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
134+
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
125135
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
126136
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
127137
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
@@ -140,6 +150,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
140150
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
141151
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
142152
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
153+
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
143154
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
144155
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
145156
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -164,6 +175,7 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
164175
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
165176
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
166177
golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM=
178+
golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
167179
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
168180
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
169181
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
Copyright 2023 The Kubernetes authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package e2e
18+
19+
import (
20+
"fmt"
21+
"testing"
22+
23+
. "github.com/onsi/ginkgo/v2"
24+
. "github.com/onsi/gomega"
25+
)
26+
27+
// Run e2e tests using the Ginkgo runner.
28+
func TestE2E(t *testing.T) {
29+
RegisterFailHandler(Fail)
30+
fmt.Fprintf(GinkgoWriter, "Starting project suite\n")
31+
RunSpecs(t, "e2e suite")
32+
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/*
2+
Copyright 2023 The Kubernetes authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package e2e
18+
19+
import (
20+
"fmt"
21+
"os/exec"
22+
"time"
23+
24+
. "github.com/onsi/ginkgo/v2"
25+
. "github.com/onsi/gomega"
26+
27+
"tutorial.kubebuilder.io/project/test/utils"
28+
)
29+
30+
const namespace = "project-system"
31+
32+
var _ = Describe("controller", Ordered, func() {
33+
BeforeAll(func() {
34+
By("installing prometheus operator")
35+
Expect(utils.InstallPrometheusOperator()).To(Succeed())
36+
37+
By("installing the cert-manager")
38+
Expect(utils.InstallCertManager()).To(Succeed())
39+
40+
By("creating manager namespace")
41+
cmd := exec.Command("kubectl", "create", "ns", namespace)
42+
_, _ = utils.Run(cmd)
43+
})
44+
45+
AfterAll(func() {
46+
By("uninstalling the Prometheus manager bundle")
47+
utils.UninstallPrometheusOperator()
48+
49+
By("uninstalling the cert-manager bundle")
50+
utils.UninstallCertManager()
51+
52+
By("removing manager namespace")
53+
cmd := exec.Command("kubectl", "delete", "ns", namespace)
54+
_, _ = utils.Run(cmd)
55+
})
56+
57+
Context("Operator", func() {
58+
It("should run successfully", func() {
59+
var controllerPodName string
60+
var err error
61+
62+
// projectimage stores the name of the image used in the example
63+
var projectimage = "example.com/project:v0.0.1"
64+
65+
By("building the manager(Operator) image")
66+
cmd := exec.Command("make", "docker-build", fmt.Sprintf("IMG=%s", projectimage))
67+
_, err = utils.Run(cmd)
68+
ExpectWithOffset(1, err).NotTo(HaveOccurred())
69+
70+
By("loading the the manager(Operator) image on Kind")
71+
err = utils.LoadImageToKindClusterWithName(projectimage)
72+
ExpectWithOffset(1, err).NotTo(HaveOccurred())
73+
74+
By("installing CRDs")
75+
cmd = exec.Command("make", "install")
76+
_, err = utils.Run(cmd)
77+
78+
By("deploying the controller-manager")
79+
cmd = exec.Command("make", "deploy", fmt.Sprintf("IMG=%s", projectimage))
80+
_, err = utils.Run(cmd)
81+
ExpectWithOffset(1, err).NotTo(HaveOccurred())
82+
83+
By("validating that the controller-manager pod is running as expected")
84+
verifyControllerUp := func() error {
85+
// Get pod name
86+
87+
cmd = exec.Command("kubectl", "get",
88+
"pods", "-l", "control-plane=controller-manager",
89+
"-o", "go-template={{ range .items }}"+
90+
"{{ if not .metadata.deletionTimestamp }}"+
91+
"{{ .metadata.name }}"+
92+
"{{ \"\\n\" }}{{ end }}{{ end }}",
93+
"-n", namespace,
94+
)
95+
96+
podOutput, err := utils.Run(cmd)
97+
ExpectWithOffset(2, err).NotTo(HaveOccurred())
98+
podNames := utils.GetNonEmptyLines(string(podOutput))
99+
if len(podNames) != 1 {
100+
return fmt.Errorf("expect 1 controller pods running, but got %d", len(podNames))
101+
}
102+
controllerPodName = podNames[0]
103+
ExpectWithOffset(2, controllerPodName).Should(ContainSubstring("controller-manager"))
104+
105+
// Validate pod status
106+
cmd = exec.Command("kubectl", "get",
107+
"pods", controllerPodName, "-o", "jsonpath={.status.phase}",
108+
"-n", namespace,
109+
)
110+
status, err := utils.Run(cmd)
111+
ExpectWithOffset(2, err).NotTo(HaveOccurred())
112+
if string(status) != "Running" {
113+
return fmt.Errorf("controller pod in %s status", status)
114+
}
115+
return nil
116+
}
117+
EventuallyWithOffset(1, verifyControllerUp, time.Minute, time.Second).Should(Succeed())
118+
119+
})
120+
})
121+
})

0 commit comments

Comments
 (0)