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 }