1 package integration
2
3 import (
4 "context"
5 "os"
6 "strings"
7 "testing"
8
9 "github.com/prometheus/client_golang/prometheus/testutil"
10
11 "github.com/stretchr/testify/assert"
12 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
13
14 l5dv1alpha1 "edge-infra.dev/pkg/edge/linkerd/k8s/apis/linkerd/v1alpha1"
15 "edge-infra.dev/pkg/edge/linkerd/k8s/controllers/metrics"
16 "edge-infra.dev/test/f2"
17 )
18
19 var f f2.Framework
20
21 var (
22 expectedLinkerdReadinessMetrics = strings.NewReader(`
23 # HELP edge_linkerd_reconcile_readiness Metric for linkerd controller readiness
24 # TYPE edge_linkerd_reconcile_readiness gauge
25 edge_linkerd_reconcile_readiness{reason="Succeeded",status="True",type="Ready", version="v1.0.0"} 1
26 `)
27 expectedLinkerdReadinessMetricsAfterUpgrade = strings.NewReader(`
28 # HELP edge_linkerd_reconcile_readiness Metric for linkerd controller readiness
29 # TYPE edge_linkerd_reconcile_readiness gauge
30 edge_linkerd_reconcile_readiness{reason="Succeeded",status="True",type="Ready", version="v2.0.0"} 1
31 `)
32 expectedTrustAnchorExpiryMetrics = strings.NewReader(`
33 # HELP edge_linkerd_trust_anchor_expiry Metric for linkerd trust anchor expiration date as UNIX timestamp
34 # TYPE edge_linkerd_trust_anchor_expiry gauge
35 edge_linkerd_trust_anchor_expiry 1.234567e+06
36 `)
37 expectedWorkloadInjecitonReadinessMetrics = strings.NewReader(`
38 # HELP edge_workloadinjection_reconcile_readiness Metric for linkerd workload injection controller readiness
39 # TYPE edge_workloadinjection_reconcile_readiness gauge
40 edge_workloadinjection_reconcile_readiness{reason="Failed",status="False",type="Ready"} 0
41 `)
42 )
43
44 func TestMain(m *testing.M) {
45 f = f2.New(context.Background())
46 os.Exit(f.Run(m))
47 }
48
49 func TestLinkerdMetrics(t *testing.T) {
50 records := f2.NewFeature("Linkerd Controller").
51 Test("readiness metric is recorded", func(ctx f2.Context, t *testing.T) f2.Context {
52 l5d := l5dMock("True", l5dv1alpha1.SucceededReason, "v1.0.0")
53 metrics.RecordLinkerdReadiness(l5d)
54 assert.NoError(t, testutil.CollectAndCompare(metrics.LinkerdReadinessMetric, expectedLinkerdReadinessMetrics))
55 return ctx
56 }).
57 Test("linkerd upgrade", func(ctx f2.Context, t *testing.T) f2.Context {
58
59 l5d := l5dMock("True", l5dv1alpha1.SucceededReason, "v1.0.0")
60 metrics.RecordLinkerdReadiness(l5d)
61
62
63 l5d = l5dMock("True", l5dv1alpha1.SucceededReason, "v2.0.0")
64 metrics.RecordLinkerdReadiness(l5d)
65
66 assert.NoError(t, testutil.CollectAndCompare(metrics.LinkerdReadinessMetric, expectedLinkerdReadinessMetricsAfterUpgrade))
67 return ctx
68 }).Feature()
69 f.Test(t, records)
70 }
71
72 func TestTrustAnchorExpiryMetrics(t *testing.T) {
73 records := f2.NewFeature("Trustanchor expiry").
74 Test("trust anchor expiry metric is recorded", func(ctx f2.Context, t *testing.T) f2.Context {
75 metrics.RecordTrustAnchorExpiryTime(1234567)
76 assert.NoError(t, testutil.CollectAndCompare(metrics.TrustAnchorExpiry, expectedTrustAnchorExpiryMetrics))
77 return ctx
78 }).Feature()
79 f.Test(t, records)
80 }
81
82 func TestLinkerdWorkloadInjectionMetrics(t *testing.T) {
83 records := f2.NewFeature("LinkerdWorkloadInjection Controller").
84 Test("readiness metric is recorded", func(ctx f2.Context, t *testing.T) f2.Context {
85 workloadInjection := l5dWorkloadInjectionMock("False", l5dv1alpha1.WorkloadInjectionFailed)
86 metrics.RecordWorkloadInjectionReadiness(workloadInjection)
87 assert.NoError(t, testutil.CollectAndCompare(metrics.WorkloadInjectionReadinessMetric, expectedWorkloadInjecitonReadinessMetrics))
88 return ctx
89 }).Feature()
90 f.Test(t, records)
91 }
92
93 func l5dMock(status, reason, version string) *l5dv1alpha1.Linkerd {
94 return &l5dv1alpha1.Linkerd{
95 ObjectMeta: metav1.ObjectMeta{
96 Name: "linkerd",
97 },
98 Spec: l5dv1alpha1.LinkerdSpec{},
99 Status: l5dv1alpha1.LinkerdStatus{
100 Conditions: []metav1.Condition{
101 {
102 Type: "Ready",
103 Status: metav1.ConditionStatus(status),
104 Reason: reason,
105 },
106 },
107 Version: version,
108 },
109 }
110 }
111
112 func l5dWorkloadInjectionMock(status, reason string) *l5dv1alpha1.LinkerdWorkloadInjection {
113 return &l5dv1alpha1.LinkerdWorkloadInjection{
114 ObjectMeta: metav1.ObjectMeta{
115 Name: "linkerd",
116 },
117 Spec: l5dv1alpha1.LinkerdWorkloadInjectionSpec{},
118 Status: l5dv1alpha1.LinkerdWorkloadInjectionStatus{
119 Conditions: []metav1.Condition{
120 {
121 Type: "Ready",
122 Status: metav1.ConditionStatus(status),
123 Reason: reason,
124 },
125 },
126 },
127 }
128 }
129
View as plain text