commit
a5f341e886
|
@ -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
|
||||||
|
}
|
|
@ -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 {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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() }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue