/
eds_conver.go
124 lines (115 loc) · 4.04 KB
/
eds_conver.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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// RAINBOND, Application Management Platform
// Copyright (C) 2014-2017 Goodrain Co., Ltd.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version. For any non-GPL usage of Rainbond,
// one or multiple Commercial Licenses authorized by Goodrain Co., Ltd.
// must be obtained first.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
package conver
import (
"fmt"
"strconv"
"github.com/Sirupsen/logrus"
v2 "github.com/envoyproxy/go-control-plane/envoy/api/v2"
endpoint "github.com/envoyproxy/go-control-plane/envoy/api/v2/endpoint"
"github.com/envoyproxy/go-control-plane/pkg/cache"
envoyv2 "github.com/goodrain/rainbond/node/core/envoy/v2"
corev1 "k8s.io/api/core/v1"
)
//OneNodeClusterLoadAssignment one envoy node endpoints
func OneNodeClusterLoadAssignment(serviceAlias, namespace string, endpoints []*corev1.Endpoints, services []*corev1.Service) (clusterLoadAssignment []cache.Resource) {
for i := range services {
service := services[i]
destServiceAlias := GetServiceAliasByService(service)
if destServiceAlias == "" {
logrus.Errorf("service alias is empty in k8s service %s", service.Name)
continue
}
clusterName := fmt.Sprintf("%s_%s_%s_%d", namespace, serviceAlias, destServiceAlias, service.Spec.Ports[0].Port)
name := fmt.Sprintf("%sService", destServiceAlias)
if destServiceAlias == serviceAlias {
name = fmt.Sprintf("%sServiceOUT", destServiceAlias)
}
selectEndpoint := getEndpointsByLables(endpoints, map[string]string{"name": name})
var lendpoints []endpoint.LocalityLbEndpoints
for _, en := range selectEndpoint {
for _, subset := range en.Subsets {
if len(subset.Ports) < 1 {
continue
}
toport := int(subset.Ports[0].Port)
if serviceAlias == destServiceAlias {
if originPort, ok := service.Labels["origin_port"]; ok {
origin, err := strconv.Atoi(originPort)
if err == nil {
toport = origin
}
}
}
protocol := string(subset.Ports[0].Protocol)
addressList := subset.Addresses
var notready bool
if len(addressList) == 0 {
notready = true
addressList = subset.NotReadyAddresses
}
getHealty := func() *endpoint.Endpoint_HealthCheckConfig {
if notready {
return nil
}
return &endpoint.Endpoint_HealthCheckConfig{
PortValue: uint32(toport),
}
}
var lbe []endpoint.LbEndpoint
for _, address := range addressList {
envoyAddress := envoyv2.CreateSocketAddress(protocol, address.IP, uint32(toport))
lbe = append(lbe, endpoint.LbEndpoint{
HostIdentifier: &endpoint.LbEndpoint_Endpoint{
Endpoint: &endpoint.Endpoint{
Address: &envoyAddress,
HealthCheckConfig: getHealty(),
},
},
})
}
lendpoints = append(lendpoints, endpoint.LocalityLbEndpoints{LbEndpoints: lbe})
}
}
cla := &v2.ClusterLoadAssignment{
ClusterName: clusterName,
Endpoints: lendpoints,
}
if err := cla.Validate(); err != nil {
logrus.Errorf("endpoints discover validate failure %s", err.Error())
} else {
clusterLoadAssignment = append(clusterLoadAssignment, cla)
}
}
if len(clusterLoadAssignment) == 0 {
logrus.Warn("create clusterLoadAssignment zero length")
}
return clusterLoadAssignment
}
func getEndpointsByLables(endpoints []*corev1.Endpoints, slabels map[string]string) (re []*corev1.Endpoints) {
for _, en := range endpoints {
existLength := 0
for k, v := range slabels {
v2, ok := en.Labels[k]
if ok && v == v2 {
existLength++
}
}
if existLength == len(slabels) {
re = append(re, en)
}
}
return
}