diff --git a/api/acl.go b/api/acl.go index c3fb0d53aa..3bf7cc8de0 100644 --- a/api/acl.go +++ b/api/acl.go @@ -1,5 +1,9 @@ package api +import ( + "time" +) + const ( // ACLCLientType is the client type token ACLClientType = "client" @@ -18,6 +22,16 @@ type ACLEntry struct { Rules string } +// ACLReplicationEntry is used to represent an ACLReplication entry +type ACLReplicationEntry struct { + Enabled bool + Running bool + SourceDatacenter string + ReplicatedIndex uint64 + LastSuccess time.Time + LastError time.Time +} + // ACL can be used to query the ACL endpoints type ACL struct { c *Client @@ -138,3 +152,24 @@ func (a *ACL) List(q *QueryOptions) ([]*ACLEntry, *QueryMeta, error) { } return entries, qm, nil } + +// Replication returns the status of the ACL replication process in the datacenter +func (a *ACL) Replication(q *QueryOptions) (*ACLReplicationEntry, *QueryMeta, error) { + r := a.c.newRequest("GET", "/v1/acl/replication") + r.setQueryOptions(q) + rtt, resp, err := requireOK(a.c.doRequest(r)) + if err != nil { + return nil, nil, err + } + defer resp.Body.Close() + + qm := &QueryMeta{} + parseQueryMeta(resp, qm) + qm.RequestTime = rtt + + var entries *ACLReplicationEntry + if err := decodeBody(resp, &entries); err != nil { + return nil, nil, err + } + return entries, qm, nil +} diff --git a/api/acl_test.go b/api/acl_test.go index 2a5207a6ee..e8a3e6d87d 100644 --- a/api/acl_test.go +++ b/api/acl_test.go @@ -126,3 +126,32 @@ func TestACL_List(t *testing.T) { t.Fatalf("bad: %v", qm) } } + +func TestACL_Replication(t *testing.T) { + t.Parallel() + c, s := makeACLClient(t) + defer s.Stop() + + acl := c.ACL() + + repl, qm, err := acl.Replication(nil) + if err != nil { + t.Fatalf("err: %v", err) + } + + if repl == nil { + t.Fatalf("bad: %v", repl) + } + + if repl.Running { + t.Fatal("bad: repl should not be running") + } + + if repl.Enabled { + t.Fatal("bad: repl should not be enabled") + } + + if qm.RequestTime == 0 { + t.Fatalf("bad: %v", qm) + } +}