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  }