github.com/verrazzano/verrazzano@v1.7.1/tools/oam-converter/pkg/resources/destinationrule/destinatonrule.go (about)

     1  // Copyright (c) 2023, Oracle and/or its affiliates.
     2  // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
     3  
     4  package destinationrule
     5  
     6  import (
     7  	vzapi "github.com/verrazzano/verrazzano/application-operator/apis/oam/v1alpha1"
     8  	consts "github.com/verrazzano/verrazzano/tools/oam-converter/pkg/constants"
     9  	"google.golang.org/protobuf/types/known/durationpb"
    10  	istionet "istio.io/api/networking/v1alpha3"
    11  	istio "istio.io/api/networking/v1beta1"
    12  	istioclient "istio.io/client-go/pkg/apis/networking/v1alpha3"
    13  	corev1 "k8s.io/api/core/v1"
    14  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    15  	"time"
    16  )
    17  
    18  // CreateDestinationFromRule creates a destination from the rule
    19  func CreateDestinationFromRule(rule vzapi.IngressRule) (*istio.HTTPRouteDestination, error) {
    20  	dest := &istio.HTTPRouteDestination{Destination: &istio.Destination{Host: rule.Destination.Host}}
    21  	if rule.Destination.Port != 0 {
    22  		dest.Destination.Port = &istio.PortSelector{Number: rule.Destination.Port}
    23  	}
    24  	return dest, nil
    25  
    26  }
    27  
    28  // CreateDestinationRule  creates or updates the DestinationRule.
    29  func CreateDestinationRule(trait *vzapi.IngressTrait, rule vzapi.IngressRule, name string) (*istioclient.DestinationRule, error) {
    30  	if rule.Destination.HTTPCookie != nil {
    31  		destinationRule := &istioclient.DestinationRule{
    32  			TypeMeta: metav1.TypeMeta{
    33  				APIVersion: consts.DestinationRuleAPIVersion,
    34  				Kind:       "DestinationRule"},
    35  			ObjectMeta: metav1.ObjectMeta{
    36  				Namespace: trait.Namespace,
    37  				Name:      name},
    38  		}
    39  		namespace := &corev1.Namespace{}
    40  		return mutateDestinationRule(destinationRule, rule, namespace)
    41  
    42  	}
    43  	return nil, nil
    44  }
    45  
    46  // mutateDestinationRule changes the destination rule based upon a traits configuration
    47  func mutateDestinationRule(destinationRule *istioclient.DestinationRule, rule vzapi.IngressRule, namespace *corev1.Namespace) (*istioclient.DestinationRule, error) {
    48  
    49  	dest, err := CreateDestinationFromRule(rule)
    50  
    51  	if err != nil {
    52  		print(err)
    53  		return nil, err
    54  	}
    55  
    56  	mode := istionet.ClientTLSSettings_DISABLE
    57  	value, ok := namespace.Labels["istio-injection"]
    58  	if ok && value == "enabled" {
    59  		mode = istionet.ClientTLSSettings_ISTIO_MUTUAL
    60  	}
    61  	destinationRule.Spec = istionet.DestinationRule{
    62  		Host: dest.Destination.Host,
    63  		TrafficPolicy: &istionet.TrafficPolicy{
    64  			Tls: &istionet.ClientTLSSettings{
    65  				Mode: mode,
    66  			},
    67  			LoadBalancer: &istionet.LoadBalancerSettings{
    68  				LbPolicy: &istionet.LoadBalancerSettings_ConsistentHash{
    69  					ConsistentHash: &istionet.LoadBalancerSettings_ConsistentHashLB{
    70  						HashKey: &istionet.LoadBalancerSettings_ConsistentHashLB_HttpCookie{
    71  							HttpCookie: &istionet.LoadBalancerSettings_ConsistentHashLB_HTTPCookie{
    72  								Name: rule.Destination.HTTPCookie.Name,
    73  								Path: rule.Destination.HTTPCookie.Path,
    74  								Ttl:  durationpb.New(rule.Destination.HTTPCookie.TTL * time.Second)},
    75  						},
    76  					},
    77  				},
    78  			},
    79  		},
    80  	}
    81  
    82  	return destinationRule, nil
    83  }