-
Notifications
You must be signed in to change notification settings - Fork 43
/
Copy pathcluster.go
77 lines (70 loc) · 2.45 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
// 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 kivik
import (
"context"
"github.com/go-kivik/kivik/v4/driver"
)
// ClusterStatus returns the current [cluster status].
//
// [cluster status]: http://docs.couchdb.org/en/stable/api/server/common.html#cluster-setup
func (c *Client) ClusterStatus(ctx context.Context, options ...Option) (string, error) {
endQuery, err := c.startQuery()
if err != nil {
return "", err
}
defer endQuery()
cluster, ok := c.driverClient.(driver.Cluster)
if !ok {
return "", errClusterNotImplemented
}
return cluster.ClusterStatus(ctx, multiOptions(options))
}
// ClusterSetup performs the requested [cluster action]. action should be
// an object understood by the driver. For the CouchDB driver, this means an
// object which is marshalable to a JSON object of the expected format.
//
// [cluster action]: http://docs.couchdb.org/en/stable/api/server/common.html#post--_cluster_setup
func (c *Client) ClusterSetup(ctx context.Context, action interface{}) error {
endQuery, err := c.startQuery()
if err != nil {
return err
}
defer endQuery()
cluster, ok := c.driverClient.(driver.Cluster)
if !ok {
return errClusterNotImplemented
}
return cluster.ClusterSetup(ctx, action)
}
// ClusterMembership contains the list of known nodes, and cluster nodes, as returned
// by [Client.Membership].
type ClusterMembership struct {
AllNodes []string `json:"all_nodes"`
ClusterNodes []string `json:"cluster_nodes"`
}
// Membership returns a list of known CouchDB [nodes in the cluster].
//
// [nodes in the cluster]: https://docs.couchdb.org/en/latest/api/server/common.html#get--_membership
func (c *Client) Membership(ctx context.Context) (*ClusterMembership, error) {
endQuery, err := c.startQuery()
if err != nil {
return nil, err
}
defer endQuery()
cluster, ok := c.driverClient.(driver.Cluster)
if !ok {
return nil, errClusterNotImplemented
}
nodes, err := cluster.Membership(ctx)
return (*ClusterMembership)(nodes), err
}