Skip to content

Commit 9ce6ff9

Browse files
committed
osde2e: migrate tests
move the tests from the centralized osde2e repo Signed-off-by: Brady Pratt <[email protected]>
1 parent 1c1eef0 commit 9ce6ff9

File tree

4 files changed

+158
-5
lines changed

4 files changed

+158
-5
lines changed

go.mod

+5-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ require (
2020
k8s.io/api v0.26.3
2121
k8s.io/apimachinery v0.26.3
2222
k8s.io/client-go v0.26.3
23-
sigs.k8s.io/controller-runtime v0.14.0
23+
sigs.k8s.io/controller-runtime v0.14.5
24+
sigs.k8s.io/e2e-framework v0.2.0
2425
)
2526

2627
require (
@@ -79,6 +80,7 @@ require (
7980
github.com/mitchellh/mapstructure v1.5.0 // indirect
8081
github.com/mitchellh/reflectwalk v1.0.2 // indirect
8182
github.com/moby/locker v1.0.1 // indirect
83+
github.com/moby/spdystream v0.2.0 // indirect
8284
github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect
8385
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
8486
github.com/modern-go/reflect2 v1.0.2 // indirect
@@ -138,3 +140,5 @@ require (
138140
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
139141
sigs.k8s.io/yaml v1.3.0 // indirect
140142
)
143+
144+
replace github.com/openshift/api => github.com/openshift/api v0.0.0-20230327113148-36ce464529eb

go.sum

+12-4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/O
5555
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
5656
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
5757
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
58+
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
5859
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
5960
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
6061
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -109,6 +110,7 @@ github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw
109110
github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
110111
github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4=
111112
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
113+
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc=
112114
github.com/emicklei/go-restful/v3 v3.10.1 h1:rc42Y5YTp7Am7CS630D7JmhRjq4UlEUuEKfrDac4bSQ=
113115
github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
114116
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@@ -237,6 +239,7 @@ github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8
237239
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
238240
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
239241
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
242+
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
240243
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
241244
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
242245
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
@@ -303,6 +306,8 @@ github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zx
303306
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
304307
github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg=
305308
github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
309+
github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8=
310+
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
306311
github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9ObI=
307312
github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA=
308313
github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
@@ -329,8 +334,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
329334
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
330335
github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034=
331336
github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ=
332-
github.com/openshift/api v3.9.0+incompatible h1:fJ/KsefYuZAjmrr3+5U9yZIZbTOpVkDDLDLFresAeYs=
333-
github.com/openshift/api v3.9.0+incompatible/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY=
337+
github.com/openshift/api v0.0.0-20230327113148-36ce464529eb h1:nJp2JVf8FsNUbdZ1QjLgmWCdvqRaLNE8dYb5WFQJ3jA=
338+
github.com/openshift/api v0.0.0-20230327113148-36ce464529eb/go.mod h1:ctXNyWanKEjGj8sss1KjjHQ3ENKFm33FFnS5BKaIPh4=
334339
github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU=
335340
github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek=
336341
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
@@ -405,6 +410,7 @@ github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ
405410
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
406411
github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8=
407412
github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0=
413+
github.com/vladimirvivien/gexe v0.2.0 h1:nbdAQ6vbZ+ZNsolCgSVb9Fno60kzSuvtzVh6Ytqi/xY=
408414
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
409415
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
410416
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
@@ -848,8 +854,10 @@ oras.land/oras-go v1.2.2/go.mod h1:Apa81sKoZPpP7CDciE006tSZ0x3Q3+dOoBcMZ/aNxvw=
848854
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
849855
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
850856
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
851-
sigs.k8s.io/controller-runtime v0.14.0 h1:ju2xsov5Ara6FoQuddg+az+rAxsUsTYn2IYyEKCTyDc=
852-
sigs.k8s.io/controller-runtime v0.14.0/go.mod h1:GaRkrY8a7UZF0kqFFbUKG7n9ICiTY5T55P1RiE3UZlU=
857+
sigs.k8s.io/controller-runtime v0.14.5 h1:6xaWFqzT5KuAQ9ufgUaj1G/+C4Y1GRkhrxl+BJ9i+5s=
858+
sigs.k8s.io/controller-runtime v0.14.5/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0=
859+
sigs.k8s.io/e2e-framework v0.2.0 h1:gD6AWWAHFcHibI69E9TgkNFhh0mVwWtRCHy2RU057jQ=
860+
sigs.k8s.io/e2e-framework v0.2.0/go.mod h1:E6JXj/V4PIlb95jsn2WrNKG+Shb45xaaI7C0+BH4PL8=
853861
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
854862
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
855863
sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM=

osde2e/Dockerfile

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
# THIS FILE IS GENERATED BY BOILERPLATE. DO NOT EDIT.
3+
FROM registry.ci.openshift.org/openshift/release:golang-1.18 AS builder
4+
5+
ENV PKG=/go/src/github.com/openshift/deployment-validation-operator/
6+
WORKDIR ${PKG}
7+
COPY . .
8+
9+
FROM registry.access.redhat.com/ubi8/ubi-minimal:latest
10+
11+
COPY ./harness.test harness.test
12+
13+
ENTRYPOINT [ "/harness.test" ]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package osde2etests
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"strings"
7+
"time"
8+
9+
"github.com/onsi/ginkgo/v2"
10+
. "github.com/onsi/gomega" //nolint:golint
11+
appsv1 "k8s.io/api/apps/v1"
12+
v1 "k8s.io/api/core/v1"
13+
rbacv1 "k8s.io/api/rbac/v1"
14+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
15+
apimachinerylabels "k8s.io/apimachinery/pkg/labels"
16+
"k8s.io/client-go/kubernetes"
17+
"sigs.k8s.io/controller-runtime/pkg/client/config"
18+
"sigs.k8s.io/e2e-framework/klient/k8s/resources"
19+
"sigs.k8s.io/e2e-framework/klient/wait"
20+
"sigs.k8s.io/e2e-framework/klient/wait/conditions"
21+
)
22+
23+
var _ = ginkgo.Describe("DVO", ginkgo.Ordered, func() {
24+
const (
25+
namespaceName = "openshift-deployment-validation-operator"
26+
deploymentName = "deployment-validation-operator"
27+
)
28+
29+
var k8s *resources.Resources
30+
31+
ginkgo.BeforeAll(func() {
32+
// setup the k8s client
33+
cfg, err := config.GetConfig()
34+
Expect(err).Should(BeNil(), "failed to get kubeconfig")
35+
k8s, err = resources.New(cfg)
36+
Expect(err).Should(BeNil(), "resources.New error")
37+
})
38+
39+
ginkgo.It("exists and is running", func(ctx context.Context) {
40+
const serviceName = "deployment-validation-operator-metrics"
41+
clusterRoles := []string{
42+
"deployment-validation-operator-og-admin",
43+
"deployment-validation-operator-og-edit",
44+
"deployment-validation-operator-og-view",
45+
}
46+
47+
err := k8s.Get(ctx, namespaceName, namespaceName, &v1.Namespace{})
48+
Expect(err).Should(BeNil(), "unable to get namespace %s", namespaceName)
49+
50+
err = k8s.Get(ctx, serviceName, namespaceName, &v1.Service{})
51+
Expect(err).Should(BeNil(), "unable to get service %s", serviceName)
52+
53+
for _, clusterRoleName := range clusterRoles {
54+
err = k8s.Get(ctx, clusterRoleName, "", &rbacv1.ClusterRole{})
55+
Expect(err).Should(BeNil(), "unable to get clusterrole %s", clusterRoleName)
56+
}
57+
58+
deployment := &appsv1.Deployment{
59+
ObjectMeta: metav1.ObjectMeta{Name: deploymentName, Namespace: namespaceName},
60+
}
61+
deploymentAvailable := conditions.New(k8s).
62+
DeploymentConditionMatch(deployment, appsv1.DeploymentAvailable, v1.ConditionTrue)
63+
err = wait.For(deploymentAvailable, wait.WithTimeout(10*time.Second))
64+
Expect(err).Should(BeNil(), "deployment %s never became available", deploymentName)
65+
})
66+
67+
ginkgo.Context("validates", func() {
68+
ginkgo.BeforeEach(func(ctx context.Context) {
69+
labels := map[string]string{"app": "test"}
70+
deployment := &appsv1.Deployment{
71+
ObjectMeta: metav1.ObjectMeta{GenerateName: "osde2e-", Namespace: "default"},
72+
Spec: appsv1.DeploymentSpec{
73+
Selector: &metav1.LabelSelector{MatchLabels: labels},
74+
Template: v1.PodTemplateSpec{
75+
ObjectMeta: metav1.ObjectMeta{Labels: labels},
76+
Spec: v1.PodSpec{
77+
Containers: []v1.Container{
78+
{Name: "pause", Image: "registry.k8s.io/pause:latest"},
79+
},
80+
},
81+
},
82+
},
83+
}
84+
err := k8s.Create(ctx, deployment)
85+
Expect(err).Should(BeNil(), "unable to create deployment %s", deployment.GetName())
86+
deploymentAvailable := conditions.New(k8s).
87+
DeploymentConditionMatch(deployment, appsv1.DeploymentAvailable, v1.ConditionTrue)
88+
err = wait.For(deploymentAvailable)
89+
Expect(err).Should(BeNil(), "deployment %s never became available", deployment.GetName())
90+
91+
ginkgo.DeferCleanup(k8s.Delete, deployment)
92+
})
93+
94+
ginkgo.It("new deployments", func(ctx context.Context) {
95+
//nolint:lll
96+
validationMsg := fmt.Sprintf("\"msg\":\"Set memory requests and limits for your container based on its requirements. Refer to https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#requests-and-limits for details.\",\"request.namespace\":\"default\"")
97+
98+
// Wait for the deployment logs to contain the validation message
99+
err := wait.For(func() (bool, error) {
100+
pods := &v1.PodList{}
101+
lbls := apimachinerylabels.FormatLabels(map[string]string{"app": deploymentName})
102+
err := k8s.List(ctx, pods, resources.WithLabelSelector(lbls))
103+
if err != nil {
104+
return false, err
105+
}
106+
107+
if len(pods.Items) < 1 {
108+
return false, fmt.Errorf("unable to find pod for deployment %s", deploymentName)
109+
}
110+
111+
clientset, err := kubernetes.NewForConfig(k8s.GetConfig())
112+
if err != nil {
113+
return false, err
114+
}
115+
116+
req := clientset.CoreV1().Pods(namespaceName).
117+
GetLogs(pods.Items[0].GetName(), &v1.PodLogOptions{})
118+
logs, err := req.DoRaw(ctx)
119+
if err != nil {
120+
return false, err
121+
}
122+
123+
return strings.Contains(string(logs), validationMsg), nil
124+
}, wait.WithTimeout(10*time.Minute))
125+
Expect(err).Should(BeNil(), "failed waiting for validation message")
126+
})
127+
})
128+
})

0 commit comments

Comments
 (0)