-
Notifications
You must be signed in to change notification settings - Fork 2
/
cluster.go
82 lines (76 loc) · 3.17 KB
/
cluster.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2015 The Cockroach Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
// implied. See the License for the specific language governing
// permissions and limitations under the License.
package cluster
import (
"net"
"testing"
"golang.org/x/net/context"
"github.com/cockroachdb/cockroach/pkg/internal/client"
"github.com/cockroachdb/cockroach/pkg/keys"
)
// A Cluster is an abstraction away from a concrete cluster deployment (i.e.
// a local docker cluster, or an AWS-provisioned one). It exposes a shared
// set of methods for test-related manipulation.
type Cluster interface {
// NumNodes returns the number of nodes in the cluster, running or not.
NumNodes() int
// NewClient returns a kv client for the given node.
NewClient(context.Context, int) (*client.DB, error)
// PGUrl returns a URL string for the given node postgres server.
PGUrl(context.Context, int) string
// InternalIP returns the address used for inter-node communication.
InternalIP(ctx context.Context, i int) net.IP
// Assert verifies that the cluster state is as expected (i.e. no unexpected
// restarts or node deaths occurred). Tests can call this periodically to
// ascertain cluster health.
Assert(context.Context, testing.TB)
// AssertAndStop performs the same test as Assert but then proceeds to
// dismantle the cluster.
AssertAndStop(context.Context, testing.TB)
// ExecCLI runs `./cockroach <args>`, while filling in required flags such as
// --insecure, --certs-dir, --host or --port.
//
// Returns stdout, stderr, and an error.
ExecCLI(ctx context.Context, i int, args []string) (string, string, error)
// Kill terminates the cockroach process running on the given node number.
// The given integer must be in the range [0,NumNodes()-1].
Kill(context.Context, int) error
// Restart terminates the cockroach process running on the given node
// number, unless it is already stopped, and restarts it.
// The given integer must be in the range [0,NumNodes()-1].
Restart(context.Context, int) error
// URL returns the HTTP(s) endpoint.
URL(context.Context, int) string
// Addr returns the host and port from the node in the format HOST:PORT.
Addr(ctx context.Context, i int, port string) string
// Hostname returns a node's hostname.
Hostname(i int) string
}
// Consistent performs a replication consistency check on all the ranges
// in the cluster. It depends on a majority of the nodes being up, and does
// the check against the node at index i.
func Consistent(ctx context.Context, c Cluster, i int) error {
kvClient, err := c.NewClient(ctx, i)
if err != nil {
return err
}
// Set withDiff to false because any failure results in a second consistency check
// being called with withDiff=true.
return kvClient.CheckConsistency(
ctx,
keys.LocalMax,
keys.MaxKey,
false, /* withDiff*/
)
}