github.com/operator-framework/operator-lifecycle-manager@v0.30.0/pkg/controller/operators/validatingroundtripper/validating_round_tripper.go (about)

     1  package validatingroundtripper
     2  
     3  import (
     4  	"fmt"
     5  	"net/http"
     6  	"os"
     7  
     8  	"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
     9  	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
    10  	"k8s.io/apimachinery/pkg/util/yaml"
    11  	"k8s.io/client-go/rest"
    12  )
    13  
    14  type validatingRoundTripper struct {
    15  	delegate http.RoundTripper
    16  }
    17  
    18  func (rt *validatingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
    19  	if req.Method == "POST" {
    20  		b, err := req.GetBody()
    21  		if err != nil {
    22  			panic(err)
    23  		}
    24  		dec := yaml.NewYAMLOrJSONDecoder(b, 10)
    25  		unstructuredObject := &unstructured.Unstructured{}
    26  		if err := dec.Decode(unstructuredObject); err != nil {
    27  			panic(fmt.Errorf("error decoding object to an unstructured object: %w", err))
    28  		}
    29  		gvk := unstructuredObject.GroupVersionKind()
    30  		if gvk.Kind != "Event" {
    31  			if labels := unstructuredObject.GetLabels(); labels[install.OLMManagedLabelKey] != install.OLMManagedLabelValue {
    32  				panic(fmt.Errorf("%s.%s/%v %s/%s does not have labels[%s]=%s", gvk.Kind, gvk.Group, gvk.Version, unstructuredObject.GetNamespace(), unstructuredObject.GetName(), install.OLMManagedLabelKey, install.OLMManagedLabelValue))
    33  			}
    34  		}
    35  	}
    36  	return rt.delegate.RoundTrip(req)
    37  }
    38  
    39  var _ http.RoundTripper = (*validatingRoundTripper)(nil)
    40  
    41  // Wrap is meant to be used in developer environments and CI to make it easy to find places
    42  // where we accidentally create Kubernetes objects without our management label.
    43  func Wrap(cfg *rest.Config) *rest.Config {
    44  	if _, set := os.LookupEnv("CI"); !set {
    45  		return cfg
    46  	}
    47  
    48  	cfgCopy := *cfg
    49  	cfgCopy.Wrap(func(rt http.RoundTripper) http.RoundTripper {
    50  		return &validatingRoundTripper{delegate: rt}
    51  	})
    52  	return &cfgCopy
    53  }