2015-11-14 02:07:35 +00:00
|
|
|
package api
|
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/hashicorp/consul/testutil"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestPreparedQuery(t *testing.T) {
|
|
|
|
t.Parallel()
|
|
|
|
c, s := makeClient(t)
|
|
|
|
defer s.Stop()
|
|
|
|
|
|
|
|
// Set up a node and a service.
|
|
|
|
reg := &CatalogRegistration{
|
|
|
|
Datacenter: "dc1",
|
|
|
|
Node: "foobar",
|
|
|
|
Address: "192.168.10.10",
|
2016-08-16 17:30:30 +00:00
|
|
|
TaggedAddresses: map[string]string{
|
|
|
|
"wan": "127.0.0.1",
|
|
|
|
},
|
2017-01-23 23:53:45 +00:00
|
|
|
NodeMeta: map[string]string{"somekey": "somevalue"},
|
2015-11-14 02:07:35 +00:00
|
|
|
Service: &AgentService{
|
|
|
|
ID: "redis1",
|
|
|
|
Service: "redis",
|
|
|
|
Tags: []string{"master", "v1"},
|
|
|
|
Port: 8000,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
catalog := c.Catalog()
|
2017-03-23 22:27:16 +00:00
|
|
|
if err := testutil.WaitForResult(func() (bool, error) {
|
2015-11-14 02:07:35 +00:00
|
|
|
if _, err := catalog.Register(reg, nil); err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if _, _, err := catalog.Node("foobar", nil); err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return true, nil
|
2017-03-23 22:27:16 +00:00
|
|
|
}); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
2015-11-14 02:07:35 +00:00
|
|
|
|
|
|
|
// Create a simple prepared query.
|
|
|
|
def := &PreparedQueryDefinition{
|
2016-12-10 19:19:08 +00:00
|
|
|
Name: "test",
|
2015-11-14 02:07:35 +00:00
|
|
|
Service: ServiceQuery{
|
2017-01-23 23:53:45 +00:00
|
|
|
Service: "redis",
|
|
|
|
NodeMeta: map[string]string{"somekey": "somevalue"},
|
2015-11-14 02:07:35 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
query := c.PreparedQuery()
|
|
|
|
var err error
|
|
|
|
def.ID, _, err = query.Create(def, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read it back.
|
|
|
|
defs, _, err := query.Get(def.ID, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
if len(defs) != 1 || !reflect.DeepEqual(defs[0], def) {
|
|
|
|
t.Fatalf("bad: %v", defs)
|
|
|
|
}
|
|
|
|
|
|
|
|
// List them all.
|
|
|
|
defs, _, err = query.List(nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
if len(defs) != 1 || !reflect.DeepEqual(defs[0], def) {
|
|
|
|
t.Fatalf("bad: %v", defs)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make an update.
|
|
|
|
def.Name = "my-query"
|
|
|
|
_, err = query.Update(def, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Read it back again to verify the update worked.
|
|
|
|
defs, _, err = query.Get(def.ID, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
if len(defs) != 1 || !reflect.DeepEqual(defs[0], def) {
|
|
|
|
t.Fatalf("bad: %v", defs)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Execute by ID.
|
|
|
|
results, _, err := query.Execute(def.ID, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
if len(results.Nodes) != 1 || results.Nodes[0].Node.Node != "foobar" {
|
|
|
|
t.Fatalf("bad: %v", results)
|
|
|
|
}
|
2016-08-16 17:30:30 +00:00
|
|
|
if wan, ok := results.Nodes[0].Node.TaggedAddresses["wan"]; !ok || wan != "127.0.0.1" {
|
|
|
|
t.Fatalf("bad: %v", results)
|
|
|
|
}
|
2015-11-14 02:07:35 +00:00
|
|
|
|
|
|
|
// Execute by name.
|
|
|
|
results, _, err = query.Execute("my-query", nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
if len(results.Nodes) != 1 || results.Nodes[0].Node.Node != "foobar" {
|
|
|
|
t.Fatalf("bad: %v", results)
|
|
|
|
}
|
2016-08-16 17:30:30 +00:00
|
|
|
if wan, ok := results.Nodes[0].Node.TaggedAddresses["wan"]; !ok || wan != "127.0.0.1" {
|
|
|
|
t.Fatalf("bad: %v", results)
|
|
|
|
}
|
2017-04-18 12:02:24 +00:00
|
|
|
if results.Nodes[0].Node.Datacenter != "dc1" {
|
|
|
|
t.Fatalf("bad datacenter: %v", results)
|
|
|
|
}
|
2015-11-14 02:07:35 +00:00
|
|
|
|
|
|
|
// Delete it.
|
|
|
|
_, err = query.Delete(def.ID, nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure there are no longer any queries.
|
|
|
|
defs, _, err = query.List(nil)
|
|
|
|
if err != nil {
|
|
|
|
t.Fatalf("err: %s", err)
|
|
|
|
}
|
|
|
|
if len(defs) != 0 {
|
|
|
|
t.Fatalf("bad: %v", defs)
|
|
|
|
}
|
|
|
|
}
|