...

Source file src/edge-infra.dev/pkg/edge/linkerd/k8s/controllers/metrics/integration/integration_test.go

Documentation: edge-infra.dev/pkg/edge/linkerd/k8s/controllers/metrics/integration

     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  			// record existing linkerd version
    59  			l5d := l5dMock("True", l5dv1alpha1.SucceededReason, "v1.0.0")
    60  			metrics.RecordLinkerdReadiness(l5d)
    61  
    62  			// record upgraded linkerd version
    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