2015-01-06 18:40:00 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
2015-01-08 02:29:42 +00:00
|
|
|
"fmt"
|
2015-01-06 18:40:00 +00:00
|
|
|
"testing"
|
2015-01-08 02:29:42 +00:00
|
|
|
|
|
|
|
"github.com/hashicorp/consul/testutil"
|
2015-01-06 18:40:00 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestCatalog_Datacenters(t *testing.T) {
|
2015-05-08 17:27:24 +00:00
|
|
|
t.Parallel()
|
2015-01-06 23:26:50 +00:00
|
|
|
c, s := makeClient(t)
|
2015-03-03 02:18:38 +00:00
|
|
|
defer s.Stop()
|
2015-01-06 23:26:50 +00:00
|
|
|
|
2015-01-06 18:40:00 +00:00
|
|
|
catalog := c.Catalog()
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
datacenters, err := catalog.Datacenters()
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if len(datacenters) == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", datacenters)
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalog_Nodes(t *testing.T) {
|
2015-01-06 23:26:50 +00:00
|
|
|
c, s := makeClient(t)
|
2015-03-03 02:18:38 +00:00
|
|
|
defer s.Stop()
|
2015-01-06 23:26:50 +00:00
|
|
|
|
2015-01-06 18:40:00 +00:00
|
|
|
catalog := c.Catalog()
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
nodes, meta, err := catalog.Nodes(nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if meta.LastIndex == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", meta)
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if len(nodes) == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", nodes)
|
|
|
|
}
|
|
|
|
|
2016-08-16 17:30:30 +00:00
|
|
|
if _, ok := nodes[0].TaggedAddresses["wan"]; !ok {
|
2016-10-31 16:59:20 +00:00
|
|
|
return false, fmt.Errorf("Bad: %v", nodes[0])
|
2016-08-16 17:30:30 +00:00
|
|
|
}
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalog_Services(t *testing.T) {
|
2015-05-08 17:27:24 +00:00
|
|
|
t.Parallel()
|
2015-01-06 23:26:50 +00:00
|
|
|
c, s := makeClient(t)
|
2015-03-03 02:18:38 +00:00
|
|
|
defer s.Stop()
|
2015-01-06 23:26:50 +00:00
|
|
|
|
2015-01-06 18:40:00 +00:00
|
|
|
catalog := c.Catalog()
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
services, meta, err := catalog.Services(nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if meta.LastIndex == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", meta)
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if len(services) == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", services)
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalog_Service(t *testing.T) {
|
2015-05-08 17:27:24 +00:00
|
|
|
t.Parallel()
|
2015-01-06 23:26:50 +00:00
|
|
|
c, s := makeClient(t)
|
2015-03-03 02:18:38 +00:00
|
|
|
defer s.Stop()
|
2015-01-06 23:26:50 +00:00
|
|
|
|
2015-01-06 18:40:00 +00:00
|
|
|
catalog := c.Catalog()
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
services, meta, err := catalog.Service("consul", "", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if meta.LastIndex == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", meta)
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if len(services) == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", services)
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalog_Node(t *testing.T) {
|
2015-05-08 17:27:24 +00:00
|
|
|
t.Parallel()
|
2015-01-06 23:26:50 +00:00
|
|
|
c, s := makeClient(t)
|
2015-03-03 02:18:38 +00:00
|
|
|
defer s.Stop()
|
2015-01-06 23:26:50 +00:00
|
|
|
|
2015-01-06 18:40:00 +00:00
|
|
|
catalog := c.Catalog()
|
|
|
|
name, _ := c.Agent().NodeName()
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
info, meta, err := catalog.Node(name, nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if meta.LastIndex == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", meta)
|
|
|
|
}
|
2016-08-16 17:30:30 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if len(info.Services) == 0 {
|
|
|
|
return false, fmt.Errorf("Bad: %v", info)
|
|
|
|
}
|
|
|
|
|
2016-08-16 17:30:30 +00:00
|
|
|
if _, ok := info.Node.TaggedAddresses["wan"]; !ok {
|
|
|
|
return false, fmt.Errorf("Bad: %v", info)
|
|
|
|
}
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCatalog_Registration(t *testing.T) {
|
2015-05-08 17:27:24 +00:00
|
|
|
t.Parallel()
|
2015-01-06 23:26:50 +00:00
|
|
|
c, s := makeClient(t)
|
2015-03-03 02:18:38 +00:00
|
|
|
defer s.Stop()
|
2015-01-06 23:26:50 +00:00
|
|
|
|
2015-01-06 18:40:00 +00:00
|
|
|
catalog := c.Catalog()
|
|
|
|
|
|
|
|
service := &AgentService{
|
|
|
|
ID: "redis1",
|
|
|
|
Service: "redis",
|
|
|
|
Tags: []string{"master", "v1"},
|
|
|
|
Port: 8000,
|
|
|
|
}
|
|
|
|
|
|
|
|
check := &AgentCheck{
|
|
|
|
Node: "foobar",
|
|
|
|
CheckID: "service:redis1",
|
|
|
|
Name: "Redis health check",
|
|
|
|
Notes: "Script based health check",
|
2016-04-23 23:01:59 +00:00
|
|
|
Status: HealthPassing,
|
2015-01-06 18:40:00 +00:00
|
|
|
ServiceID: "redis1",
|
|
|
|
}
|
|
|
|
|
|
|
|
reg := &CatalogRegistration{
|
|
|
|
Datacenter: "dc1",
|
|
|
|
Node: "foobar",
|
|
|
|
Address: "192.168.10.10",
|
|
|
|
Service: service,
|
|
|
|
Check: check,
|
|
|
|
}
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
if _, err := catalog.Register(reg, nil); err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
node, _, err := catalog.Node("foobar", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if _, ok := node.Services["redis1"]; !ok {
|
|
|
|
return false, fmt.Errorf("missing service: redis1")
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
health, _, err := c.Health().Node("foobar", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if health[0].CheckID != "service:redis1" {
|
|
|
|
return false, fmt.Errorf("missing checkid service:redis1")
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
// Test catalog deregistration of the previously registered service
|
2015-01-06 18:40:00 +00:00
|
|
|
dereg := &CatalogDeregistration{
|
|
|
|
Datacenter: "dc1",
|
|
|
|
Node: "foobar",
|
|
|
|
Address: "192.168.10.10",
|
|
|
|
ServiceID: "redis1",
|
|
|
|
}
|
|
|
|
|
2015-01-06 23:26:50 +00:00
|
|
|
if _, err := catalog.Deregister(dereg, nil); err != nil {
|
2015-01-06 18:40:00 +00:00
|
|
|
t.Fatalf("err: %v", err)
|
|
|
|
}
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
node, _, err := catalog.Node("foobar", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if _, ok := node.Services["redis1"]; ok {
|
|
|
|
return false, fmt.Errorf("ServiceID:redis1 is not deregistered")
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
// Test deregistration of the previously registered check
|
2015-01-06 18:40:00 +00:00
|
|
|
dereg = &CatalogDeregistration{
|
|
|
|
Datacenter: "dc1",
|
|
|
|
Node: "foobar",
|
|
|
|
Address: "192.168.10.10",
|
|
|
|
CheckID: "service:redis1",
|
|
|
|
}
|
|
|
|
|
2015-01-06 23:26:50 +00:00
|
|
|
if _, err := catalog.Deregister(dereg, nil); err != nil {
|
2015-01-06 18:40:00 +00:00
|
|
|
t.Fatalf("err: %v", err)
|
|
|
|
}
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
health, _, err := c.Health().Node("foobar", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if len(health) != 0 {
|
|
|
|
return false, fmt.Errorf("CheckID:service:redis1 is not deregistered")
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
|
|
|
|
|
|
|
// Test node deregistration of the previously registered node
|
2015-01-06 18:40:00 +00:00
|
|
|
dereg = &CatalogDeregistration{
|
|
|
|
Datacenter: "dc1",
|
|
|
|
Node: "foobar",
|
|
|
|
Address: "192.168.10.10",
|
|
|
|
}
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if _, err := catalog.Deregister(dereg, nil); err != nil {
|
2015-01-06 18:40:00 +00:00
|
|
|
t.Fatalf("err: %v", err)
|
|
|
|
}
|
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
node, _, err := catalog.Node("foobar", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
2015-01-06 18:40:00 +00:00
|
|
|
|
2015-01-08 02:29:42 +00:00
|
|
|
if node != nil {
|
|
|
|
return false, fmt.Errorf("node is not deregistered: %v", node)
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
2015-01-06 18:40:00 +00:00
|
|
|
}
|
2016-02-16 19:45:29 +00:00
|
|
|
|
|
|
|
func TestCatalog_EnableTagOverride(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
c, s := makeClient(t)
|
|
|
|
defer s.Stop()
|
|
|
|
|
|
|
|
catalog := c.Catalog()
|
|
|
|
|
|
|
|
service := &AgentService{
|
|
|
|
ID: "redis1",
|
|
|
|
Service: "redis",
|
|
|
|
Tags: []string{"master", "v1"},
|
|
|
|
Port: 8000,
|
|
|
|
}
|
|
|
|
|
|
|
|
reg := &CatalogRegistration{
|
|
|
|
Datacenter: "dc1",
|
|
|
|
Node: "foobar",
|
|
|
|
Address: "192.168.10.10",
|
|
|
|
Service: service,
|
|
|
|
}
|
|
|
|
|
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
if _, err := catalog.Register(reg, nil); err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
node, _, err := catalog.Node("foobar", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := node.Services["redis1"]; !ok {
|
|
|
|
return false, fmt.Errorf("missing service: redis1")
|
|
|
|
}
|
|
|
|
if node.Services["redis1"].EnableTagOverride != false {
|
|
|
|
return false, fmt.Errorf("tag override set")
|
|
|
|
}
|
|
|
|
|
|
|
|
services, _, err := catalog.Service("redis", "", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(services) < 1 || services[0].ServiceName != "redis" {
|
|
|
|
return false, fmt.Errorf("missing service: redis")
|
|
|
|
}
|
|
|
|
if services[0].ServiceEnableTagOverride != false {
|
|
|
|
return false, fmt.Errorf("tag override set")
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
|
|
|
|
|
|
|
service.EnableTagOverride = true
|
|
|
|
testutil.WaitForResult(func() (bool, error) {
|
|
|
|
if _, err := catalog.Register(reg, nil); err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
node, _, err := catalog.Node("foobar", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, ok := node.Services["redis1"]; !ok {
|
|
|
|
return false, fmt.Errorf("missing service: redis1")
|
|
|
|
}
|
|
|
|
if node.Services["redis1"].EnableTagOverride != true {
|
|
|
|
return false, fmt.Errorf("tag override not set")
|
|
|
|
}
|
|
|
|
|
|
|
|
services, _, err := catalog.Service("redis", "", nil)
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(services) < 1 || services[0].ServiceName != "redis" {
|
|
|
|
return false, fmt.Errorf("missing service: redis")
|
|
|
|
}
|
|
|
|
if services[0].ServiceEnableTagOverride != true {
|
|
|
|
return false, fmt.Errorf("tag override not set")
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
|
|
|
}, func(err error) {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
})
|
|
|
|
}
|