Merge pull request #4989 from xiang90/clu

*: move Cluster interface to api
release-3.0
Xiang Li 2016-04-07 08:33:52 -07:00
commit a5f341e886
8 changed files with 57 additions and 31 deletions

41
etcdserver/api/cluster.go Normal file
View File

@ -0,0 +1,41 @@
// Copyright 2016 CoreOS, Inc.
//
// 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 api
import (
"github.com/coreos/etcd/etcdserver"
"github.com/coreos/etcd/pkg/types"
"github.com/coreos/go-semver/semver"
)
// Cluster is an interface representing a collection of members in one etcd cluster.
type Cluster interface {
// ID returns the cluster ID
ID() types.ID
// ClientURLs returns an aggregate set of all URLs on which this
// cluster is listening for client requests
ClientURLs() []string
// Members returns a slice of members sorted by their ID
Members() []*etcdserver.Member
// Member retrieves a particular member based on ID, or nil if the
// member does not exist in the cluster
Member(id types.ID) *etcdserver.Member
// IsIDRemoved checks whether the given ID has been removed from this
// cluster at some point in the past
IsIDRemoved(id types.ID) bool
// Version is the cluster-wide minimum major.minor version.
Version() *semver.Version
}

View File

@ -30,6 +30,7 @@ import (
etcdErr "github.com/coreos/etcd/error" etcdErr "github.com/coreos/etcd/error"
"github.com/coreos/etcd/etcdserver" "github.com/coreos/etcd/etcdserver"
"github.com/coreos/etcd/etcdserver/api"
"github.com/coreos/etcd/etcdserver/api/v2http/httptypes" "github.com/coreos/etcd/etcdserver/api/v2http/httptypes"
"github.com/coreos/etcd/etcdserver/auth" "github.com/coreos/etcd/etcdserver/auth"
"github.com/coreos/etcd/etcdserver/etcdserverpb" "github.com/coreos/etcd/etcdserver/etcdserverpb"
@ -133,7 +134,7 @@ func NewClientHandler(server *etcdserver.EtcdServer, timeout time.Duration) http
type keysHandler struct { type keysHandler struct {
sec auth.Store sec auth.Store
server etcdserver.Server server etcdserver.Server
cluster etcdserver.Cluster cluster api.Cluster
timer etcdserver.RaftTimer timer etcdserver.RaftTimer
timeout time.Duration timeout time.Duration
} }
@ -186,7 +187,7 @@ func (h *keysHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
type deprecatedMachinesHandler struct { type deprecatedMachinesHandler struct {
cluster etcdserver.Cluster cluster api.Cluster
} }
func (h *deprecatedMachinesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (h *deprecatedMachinesHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
@ -200,7 +201,7 @@ func (h *deprecatedMachinesHandler) ServeHTTP(w http.ResponseWriter, r *http.Req
type membersHandler struct { type membersHandler struct {
sec auth.Store sec auth.Store
server etcdserver.Server server etcdserver.Server
cluster etcdserver.Cluster cluster api.Cluster
timeout time.Duration timeout time.Duration
clock clockwork.Clock clock clockwork.Clock
} }
@ -389,7 +390,7 @@ func healthHandler(server *etcdserver.EtcdServer) http.HandlerFunc {
} }
} }
func versionHandler(c etcdserver.Cluster, fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { func versionHandler(c api.Cluster, fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) { return func(w http.ResponseWriter, r *http.Request) {
v := c.Version() v := c.Version()
if v != nil { if v != nil {

View File

@ -20,14 +20,14 @@ import (
"path" "path"
"strings" "strings"
"github.com/coreos/etcd/etcdserver" "github.com/coreos/etcd/etcdserver/api"
"github.com/coreos/etcd/etcdserver/api/v2http/httptypes" "github.com/coreos/etcd/etcdserver/api/v2http/httptypes"
"github.com/coreos/etcd/etcdserver/auth" "github.com/coreos/etcd/etcdserver/auth"
) )
type authHandler struct { type authHandler struct {
sec auth.Store sec auth.Store
cluster etcdserver.Cluster cluster api.Cluster
} }
func hasWriteRootAccess(sec auth.Store, r *http.Request) bool { func hasWriteRootAccess(sec auth.Store, r *http.Request) bool {

View File

@ -19,6 +19,7 @@ import (
"net/http" "net/http"
"github.com/coreos/etcd/etcdserver" "github.com/coreos/etcd/etcdserver"
"github.com/coreos/etcd/etcdserver/api"
"github.com/coreos/etcd/lease/leasehttp" "github.com/coreos/etcd/lease/leasehttp"
"github.com/coreos/etcd/rafthttp" "github.com/coreos/etcd/rafthttp"
) )
@ -37,7 +38,7 @@ func NewPeerHandler(s *etcdserver.EtcdServer) http.Handler {
return newPeerHandler(s.Cluster(), s.RaftHandler(), lh) return newPeerHandler(s.Cluster(), s.RaftHandler(), lh)
} }
func newPeerHandler(cluster etcdserver.Cluster, raftHandler http.Handler, leaseHandler http.Handler) http.Handler { func newPeerHandler(cluster api.Cluster, raftHandler http.Handler, leaseHandler http.Handler) http.Handler {
mh := &peerMembersHandler{ mh := &peerMembersHandler{
cluster: cluster, cluster: cluster,
} }
@ -55,7 +56,7 @@ func newPeerHandler(cluster etcdserver.Cluster, raftHandler http.Handler, leaseH
} }
type peerMembersHandler struct { type peerMembersHandler struct {
cluster etcdserver.Cluster cluster api.Cluster
} }
func (h *peerMembersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (h *peerMembersHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

View File

@ -18,6 +18,7 @@ import (
"time" "time"
"github.com/coreos/etcd/etcdserver" "github.com/coreos/etcd/etcdserver"
"github.com/coreos/etcd/etcdserver/api"
"github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes" "github.com/coreos/etcd/etcdserver/api/v3rpc/rpctypes"
pb "github.com/coreos/etcd/etcdserver/etcdserverpb" pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
"github.com/coreos/etcd/pkg/types" "github.com/coreos/etcd/pkg/types"
@ -27,7 +28,7 @@ import (
) )
type ClusterServer struct { type ClusterServer struct {
cluster etcdserver.Cluster cluster api.Cluster
server etcdserver.Server server etcdserver.Server
raftTimer etcdserver.RaftTimer raftTimer etcdserver.RaftTimer
} }

View File

@ -39,24 +39,6 @@ const (
attributesSuffix = "attributes" attributesSuffix = "attributes"
) )
type Cluster interface {
// ID returns the cluster ID
ID() types.ID
// ClientURLs returns an aggregate set of all URLs on which this
// cluster is listening for client requests
ClientURLs() []string
// Members returns a slice of members sorted by their ID
Members() []*Member
// Member retrieves a particular member based on ID, or nil if the
// member does not exist in the cluster
Member(id types.ID) *Member
// IsIDRemoved checks whether the given ID has been removed from this
// cluster at some point in the past
IsIDRemoved(id types.ID) bool
// Version is the cluster-wide minimum major.minor version.
Version() *semver.Version
}
// Cluster is a list of Members that belong to the same raft cluster // Cluster is a list of Members that belong to the same raft cluster
type cluster struct { type cluster struct {
id types.ID id types.ID

View File

@ -99,7 +99,7 @@ func getClusterFromRemotePeers(urls []string, timeout time.Duration, logerr bool
// getRemotePeerURLs returns peer urls of remote members in the cluster. The // getRemotePeerURLs returns peer urls of remote members in the cluster. The
// returned list is sorted in ascending lexicographical order. // returned list is sorted in ascending lexicographical order.
func getRemotePeerURLs(cl Cluster, local string) []string { func getRemotePeerURLs(cl *cluster, local string) []string {
us := make([]string, 0) us := make([]string, 0)
for _, m := range cl.Members() { for _, m := range cl.Members() {
if m.Name == local { if m.Name == local {
@ -115,7 +115,7 @@ func getRemotePeerURLs(cl Cluster, local string) []string {
// The key of the returned map is the member's ID. The value of the returned map // The key of the returned map is the member's ID. The value of the returned map
// is the semver versions string, including server and cluster. // is the semver versions string, including server and cluster.
// If it fails to get the version of a member, the key will be nil. // If it fails to get the version of a member, the key will be nil.
func getVersions(cl Cluster, local types.ID, rt http.RoundTripper) map[string]*version.Versions { func getVersions(cl *cluster, local types.ID, rt http.RoundTripper) map[string]*version.Versions {
members := cl.Members() members := cl.Members()
vers := make(map[string]*version.Versions) vers := make(map[string]*version.Versions)
for _, m := range members { for _, m := range members {
@ -173,7 +173,7 @@ func decideClusterVersion(vers map[string]*version.Versions) *semver.Version {
// cluster version in the range of [MinClusterVersion, Version] and no known members has a cluster version // cluster version in the range of [MinClusterVersion, Version] and no known members has a cluster version
// out of the range. // out of the range.
// We set this rule since when the local member joins, another member might be offline. // We set this rule since when the local member joins, another member might be offline.
func isCompatibleWithCluster(cl Cluster, local types.ID, rt http.RoundTripper) bool { func isCompatibleWithCluster(cl *cluster, local types.ID, rt http.RoundTripper) bool {
vers := getVersions(cl, local, rt) vers := getVersions(cl, local, rt)
minV := semver.Must(semver.NewVersion(version.MinClusterVersion)) minV := semver.Must(semver.NewVersion(version.MinClusterVersion))
maxV := semver.Must(semver.NewVersion(version.Version)) maxV := semver.Must(semver.NewVersion(version.Version))

View File

@ -466,7 +466,7 @@ func (s *EtcdServer) purgeFile() {
func (s *EtcdServer) ID() types.ID { return s.id } func (s *EtcdServer) ID() types.ID { return s.id }
func (s *EtcdServer) Cluster() Cluster { return s.cluster } func (s *EtcdServer) Cluster() *cluster { return s.cluster }
func (s *EtcdServer) RaftHandler() http.Handler { return s.r.transport.Handler() } func (s *EtcdServer) RaftHandler() http.Handler { return s.r.transport.Handler() }