Skip to content

Commit d0a62c0

Browse files
committed
Add ginkgo e2e tests
1 parent e44ccea commit d0a62c0

File tree

7 files changed

+168
-30
lines changed

7 files changed

+168
-30
lines changed

go.mod

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,12 @@ require (
4343
github.com/patrickmn/go-cache v2.1.0+incompatible
4444
github.com/stretchr/testify v1.10.0
4545
sigs.k8s.io/controller-runtime v0.20.4
46+
github.com/onsi/ginkgo/v2 v2.19.0
47+
github.com/onsi/gomega v1.33.1
4648
)
4749

50+
require github.com/itchyny/timefmt-go v0.1.6 // indirect
51+
4852
require (
4953
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
5054
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
@@ -79,17 +83,21 @@ require (
7983
github.com/go-openapi/jsonpointer v0.21.1 // indirect
8084
github.com/go-openapi/jsonreference v0.21.0 // indirect
8185
github.com/go-openapi/swag v0.23.1 // indirect
86+
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
8287
github.com/gogo/protobuf v1.3.2 // indirect
8388
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
8489
github.com/golang/protobuf v1.5.4 // indirect
8590
github.com/google/btree v1.1.3 // indirect
8691
github.com/google/gnostic-models v0.6.9 // indirect
8792
github.com/google/go-querystring v1.1.0 // indirect
8893
github.com/google/gofuzz v1.2.0 // indirect
94+
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect
8995
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
9096
github.com/google/uuid v1.6.0 // indirect
9197
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect
9298
github.com/inconshreveable/mousetrap v1.1.0 // indirect
99+
github.com/itchyny/gojq v0.12.16
100+
github.com/jmespath/go-jmespath v0.4.0 // indirect
93101
github.com/josharian/intern v1.0.0 // indirect
94102
github.com/json-iterator/go v1.1.12 // indirect
95103
github.com/klauspost/compress v1.18.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,10 @@ github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISH
148148
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
149149
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
150150
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
151+
github.com/itchyny/gojq v0.12.16 h1:yLfgLxhIr/6sJNVmYfQjTIv0jGctu6/DgDoivmxTr7g=
152+
github.com/itchyny/gojq v0.12.16/go.mod h1:6abHbdC2uB9ogMS38XsErnfqJ94UlngIJGlRAIj4jTM=
153+
github.com/itchyny/timefmt-go v0.1.6 h1:ia3s54iciXDdzWzwaVKXZPbiXzxxnv1SPGFfM/myJ5Q=
154+
github.com/itchyny/timefmt-go v0.1.6/go.mod h1:RRDZYC5s9ErkjQvTvvU7keJjxUYzIISJGxm9/mAERQg=
151155
github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
152156
github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
153157
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=

make/test-e2e.mk

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,6 @@ e2e-setup-docker-registry: | kind-cluster $(NEEDS_HELM) $(NEEDS_KUBECTL)
2525
-f ./make/config/registry/docker-registry-values.yaml \
2626
docker-registry twuni/docker-registry >/dev/null
2727

28-
.PHONY: install-harbor
29-
e2e-setup-harbor: | kind-cluster $(NEEDS_HELM) $(NEEDS_KUBECTL)
30-
$(HELM) repo add harbor https://helm.goharbor.io
31-
$(HELM) upgrade \
32-
--install \
33-
--create-namespace \
34-
-n harbor \
35-
--wait \
36-
--set expose.type=nodePort \
37-
--set expose.tls.enabled=false \
38-
--set trivy.enabled=false \
39-
--set registry.credentials.username="user" \
40-
--set registry.credentials.password="password" \
41-
--set expose.nodePort.ports.http.nodePort=30443 \
42-
harbor harbor/harbor >/dev/null
43-
4428

4529
INSTALL_OPTIONS += --set image.repository=$(oci_manager_image_name_development)
4630
INSTALL_OPTIONS += -f ./make/config/version-checker-values.yaml
@@ -75,16 +59,8 @@ test-e2e-deps: install
7559
.PHONY: test-e2e
7660
## e2e end-to-end tests
7761
## @category Testing
78-
test-e2e: test-e2e-deps | kind-cluster #$(NEEDS_GINKGO) $(NEEDS_KUBECTL)
79-
# $(GINKGO) \
80-
# --output-dir=$(ARTIFACTS) \
81-
# --focus="$(E2E_FOCUS)" \
82-
# --junit-report=junit-go-e2e.xml \
83-
# $(EXTRA_GINKGO_FLAGS) \
84-
# ./test/e2e/ \
85-
# -ldflags $(go_manager_ldflags) \
86-
# -- \
87-
# --istioctl-path $(CURDIR)/$(bin_dir)/scratch/istioctl-$(ISTIO_VERSION) \
88-
# --kubeconfig-path $(CURDIR)/$(kind_kubeconfig) \
89-
# --kubectl-path $(KUBECTL) \
90-
# --runtime-issuance-config-map-name=$(E2E_RUNTIME_CONFIG_MAP_NAME)
62+
test-e2e: test-e2e-deps | kind-cluster $(NEEDS_GINKGO) $(NEEDS_KUBECTL)
63+
$(GINKGO) \
64+
-v \
65+
--no-color \
66+
./test/e2e/

pkg/client/selfhosted/selfhosted.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,17 @@ func (c *Client) doRequest(ctx context.Context, url, header string, obj interfac
232232
req = req.WithContext(ctx)
233233
if len(c.Bearer) > 0 {
234234
req.Header.Add("Authorization", "Bearer "+c.Bearer)
235+
<<<<<<< HEAD
235236
} else if c.Username != "" && c.Password != "" {
237+
=======
238+
} else if len(c.Username) > 0 && len(c.Password) > 0 {
239+
>>>>>>> 8e64777... Add ginkgo e2e tests
236240
req.SetBasicAuth(c.Username, c.Password)
237241
}
238242

239243
if len(header) > 0 {
240244
req.Header.Set("Accept", header)
241-
req.Header.Set("Accept", ociV1Header)
245+
req.Header.Add("Accept", ociV1Header)
242246
}
243247

244248
resp, err := c.Do(req)

test/e2e/e2e_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package e2e
2+
3+
import (
4+
"testing"
5+
6+
. "github.com/onsi/ginkgo/v2"
7+
. "github.com/onsi/gomega"
8+
9+
_ "github.com/jetstack/version-checker/test/e2e/suite"
10+
)
11+
12+
func TestVersionChecker(t *testing.T) {
13+
RegisterFailHandler(Fail)
14+
RunSpecs(t, "VersionChecker Suite")
15+
}

test/e2e/manifests/prom2json.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: batch/v1
2+
kind: Job
3+
metadata:
4+
name: prom2json
5+
spec:
6+
template:
7+
spec:
8+
containers:
9+
- command:
10+
- prom2json
11+
- http://version-checker.version-checker:8080/metrics
12+
image: prom/prom2json
13+
name: prom2json
14+
restartPolicy: Never

test/e2e/suite/version_checker.go

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package suite
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"log"
7+
"os/exec"
8+
9+
. "github.com/onsi/ginkgo/v2"
10+
. "github.com/onsi/gomega"
11+
12+
"github.com/itchyny/gojq"
13+
)
14+
15+
var _ = Describe("version-checker", func() {
16+
BeforeEach(func() {
17+
cmd := exec.Command("kubectl", "apply", "-f", "./manifests/prom2json.yaml")
18+
cmd.Stdout = GinkgoWriter
19+
cmd.Stderr = GinkgoWriter
20+
Expect(cmd.Run()).NotTo(HaveOccurred())
21+
cmd = exec.Command("kubectl", "wait", "--for=condition=Complete", "job", "-ljob-name=prom2json")
22+
cmd.Stdout = GinkgoWriter
23+
cmd.Stderr = GinkgoWriter
24+
Expect(cmd.Run()).NotTo(HaveOccurred())
25+
})
26+
AfterEach(func() {
27+
cmd := exec.Command("kubectl", "delete", "-f", "./manifests/prom2json.yaml")
28+
cmd.Stdout = GinkgoWriter
29+
cmd.Stderr = GinkgoWriter
30+
Expect(cmd.Run()).NotTo(HaveOccurred())
31+
})
32+
33+
When("a Pod is deployed", func() {
34+
BeforeEach(func() {
35+
cmd := exec.Command("kubectl", "apply", "-f", "./manifests/image-from-reg.yaml")
36+
cmd.Stdout = GinkgoWriter
37+
cmd.Stderr = GinkgoWriter
38+
Expect(cmd.Run()).NotTo(HaveOccurred())
39+
})
40+
AfterEach(func() {
41+
cmd := exec.Command("kubectl", "delete", "-f", "./manifests/image-from-reg.yaml")
42+
cmd.Stdout = GinkgoWriter
43+
cmd.Stderr = GinkgoWriter
44+
Expect(cmd.Run()).NotTo(HaveOccurred())
45+
})
46+
})
47+
48+
It("it should get the current version", func() {
49+
buf := new(bytes.Buffer)
50+
cmd := exec.Command("kubectl", "logs", "-ljob-name=prom2json")
51+
cmd.Stdout = buf
52+
cmd.Stderr = GinkgoWriter
53+
Expect(cmd.Run()).NotTo(HaveOccurred())
54+
55+
//k logs -ljob-name=prom2json | jq '.[]|select(.name=="version_checker_is_latest_version")| .metrics[] | select(.labels.image=="docker-registry.registry.svc.cluster.local:5000/my-app") | .labels.current_version'
56+
//k logs -ljob-name=prom2json | jq '.[]|select(.name=="version_checker_is_latest_version")| .metrics[] | select(.labels.image=="docker-registry.registry.svc.cluster.local:5000/my-app") | .labels.latest_version'
57+
//k logs -ljob-name=prom2json | jq '.[]|select(.name=="version_checker_is_latest_version")| .metrics[] | select(.labels.image=="docker-registry.registry.svc.cluster.local:5000/my-app") | .value'
58+
query, err := gojq.Parse(".[]|select(.name==\"version_checker_is_latest_version\")| .metrics[] | select(.labels.image==\"docker-registry.registry.svc.cluster.local:5000/my-app\") | .labels.current_version")
59+
if err != nil {
60+
log.Fatalln(err)
61+
}
62+
var result []interface{}
63+
err = json.Unmarshal(buf.Bytes(), &result)
64+
if err != nil {
65+
log.Fatalln(err)
66+
}
67+
iter := query.Run(result)
68+
for {
69+
v, ok := iter.Next()
70+
if !ok {
71+
break
72+
}
73+
if err, ok := v.(error); ok {
74+
if err, ok := err.(*gojq.HaltError); ok && err.Value() == nil {
75+
break
76+
}
77+
log.Fatalln(err)
78+
}
79+
Expect(v).To(Equal("0.0.1"))
80+
}
81+
})
82+
83+
It("it should find a newer version", func() {
84+
buf := new(bytes.Buffer)
85+
cmd := exec.Command("kubectl", "logs", "-ljob-name=prom2json")
86+
cmd.Stdout = buf
87+
cmd.Stderr = GinkgoWriter
88+
Expect(cmd.Run()).NotTo(HaveOccurred())
89+
90+
//k logs -ljob-name=prom2json | jq '.[]|select(.name=="version_checker_is_latest_version")| .metrics[] | select(.labels.image=="docker-registry.registry.svc.cluster.local:5000/my-app") | .labels.current_version'
91+
//k logs -ljob-name=prom2json | jq '.[]|select(.name=="version_checker_is_latest_version")| .metrics[] | select(.labels.image=="docker-registry.registry.svc.cluster.local:5000/my-app") | .labels.latest_version'
92+
//k logs -ljob-name=prom2json | jq '.[]|select(.name=="version_checker_is_latest_version")| .metrics[] | select(.labels.image=="docker-registry.registry.svc.cluster.local:5000/my-app") | .value'
93+
query, err := gojq.Parse(".[]|select(.name==\"version_checker_is_latest_version\")| .metrics[] | select(.labels.image==\"docker-registry.registry.svc.cluster.local:5000/my-app\") | .labels.latest_version")
94+
if err != nil {
95+
log.Fatalln(err)
96+
}
97+
var result []interface{}
98+
err = json.Unmarshal(buf.Bytes(), &result)
99+
if err != nil {
100+
log.Fatalln(err)
101+
}
102+
iter := query.Run(result)
103+
for {
104+
v, ok := iter.Next()
105+
if !ok {
106+
break
107+
}
108+
if err, ok := v.(error); ok {
109+
if err, ok := err.(*gojq.HaltError); ok && err.Value() == nil {
110+
break
111+
}
112+
log.Fatalln(err)
113+
}
114+
Expect(v).To(Equal("0.0.2"))
115+
}
116+
})
117+
})

0 commit comments

Comments
 (0)