-
Notifications
You must be signed in to change notification settings - Fork 20
/
endpoints_mapper.go
174 lines (139 loc) · 4.07 KB
/
endpoints_mapper.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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package discovery
import (
"sync"
"github.com/s7techlab/hlf-sdk-go/api"
"github.com/s7techlab/hlf-sdk-go/api/config"
)
// implementation of connectionMapper interface
var _ connectionMapper = (*EndpointsMapper)(nil)
// EndpointsMapper - if tls is enabled with gossip maps provided from cfg TLS certs to discovered peers
type EndpointsMapper struct {
addressEndpoint map[string]*api.Endpoint
lock sync.RWMutex
}
func NewEndpointsMapper(endpoints []config.Endpoint) *EndpointsMapper {
endpointMap := make(map[string]*api.Endpoint)
for _, e := range endpoints {
var hostAddress api.Endpoint
hostAddress.TlsConfig = e.TlsConfig
hostAddress.Host = e.Host
if e.HostOverride != "" {
hostAddress.Host = e.HostOverride
}
endpointMap[e.Host] = &hostAddress
}
return &EndpointsMapper{
addressEndpoint: endpointMap,
lock: sync.RWMutex{},
}
}
func (m *EndpointsMapper) MapConnection(address string) *api.Endpoint {
m.lock.RLock()
defer m.lock.RUnlock()
endpoint, ok := m.addressEndpoint[address]
if ok {
return endpoint
}
return &api.Endpoint{}
}
// TlsConfigForAddress - get tls config for provided address
// if config wasn't provided on startup time return disabled tls
func (m *EndpointsMapper) TlsConfigForAddress(address string) config.TlsConfig {
m.lock.RLock()
defer m.lock.RUnlock()
v, ok := m.addressEndpoint[address]
if ok {
return v.TlsConfig
}
return config.TlsConfig{
Enabled: false,
}
}
func (m *EndpointsMapper) TlsEndpointForAddress(address string) string {
m.lock.RLock()
defer m.lock.RUnlock()
v, ok := m.addressEndpoint[address]
if ok {
return v.Host
}
return address
}
/*
decorators over api.ChaincodeDiscoverer/ChannelDiscoverer
adds TLS settings(if they were provided in cfg) for discovered peers
*/
type chaincodeDiscovererTLSDecorator struct {
target api.ChaincodeDiscoverer
tlsMapper connectionMapper
}
func newChaincodeDiscovererTLSDecorator(
target api.ChaincodeDiscoverer,
tlsMapper connectionMapper,
) *chaincodeDiscovererTLSDecorator {
return &chaincodeDiscovererTLSDecorator{
target: target,
tlsMapper: tlsMapper,
}
}
func (d *chaincodeDiscovererTLSDecorator) Endorsers() []*api.HostEndpoint {
return addTLConfigs(d.target.Endorsers(), d.tlsMapper)
}
func (d *chaincodeDiscovererTLSDecorator) Orderers() []*api.HostEndpoint {
return addTLConfigs(d.target.Orderers(), d.tlsMapper)
}
func (d *chaincodeDiscovererTLSDecorator) ChaincodeVersion() string {
return d.target.ChaincodeVersion()
}
func (d *chaincodeDiscovererTLSDecorator) ChaincodeName() string {
return d.target.ChaincodeName()
}
func (d *chaincodeDiscovererTLSDecorator) ChannelName() string {
return d.target.ChannelName()
}
/* */
type channelDiscovererTLSDecorator struct {
target api.ChannelDiscoverer
tlsMapper connectionMapper
}
func newChannelDiscovererTLSDecorator(
target api.ChannelDiscoverer,
tlsMapper connectionMapper,
) *channelDiscovererTLSDecorator {
return &channelDiscovererTLSDecorator{
target: target,
tlsMapper: tlsMapper,
}
}
func (d *channelDiscovererTLSDecorator) Orderers() []*api.HostEndpoint {
return addTLConfigs(d.target.Orderers(), d.tlsMapper)
}
func (d *channelDiscovererTLSDecorator) ChannelName() string {
return d.target.ChannelName()
}
func addTLConfigs(endpoints []*api.HostEndpoint, tlsMapper connectionMapper) []*api.HostEndpoint {
for i := range endpoints {
for j := range endpoints[i].HostAddresses {
conn := tlsMapper.MapConnection(endpoints[i].HostAddresses[j].Host)
endpoints[i].HostAddresses[j].TlsConfig = conn.TlsConfig
endpoints[i].HostAddresses[j].Host = conn.Host
}
}
return endpoints
}
/* */
type localPeersDiscovererTLSDecorator struct {
target api.LocalPeersDiscoverer
tlsMapper connectionMapper
}
func newLocalPeersDiscovererTLSDecorator(
target api.LocalPeersDiscoverer,
tlsMapper connectionMapper,
) *localPeersDiscovererTLSDecorator {
return &localPeersDiscovererTLSDecorator{
target: target,
tlsMapper: tlsMapper,
}
}
func (d *localPeersDiscovererTLSDecorator) Peers() []*api.HostEndpoint {
return addTLConfigs(d.target.Peers(), d.tlsMapper)
}