Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Request to add DNS server implementation for sidecar #328

Merged
merged 27 commits into from
Nov 2, 2016
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
8e00c22
Added miekg/dns package to vendor
tomerGolany Sep 29, 2016
eea6343
Added DNS server implementation
tomerGolany Oct 6, 2016
d11c171
Added configurations for dns server
tomerGolany Oct 5, 2016
2d82883
fixed rejects from code review with Zvi, for DNS server configuraions
tomerGolany Oct 9, 2016
965ac9c
Fixed rejects from code review with Zvi, for DNS server implementation
tomerGolany Oct 9, 2016
0346ee5
Fixed rejects from code review with Zvi, for adding dns server to sid…
tomerGolany Oct 9, 2016
aee1751
Fixed confilcts on sidecar/config/flags.go and glie.yaml
tomerGolany Oct 13, 2016
78b4aff
Added implementation of registry monitor for the DNS server queries
tomerGolany Oct 13, 2016
f039e24
Fixed rejects from pull request of DNS server implementation
tomerGolany Oct 13, 2016
ae12a7d
Fixed formatting
tomerGolany Oct 13, 2016
e15cecd
Removed Comment
tomerGolany Oct 20, 2016
69cf771
Merge branch 'master' of github.com:amalgam8/amalgam8
tomerGolany Oct 20, 2016
8822193
Fixed conflicts
tomerGolany Oct 27, 2016
ab93fd6
Added implementation to support SRV records
tomerGolany Oct 27, 2016
abc3094
SRV implementation
tomerGolany Oct 27, 2016
7aeb0b4
Fixed rejects from Zvi after implementing support for SRV records
tomerGolany Oct 30, 2016
7ae0355
Resolved confilcts
tomerGolany Oct 30, 2016
fe2e8b2
Fixed more rejects from Zvi
tomerGolany Oct 31, 2016
9842da4
Fixed conflicts and reduced sleep time of dns server test
tomerGolany Oct 31, 2016
a9393e1
fix and refactor registry monitor
zcahana Nov 1, 2016
ce956ec
fix dns ip/port parsing
zcahana Nov 1, 2016
18fa860
use weight=priority=0 for SRV records
zcahana Nov 1, 2016
dbf701d
randomize returned dns records
zcahana Nov 1, 2016
2dd1632
update dns server query format
zcahana Nov 2, 2016
4265f3e
update dns server unit tests
zcahana Nov 2, 2016
a3302c6
Merge branch 'master' into master
zcahana Nov 2, 2016
e7a9c8c
fix A record names returned for SRV queries
zcahana Nov 2, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions glide.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions glide.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,6 @@ import:

- package: github.com/onsi/gomega
version: 0fe204460da2c8fa1babcaac196e694de8f1aaa1

- package: github.com/miekg/dns
version: db96a2b759cdef4f11a34506a42eb8d1290c598e
18 changes: 18 additions & 0 deletions sidecar/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ type Controller struct {
Poll time.Duration `yaml:"poll"`
}

// Dnsconfig - DNS server configuration
type Dnsconfig struct {
Port int `yaml:"port"`
Domain string `yaml:"domain"`
}

