mirror of https://github.com/status-im/consul.git
Merge branch 'master' into f-autopilot-2
This commit is contained in:
commit
fb259e3d04
|
@ -28,6 +28,7 @@ IMPROVEMENTS:
|
|||
* cli: Standardized handling of CLI options for connecting to the Consul agent. This makes sure that the same set of flags and environment variables works in all CLI commands (see https://www.consul.io/docs/commands/index.html#environment-variables). [GH-2717]
|
||||
* cli: Updated go-cleanhttp library for better HTTP connection handling between CLI commands and the Consul agent (tunes reuse settings). [GH-2735]
|
||||
* cli: The `operator raft` subcommand has had its two modes split into the `list-peers` and `remove-peer` subcommands. The old flags for these will continue to work for backwards compatibility, but will be removed in Consul 0.9.
|
||||
* dns: Allows the `.service` tag to be optional in RFC 2782 lookups. [GH-2690]
|
||||
|
||||
BUG FIXES:
|
||||
|
||||
|
|
|
@ -304,12 +304,20 @@ func (d *DNSServer) dispatch(network string, req, resp *dns.Msg) {
|
|||
// Split into the label parts
|
||||
labels := dns.SplitDomainName(qName)
|
||||
|
||||
// The last label is either "node", "service", "query", or a datacenter name
|
||||
// The last label is either "node", "service", "query", "_<protocol>", or a datacenter name
|
||||
PARSE:
|
||||
n := len(labels)
|
||||
if n == 0 {
|
||||
goto INVALID
|
||||
}
|
||||
|
||||
// If this is a SRV query the "service" label is optional, we add it back to use the
|
||||
// existing code-path.
|
||||
if req.Question[0].Qtype == dns.TypeSRV && strings.HasPrefix(labels[n-1], "_") {
|
||||
labels = append(labels, "service")
|
||||
n = n + 1
|
||||
}
|
||||
|
||||
switch labels[n-1] {
|
||||
case "service":
|
||||
if n == 1 {
|
||||
|
|
|
@ -3488,47 +3488,57 @@ func TestDNS_ServiceLookup_SRV_RFC(t *testing.T) {
|
|||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion("_db._master.service.consul.", dns.TypeSRV)
|
||||
|
||||
c := new(dns.Client)
|
||||
addr, _ := srv.agent.config.ClientListener("", srv.agent.config.Ports.DNS)
|
||||
in, _, err := c.Exchange(m, addr.String())
|
||||
if err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
questions := []string{
|
||||
"_db._master.service.dc1.consul.",
|
||||
"_db._master.service.consul.",
|
||||
"_db._master.dc1.consul.",
|
||||
"_db._master.consul.",
|
||||
}
|
||||
|
||||
if len(in.Answer) != 1 {
|
||||
t.Fatalf("Bad: %#v", in)
|
||||
for _, question := range questions {
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion(question, dns.TypeSRV)
|
||||
|
||||
c := new(dns.Client)
|
||||
addr, _ := srv.agent.config.ClientListener("", srv.agent.config.Ports.DNS)
|
||||
in, _, err := c.Exchange(m, addr.String())
|
||||
if err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
||||
if len(in.Answer) != 1 {
|
||||
t.Fatalf("Bad: %#v", in)
|
||||
}
|
||||
|
||||
srvRec, ok := in.Answer[0].(*dns.SRV)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
if srvRec.Port != 12345 {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Target != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
|
||||
aRec, ok := in.Extra[0].(*dns.A)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Name != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.A.String() != "127.0.0.1" {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
}
|
||||
|
||||
srvRec, ok := in.Answer[0].(*dns.SRV)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
if srvRec.Port != 12345 {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Target != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
|
||||
aRec, ok := in.Extra[0].(*dns.A)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Name != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.A.String() != "127.0.0.1" {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
}
|
||||
|
||||
func TestDNS_ServiceLookup_SRV_RFC_TCP_Default(t *testing.T) {
|
||||
|
@ -3555,47 +3565,57 @@ func TestDNS_ServiceLookup_SRV_RFC_TCP_Default(t *testing.T) {
|
|||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion("_db._tcp.service.consul.", dns.TypeSRV)
|
||||
|
||||
c := new(dns.Client)
|
||||
addr, _ := srv.agent.config.ClientListener("", srv.agent.config.Ports.DNS)
|
||||
in, _, err := c.Exchange(m, addr.String())
|
||||
if err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
questions := []string{
|
||||
"_db._tcp.service.dc1.consul.",
|
||||
"_db._tcp.service.consul.",
|
||||
"_db._tcp.dc1.consul.",
|
||||
"_db._tcp.consul.",
|
||||
}
|
||||
|
||||
if len(in.Answer) != 1 {
|
||||
t.Fatalf("Bad: %#v", in)
|
||||
for _, question := range questions {
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion(question, dns.TypeSRV)
|
||||
|
||||
c := new(dns.Client)
|
||||
addr, _ := srv.agent.config.ClientListener("", srv.agent.config.Ports.DNS)
|
||||
in, _, err := c.Exchange(m, addr.String())
|
||||
if err != nil {
|
||||
t.Fatalf("err: %v", err)
|
||||
}
|
||||
|
||||
if len(in.Answer) != 1 {
|
||||
t.Fatalf("Bad: %#v", in)
|
||||
}
|
||||
|
||||
srvRec, ok := in.Answer[0].(*dns.SRV)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
if srvRec.Port != 12345 {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Target != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
|
||||
aRec, ok := in.Extra[0].(*dns.A)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Name != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.A.String() != "127.0.0.1" {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
}
|
||||
|
||||
srvRec, ok := in.Answer[0].(*dns.SRV)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
if srvRec.Port != 12345 {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Target != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", srvRec)
|
||||
}
|
||||
if srvRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Answer[0])
|
||||
}
|
||||
|
||||
aRec, ok := in.Extra[0].(*dns.A)
|
||||
if !ok {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Name != "foo.node.dc1.consul." {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.A.String() != "127.0.0.1" {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
if aRec.Hdr.Ttl != 0 {
|
||||
t.Fatalf("Bad: %#v", in.Extra[0])
|
||||
}
|
||||
}
|
||||
|
||||
func TestDNS_ServiceLookup_FilterACL(t *testing.T) {
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
This demo provides a very simple `Vagrantfile` that creates two Consul
|
||||
server nodes, one at *172.20.20.10* and another at *172.20.20.11*. Both are
|
||||
running a standard Debian * distribution, and Consul is pre-installed.
|
||||
running a standard Debian * distribution, and *the latest version* of Consul
|
||||
is pre-installed.
|
||||
|
||||
To get started, you can start the nodes by just doing:
|
||||
|
||||
|
@ -29,7 +30,7 @@ At this point the two nodes are running and you can SSH in to play with them:
|
|||
```
|
||||
vagrant ssh n1
|
||||
consul version
|
||||
Consul v0.7.2
|
||||
Consul v0.7.5
|
||||
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
|
||||
exit
|
||||
```
|
||||
|
@ -39,14 +40,15 @@ and
|
|||
```
|
||||
vagrant ssh n2
|
||||
consul version
|
||||
Consul v0.7.2
|
||||
Consul v0.7.5
|
||||
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
|
||||
exit
|
||||
```
|
||||
|
||||
> NOTE: This demo will install the latest Consul release version by default,
|
||||
> but if you prefer a different version, you can set the `CONSUL_DEMO_VERSION`
|
||||
> environment variable before starting `vagrant` like this:
|
||||
> NOTE: This demo will query the HashiCorp Checkpoint service to determine
|
||||
> the the latest Consul release version and install that version by default,
|
||||
> but if you need a different Consul version, set the `CONSUL_DEMO_VERSION`
|
||||
> environment variable before `vagrant up` like this:
|
||||
> `CONSUL_DEMO_VERSION=0.6.4 vagrant up`
|
||||
|
||||
## Where to Next?
|
||||
|
|
|
@ -5,7 +5,13 @@ $script = <<SCRIPT
|
|||
|
||||
echo "Installing dependencies ..."
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y unzip curl
|
||||
sudo apt-get install -y unzip curl jq
|
||||
|
||||
echo "Determining Consul version to install ..."
|
||||
CHECKPOINT_URL="https://checkpoint-api.hashicorp.com/v1/check"
|
||||
if [ -z "$CONSUL_DEMO_VERSION" ]; then
|
||||
CONSUL_DEMO_VERSION=$(curl -s "${CHECKPOINT_URL}"/consul | jq .current_version | tr -d '"')
|
||||
fi
|
||||
|
||||
echo "Fetching Consul version ${CONSUL_DEMO_VERSION} ..."
|
||||
cd /tmp/
|
||||
|
@ -22,7 +28,7 @@ sudo chmod a+w /etc/consul.d
|
|||
SCRIPT
|
||||
|
||||
# Specify a Consul version
|
||||
CONSUL_DEMO_VERSION = ENV['CONSUL_DEMO_VERSION'] || "0.7.2"
|
||||
CONSUL_DEMO_VERSION = ENV['CONSUL_DEMO_VERSION']
|
||||
|
||||
# Specify a custom Vagrant box for the demo
|
||||
DEMO_BOX_NAME = ENV['DEMO_BOX_NAME'] || "debian/jessie64"
|
||||
|
|
|
@ -59,7 +59,7 @@ if [ -z "$NO_UPLOAD" ]; then
|
|||
--acl-public \
|
||||
--recursive \
|
||||
--add-header="Cache-Control: max-age=14400" \
|
||||
--add-header="x-amz-meta-surrogate-control: max-age=31536000" \
|
||||
--add-header="x-amz-meta-surrogate-control: max-age=31536000, stale-white-revalidate=86400, stale-if-error=604800" \
|
||||
--add-header="x-amz-meta-surrogate-key: site-$PROJECT" \
|
||||
sync "$DIR/build/" "s3://hc-sites/$PROJECT/latest/"
|
||||
|
||||
|
@ -103,6 +103,7 @@ if [ -z "$NO_PURGE" ]; then
|
|||
--request "POST" \
|
||||
--header "Accept: application/json" \
|
||||
--header "Fastly-Key: $FASTLY_API_KEY" \
|
||||
--header "Fastly-Soft-Purge: 1" \
|
||||
"https://api.fastly.com/service/$FASTLY_SERVICE_ID/purge/site-$PROJECT"
|
||||
fi
|
||||
|
||||
|
|
|
@ -138,7 +138,7 @@ foobar.node.dc1.consul. 0 IN A 10.1.10.12
|
|||
|
||||
The format for RFC 2782 SRV lookups is:
|
||||
|
||||
_<service>._<protocol>.service[.datacenter][.domain]
|
||||
_<service>._<protocol>[.service][.datacenter][.domain]
|
||||
|
||||
Per [RFC 2782](https://tools.ietf.org/html/rfc2782), SRV queries should use
|
||||
underscores, `_`, as a prefix to the `service` and `protocol` values in a query to
|
||||
|
|
|
@ -311,7 +311,7 @@ will exit with an error at startup.
|
|||
use. This defaults to the latest version. This should be set only when [upgrading](/docs/upgrading.html).
|
||||
You can view the protocol versions supported by Consul by running `consul -v`.
|
||||
|
||||
* <a name="_raft_protocol"></a><a href="#_raft_protocol">`-raft_protocol`</a> - This controls the internal
|
||||
* <a name="_raft_protocol"></a><a href="#_raft_protocol">`-raft-protocol`</a> - This controls the internal
|
||||
version of the Raft consensus protocol used for server communications. This defaults to 2 but must
|
||||
be set to 3 in order to gain access to Autopilot features, with the exception of
|
||||
[`cleanup_dead_servers`](#cleanup_dead_servers).
|
||||
|
|
Loading…
Reference in New Issue