forked from kiali/kiali
/
destination_rule.go
99 lines (91 loc) · 3.02 KB
/
destination_rule.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package models
import (
meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/kiali/kiali/config"
"github.com/kiali/kiali/kubernetes"
)
// DestinationRules destinationRules
//
// This is used for returning an array of DestinationRules
//
// swagger:model destinationRules
// An array of destinationRule
// swagger:allOf
type DestinationRules struct {
Permissions ResourcePermissions `json:"permissions"`
Items []DestinationRule `json:"items"`
}
// DestinationRule destinationRule
//
// This is used for returning a DestinationRule
//
// swagger:model destinationRule
type DestinationRule struct {
meta_v1.TypeMeta
Metadata meta_v1.ObjectMeta `json:"metadata"`
Spec struct {
Host interface{} `json:"host,omitempty"`
TrafficPolicy interface{} `json:"trafficPolicy,omitempty"`
Subsets interface{} `json:"subsets,omitempty"`
ExportTo interface{} `json:"exportTo,omitempty"`
} `json:"spec"`
}
func (dRules *DestinationRules) Parse(destinationRules []kubernetes.IstioObject) {
dRules.Items = []DestinationRule{}
for _, dr := range destinationRules {
destinationRule := DestinationRule{}
destinationRule.Parse(dr)
dRules.Items = append(dRules.Items, destinationRule)
}
}
func (dRule *DestinationRule) Parse(destinationRule kubernetes.IstioObject) {
dRule.TypeMeta = destinationRule.GetTypeMeta()
dRule.Metadata = destinationRule.GetObjectMeta()
dRule.Spec.Host = destinationRule.GetSpec()["host"]
dRule.Spec.TrafficPolicy = destinationRule.GetSpec()["trafficPolicy"]
dRule.Spec.Subsets = destinationRule.GetSpec()["subsets"]
dRule.Spec.ExportTo = destinationRule.GetSpec()["exportTo"]
}
func (dRule *DestinationRule) HasCircuitBreaker(namespace string, serviceName string, version string) bool {
if host, ok := dRule.Spec.Host.(string); ok && kubernetes.FilterByHost(host, serviceName, namespace) {
// CB is set at DR level, so it's true for the service and all versions
if isCircuitBreakerTrafficPolicy(dRule.Spec.TrafficPolicy) {
return true
}
if subsets, ok := dRule.Spec.Subsets.([]interface{}); ok {
cfg := config.Get()
for _, subsetInterface := range subsets {
if subset, ok := subsetInterface.(map[string]interface{}); ok {
if trafficPolicy, ok := subset["trafficPolicy"]; ok && isCircuitBreakerTrafficPolicy(trafficPolicy) {
// set the service true if it has a subset with a CB
if version == "" {
return true
}
if labels, ok := subset["labels"]; ok {
if dLabels, ok := labels.(map[string]interface{}); ok {
if versionValue, ok := dLabels[cfg.IstioLabels.VersionLabelName]; ok && versionValue == version {
return true
}
}
}
}
}
}
}
}
return false
}
func isCircuitBreakerTrafficPolicy(trafficPolicy interface{}) bool {
if trafficPolicy == nil {
return false
}
if dTrafficPolicy, ok := trafficPolicy.(map[string]interface{}); ok {
if _, ok := dTrafficPolicy["connectionPool"]; ok {
return true
}
if _, ok := dTrafficPolicy["outlierDetection"]; ok {
return true
}
}
return false
}