go.etcd.io/etcd@v3.3.27+incompatible/etcdserver/api/capability.go (about) 1 // Copyright 2015 The etcd Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package api 16 17 import ( 18 "sync" 19 20 "github.com/coreos/etcd/version" 21 "github.com/coreos/go-semver/semver" 22 "github.com/coreos/pkg/capnslog" 23 ) 24 25 type Capability string 26 27 const ( 28 AuthCapability Capability = "auth" 29 V3rpcCapability Capability = "v3rpc" 30 ) 31 32 var ( 33 plog = capnslog.NewPackageLogger("github.com/coreos/etcd", "etcdserver/api") 34 35 // capabilityMaps is a static map of version to capability map. 36 capabilityMaps = map[string]map[Capability]bool{ 37 "3.0.0": {AuthCapability: true, V3rpcCapability: true}, 38 "3.1.0": {AuthCapability: true, V3rpcCapability: true}, 39 "3.2.0": {AuthCapability: true, V3rpcCapability: true}, 40 "3.3.0": {AuthCapability: true, V3rpcCapability: true}, 41 } 42 43 enableMapMu sync.RWMutex 44 // enabledMap points to a map in capabilityMaps 45 enabledMap map[Capability]bool 46 47 curVersion *semver.Version 48 ) 49 50 func init() { 51 enabledMap = map[Capability]bool{ 52 AuthCapability: true, 53 V3rpcCapability: true, 54 } 55 } 56 57 // UpdateCapability updates the enabledMap when the cluster version increases. 58 func UpdateCapability(v *semver.Version) { 59 if v == nil { 60 // if recovered but version was never set by cluster 61 return 62 } 63 enableMapMu.Lock() 64 if curVersion != nil && !curVersion.LessThan(*v) { 65 enableMapMu.Unlock() 66 return 67 } 68 curVersion = v 69 enabledMap = capabilityMaps[curVersion.String()] 70 enableMapMu.Unlock() 71 plog.Infof("enabled capabilities for version %s", version.Cluster(v.String())) 72 } 73 74 func IsCapabilityEnabled(c Capability) bool { 75 enableMapMu.RLock() 76 defer enableMapMu.RUnlock() 77 if enabledMap == nil { 78 return false 79 } 80 return enabledMap[c] 81 } 82 83 func EnableCapability(c Capability) { 84 enableMapMu.Lock() 85 defer enableMapMu.Unlock() 86 enabledMap[c] = true 87 }