Adds integration test for new metrics controller

Signed-off-by: JoshVanL <vleeuwenjoshua@gmail.com>
This commit is contained in:
JoshVanL 2020-05-18 17:45:12 +01:00
parent 8214cb4b70
commit e936d2242c
No known key found for this signature in database
GPG Key ID: E7A7196576A219DA
6 changed files with 201 additions and 5 deletions

View File

@ -4,6 +4,7 @@ go_test(
name = "go_default_test",
srcs = [
"issuing_controller_test.go",
"metrics_controller_test.go",
"trigger_controller_test.go",
],
deps = [
@ -14,7 +15,9 @@ go_test(
"//pkg/controller/expcertificates/issuing:go_default_library",
"//pkg/controller/expcertificates/trigger:go_default_library",
"//pkg/controller/expcertificates/trigger/policies:go_default_library",
"//pkg/controller/metrics:go_default_library",
"//pkg/logs:go_default_library",
"//pkg/metrics:go_default_library",
"//pkg/util/pki:go_default_library",
"//test/integration/framework:go_default_library",
"//test/unit/gen:go_default_library",

View File

@ -35,6 +35,7 @@ import (
controllerpkg "github.com/jetstack/cert-manager/pkg/controller"
"github.com/jetstack/cert-manager/pkg/controller/expcertificates/issuing"
logf "github.com/jetstack/cert-manager/pkg/logs"
"github.com/jetstack/cert-manager/pkg/metrics"
utilpki "github.com/jetstack/cert-manager/pkg/util/pki"
"github.com/jetstack/cert-manager/test/integration/framework"
"github.com/jetstack/cert-manager/test/unit/gen"
@ -55,9 +56,14 @@ func TestIssuingController(t *testing.T) {
EnableOwnerRef: true,
}
ctx, cancel := context.WithTimeout(context.TODO(), time.Second*20)
defer cancel()
ctrl, queue, mustSync := issuing.NewController(logf.Log, kubeClient, cmCl, factory, cmFactory, framework.NewEventRecorder(t), clock.RealClock{}, controllerOptions)
c := controllerpkg.NewController(
context.Background(),
"issuing_test",
metrics.New(logf.Log),
ctrl.ProcessItem,
mustSync,
nil,
@ -66,9 +72,6 @@ func TestIssuingController(t *testing.T) {
stopController := framework.StartInformersAndController(t, factory, cmFactory, c)
defer stopController()
ctx, cancel := context.WithTimeout(context.TODO(), time.Second*20)
defer cancel()
var (
crtName = "testcrt"
revision = 1

View File

@ -0,0 +1,174 @@
/*
Copyright 2020 The Jetstack cert-manager contributors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package certificates
import (
"context"
"fmt"
"io/ioutil"
"net/http"
"strings"
"testing"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
cmapi "github.com/jetstack/cert-manager/pkg/apis/certmanager/v1alpha2"
cmmeta "github.com/jetstack/cert-manager/pkg/apis/meta/v1"
controllerpkg "github.com/jetstack/cert-manager/pkg/controller"
controllermetrics "github.com/jetstack/cert-manager/pkg/controller/metrics"
logf "github.com/jetstack/cert-manager/pkg/logs"
"github.com/jetstack/cert-manager/pkg/metrics"
"github.com/jetstack/cert-manager/test/integration/framework"
"github.com/jetstack/cert-manager/test/unit/gen"
)
// TestMetricscontoller performs a basic test to ensure that Certificates
// metrics are exposed when a Certificate is created, updated, and removed when
// it is deleted.
func TestMetricsController(t *testing.T) {
config, stopFn := framework.RunControlPlane(t)
defer stopFn()
// Build, instantiate and run the issuing controller.
_, factory, cmClient, cmFactory := framework.NewClients(t, config)
ctx, cancel := context.WithTimeout(context.TODO(), time.Second*20)
defer cancel()
metricsHandler := metrics.New(logf.Log)
go metricsHandler.Start(make(chan struct{}))
time.Sleep(time.Second)
ctrl, queue, mustSync := controllermetrics.NewController(factory, cmFactory, metricsHandler)
c := controllerpkg.NewController(
context.Background(),
"metrics_test",
metricsHandler,
ctrl.ProcessItem,
mustSync,
nil,
queue,
)
stopController := framework.StartInformersAndController(t, factory, cmFactory, c)
defer stopController()
var (
crtName = "testcrt"
namespace = "testns"
lastErr error
)
testMetrics := func(expectedOutput string) error {
resp, err := http.DefaultClient.Get("http://127.0.0.1:9402/metrics")
if err != nil {
return err
}
output, err := ioutil.ReadAll(resp.Body)
if err != nil {
return err
}
if strings.TrimSpace(string(output)) != strings.TrimSpace(expectedOutput) {
return fmt.Errorf("got unexpected metrics output\nexp:\n%s\ngot:\n%s\n",
expectedOutput, output)
}
return nil
}
waitForMetrics := func(expectedOutput string) {
err := wait.Poll(time.Millisecond*100, time.Second*5, func() (done bool, err error) {
if err := testMetrics(expectedOutput); err != nil {
lastErr = err
return false, nil
}
return true, nil
})
if err != nil {
t.Fatalf("%s: failed to wait for expected metrics to be exposed: %s", err, lastErr)
}
}
// Should expose no metrics
// Create Certificate
crt := gen.Certificate(crtName,
gen.SetCertificateNamespace(namespace),
gen.SetCertificateUID("uid-1"),
)
waitForMetrics("")
crt, err := cmClient.CertmanagerV1alpha2().Certificates(namespace).Create(ctx, crt, metav1.CreateOptions{})
if err != nil {
t.Fatal(err)
}
waitForMetrics(`# HELP certmanager_certificate_expiration_timestamp_seconds The date after which the certificate expires. Expressed as a Unix Epoch Time.
# TYPE certmanager_certificate_expiration_timestamp_seconds gauge
certmanager_certificate_expiration_timestamp_seconds{name="testcrt",namespace="testns"} 0
# HELP certmanager_certificate_ready_status The ready status of the certificate.
# TYPE certmanager_certificate_ready_status gauge
certmanager_certificate_ready_status{condition="False",name="testcrt",namespace="testns"} 0
certmanager_certificate_ready_status{condition="True",name="testcrt",namespace="testns"} 0
certmanager_certificate_ready_status{condition="Unknown",name="testcrt",namespace="testns"} 1
# HELP certmanager_controller_sync_call_count The number of sync() calls made by a controller.
# TYPE certmanager_controller_sync_call_count counter
certmanager_controller_sync_call_count{controller="metrics_test"} 1
`)
// Set Certificate Expiry and Ready status True
crt.Status.NotAfter = &metav1.Time{
Time: time.Unix(100, 0),
}
crt.Status.Conditions = []cmapi.CertificateCondition{
{
Type: cmapi.CertificateConditionReady,
Status: cmmeta.ConditionTrue,
},
}
_, err = cmClient.CertmanagerV1alpha2().Certificates(namespace).UpdateStatus(ctx, crt, metav1.UpdateOptions{})
if err != nil {
t.Fatal(err)
}
waitForMetrics(`# HELP certmanager_certificate_expiration_timestamp_seconds The date after which the certificate expires. Expressed as a Unix Epoch Time.
# TYPE certmanager_certificate_expiration_timestamp_seconds gauge
certmanager_certificate_expiration_timestamp_seconds{name="testcrt",namespace="testns"} 100
# HELP certmanager_certificate_ready_status The ready status of the certificate.
# TYPE certmanager_certificate_ready_status gauge
certmanager_certificate_ready_status{condition="False",name="testcrt",namespace="testns"} 0
certmanager_certificate_ready_status{condition="True",name="testcrt",namespace="testns"} 1
certmanager_certificate_ready_status{condition="Unknown",name="testcrt",namespace="testns"} 0
# HELP certmanager_controller_sync_call_count The number of sync() calls made by a controller.
# TYPE certmanager_controller_sync_call_count counter
certmanager_controller_sync_call_count{controller="metrics_test"} 2
`)
err = cmClient.CertmanagerV1alpha2().Certificates(namespace).Delete(ctx, crt.Name, metav1.DeleteOptions{})
if err != nil {
t.Fatal(err)
}
waitForMetrics(`# HELP certmanager_controller_sync_call_count The number of sync() calls made by a controller.
# TYPE certmanager_controller_sync_call_count counter
certmanager_controller_sync_call_count{controller="metrics_test"} 3
`)
}

View File

@ -32,6 +32,7 @@ import (
"github.com/jetstack/cert-manager/pkg/controller/expcertificates/trigger"
"github.com/jetstack/cert-manager/pkg/controller/expcertificates/trigger/policies"
logf "github.com/jetstack/cert-manager/pkg/logs"
"github.com/jetstack/cert-manager/pkg/metrics"
"github.com/jetstack/cert-manager/test/integration/framework"
)
@ -44,11 +45,16 @@ func TestTriggerController(t *testing.T) {
config, stopFn := framework.RunControlPlane(t)
defer stopFn()
ctx, cancel := context.WithTimeout(context.TODO(), time.Second*20)
defer cancel()
// Build, instantiate and run the trigger controller.
_, factory, cmCl, cmFactory := framework.NewClients(t, config)
ctrl, queue, mustSync := trigger.NewController(logf.Log, cmCl, factory, cmFactory, framework.NewEventRecorder(t), clock.RealClock{}, policies.TriggerPolicyChain)
c := controllerpkg.NewController(
context.Background(),
"trigger_test",
metrics.New(logf.Log),
ctrl.ProcessItem,
mustSync,
nil,
@ -57,7 +63,6 @@ func TestTriggerController(t *testing.T) {
stopController := framework.StartInformersAndController(t, factory, cmFactory, c)
defer stopController()
ctx := context.TODO()
// Create a Certificate resource and wait for it to have the 'Issuing' condition.
cert, err := cmCl.CertmanagerV1alpha2().Certificates("testns").Create(ctx, &cmapi.Certificate{
ObjectMeta: metav1.ObjectMeta{Name: "testcrt", Namespace: "testns"},
@ -71,7 +76,7 @@ func TestTriggerController(t *testing.T) {
t.Fatal(err)
}
wait.Poll(time.Millisecond*100, time.Second*5, func() (done bool, err error) {
err = wait.Poll(time.Millisecond*100, time.Second*5, func() (done bool, err error) {
c, err := cmCl.CertmanagerV1alpha2().Certificates(cert.Namespace).Get(ctx, cert.Name, metav1.GetOptions{})
if err != nil {
t.Logf("Failed to fetch Certificate resource, retrying: %v", err)
@ -86,4 +91,7 @@ func TestTriggerController(t *testing.T) {
}
return true, nil
})
if err != nil {
t.Fatal(err)
}
}

View File

@ -22,6 +22,7 @@ go_library(
"//pkg/util/pki:go_default_library",
"@io_k8s_api//core/v1:go_default_library",
"@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
"@io_k8s_apimachinery//pkg/types:go_default_library",
],
)

View File

@ -20,6 +20,7 @@ import (
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"github.com/jetstack/cert-manager/pkg/apis/certmanager/v1alpha2"
cmmeta "github.com/jetstack/cert-manager/pkg/apis/meta/v1"
@ -176,6 +177,12 @@ func SetCertificateRevision(revision int) CertificateModifier {
}
}
func SetCertificateUID(uid types.UID) CertificateModifier {
return func(crt *v1alpha2.Certificate) {
crt.UID = uid
}
}
func AddCertificateAnnotations(annotations map[string]string) CertificateModifier {
return func(crt *v1alpha2.Certificate) {
if crt.Annotations == nil {