...

Source file src/github.com/linkerd/linkerd2/pkg/healthcheck/healthcheck_labels.go

Documentation: github.com/linkerd/linkerd2/pkg/healthcheck

     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