Skip to content

Commit 158f79d

Browse files
committed
This commit bumps cert-manager CR apiVersion to v1 from v1beta2
for go/v3-alpha. TestContext has been updated to be cluster version- aware such that the correct cert-manager bundle URL is applied. pkg/plugin/v3/scaffolds/internal/templates/config: cert-manager CRs have apiVersion v1 test/e2e/utils: KubectlVersion -> KubernetesVersion, which now gets created in NewTestContext. cert-manager install funcs use this version to get the correct bundle for a particular cluster version test/e2e/{v2,v3}: update {Install,Uninstall}CertManager() to include new 'hasv1beta2CRs' boolean arg, which depends on plugin being tested
1 parent cd3cb2a commit 158f79d

File tree

13 files changed

+120
-83
lines changed

13 files changed

+120
-83
lines changed

pkg/plugin/v3/scaffolds/internal/templates/config/certmanager/certificate.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,16 @@ func (f *Certificate) SetTemplateDefaults() error {
4242

4343
const certManagerTemplate = `# The following manifests contain a self-signed issuer CR and a certificate CR.
4444
# More document can be found at https://docs.cert-manager.io
45-
# WARNING: Targets CertManager 0.11 check https://docs.cert-manager.io/en/latest/tasks/upgrading/index.html for
46-
# breaking changes
47-
apiVersion: cert-manager.io/v1alpha2
45+
# WARNING: Targets CertManager v1.0. Check https://cert-manager.io/docs/installation/upgrading/ for breaking changes.
46+
apiVersion: cert-manager.io/v1
4847
kind: Issuer
4948
metadata:
5049
name: selfsigned-issuer
5150
namespace: system
5251
spec:
5352
selfSigned: {}
5453
---
55-
apiVersion: cert-manager.io/v1alpha2
54+
apiVersion: cert-manager.io/v1
5655
kind: Certificate
5756
metadata:
5857
name: serving-cert # this name should match the one appeared in kustomizeconfig.yaml

pkg/plugin/v3/scaffolds/internal/templates/config/kdefault/kustomization.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ vars:
9191
# objref:
9292
# kind: Certificate
9393
# group: cert-manager.io
94-
# version: v1alpha2
94+
# version: v1
9595
# name: serving-cert # this name should match the one in certificate.yaml
9696
# fieldref:
9797
# fieldpath: metadata.namespace
9898
#- name: CERTIFICATE_NAME
9999
# objref:
100100
# kind: Certificate
101101
# group: cert-manager.io
102-
# version: v1alpha2
102+
# version: v1
103103
# name: serving-cert # this name should match the one in certificate.yaml
104104
#- name: SERVICE_NAMESPACE # namespace of the service
105105
# objref:

test/e2e/utils/kubectl.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,13 @@ func (vi *VersionInfo) parseVersionInts() (err error) {
120120
return nil
121121
}
122122

123-
// KubectlVersion holds a subset of both client and server versions.
124-
type KubectlVersion struct {
123+
// KubernetesVersion holds a subset of both client and server versions.
124+
type KubernetesVersion struct {
125125
ClientVersion VersionInfo `json:"clientVersion,omitempty"`
126126
ServerVersion VersionInfo `json:"serverVersion,omitempty"`
127127
}
128128

129-
func (v *KubectlVersion) prepare() (err error) {
129+
func (v *KubernetesVersion) prepare() (err error) {
130130
if err = v.ClientVersion.parseVersionInts(); err != nil {
131131
return err
132132
}
@@ -137,16 +137,16 @@ func (v *KubectlVersion) prepare() (err error) {
137137
}
138138

139139
// Version is a func to run kubectl version command
140-
func (k *Kubectl) Version() (ver KubectlVersion, err error) {
140+
func (k *Kubectl) Version() (ver KubernetesVersion, err error) {
141141
var out string
142142
if out, err = k.Command("version", "-o", "json"); err != nil {
143-
return KubectlVersion{}, err
143+
return KubernetesVersion{}, err
144144
}
145145
if err = json.Unmarshal([]byte(out), &ver); err != nil {
146-
return KubectlVersion{}, err
146+
return KubernetesVersion{}, err
147147
}
148148
if err = ver.prepare(); err != nil {
149-
return KubectlVersion{}, err
149+
return KubernetesVersion{}, err
150150
}
151151
return ver, nil
152152
}

test/e2e/utils/test_context.go

+63-34
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,6 @@ import (
2727
. "github.com/onsi/ginkgo" //nolint:golint
2828
)
2929

30-
const certmanagerVersion = "v0.11.0"
31-
const prometheusOperatorVersion = "0.33"
32-
const certmanagerURL = "https://github.com/jetstack/cert-manager/releases/download/%s/cert-manager.yaml"
33-
const prometheusOperatorURL = "https://raw.githubusercontent.com/coreos/prometheus-operator/release-%s/bundle.yaml"
34-
3530
// TestContext specified to run e2e tests
3631
type TestContext struct {
3732
*CmdContext
@@ -42,8 +37,9 @@ type TestContext struct {
4237
Kind string
4338
Resources string
4439
ImageName string
45-
Kubectl *Kubectl
4640
BinaryName string
41+
Kubectl *Kubectl
42+
K8sVersion *KubernetesVersion
4743
}
4844

4945
// NewTestContext init with a random suffix for test TestContext stuff,
@@ -54,30 +50,36 @@ func NewTestContext(binaryName string, env ...string) (*TestContext, error) {
5450
return nil, err
5551
}
5652

57-
testGroup := "bar" + testSuffix
58-
path, err := filepath.Abs("e2e-" + testSuffix)
53+
cc := &CmdContext{
54+
Env: env,
55+
}
56+
57+
// Use kubectl to get Kubernetes client and cluster version.
58+
kubectl := &Kubectl{
59+
Namespace: fmt.Sprintf("e2e-%s-system", testSuffix),
60+
CmdContext: cc,
61+
}
62+
k8sVersion, err := kubectl.Version()
5963
if err != nil {
6064
return nil, err
6165
}
6266

63-
cc := &CmdContext{
64-
Env: env,
65-
Dir: path,
67+
// Set CmdContext.Dir after running Kubectl.Version() because dir does not exist yet.
68+
if cc.Dir, err = filepath.Abs("e2e-" + testSuffix); err != nil {
69+
return nil, err
6670
}
6771

6872
return &TestContext{
6973
TestSuffix: testSuffix,
7074
Domain: "example.com" + testSuffix,
71-
Group: testGroup,
75+
Group: "bar" + testSuffix,
7276
Version: "v1alpha1",
7377
Kind: "Foo" + testSuffix,
7478
Resources: "foo" + testSuffix + "s",
7579
ImageName: "e2e-test/controller-manager:" + testSuffix,
7680
CmdContext: cc,
77-
Kubectl: &Kubectl{
78-
Namespace: fmt.Sprintf("e2e-%s-system", testSuffix),
79-
CmdContext: cc,
80-
},
81+
Kubectl: kubectl,
82+
K8sVersion: &k8sVersion,
8183
BinaryName: binaryName,
8284
}, nil
8385
}
@@ -98,12 +100,33 @@ func (t *TestContext) Prepare() error {
98100
return os.MkdirAll(t.Dir, 0755)
99101
}
100102

101-
// InstallCertManager installs the cert manager bundle.
102-
func (t *TestContext) InstallCertManager() error {
103-
if _, err := t.Kubectl.Command("create", "namespace", "cert-manager"); err != nil {
104-
return err
103+
const (
104+
certmanagerVersionWithv1beta2CRs = "v0.11.0"
105+
certmanagerVersion = "v1.0.4"
106+
107+
certmanagerURLTmplLegacy = "https://github.com/jetstack/cert-manager/releases/download/%s/cert-manager-legacy.yaml"
108+
certmanagerURLTmpl = "https://github.com/jetstack/cert-manager/releases/download/%s/cert-manager.yaml"
109+
)
110+
111+
// makeCertManagerURL returns a kubectl-able URL for the cert-manager bundle.
112+
func (t *TestContext) makeCertManagerURL(hasv1beta1CRs bool) string {
113+
// Return a URL for the manifest bundle with v1beta1 CRs.
114+
if hasv1beta1CRs {
115+
return fmt.Sprintf(certmanagerURLTmpl, certmanagerVersionWithv1beta2CRs)
116+
}
117+
118+
// Determine which URL to use for a manifest bundle with v1 CRs.
119+
// The most up-to-date bundle uses v1 CRDs, which were introduced in k8s v1.16.
120+
if ver := t.K8sVersion.ServerVersion; ver.GetMajorInt() <= 1 && ver.GetMinorInt() < 16 {
121+
return fmt.Sprintf(certmanagerURLTmplLegacy, certmanagerVersion)
105122
}
106-
url := fmt.Sprintf(certmanagerURL, certmanagerVersion)
123+
return fmt.Sprintf(certmanagerURLTmpl, certmanagerVersion)
124+
}
125+
126+
// InstallCertManager installs the cert manager bundle. If hasv1beta1CRs is true,
127+
// the legacy version (which uses v1alpha2 CRs) is installed.
128+
func (t *TestContext) InstallCertManager(hasv1beta1CRs bool) error {
129+
url := t.makeCertManagerURL(hasv1beta1CRs)
107130
if _, err := t.Kubectl.Apply(false, "-f", url, "--validate=false"); err != nil {
108131
return err
109132
}
@@ -117,6 +140,24 @@ func (t *TestContext) InstallCertManager() error {
117140
return err
118141
}
119142

143+
// UninstallCertManager uninstalls the cert manager bundle. If hasv1beta1CRs is true,
144+
// the legacy version (which uses v1alpha2 CRs) is installed.
145+
func (t *TestContext) UninstallCertManager(hasv1beta1CRs bool) {
146+
url := t.makeCertManagerURL(hasv1beta1CRs)
147+
if _, err := t.Kubectl.Delete(false, "-f", url); err != nil {
148+
fmt.Fprintf(GinkgoWriter,
149+
"warning: error when running kubectl delete during cleaning up cert manager: %v\n", err)
150+
}
151+
if _, err := t.Kubectl.Delete(false, "namespace", "cert-manager"); err != nil {
152+
fmt.Fprintf(GinkgoWriter, "warning: error when cleaning up the cert manager namespace: %v\n", err)
153+
}
154+
}
155+
156+
const (
157+
prometheusOperatorVersion = "0.33"
158+
prometheusOperatorURL = "https://raw.githubusercontent.com/coreos/prometheus-operator/release-%s/bundle.yaml"
159+
)
160+
120161
// InstallPrometheusOperManager installs the prometheus manager bundle.
121162
func (t *TestContext) InstallPrometheusOperManager() error {
122163
url := fmt.Sprintf(prometheusOperatorURL, prometheusOperatorVersion)
@@ -132,18 +173,6 @@ func (t *TestContext) UninstallPrometheusOperManager() {
132173
}
133174
}
134175

135-
// UninstallCertManager uninstalls the cert manager bundle.
136-
func (t *TestContext) UninstallCertManager() {
137-
url := fmt.Sprintf(certmanagerURL, certmanagerVersion)
138-
if _, err := t.Kubectl.Delete(false, "-f", url); err != nil {
139-
fmt.Fprintf(GinkgoWriter,
140-
"warning: error when running kubectl delete during cleaning up cert manager: %v\n", err)
141-
}
142-
if _, err := t.Kubectl.Delete(false, "namespace", "cert-manager"); err != nil {
143-
fmt.Fprintf(GinkgoWriter, "warning: error when cleaning up the cert manager namespace: %v\n", err)
144-
}
145-
}
146-
147176
// CleanupManifests is a helper func to run kustomize build and pipe the output to kubectl delete -f -
148177
func (t *TestContext) CleanupManifests(dir string) {
149178
cmd := exec.Command("kustomize", "build", dir)
@@ -231,7 +260,7 @@ func (cc *CmdContext) Run(cmd *exec.Cmd) ([]byte, error) {
231260
fmt.Fprintf(GinkgoWriter, "running: %s\n", command)
232261
output, err := cmd.CombinedOutput()
233262
if err != nil {
234-
return output, fmt.Errorf("%s failed with error: %s", command, string(output))
263+
return output, fmt.Errorf("%s failed with error: (%v) %s", command, err, string(output))
235264
}
236265

237266
return output, nil

test/e2e/v2/plugin_cluster_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ var _ = Describe("kubebuilder", func() {
3939
Expect(err).NotTo(HaveOccurred())
4040
Expect(kbc.Prepare()).To(Succeed())
4141

42+
// Install cert-manager with v1beta2 CRs.
4243
By("installing cert manager bundle")
43-
Expect(kbc.InstallCertManager()).To(Succeed())
44+
Expect(kbc.InstallCertManager(true)).To(Succeed())
4445

4546
By("installing prometheus operator")
4647
Expect(kbc.InstallPrometheusOperManager()).To(Succeed())
@@ -53,8 +54,9 @@ var _ = Describe("kubebuilder", func() {
5354
By("uninstalling prometheus manager bundle")
5455
kbc.UninstallPrometheusOperManager()
5556

57+
// Uninstall cert-manager with v1beta2 CRs.
5658
By("uninstalling cert manager bundle")
57-
kbc.UninstallCertManager()
59+
kbc.UninstallCertManager(true)
5860

5961
By("remove container image and work dir")
6062
kbc.Destroy()

test/e2e/v3/generate_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -211,15 +211,15 @@ Count int `+"`"+`json:"count,omitempty"`+"`"+`
211211
# objref:
212212
# kind: Certificate
213213
# group: cert-manager.io
214-
# version: v1alpha2
214+
# version: v1
215215
# name: serving-cert # this name should match the one in certificate.yaml
216216
# fieldref:
217217
# fieldpath: metadata.namespace
218218
#- name: CERTIFICATE_NAME
219219
# objref:
220220
# kind: Certificate
221221
# group: cert-manager.io
222-
# version: v1alpha2
222+
# version: v1
223223
# name: serving-cert # this name should match the one in certificate.yaml
224224
#- name: SERVICE_NAMESPACE # namespace of the service
225225
# objref:

test/e2e/v3/plugin_cluster_test.go

+24-14
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ import (
3333
var _ = Describe("kubebuilder", func() {
3434
Context("project version 3", func() {
3535
var (
36-
kbc *utils.TestContext
37-
k8sVer utils.KubectlVersion
36+
kbc *utils.TestContext
3837
)
3938

4039
BeforeEach(func() {
@@ -43,13 +42,6 @@ var _ = Describe("kubebuilder", func() {
4342
Expect(err).NotTo(HaveOccurred())
4443
Expect(kbc.Prepare()).To(Succeed())
4544

46-
// Get versions to determine which tests to skip.
47-
k8sVer, err = kbc.Kubectl.Version()
48-
Expect(err).NotTo(HaveOccurred())
49-
50-
By("installing the cert-manager bundle")
51-
Expect(kbc.InstallCertManager()).To(Succeed())
52-
5345
By("installing the Prometheus operator")
5446
Expect(kbc.InstallPrometheusOperManager()).To(Succeed())
5547
})
@@ -61,23 +53,41 @@ var _ = Describe("kubebuilder", func() {
6153
By("uninstalling the Prometheus manager bundle")
6254
kbc.UninstallPrometheusOperManager()
6355

64-
By("uninstalling the cert-manager bundle")
65-
kbc.UninstallCertManager()
66-
6756
By("removing controller image and working dir")
6857
kbc.Destroy()
6958
})
7059

7160
Context("plugin go.kubebuilder.io/v2", func() {
61+
// Use cert-manager with v1beta2 CRs.
62+
BeforeEach(func() {
63+
By("installing the v1beta2 cert-manager bundle")
64+
Expect(kbc.InstallCertManager(true)).To(Succeed())
65+
})
66+
AfterEach(func() {
67+
By("uninstalling the v1beta2 cert-manager bundle")
68+
kbc.UninstallCertManager(true)
69+
})
70+
7271
It("should generate a runnable project", func() {
7372
GenerateV2(kbc)
7473
Run(kbc)
7574
})
7675
})
76+
7777
Context("plugin go.kubebuilder.io/v3-alpha", func() {
78+
// Use cert-manager with v1 CRs.
79+
BeforeEach(func() {
80+
By("installing the cert-manager bundle")
81+
Expect(kbc.InstallCertManager(false)).To(Succeed())
82+
})
83+
AfterEach(func() {
84+
By("uninstalling the cert-manager bundle")
85+
kbc.UninstallCertManager(false)
86+
})
87+
7888
It("should generate a runnable project", func() {
7989
// Skip if cluster version < 1.16, when v1 CRDs and webhooks did not exist.
80-
if srvVer := k8sVer.ServerVersion; srvVer.GetMajorInt() <= 1 && srvVer.GetMinorInt() < 16 {
90+
if srvVer := kbc.K8sVersion.ServerVersion; srvVer.GetMajorInt() <= 1 && srvVer.GetMinorInt() < 16 {
8191
Skip(fmt.Sprintf("cluster version %s does not support v1 CRDs or webhooks", srvVer.GitVersion))
8292
}
8393

@@ -86,7 +96,7 @@ var _ = Describe("kubebuilder", func() {
8696
})
8797
It("should generate a runnable project with v1beta1 CRDs and Webhooks", func() {
8898
// Skip if cluster version < 1.15, when `.spec.preserveUnknownFields` was not a v1beta1 CRD field.
89-
if srvVer := k8sVer.ServerVersion; srvVer.GetMajorInt() <= 1 && srvVer.GetMinorInt() < 15 {
99+
if srvVer := kbc.K8sVersion.ServerVersion; srvVer.GetMajorInt() <= 1 && srvVer.GetMinorInt() < 15 {
90100
Skip(fmt.Sprintf("cluster version %s does not support project defaults", srvVer.GitVersion))
91101
}
92102

testdata/project-v3-addon/config/certmanager/certificate.yaml

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
# The following manifests contain a self-signed issuer CR and a certificate CR.
22
# More document can be found at https://docs.cert-manager.io
3-
# WARNING: Targets CertManager 0.11 check https://docs.cert-manager.io/en/latest/tasks/upgrading/index.html for
4-
# breaking changes
5-
apiVersion: cert-manager.io/v1alpha2
3+
# WARNING: Targets CertManager v1.0. Check https://cert-manager.io/docs/installation/upgrading/ for breaking changes.
4+
apiVersion: cert-manager.io/v1
65
kind: Issuer
76
metadata:
87
name: selfsigned-issuer
98
namespace: system
109
spec:
1110
selfSigned: {}
1211
---
13-
apiVersion: cert-manager.io/v1alpha2
12+
apiVersion: cert-manager.io/v1
1413
kind: Certificate
1514
metadata:
1615
name: serving-cert # this name should match the one appeared in kustomizeconfig.yaml

testdata/project-v3-addon/config/default/kustomization.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,15 @@ vars:
4646
# objref:
4747
# kind: Certificate
4848
# group: cert-manager.io
49-
# version: v1alpha2
49+
# version: v1
5050
# name: serving-cert # this name should match the one in certificate.yaml
5151
# fieldref:
5252
# fieldpath: metadata.namespace
5353
#- name: CERTIFICATE_NAME
5454
# objref:
5555
# kind: Certificate
5656
# group: cert-manager.io
57-
# version: v1alpha2
57+
# version: v1
5858
# name: serving-cert # this name should match the one in certificate.yaml
5959
#- name: SERVICE_NAMESPACE # namespace of the service
6060
# objref:

0 commit comments

Comments
 (0)