github.com/caos/orbos@v1.5.14-0.20221103111702-e6cd0cea7ad4/pkg/kubernetes/resources/ambassador/mapping/adapt.go (about) 1 package mapping 2 3 import ( 4 "github.com/caos/orbos/mntr" 5 "github.com/caos/orbos/pkg/kubernetes" 6 "github.com/caos/orbos/pkg/kubernetes/resources" 7 "github.com/caos/orbos/pkg/labels" 8 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" 9 ) 10 11 const ( 12 group = "getambassador.io" 13 version = "v2" 14 kind = "Mapping" 15 ) 16 17 type CORS struct { 18 Origins string 19 Methods string 20 Headers string 21 Credentials bool 22 ExposedHeaders string 23 MaxAge string 24 } 25 26 type Arguments struct { 27 Monitor mntr.Monitor 28 Namespace string 29 ID labels.IDLabels 30 GRPC bool 31 Host string 32 Prefix string 33 Rewrite string 34 Service string 35 TimeoutMS int 36 ConnectTimeoutMS int 37 CORS *CORS 38 } 39 40 func AdaptFuncToEnsure(params *Arguments) (resources.QueryFunc, error) { 41 42 spec := map[string]interface{}{ 43 "host": params.Host, 44 "rewrite": params.Rewrite, 45 "service": params.Service, 46 } 47 if params.Prefix != "" { 48 spec["prefix"] = params.Prefix 49 } 50 51 if params.TimeoutMS != 0 { 52 spec["timeout_ms"] = params.TimeoutMS 53 } 54 if params.ConnectTimeoutMS != 0 { 55 spec["connect_timeout_ms"] = params.ConnectTimeoutMS 56 } 57 if params.GRPC { 58 spec["grpc"] = params.GRPC 59 } 60 61 if params.CORS != nil { 62 corsMap := map[string]interface{}{ 63 "origins": params.CORS.Origins, 64 "methods": params.CORS.Methods, 65 "headers": params.CORS.Headers, 66 "credentials": params.CORS.Credentials, 67 "exposed_headers": params.CORS.ExposedHeaders, 68 "max_age": params.CORS.MaxAge, 69 } 70 spec["cors"] = corsMap 71 } 72 73 crd := &unstructured.Unstructured{ 74 Object: map[string]interface{}{ 75 "kind": kind, 76 "apiVersion": group + "/" + version, 77 "metadata": map[string]interface{}{ 78 "name": params.ID.Name(), 79 "namespace": params.Namespace, 80 "labels": labels.MustK8sMap(params.ID), 81 }, 82 "spec": spec, 83 }} 84 85 return func(k8sClient kubernetes.ClientInt, _ map[string]interface{}) (resources.EnsureFunc, error) { 86 crdName := "mappings.getambassador.io" 87 _, ok, err := k8sClient.CheckCRD(crdName) 88 if err != nil { 89 return nil, err 90 } 91 if !ok { 92 params.Monitor.WithField("name", crdName).Info("crd definition not found, skipping") 93 return func(k8sClient kubernetes.ClientInt) error { return nil }, nil 94 } 95 96 return func(k8sClient kubernetes.ClientInt) error { 97 return k8sClient.ApplyNamespacedCRDResource(group, version, kind, params.Namespace, params.ID.Name(), crd) 98 }, nil 99 }, nil 100 } 101 102 func AdaptFuncToDestroy(namespace, name string) (resources.DestroyFunc, error) { 103 return func(client kubernetes.ClientInt) error { 104 return client.DeleteNamespacedCRDResource(group, version, kind, namespace, name) 105 }, nil 106 }