This repository has been archived by the owner on Sep 16, 2019. It is now read-only.
/
fake.go
139 lines (116 loc) · 2.72 KB
/
fake.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
package producers
import (
"fmt"
"math/rand"
"net"
"sync"
"time"
log "github.com/Sirupsen/logrus"
"github.com/zalando-incubator/mate/pkg"
)
const (
defaultFakeDomain = "example.org."
defaultFakeMode = "ip"
ipMode = "ip"
hostnameMode = "hostname"
fixedMode = "fixed"
)
type fakeProducer struct {
mode string
dnsName string
targetDomain string
fixedDNSName string
fixedIP string
fixedHostname string
}
type FakeProducerOptions struct {
DNSName string
Mode string
TargetDomain string
FixedDNSName string
FixedIP string
FixedHostname string
}
func init() {
rand.Seed(time.Now().UnixNano())
}
func NewFakeProducer(cfg *FakeProducerOptions) (*fakeProducer, error) {
if cfg.DNSName == "" {
cfg.DNSName = defaultFakeDomain
}
if cfg.Mode == "" {
cfg.Mode = defaultFakeMode
}
return &fakeProducer{
mode: cfg.Mode,
dnsName: cfg.DNSName,
targetDomain: cfg.TargetDomain,
fixedDNSName: cfg.FixedDNSName,
fixedIP: cfg.FixedIP,
fixedHostname: cfg.FixedHostname,
}, nil
}
func (a *fakeProducer) Endpoints() ([]*pkg.Endpoint, error) {
endpoints := make([]*pkg.Endpoint, 0)
for i := 0; i < 10; i++ {
endpoint, err := a.generateEndpoint()
if err != nil {
log.Warn("[Fake] Error generating fake endpoint: %v", err)
continue
}
endpoints = append(endpoints, endpoint)
}
return endpoints, nil
}
func (a *fakeProducer) Monitor(results chan *pkg.Endpoint, errChan chan error, done chan struct{}, wg *sync.WaitGroup) {
wg.Add(1)
defer wg.Done()
for {
select {
case <-time.After(5 * time.Second):
case <-done:
log.Info("[Fake] Exited monitoring loop.")
return
}
endpoint, err := a.generateEndpoint()
if err != nil {
errChan <- err
continue
}
results <- endpoint
}
}
func (a *fakeProducer) generateEndpoint() (*pkg.Endpoint, error) {
endpoint := &pkg.Endpoint{
DNSName: fmt.Sprintf("%s.%s", randomString(2), a.dnsName),
}
switch a.mode {
case ipMode:
endpoint.IP = net.IPv4(
byte(randomNumber(1, 255)),
byte(randomNumber(1, 255)),
byte(randomNumber(1, 255)),
byte(randomNumber(1, 255)),
).String()
case hostnameMode:
endpoint.Hostname = fmt.Sprintf("%s.%s", randomString(6), a.targetDomain)
case fixedMode:
endpoint.DNSName = a.fixedDNSName
endpoint.IP = a.fixedIP
endpoint.Hostname = a.fixedHostname
default:
return nil, fmt.Errorf("Unknown mode: %s", a.mode)
}
return endpoint, nil
}
func randomNumber(min, max int) int {
return rand.Intn(max-min) + min
}
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyz")
func randomString(n int) string {
b := make([]rune, n)
for i := range b {
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
return string(b)
}