forked from dapr/components-contrib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
nameresolution.go
64 lines (56 loc) · 1.84 KB
/
nameresolution.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
/*
Copyright 2021 The Dapr Authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package nameresolution
import (
"context"
"math/rand"
"strconv"
)
// Resolver is the interface of name resolver.
type Resolver interface {
// Init initializes name resolver.
Init(ctx context.Context, metadata Metadata) error
// ResolveID resolves name to address.
ResolveID(ctx context.Context, req ResolveRequest) (string, error)
}
// ResolverMulti is an optional interface for name resolvers that can return multiple addresses.
type ResolverMulti interface {
ResolveIDMulti(ctx context.Context, req ResolveRequest) (AddressList, error)
}
// ResolveRequest represents service discovery resolver request.
type ResolveRequest struct {
ID string
Namespace string
Port int
Data map[string]string
}
// CacheKey returns a string that can be used to identify this ResolveRequest in a cache
func (r ResolveRequest) CacheKey() string {
return r.Namespace + "/" + r.ID + "/" + strconv.Itoa(r.Port)
}
// AddressList is a list of addresses resolved by the nameresolver
type AddressList []string
// Pick returns a random address from the list
func (a AddressList) Pick() string {
l := len(a)
switch l {
case 0:
return ""
case 1:
return a[0]
default:
// We use math/rand here as we are just picking a random address, so we don't need a CSPRNG
//nolint:gosec
return a[rand.Intn(l)]
}
}