// Health check types.
const (
HTTPHealthCheck = "http"
Expand All @@ -95,12 +101,14 @@ type HealthCheck struct {
type Config struct {
Register bool `yaml:"register"`
Proxy bool `yaml:"proxy"`
DNS bool `yaml:"dns"`

Service Service `yaml:"service"`
Endpoint Endpoint `yaml:"endpoint"`

Registry Registry `yaml:"registry"`
Controller Controller `yaml:"controller"`
Dnsconfig Dnsconfig `yaml:"dnsconfig"`

HealthChecks []HealthCheck `yaml:"healthchecks"`

Expand Down Expand Up @@ -191,6 +199,7 @@ func (c *Config) loadFromContext(context *cli.Context) error {

loadFromContextIfSet(&c.Register, registerFlag)
loadFromContextIfSet(&c.Proxy, proxyFlag)
loadFromContextIfSet(&c.DNS, dnsFlag)
loadFromContextIfSet(&c.Endpoint.Host, endpointHostFlag)
loadFromContextIfSet(&c.Endpoint.Port, endpointPortFlag)
loadFromContextIfSet(&c.Endpoint.Type, endpointTypeFlag)
Expand All @@ -200,6 +209,8 @@ func (c *Config) loadFromContext(context *cli.Context) error {
loadFromContextIfSet(&c.Controller.URL, controllerURLFlag)
loadFromContextIfSet(&c.Controller.Token, controllerTokenFlag)
loadFromContextIfSet(&c.Controller.Poll, controllerPollFlag)
loadFromContextIfSet(&c.Dnsconfig.Port, dnsConfigPortFlag)
loadFromContextIfSet(&c.Dnsconfig.Domain, dnsConfigDomainFlag)
loadFromContextIfSet(&c.LogLevel, logLevelFlag)
loadFromContextIfSet(&c.Debug, debugFlag)

Expand Down Expand Up @@ -308,6 +319,13 @@ func (c *Config) Validate() error {

}

if c.DNS {
validators = append(validators,
IsInRange("Dns Port", c.Dnsconfig.Port, 1, 65535),
IsValidDomain("Dns Domain", c.Dnsconfig.Domain),
)
}

return Validate(validators)
}

Expand Down
33 changes: 31 additions & 2 deletions sidecar/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,13 @@ var _ = Describe("Config", func() {
It("uses default config values", func() {
Expect(c.Register).To(Equal(DefaultConfig.Register))
Expect(c.Proxy).To(Equal(DefaultConfig.Proxy))
Expect(c.DNS).To(Equal(DefaultConfig.DNS))
Expect(c.Service).To(Equal(DefaultConfig.Service))
Expect(c.Endpoint.Port).To(Equal(DefaultConfig.Endpoint.Port))
Expect(c.Endpoint.Type).To(Equal(DefaultConfig.Endpoint.Type))
Expect(c.Registry).To(Equal(DefaultConfig.Registry))
Expect(c.Controller).To(Equal(DefaultConfig.Controller))
Expect(c.Dnsconfig).To(Equal(DefaultConfig.Dnsconfig))
Expect(c.HealthChecks).To(Equal(DefaultConfig.HealthChecks))
Expect(c.LogLevel).To(Equal(DefaultConfig.LogLevel))
Expect(c.Commands).To(HaveLen(0))
Expand Down Expand Up @@ -85,6 +87,7 @@ var _ = Describe("Config", func() {
args := append(os.Args[:1], []string{
"--register=true",
"--proxy=true",
"--dns=true",
"--service=helloworld:v1,somethingelse",
"--endpoint_host=localhost",
"--endpoint_port=9080",
Expand All @@ -95,6 +98,8 @@ var _ = Describe("Config", func() {
"--controller_url=http://controller:8080",
"--controller_token=local",
"--controller_poll=5s",
"--dns_port=4056",
"--dns_domain=someServer",
"--healthchecks=http://localhost:8082/health1",
"--healthchecks=http://localhost:8082/health2",
"--log_level=debug",
Expand All @@ -107,6 +112,7 @@ var _ = Describe("Config", func() {
It("uses config values from command line flags", func() {
Expect(c.Register).To(Equal(true))
Expect(c.Proxy).To(Equal(true))
Expect(c.DNS).To(Equal(true))
Expect(c.Service.Name).To(Equal("helloworld"))
Expect(c.Service.Tags).To(Equal([]string{"v1", "somethingelse"}))
Expect(c.Endpoint.Host).To(Equal("localhost"))
Expand All @@ -118,6 +124,8 @@ var _ = Describe("Config", func() {
Expect(c.Controller.URL).To(Equal("http://controller:8080"))
Expect(c.Controller.Token).To(Equal("local"))
Expect(c.Controller.Poll).To(Equal(time.Duration(5) * time.Second))
Expect(c.Dnsconfig.Port).To(Equal(4056))
Expect(c.Dnsconfig.Domain).To(Equal("someServer"))
Expect(c.HealthChecks[0].Value).To(Equal("http://localhost:8082/health1"))
Expect(c.HealthChecks[1].Value).To(Equal("http://localhost:8082/health2"))
Expect(c.LogLevel).To(Equal("debug"))
Expand All @@ -142,6 +150,7 @@ var _ = Describe("Config", func() {

os.Setenv("A8_REGISTER", "true")
os.Setenv("A8_PROXY", "true")
os.Setenv("A8_DNS", "true")
os.Setenv("A8_SERVICE", "helloworld:v1,somethingelse")
os.Setenv("A8_ENDPOINT_HOST", "localhost")
os.Setenv("A8_ENDPOINT_PORT", "9080")
Expand All @@ -152,9 +161,10 @@ var _ = Describe("Config", func() {
os.Setenv("A8_CONTROLLER_URL", "http://controller:8080")
os.Setenv("A8_CONTROLLER_TOKEN", "local")
os.Setenv("A8_CONTROLLER_POLL", "5s")
os.Setenv("A8_DNS_PORT", "4056")
os.Setenv("A8_DNS_DOMAIN", "someServer")
os.Setenv("A8_HEALTHCHECKS", "http://localhost:8082/health1,http://localhost:8082/health2")
os.Setenv("A8_LOG_LEVEL", "debug")

args := append(os.Args[:1], []string{
"python", "productpage.py",
}...)
Expand All @@ -164,6 +174,7 @@ var _ = Describe("Config", func() {
AfterEach(func() {
os.Unsetenv("A8_REGISTER")
os.Unsetenv("A8_PROXY")
os.Unsetenv("A8_DNS")
os.Unsetenv("A8_SERVICE")
os.Unsetenv("A8_ENDPOINT_HOST")
os.Unsetenv("A8_ENDPOINT_PORT")
Expand All @@ -174,13 +185,16 @@ var _ = Describe("Config", func() {
os.Unsetenv("A8_CONTROLLER_URL")
os.Unsetenv("A8_CONTROLLER_TOKEN")
os.Unsetenv("A8_CONTROLLER_POLL")
os.Unsetenv("A8_DNS_PORT")
os.Unsetenv("A8_DNS_DOMAIN")
os.Unsetenv("A8_HEALTHCHECKS")
os.Unsetenv("A8_LOG_LEVEL")
})

It("uses config values from environment variables", func() {
Expect(c.Register).To(Equal(true))
Expect(c.Proxy).To(Equal(true))
Expect(c.DNS).To(Equal(true))
Expect(c.Service.Name).To(Equal("helloworld"))
Expect(c.Service.Tags).To(Equal([]string{"v1", "somethingelse"}))
Expect(c.Endpoint.Host).To(Equal("localhost"))
Expand All @@ -192,6 +206,8 @@ var _ = Describe("Config", func() {
Expect(c.Controller.URL).To(Equal("http://controller:8080"))
Expect(c.Controller.Token).To(Equal("local"))
Expect(c.Controller.Poll).To(Equal(time.Duration(5) * time.Second))
Expect(c.Dnsconfig.Port).To(Equal(4056))
Expect(c.Dnsconfig.Domain).To(Equal("someServer"))
Expect(c.HealthChecks[0].Value).To(Equal("http://localhost:8082/health1"))
Expect(c.HealthChecks[1].Value).To(Equal("http://localhost:8082/health2"))
Expect(c.LogLevel).To(Equal("debug"))
Expand All @@ -216,7 +232,7 @@ var _ = Describe("Config", func() {
configYaml := `
register: true
proxy: true

dns: true
service:
name: helloworld
tags:
Expand All @@ -238,6 +254,11 @@ controller:
token: local
poll: 5s


dnsconfig:
port: 4056
domain: someServer

healthchecks:
- type: http
value: http://localhost:8082/health1
Expand Down Expand Up @@ -280,6 +301,7 @@ log_level: debug
It("uses config values from configuration file", func() {
Expect(c.Register).To(Equal(true))
Expect(c.Proxy).To(Equal(true))
Expect(c.DNS).To(Equal(true))
Expect(c.Service.Name).To(Equal("helloworld"))
Expect(c.Service.Tags).To(Equal([]string{"v1", "somethingelse"}))
Expect(c.Endpoint.Host).To(Equal("localhost"))
Expand All @@ -290,6 +312,8 @@ log_level: debug
Expect(c.Registry.Poll).To(Equal(time.Duration(5) * time.Second))
Expect(c.Controller.URL).To(Equal("http://controller:8080"))
Expect(c.Controller.Token).To(Equal("local"))
Expect(c.Dnsconfig.Port).To(Equal(4056))
Expect(c.Dnsconfig.Domain).To(Equal("someServer"))
Expect(c.Controller.Poll).To(Equal(time.Duration(5) * time.Second))
Expect(c.HealthChecks[0].Type).To(Equal("http"))
Expect(c.HealthChecks[0].Value).To(Equal("http://localhost:8082/health1"))
Expand Down Expand Up @@ -324,8 +348,13 @@ log_level: debug
URL: "http://controller",
Poll: 60 * time.Second,
},
Dnsconfig: Dnsconfig{
Port: 8053,
Domain: "amalgam8",
},
Proxy: true,
Register: true,
DNS: true,
Service: Service{
Name: "mock",
},
Expand Down
6 changes: 6 additions & 0 deletions sidecar/config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import "time"
var DefaultConfig = Config{
Register: false,
Proxy: false,
DNS: false,

Service: Service{
Name: "",
Expand All @@ -42,6 +43,11 @@ var DefaultConfig = Config{
Poll: time.Duration(15 * time.Second),
},

Dnsconfig: Dnsconfig{
Port: 8053,
Domain: "amalgam8",
},

HealthChecks: nil,

LogLevel: "info",
Expand Down
19 changes: 19 additions & 0 deletions sidecar/config/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ const (
controllerPollFlag = "controller_poll"
healthchecksFlag = "healthchecks"
logLevelFlag = "log_level"
dnsFlag = "dns"
dnsConfigPortFlag = "dns_port"
dnsConfigDomainFlag = "dns_domain"
debugFlag = "debug"
)

Expand All @@ -61,6 +64,11 @@ var Flags = []cli.Flag{
EnvVar: envVar(proxyFlag),
Usage: "Enable automatic service discovery and load balancing across services using NGINX",
},
cli.BoolFlag{
Name: dnsFlag,
EnvVar: envVar(dnsFlag),
Usage: "Enable DNS server",
},
cli.StringFlag{
Name: serviceFlag,
EnvVar: envVar(serviceFlag),
Expand Down Expand Up @@ -111,6 +119,17 @@ var Flags = []cli.Flag{
EnvVar: envVar(controllerPollFlag),
Usage: "Interval for polling Controller",
},

cli.StringFlag{
Name: dnsConfigPortFlag,
EnvVar: envVar(dnsConfigPortFlag),
Usage: "DNS server port number",
},
cli.StringFlag{
Name: dnsConfigDomainFlag,
EnvVar: envVar(dnsConfigDomainFlag),
Usage: "DNS server authorization domain name",
},
cli.StringSliceFlag{
Name: healthchecksFlag,
EnvVar: envVar(healthchecksFlag),
Expand Down
16 changes: 16 additions & 0 deletions sidecar/config/validation.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ import (
"fmt"
"net/url"
"time"

"github.com/miekg/dns"
)

// Validate runs validation checks
Expand Down Expand Up @@ -96,3 +98,17 @@ func IsInRangeDuration(name string, value, min, max time.Duration) ValidatorFunc
return nil
}
}

// IsValidDomain ensures the domain name is valid domain and that it contains only one domain.
func IsValidDomain(name, value string) ValidatorFunc {
return func() error {
numberOfDomains, isValidDomain := dns.IsDomainName(value)
if !isValidDomain {
return errors.New(name + " not a valid domain")
}
if numberOfDomains != 1 {
return errors.New(name + " needs to contain 1 domain")
}
return nil
}
}
Loading