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 }