...
1 package healthcheck
2
3 import (
4 "fmt"
5 "strings"
6
7 "github.com/linkerd/linkerd2/pkg/k8s"
8 "github.com/linkerd/linkerd2/pkg/util"
9 corev1 "k8s.io/api/core/v1"
10 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11 )
12
13 var (
14 validAsLabelOnly = []string{
15 k8s.DefaultExportedServiceSelector,
16 }
17 validAsAnnotationOnly = []string{
18 k8s.ProxyInjectAnnotation,
19 }
20 validAsAnnotationPrefixOnly = []string{
21 k8s.ProxyConfigAnnotationsPrefix,
22 k8s.ProxyConfigAnnotationsPrefixAlpha,
23 }
24 )
25
26 func checkMisconfiguredPodsLabels(pods []corev1.Pod) error {
27 var invalid []string
28
29 for _, pod := range pods {
30 invalidLabels := getMisconfiguredLabels(pod.ObjectMeta)
31 if len(invalidLabels) > 0 {
32 invalid = append(invalid,
33 fmt.Sprintf("\t* %s/%s\n\t\t%s", pod.Namespace, pod.Name, strings.Join(invalidLabels, "\n\t\t")))
34 }
35 }
36 if len(invalid) > 0 {
37 return fmt.Errorf("Some labels on data plane pods should be annotations:\n%s", strings.Join(invalid, "\n"))
38 }
39 return nil
40 }
41
42 func checkMisconfiguredServiceLabels(services []corev1.Service) error {
43 var invalid []string
44
45 for _, svc := range services {
46 invalidLabels := getMisconfiguredLabels(svc.ObjectMeta)
47 if len(invalidLabels) > 0 {
48 invalid = append(invalid,
49 fmt.Sprintf("\t* %s/%s\n\t\t%s", svc.Namespace, svc.Name, strings.Join(invalidLabels, "\n\t\t")))
50 }
51 }
52 if len(invalid) > 0 {
53 return fmt.Errorf("Some labels on data plane services should be annotations:\n%s", strings.Join(invalid, "\n"))
54 }
55 return nil
56 }
57
58 func checkMisconfiguredServiceAnnotations(services []corev1.Service) error {
59 var invalid []string
60
61 for _, svc := range services {
62 invalidAnnotations := getMisconfiguredAnnotations(svc.ObjectMeta)
63 if len(invalidAnnotations) > 0 {
64 invalid = append(invalid,
65 fmt.Sprintf("\t* %s/%s\n\t\t%s", svc.Namespace, svc.Name, strings.Join(invalidAnnotations, "\n\t\t")))
66 }
67 }
68 if len(invalid) > 0 {
69 return fmt.Errorf("Some annotations on data plane services should be labels:\n%s", strings.Join(invalid, "\n"))
70 }
71 return nil
72 }
73
74 func getMisconfiguredLabels(objectMeta metav1.ObjectMeta) []string {
75 var invalid []string
76
77 for label := range objectMeta.Labels {
78 if hasAnyPrefix(label, validAsAnnotationPrefixOnly) ||
79 util.ContainsString(label, validAsAnnotationOnly) {
80 invalid = append(invalid, label)
81 }
82 }
83
84 return invalid
85 }
86
87 func getMisconfiguredAnnotations(objectMeta metav1.ObjectMeta) []string {
88 var invalid []string
89
90 for ann := range objectMeta.Annotations {
91 if util.ContainsString(ann, validAsLabelOnly) {
92 invalid = append(invalid, ann)
93 }
94 }
95
96 return invalid
97 }
98
99 func hasAnyPrefix(str string, prefixes []string) bool {
100 for _, pref := range prefixes {
101 if strings.HasPrefix(str, pref) {
102 return true
103 }
104 }
105 return false
106 }
107
View as plain text