Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
20ead45a
Commit
20ead45a
authored
Nov 23, 2015
by
Tim St. Clair
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move etcd_util.go to separate package
parent
07664a61
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
195 additions
and
181 deletions
+195
-181
kube2sky.go
cluster/addons/dns/kube2sky/kube2sky.go
+2
-2
etcd_master.go
contrib/mesos/pkg/election/etcd_master.go
+7
-7
service.go
contrib/mesos/pkg/scheduler/service/service.go
+3
-3
etcd.go
pkg/api/errors/etcd/etcd.go
+11
-11
errors.go
pkg/apiserver/errors.go
+2
-2
master.go
pkg/master/master.go
+2
-1
master_test.go
pkg/master/master_test.go
+3
-2
etcd.go
pkg/registry/service/allocator/etcd/etcd.go
+2
-2
etcd_helper.go
pkg/storage/etcd/etcd_helper.go
+10
-9
etcd_helper_test.go
pkg/storage/etcd/etcd_helper_test.go
+2
-97
etcd_watcher.go
pkg/storage/etcd/etcd_watcher.go
+6
-5
doc.go
pkg/storage/etcd/util/doc.go
+19
-0
etcd_util.go
pkg/storage/etcd/util/etcd_util.go
+1
-40
etcd_util_test.go
pkg/storage/etcd/util/etcd_util_test.go
+125
-0
No files found.
cluster/addons/dns/kube2sky/kube2sky.go
View file @
20ead45a
...
@@ -40,7 +40,7 @@ import (
...
@@ -40,7 +40,7 @@ import (
kclientcmd
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
kclientcmd
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
kframework
"k8s.io/kubernetes/pkg/controller/framework"
kframework
"k8s.io/kubernetes/pkg/controller/framework"
kselector
"k8s.io/kubernetes/pkg/fields"
kselector
"k8s.io/kubernetes/pkg/fields"
etcd
storage
"k8s.io/kubernetes/pkg/storage/etcd
"
etcd
util
"k8s.io/kubernetes/pkg/storage/etcd/util
"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/pkg/util/wait"
)
)
...
@@ -418,7 +418,7 @@ func newEtcdClient(etcdServer string) (*etcd.Client, error) {
...
@@ -418,7 +418,7 @@ func newEtcdClient(etcdServer string) (*etcd.Client, error) {
err
error
err
error
)
)
for
attempt
:=
1
;
attempt
<=
maxConnectAttempts
;
attempt
++
{
for
attempt
:=
1
;
attempt
<=
maxConnectAttempts
;
attempt
++
{
if
_
,
err
=
etcd
storage
.
GetEtcdVersion
(
etcdServer
);
err
==
nil
{
if
_
,
err
=
etcd
util
.
GetEtcdVersion
(
etcdServer
);
err
==
nil
{
break
break
}
}
if
attempt
==
maxConnectAttempts
{
if
attempt
==
maxConnectAttempts
{
...
...
contrib/mesos/pkg/election/etcd_master.go
View file @
20ead45a
...
@@ -22,7 +22,7 @@ import (
...
@@ -22,7 +22,7 @@ import (
"github.com/coreos/go-etcd/etcd"
"github.com/coreos/go-etcd/etcd"
"github.com/golang/glog"
"github.com/golang/glog"
etcd
storage
"k8s.io/kubernetes/pkg/storage/etcd
"
etcd
util
"k8s.io/kubernetes/pkg/storage/etcd/util
"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/watch"
"k8s.io/kubernetes/pkg/watch"
...
@@ -91,10 +91,10 @@ func (e *etcdMasterElector) extendMaster(path, id string, ttl uint64, res *etcd.
...
@@ -91,10 +91,10 @@ func (e *etcdMasterElector) extendMaster(path, id string, ttl uint64, res *etcd.
// We don't handle the TTL delete w/o a write case here, it's handled in the next loop
// We don't handle the TTL delete w/o a write case here, it's handled in the next loop
// iteration.
// iteration.
_
,
err
:=
e
.
etcd
.
CompareAndSwap
(
path
,
id
,
ttl
,
""
,
res
.
Node
.
ModifiedIndex
)
_
,
err
:=
e
.
etcd
.
CompareAndSwap
(
path
,
id
,
ttl
,
""
,
res
.
Node
.
ModifiedIndex
)
if
err
!=
nil
&&
!
etcd
storage
.
IsEtcdTestFailed
(
err
)
{
if
err
!=
nil
&&
!
etcd
util
.
IsEtcdTestFailed
(
err
)
{
return
""
,
err
return
""
,
err
}
}
if
err
!=
nil
&&
etcd
storage
.
IsEtcdTestFailed
(
err
)
{
if
err
!=
nil
&&
etcd
util
.
IsEtcdTestFailed
(
err
)
{
return
""
,
nil
return
""
,
nil
}
}
return
id
,
nil
return
id
,
nil
...
@@ -106,11 +106,11 @@ func (e *etcdMasterElector) extendMaster(path, id string, ttl uint64, res *etcd.
...
@@ -106,11 +106,11 @@ func (e *etcdMasterElector) extendMaster(path, id string, ttl uint64, res *etcd.
// returns "", err if an error occurred
// returns "", err if an error occurred
func
(
e
*
etcdMasterElector
)
becomeMaster
(
path
,
id
string
,
ttl
uint64
)
(
string
,
error
)
{
func
(
e
*
etcdMasterElector
)
becomeMaster
(
path
,
id
string
,
ttl
uint64
)
(
string
,
error
)
{
_
,
err
:=
e
.
etcd
.
Create
(
path
,
id
,
ttl
)
_
,
err
:=
e
.
etcd
.
Create
(
path
,
id
,
ttl
)
if
err
!=
nil
&&
!
etcd
storage
.
IsEtcdNodeExist
(
err
)
{
if
err
!=
nil
&&
!
etcd
util
.
IsEtcdNodeExist
(
err
)
{
// unexpected error
// unexpected error
return
""
,
err
return
""
,
err
}
}
if
err
!=
nil
&&
etcd
storage
.
IsEtcdNodeExist
(
err
)
{
if
err
!=
nil
&&
etcd
util
.
IsEtcdNodeExist
(
err
)
{
return
""
,
nil
return
""
,
nil
}
}
return
id
,
nil
return
id
,
nil
...
@@ -125,12 +125,12 @@ func (e *etcdMasterElector) handleMaster(path, id string, ttl uint64) (string, e
...
@@ -125,12 +125,12 @@ func (e *etcdMasterElector) handleMaster(path, id string, ttl uint64) (string, e
res
,
err
:=
e
.
etcd
.
Get
(
path
,
false
,
false
)
res
,
err
:=
e
.
etcd
.
Get
(
path
,
false
,
false
)
// Unexpected error, bail out
// Unexpected error, bail out
if
err
!=
nil
&&
!
etcd
storage
.
IsEtcdNotFound
(
err
)
{
if
err
!=
nil
&&
!
etcd
util
.
IsEtcdNotFound
(
err
)
{
return
""
,
err
return
""
,
err
}
}
// There is no master, try to become the master.
// There is no master, try to become the master.
if
err
!=
nil
&&
etcd
storage
.
IsEtcdNotFound
(
err
)
{
if
err
!=
nil
&&
etcd
util
.
IsEtcdNotFound
(
err
)
{
return
e
.
becomeMaster
(
path
,
id
,
ttl
)
return
e
.
becomeMaster
(
path
,
id
,
ttl
)
}
}
...
...
contrib/mesos/pkg/scheduler/service/service.go
View file @
20ead45a
...
@@ -73,7 +73,7 @@ import (
...
@@ -73,7 +73,7 @@ import (
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/healthz"
"k8s.io/kubernetes/pkg/healthz"
"k8s.io/kubernetes/pkg/master/ports"
"k8s.io/kubernetes/pkg/master/ports"
etcd
storage
"k8s.io/kubernetes/pkg/storage/etcd
"
etcd
util
"k8s.io/kubernetes/pkg/storage/etcd/util
"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/tools"
// lock to this API version, compilation will fail when this becomes unsupported
// lock to this API version, compilation will fail when this becomes unsupported
...
@@ -894,7 +894,7 @@ func (s *SchedulerServer) buildFrameworkInfo() (info *mesos.FrameworkInfo, cred
...
@@ -894,7 +894,7 @@ func (s *SchedulerServer) buildFrameworkInfo() (info *mesos.FrameworkInfo, cred
func
(
s
*
SchedulerServer
)
fetchFrameworkID
(
client
tools
.
EtcdClient
)
(
*
mesos
.
FrameworkID
,
error
)
{
func
(
s
*
SchedulerServer
)
fetchFrameworkID
(
client
tools
.
EtcdClient
)
(
*
mesos
.
FrameworkID
,
error
)
{
if
s
.
failoverTimeout
>
0
{
if
s
.
failoverTimeout
>
0
{
if
response
,
err
:=
client
.
Get
(
meta
.
FrameworkIDKey
,
false
,
false
);
err
!=
nil
{
if
response
,
err
:=
client
.
Get
(
meta
.
FrameworkIDKey
,
false
,
false
);
err
!=
nil
{
if
!
etcd
storage
.
IsEtcdNotFound
(
err
)
{
if
!
etcd
util
.
IsEtcdNotFound
(
err
)
{
return
nil
,
fmt
.
Errorf
(
"unexpected failure attempting to load framework ID from etcd: %v"
,
err
)
return
nil
,
fmt
.
Errorf
(
"unexpected failure attempting to load framework ID from etcd: %v"
,
err
)
}
}
log
.
V
(
1
)
.
Infof
(
"did not find framework ID in etcd"
)
log
.
V
(
1
)
.
Infof
(
"did not find framework ID in etcd"
)
...
@@ -905,7 +905,7 @@ func (s *SchedulerServer) fetchFrameworkID(client tools.EtcdClient) (*mesos.Fram
...
@@ -905,7 +905,7 @@ func (s *SchedulerServer) fetchFrameworkID(client tools.EtcdClient) (*mesos.Fram
}
else
{
}
else
{
//TODO(jdef) this seems like a totally hackish way to clean up the framework ID
//TODO(jdef) this seems like a totally hackish way to clean up the framework ID
if
_
,
err
:=
client
.
Delete
(
meta
.
FrameworkIDKey
,
true
);
err
!=
nil
{
if
_
,
err
:=
client
.
Delete
(
meta
.
FrameworkIDKey
,
true
);
err
!=
nil
{
if
!
etcd
storage
.
IsEtcdNotFound
(
err
)
{
if
!
etcd
util
.
IsEtcdNotFound
(
err
)
{
return
nil
,
fmt
.
Errorf
(
"failed to delete framework ID from etcd: %v"
,
err
)
return
nil
,
fmt
.
Errorf
(
"failed to delete framework ID from etcd: %v"
,
err
)
}
}
log
.
V
(
1
)
.
Infof
(
"nothing to delete: did not find framework ID in etcd"
)
log
.
V
(
1
)
.
Infof
(
"nothing to delete: did not find framework ID in etcd"
)
...
...
pkg/api/errors/etcd/etcd.go
View file @
20ead45a
...
@@ -18,16 +18,16 @@ package etcd
...
@@ -18,16 +18,16 @@ package etcd
import
(
import
(
"k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/errors"
etcd
storage
"k8s.io/kubernetes/pkg/storage/etcd
"
etcd
util
"k8s.io/kubernetes/pkg/storage/etcd/util
"
)
)
// InterpretListError converts a generic etcd error on a retrieval
// InterpretListError converts a generic etcd error on a retrieval
// operation into the appropriate API error.
// operation into the appropriate API error.
func
InterpretListError
(
err
error
,
kind
string
)
error
{
func
InterpretListError
(
err
error
,
kind
string
)
error
{
switch
{
switch
{
case
etcd
storage
.
IsEtcdNotFound
(
err
)
:
case
etcd
util
.
IsEtcdNotFound
(
err
)
:
return
errors
.
NewNotFound
(
kind
,
""
)
return
errors
.
NewNotFound
(
kind
,
""
)
case
etcd
storage
.
IsEtcdUnreachable
(
err
)
:
case
etcd
util
.
IsEtcdUnreachable
(
err
)
:
return
errors
.
NewServerTimeout
(
kind
,
"list"
,
2
)
// TODO: make configurable or handled at a higher level
return
errors
.
NewServerTimeout
(
kind
,
"list"
,
2
)
// TODO: make configurable or handled at a higher level
default
:
default
:
return
err
return
err
...
@@ -38,9 +38,9 @@ func InterpretListError(err error, kind string) error {
...
@@ -38,9 +38,9 @@ func InterpretListError(err error, kind string) error {
// operation into the appropriate API error.
// operation into the appropriate API error.
func
InterpretGetError
(
err
error
,
kind
,
name
string
)
error
{
func
InterpretGetError
(
err
error
,
kind
,
name
string
)
error
{
switch
{
switch
{
case
etcd
storage
.
IsEtcdNotFound
(
err
)
:
case
etcd
util
.
IsEtcdNotFound
(
err
)
:
return
errors
.
NewNotFound
(
kind
,
name
)
return
errors
.
NewNotFound
(
kind
,
name
)
case
etcd
storage
.
IsEtcdUnreachable
(
err
)
:
case
etcd
util
.
IsEtcdUnreachable
(
err
)
:
return
errors
.
NewServerTimeout
(
kind
,
"get"
,
2
)
// TODO: make configurable or handled at a higher level
return
errors
.
NewServerTimeout
(
kind
,
"get"
,
2
)
// TODO: make configurable or handled at a higher level
default
:
default
:
return
err
return
err
...
@@ -51,9 +51,9 @@ func InterpretGetError(err error, kind, name string) error {
...
@@ -51,9 +51,9 @@ func InterpretGetError(err error, kind, name string) error {
// operation into the appropriate API error.
// operation into the appropriate API error.
func
InterpretCreateError
(
err
error
,
kind
,
name
string
)
error
{
func
InterpretCreateError
(
err
error
,
kind
,
name
string
)
error
{
switch
{
switch
{
case
etcd
storage
.
IsEtcdNodeExist
(
err
)
:
case
etcd
util
.
IsEtcdNodeExist
(
err
)
:
return
errors
.
NewAlreadyExists
(
kind
,
name
)
return
errors
.
NewAlreadyExists
(
kind
,
name
)
case
etcd
storage
.
IsEtcdUnreachable
(
err
)
:
case
etcd
util
.
IsEtcdUnreachable
(
err
)
:
return
errors
.
NewServerTimeout
(
kind
,
"create"
,
2
)
// TODO: make configurable or handled at a higher level
return
errors
.
NewServerTimeout
(
kind
,
"create"
,
2
)
// TODO: make configurable or handled at a higher level
default
:
default
:
return
err
return
err
...
@@ -64,9 +64,9 @@ func InterpretCreateError(err error, kind, name string) error {
...
@@ -64,9 +64,9 @@ func InterpretCreateError(err error, kind, name string) error {
// operation into the appropriate API error.
// operation into the appropriate API error.
func
InterpretUpdateError
(
err
error
,
kind
,
name
string
)
error
{
func
InterpretUpdateError
(
err
error
,
kind
,
name
string
)
error
{
switch
{
switch
{
case
etcd
storage
.
IsEtcdTestFailed
(
err
),
etcdstorage
.
IsEtcdNodeExist
(
err
)
:
case
etcd
util
.
IsEtcdTestFailed
(
err
),
etcdutil
.
IsEtcdNodeExist
(
err
)
:
return
errors
.
NewConflict
(
kind
,
name
,
err
)
return
errors
.
NewConflict
(
kind
,
name
,
err
)
case
etcd
storage
.
IsEtcdUnreachable
(
err
)
:
case
etcd
util
.
IsEtcdUnreachable
(
err
)
:
return
errors
.
NewServerTimeout
(
kind
,
"update"
,
2
)
// TODO: make configurable or handled at a higher level
return
errors
.
NewServerTimeout
(
kind
,
"update"
,
2
)
// TODO: make configurable or handled at a higher level
default
:
default
:
return
err
return
err
...
@@ -77,9 +77,9 @@ func InterpretUpdateError(err error, kind, name string) error {
...
@@ -77,9 +77,9 @@ func InterpretUpdateError(err error, kind, name string) error {
// operation into the appropriate API error.
// operation into the appropriate API error.
func
InterpretDeleteError
(
err
error
,
kind
,
name
string
)
error
{
func
InterpretDeleteError
(
err
error
,
kind
,
name
string
)
error
{
switch
{
switch
{
case
etcd
storage
.
IsEtcdNotFound
(
err
)
:
case
etcd
util
.
IsEtcdNotFound
(
err
)
:
return
errors
.
NewNotFound
(
kind
,
name
)
return
errors
.
NewNotFound
(
kind
,
name
)
case
etcd
storage
.
IsEtcdUnreachable
(
err
)
:
case
etcd
util
.
IsEtcdUnreachable
(
err
)
:
return
errors
.
NewServerTimeout
(
kind
,
"delete"
,
2
)
// TODO: make configurable or handled at a higher level
return
errors
.
NewServerTimeout
(
kind
,
"delete"
,
2
)
// TODO: make configurable or handled at a higher level
default
:
default
:
return
err
return
err
...
...
pkg/apiserver/errors.go
View file @
20ead45a
...
@@ -21,7 +21,7 @@ import (
...
@@ -21,7 +21,7 @@ import (
"net/http"
"net/http"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/unversioned"
etcd
storage
"k8s.io/kubernetes/pkg/storage/etcd
"
etcd
util
"k8s.io/kubernetes/pkg/storage/etcd/util
"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util"
)
)
...
@@ -52,7 +52,7 @@ func errToAPIStatus(err error) *unversioned.Status {
...
@@ -52,7 +52,7 @@ func errToAPIStatus(err error) *unversioned.Status {
status
:=
http
.
StatusInternalServerError
status
:=
http
.
StatusInternalServerError
switch
{
switch
{
//TODO: replace me with NewConflictErr
//TODO: replace me with NewConflictErr
case
etcd
storage
.
IsEtcdTestFailed
(
err
)
:
case
etcd
util
.
IsEtcdTestFailed
(
err
)
:
status
=
http
.
StatusConflict
status
=
http
.
StatusConflict
}
}
// Log errors that were not converted to an error status
// Log errors that were not converted to an error status
...
...
pkg/master/master.go
View file @
20ead45a
...
@@ -76,6 +76,7 @@ import (
...
@@ -76,6 +76,7 @@ import (
thirdpartyresourcedataetcd
"k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd"
thirdpartyresourcedataetcd
"k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata/etcd"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage"
etcdstorage
"k8s.io/kubernetes/pkg/storage/etcd"
etcdstorage
"k8s.io/kubernetes/pkg/storage/etcd"
etcdutil
"k8s.io/kubernetes/pkg/storage/etcd/util"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/ui"
"k8s.io/kubernetes/pkg/ui"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util"
...
@@ -855,7 +856,7 @@ func (m *Master) getServersToValidate(c *Config) map[string]apiserver.Server {
...
@@ -855,7 +856,7 @@ func (m *Master) getServersToValidate(c *Config) map[string]apiserver.Server {
addr
=
etcdUrl
.
Host
addr
=
etcdUrl
.
Host
port
=
4001
port
=
4001
}
}
serversToValidate
[
fmt
.
Sprintf
(
"etcd-%d"
,
ix
)]
=
apiserver
.
Server
{
Addr
:
addr
,
Port
:
port
,
Path
:
"/health"
,
Validate
:
etcd
storage
.
EtcdHealthCheck
}
serversToValidate
[
fmt
.
Sprintf
(
"etcd-%d"
,
ix
)]
=
apiserver
.
Server
{
Addr
:
addr
,
Port
:
port
,
Path
:
"/health"
,
Validate
:
etcd
util
.
EtcdHealthCheck
}
}
}
return
serversToValidate
return
serversToValidate
}
}
...
...
pkg/master/master_test.go
View file @
20ead45a
...
@@ -49,6 +49,7 @@ import (
...
@@ -49,6 +49,7 @@ import (
etcdstorage
"k8s.io/kubernetes/pkg/storage/etcd"
etcdstorage
"k8s.io/kubernetes/pkg/storage/etcd"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
etcdtesting
"k8s.io/kubernetes/pkg/storage/etcd/testing"
etcdtesting
"k8s.io/kubernetes/pkg/storage/etcd/testing"
etcdutil
"k8s.io/kubernetes/pkg/storage/etcd/util"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util/intstr"
"k8s.io/kubernetes/pkg/util/intstr"
...
@@ -806,7 +807,7 @@ func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) {
...
@@ -806,7 +807,7 @@ func testInstallThirdPartyAPIDeleteVersion(t *testing.T, version string) {
thirdPartyObj
:=
extensions
.
ThirdPartyResourceData
{}
thirdPartyObj
:=
extensions
.
ThirdPartyResourceData
{}
err
=
master
.
thirdPartyStorage
.
Get
(
err
=
master
.
thirdPartyStorage
.
Get
(
context
.
TODO
(),
expectedDeletedKey
,
&
thirdPartyObj
,
false
)
context
.
TODO
(),
expectedDeletedKey
,
&
thirdPartyObj
,
false
)
if
!
etcd
storage
.
IsEtcdNotFound
(
err
)
{
if
!
etcd
util
.
IsEtcdNotFound
(
err
)
{
t
.
Errorf
(
"expected deletion didn't happen: %v"
,
err
)
t
.
Errorf
(
"expected deletion didn't happen: %v"
,
err
)
}
}
}
}
...
@@ -893,7 +894,7 @@ func testInstallThirdPartyResourceRemove(t *testing.T, version string) {
...
@@ -893,7 +894,7 @@ func testInstallThirdPartyResourceRemove(t *testing.T, version string) {
for
_
,
key
:=
range
expectedDeletedKeys
{
for
_
,
key
:=
range
expectedDeletedKeys
{
thirdPartyObj
:=
extensions
.
ThirdPartyResourceData
{}
thirdPartyObj
:=
extensions
.
ThirdPartyResourceData
{}
err
:=
master
.
thirdPartyStorage
.
Get
(
context
.
TODO
(),
key
,
&
thirdPartyObj
,
false
)
err
:=
master
.
thirdPartyStorage
.
Get
(
context
.
TODO
(),
key
,
&
thirdPartyObj
,
false
)
if
!
etcd
storage
.
IsEtcdNotFound
(
err
)
{
if
!
etcd
util
.
IsEtcdNotFound
(
err
)
{
t
.
Errorf
(
"expected deletion didn't happen: %v"
,
err
)
t
.
Errorf
(
"expected deletion didn't happen: %v"
,
err
)
}
}
}
}
...
...
pkg/registry/service/allocator/etcd/etcd.go
View file @
20ead45a
...
@@ -28,7 +28,7 @@ import (
...
@@ -28,7 +28,7 @@ import (
"k8s.io/kubernetes/pkg/registry/service/allocator"
"k8s.io/kubernetes/pkg/registry/service/allocator"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage"
etcd
storage
"k8s.io/kubernetes/pkg/storage/etcd
"
etcd
util
"k8s.io/kubernetes/pkg/storage/etcd/util
"
"golang.org/x/net/context"
"golang.org/x/net/context"
)
)
...
@@ -174,7 +174,7 @@ func (e *Etcd) Refresh() (*api.RangeAllocation, error) {
...
@@ -174,7 +174,7 @@ func (e *Etcd) Refresh() (*api.RangeAllocation, error) {
existing
:=
&
api
.
RangeAllocation
{}
existing
:=
&
api
.
RangeAllocation
{}
if
err
:=
e
.
storage
.
Get
(
context
.
TODO
(),
e
.
baseKey
,
existing
,
false
);
err
!=
nil
{
if
err
:=
e
.
storage
.
Get
(
context
.
TODO
(),
e
.
baseKey
,
existing
,
false
);
err
!=
nil
{
if
etcd
storage
.
IsEtcdNotFound
(
err
)
{
if
etcd
util
.
IsEtcdNotFound
(
err
)
{
return
nil
,
nil
return
nil
,
nil
}
}
return
nil
,
etcderr
.
InterpretGetError
(
err
,
e
.
kind
,
""
)
return
nil
,
etcderr
.
InterpretGetError
(
err
,
e
.
kind
,
""
)
...
...
pkg/storage/etcd/etcd_helper.go
View file @
20ead45a
...
@@ -30,6 +30,7 @@ import (
...
@@ -30,6 +30,7 @@ import (
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage/etcd/metrics"
"k8s.io/kubernetes/pkg/storage/etcd/metrics"
etcdutil
"k8s.io/kubernetes/pkg/storage/etcd/util"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/watch"
"k8s.io/kubernetes/pkg/watch"
...
@@ -179,7 +180,7 @@ func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object)
...
@@ -179,7 +180,7 @@ func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object)
startTime
:=
time
.
Now
()
startTime
:=
time
.
Now
()
response
,
err
:=
h
.
client
.
Delete
(
key
,
false
)
response
,
err
:=
h
.
client
.
Delete
(
key
,
false
)
metrics
.
RecordEtcdRequestLatency
(
"delete"
,
getTypeName
(
out
),
startTime
)
metrics
.
RecordEtcdRequestLatency
(
"delete"
,
getTypeName
(
out
),
startTime
)
if
!
IsEtcdNotFound
(
err
)
{
if
!
etcdutil
.
IsEtcdNotFound
(
err
)
{
// if the object that existed prior to the delete is returned by etcd, update out.
// if the object that existed prior to the delete is returned by etcd, update out.
if
err
!=
nil
||
response
.
PrevNode
!=
nil
{
if
err
!=
nil
||
response
.
PrevNode
!=
nil
{
_
,
_
,
err
=
h
.
extractObj
(
response
,
err
,
out
,
false
,
true
)
_
,
_
,
err
=
h
.
extractObj
(
response
,
err
,
out
,
false
,
true
)
...
@@ -230,7 +231,7 @@ func (h *etcdHelper) bodyAndExtractObj(ctx context.Context, key string, objPtr r
...
@@ -230,7 +231,7 @@ func (h *etcdHelper) bodyAndExtractObj(ctx context.Context, key string, objPtr r
response
,
err
:=
h
.
client
.
Get
(
key
,
false
,
false
)
response
,
err
:=
h
.
client
.
Get
(
key
,
false
,
false
)
metrics
.
RecordEtcdRequestLatency
(
"get"
,
getTypeName
(
objPtr
),
startTime
)
metrics
.
RecordEtcdRequestLatency
(
"get"
,
getTypeName
(
objPtr
),
startTime
)
if
err
!=
nil
&&
!
IsEtcdNotFound
(
err
)
{
if
err
!=
nil
&&
!
etcdutil
.
IsEtcdNotFound
(
err
)
{
return
""
,
nil
,
nil
,
err
return
""
,
nil
,
nil
,
err
}
}
body
,
node
,
err
=
h
.
extractObj
(
response
,
err
,
objPtr
,
ignoreNotFound
,
false
)
body
,
node
,
err
=
h
.
extractObj
(
response
,
err
,
objPtr
,
ignoreNotFound
,
false
)
...
@@ -284,7 +285,7 @@ func (h *etcdHelper) GetToList(ctx context.Context, key string, filter storage.F
...
@@ -284,7 +285,7 @@ func (h *etcdHelper) GetToList(ctx context.Context, key string, filter storage.F
metrics
.
RecordEtcdRequestLatency
(
"get"
,
getTypeName
(
listPtr
),
startTime
)
metrics
.
RecordEtcdRequestLatency
(
"get"
,
getTypeName
(
listPtr
),
startTime
)
trace
.
Step
(
"Etcd node read"
)
trace
.
Step
(
"Etcd node read"
)
if
err
!=
nil
{
if
err
!=
nil
{
if
IsEtcdNotFound
(
err
)
{
if
etcdutil
.
IsEtcdNotFound
(
err
)
{
return
nil
return
nil
}
}
return
err
return
err
...
@@ -387,12 +388,12 @@ func (h *etcdHelper) listEtcdNode(ctx context.Context, key string) ([]*etcd.Node
...
@@ -387,12 +388,12 @@ func (h *etcdHelper) listEtcdNode(ctx context.Context, key string) ([]*etcd.Node
}
}
result
,
err
:=
h
.
client
.
Get
(
key
,
true
,
true
)
result
,
err
:=
h
.
client
.
Get
(
key
,
true
,
true
)
if
err
!=
nil
{
if
err
!=
nil
{
index
,
ok
:=
etcdErrorIndex
(
err
)
var
index
uint64
if
!
ok
{
if
etcdError
,
ok
:=
err
.
(
*
etcd
.
EtcdError
);
ok
{
index
=
0
index
=
etcdError
.
Index
}
}
nodes
:=
make
([]
*
etcd
.
Node
,
0
)
nodes
:=
make
([]
*
etcd
.
Node
,
0
)
if
IsEtcdNotFound
(
err
)
{
if
etcdutil
.
IsEtcdNotFound
(
err
)
{
return
nodes
,
index
,
nil
return
nodes
,
index
,
nil
}
else
{
}
else
{
return
nodes
,
index
,
err
return
nodes
,
index
,
err
...
@@ -464,7 +465,7 @@ func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType
...
@@ -464,7 +465,7 @@ func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType
startTime
:=
time
.
Now
()
startTime
:=
time
.
Now
()
response
,
err
:=
h
.
client
.
Create
(
key
,
string
(
data
),
ttl
)
response
,
err
:=
h
.
client
.
Create
(
key
,
string
(
data
),
ttl
)
metrics
.
RecordEtcdRequestLatency
(
"create"
,
getTypeName
(
ptrToType
),
startTime
)
metrics
.
RecordEtcdRequestLatency
(
"create"
,
getTypeName
(
ptrToType
),
startTime
)
if
IsEtcdNodeExist
(
err
)
{
if
etcdutil
.
IsEtcdNodeExist
(
err
)
{
continue
continue
}
}
_
,
_
,
err
=
h
.
extractObj
(
response
,
err
,
ptrToType
,
false
,
false
)
_
,
_
,
err
=
h
.
extractObj
(
response
,
err
,
ptrToType
,
false
,
false
)
...
@@ -479,7 +480,7 @@ func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType
...
@@ -479,7 +480,7 @@ func (h *etcdHelper) GuaranteedUpdate(ctx context.Context, key string, ptrToType
// Swap origBody with data, if origBody is the latest etcd data.
// Swap origBody with data, if origBody is the latest etcd data.
response
,
err
:=
h
.
client
.
CompareAndSwap
(
key
,
string
(
data
),
ttl
,
origBody
,
index
)
response
,
err
:=
h
.
client
.
CompareAndSwap
(
key
,
string
(
data
),
ttl
,
origBody
,
index
)
metrics
.
RecordEtcdRequestLatency
(
"compareAndSwap"
,
getTypeName
(
ptrToType
),
startTime
)
metrics
.
RecordEtcdRequestLatency
(
"compareAndSwap"
,
getTypeName
(
ptrToType
),
startTime
)
if
IsEtcdTestFailed
(
err
)
{
if
etcdutil
.
IsEtcdTestFailed
(
err
)
{
// Try again.
// Try again.
continue
continue
}
}
...
...
pkg/storage/etcd/etcd_helper_test.go
View file @
20ead45a
...
@@ -17,19 +17,11 @@ limitations under the License.
...
@@ -17,19 +17,11 @@ limitations under the License.
package
etcd
package
etcd
import
(
import
(
"fmt"
"math/rand"
"net"
"net/http"
"net/http/httptest"
"path"
"path"
"reflect"
"reflect"
"strconv"
"sync"
"sync"
"testing"
"testing"
"time"
"github.com/coreos/go-etcd/etcd"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
"golang.org/x/net/context"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
...
@@ -40,6 +32,7 @@ import (
...
@@ -40,6 +32,7 @@ import (
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
"k8s.io/kubernetes/pkg/storage/etcd/etcdtest"
etcdtesting
"k8s.io/kubernetes/pkg/storage/etcd/testing"
etcdtesting
"k8s.io/kubernetes/pkg/storage/etcd/testing"
etcdutil
"k8s.io/kubernetes/pkg/storage/etcd/util"
storagetesting
"k8s.io/kubernetes/pkg/storage/testing"
storagetesting
"k8s.io/kubernetes/pkg/storage/testing"
// TODO: once fakeClient has been purged move utils
// TODO: once fakeClient has been purged move utils
...
@@ -69,18 +62,6 @@ func newEtcdHelper(client tools.EtcdClient, codec runtime.Codec, prefix string)
...
@@ -69,18 +62,6 @@ func newEtcdHelper(client tools.EtcdClient, codec runtime.Codec, prefix string)
return
*
NewEtcdStorage
(
client
,
codec
,
prefix
)
.
(
*
etcdHelper
)
return
*
NewEtcdStorage
(
client
,
codec
,
prefix
)
.
(
*
etcdHelper
)
}
}
func
TestIsEtcdNotFound
(
t
*
testing
.
T
)
{
try
:=
func
(
err
error
,
isNotFound
bool
)
{
if
IsEtcdNotFound
(
err
)
!=
isNotFound
{
t
.
Errorf
(
"Expected %#v to return %v, but it did not"
,
err
,
isNotFound
)
}
}
try
(
tools
.
EtcdErrorNotFound
,
true
)
try
(
&
etcd
.
EtcdError
{
ErrorCode
:
101
},
false
)
try
(
nil
,
false
)
try
(
fmt
.
Errorf
(
"some other kind of error"
),
false
)
}
// Returns an encoded version of api.Pod with the given name.
// Returns an encoded version of api.Pod with the given name.
func
getEncodedPod
(
name
string
)
string
{
func
getEncodedPod
(
name
string
)
string
{
pod
,
_
:=
testapi
.
Default
.
Codec
()
.
Encode
(
&
api
.
Pod
{
pod
,
_
:=
testapi
.
Default
.
Codec
()
.
Encode
(
&
api
.
Pod
{
...
@@ -265,7 +246,7 @@ func TestGetNotFoundErr(t *testing.T) {
...
@@ -265,7 +246,7 @@ func TestGetNotFoundErr(t *testing.T) {
var
got
api
.
Pod
var
got
api
.
Pod
err
:=
helper
.
Get
(
context
.
TODO
(),
boguskey
,
&
got
,
false
)
err
:=
helper
.
Get
(
context
.
TODO
(),
boguskey
,
&
got
,
false
)
if
!
IsEtcdNotFound
(
err
)
{
if
!
etcdutil
.
IsEtcdNotFound
(
err
)
{
t
.
Errorf
(
"Unexpected reponse on key=%v, err=%v"
,
key
,
err
)
t
.
Errorf
(
"Unexpected reponse on key=%v, err=%v"
,
key
,
err
)
}
}
}
}
...
@@ -539,53 +520,6 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
...
@@ -539,53 +520,6 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
}
}
}
}
func
TestGetEtcdVersion_ValidVersion
(
t
*
testing
.
T
)
{
testServer
:=
httptest
.
NewServer
(
http
.
HandlerFunc
(
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
fmt
.
Fprint
(
w
,
validEtcdVersion
)
}))
defer
testServer
.
Close
()
var
version
string
var
err
error
if
version
,
err
=
GetEtcdVersion
(
testServer
.
URL
);
err
!=
nil
{
t
.
Errorf
(
"Unexpected error: %v"
,
err
)
}
assert
.
Equal
(
t
,
validEtcdVersion
,
version
,
"Unexpected version"
)
assert
.
Nil
(
t
,
err
)
}
func
TestGetEtcdVersion_ErrorStatus
(
t
*
testing
.
T
)
{
testServer
:=
httptest
.
NewServer
(
http
.
HandlerFunc
(
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
w
.
WriteHeader
(
http
.
StatusServiceUnavailable
)
}))
defer
testServer
.
Close
()
_
,
err
:=
GetEtcdVersion
(
testServer
.
URL
)
assert
.
NotNil
(
t
,
err
)
}
func
TestGetEtcdVersion_NotListening
(
t
*
testing
.
T
)
{
portIsOpen
:=
func
(
port
int
)
bool
{
conn
,
err
:=
net
.
DialTimeout
(
"tcp"
,
"127.0.0.1:"
+
strconv
.
Itoa
(
port
),
1
*
time
.
Second
)
if
err
==
nil
{
conn
.
Close
()
return
true
}
return
false
}
port
:=
rand
.
Intn
((
1
<<
16
)
-
1
)
for
tried
:=
0
;
portIsOpen
(
port
);
tried
++
{
if
tried
>=
10
{
t
.
Fatal
(
"Couldn't find a closed TCP port to continue testing"
)
}
port
++
}
_
,
err
:=
GetEtcdVersion
(
"http://127.0.0.1:"
+
strconv
.
Itoa
(
port
))
assert
.
NotNil
(
t
,
err
)
}
func
TestPrefixEtcdKey
(
t
*
testing
.
T
)
{
func
TestPrefixEtcdKey
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
defer
server
.
Terminate
(
t
)
...
@@ -606,32 +540,3 @@ func TestPrefixEtcdKey(t *testing.T) {
...
@@ -606,32 +540,3 @@ func TestPrefixEtcdKey(t *testing.T) {
assert
.
Equal
(
t
,
keyBefore
,
keyAfter
,
"Prefix incorrectly added by EtcdHelper"
)
assert
.
Equal
(
t
,
keyBefore
,
keyAfter
,
"Prefix incorrectly added by EtcdHelper"
)
}
}
func
TestEtcdHealthCheck
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
data
string
expectErr
bool
}{
{
data
:
"{
\"
health
\"
:
\"
true
\"
}"
,
expectErr
:
false
,
},
{
data
:
"{
\"
health
\"
:
\"
false
\"
}"
,
expectErr
:
true
,
},
{
data
:
"invalid json"
,
expectErr
:
true
,
},
}
for
_
,
test
:=
range
tests
{
err
:=
EtcdHealthCheck
([]
byte
(
test
.
data
))
if
err
!=
nil
&&
!
test
.
expectErr
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
if
err
==
nil
&&
test
.
expectErr
{
t
.
Error
(
"unexpected non-error"
)
}
}
}
pkg/storage/etcd/etcd_watcher.go
View file @
20ead45a
...
@@ -24,6 +24,7 @@ import (
...
@@ -24,6 +24,7 @@ import (
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/api/unversioned"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage"
etcdutil
"k8s.io/kubernetes/pkg/storage/etcd/util"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/watch"
"k8s.io/kubernetes/pkg/watch"
...
@@ -139,12 +140,12 @@ func (w *etcdWatcher) etcdWatch(client tools.EtcdClient, key string, resourceVer
...
@@ -139,12 +140,12 @@ func (w *etcdWatcher) etcdWatch(client tools.EtcdClient, key string, resourceVer
func
etcdGetInitialWatchState
(
client
tools
.
EtcdClient
,
key
string
,
recursive
bool
,
incoming
chan
<-
*
etcd
.
Response
)
(
resourceVersion
uint64
,
err
error
)
{
func
etcdGetInitialWatchState
(
client
tools
.
EtcdClient
,
key
string
,
recursive
bool
,
incoming
chan
<-
*
etcd
.
Response
)
(
resourceVersion
uint64
,
err
error
)
{
resp
,
err
:=
client
.
Get
(
key
,
false
,
recursive
)
resp
,
err
:=
client
.
Get
(
key
,
false
,
recursive
)
if
err
!=
nil
{
if
err
!=
nil
{
if
!
IsEtcdNotFound
(
err
)
{
if
!
etcdutil
.
IsEtcdNotFound
(
err
)
{
glog
.
Errorf
(
"watch was unable to retrieve the current index for the provided key (%q): %v"
,
key
,
err
)
glog
.
Errorf
(
"watch was unable to retrieve the current index for the provided key (%q): %v"
,
key
,
err
)
return
resourceVersion
,
err
return
resourceVersion
,
err
}
}
if
index
,
ok
:=
etcdErrorIndex
(
er
r
);
ok
{
if
etcdError
,
ok
:=
err
.
(
*
etcd
.
EtcdErro
r
);
ok
{
resourceVersion
=
i
ndex
resourceVersion
=
etcdError
.
I
ndex
}
}
return
resourceVersion
,
nil
return
resourceVersion
,
nil
}
}
...
@@ -184,7 +185,7 @@ func (w *etcdWatcher) translate() {
...
@@ -184,7 +185,7 @@ func (w *etcdWatcher) translate() {
if
err
!=
nil
{
if
err
!=
nil
{
var
status
*
unversioned
.
Status
var
status
*
unversioned
.
Status
switch
{
switch
{
case
IsEtcdWatchExpired
(
err
)
:
case
etcdutil
.
IsEtcdWatchExpired
(
err
)
:
status
=
&
unversioned
.
Status
{
status
=
&
unversioned
.
Status
{
Status
:
unversioned
.
StatusFailure
,
Status
:
unversioned
.
StatusFailure
,
Message
:
err
.
Error
(),
Message
:
err
.
Error
(),
...
@@ -193,7 +194,7 @@ func (w *etcdWatcher) translate() {
...
@@ -193,7 +194,7 @@ func (w *etcdWatcher) translate() {
}
}
// TODO: need to generate errors using api/errors which has a circular dependency on this package
// TODO: need to generate errors using api/errors which has a circular dependency on this package
// no other way to inject errors
// no other way to inject errors
// case IsEtcdUnreachable(err):
// case
etcdutil.
IsEtcdUnreachable(err):
// status = errors.NewServerTimeout(...)
// status = errors.NewServerTimeout(...)
default
:
default
:
status
=
&
unversioned
.
Status
{
status
=
&
unversioned
.
Status
{
...
...
pkg/storage/etcd/util/doc.go
0 → 100644
View file @
20ead45a
/*
Copyright 2015 The Kubernetes Authors All rights reserved.
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 util holds generic etcd-related utility functions that any user of ectd might want to
// use, without pulling in kubernetes-specific code.
package
util
pkg/storage/etcd/etcd_util.go
→
pkg/storage/etcd/
util/
etcd_util.go
View file @
20ead45a
...
@@ -14,17 +14,15 @@ See the License for the specific language governing permissions and
...
@@ -14,17 +14,15 @@ See the License for the specific language governing permissions and
limitations under the License.
limitations under the License.
*/
*/
package
etcd
package
util
import
(
import
(
"encoding/json"
"encoding/json"
"fmt"
"fmt"
"io/ioutil"
"io/ioutil"
"net/http"
"net/http"
"os/exec"
goetcd
"github.com/coreos/go-etcd/etcd"
goetcd
"github.com/coreos/go-etcd/etcd"
"github.com/golang/glog"
"k8s.io/kubernetes/pkg/tools"
"k8s.io/kubernetes/pkg/tools"
)
)
...
@@ -53,26 +51,12 @@ func IsEtcdUnreachable(err error) bool {
...
@@ -53,26 +51,12 @@ func IsEtcdUnreachable(err error) bool {
return
isEtcdErrorNum
(
err
,
tools
.
EtcdErrorCodeUnreachable
)
return
isEtcdErrorNum
(
err
,
tools
.
EtcdErrorCodeUnreachable
)
}
}
// IsEtcdWatchStoppedByUser returns true if and only if err is a client triggered stop.
func
IsEtcdWatchStoppedByUser
(
err
error
)
bool
{
return
goetcd
.
ErrWatchStoppedByUser
==
err
}
// isEtcdErrorNum returns true if and only if err is an etcd error, whose errorCode matches errorCode
// isEtcdErrorNum returns true if and only if err is an etcd error, whose errorCode matches errorCode
func
isEtcdErrorNum
(
err
error
,
errorCode
int
)
bool
{
func
isEtcdErrorNum
(
err
error
,
errorCode
int
)
bool
{
etcdError
,
ok
:=
err
.
(
*
goetcd
.
EtcdError
)
etcdError
,
ok
:=
err
.
(
*
goetcd
.
EtcdError
)
return
ok
&&
etcdError
!=
nil
&&
etcdError
.
ErrorCode
==
errorCode
return
ok
&&
etcdError
!=
nil
&&
etcdError
.
ErrorCode
==
errorCode
}
}
// etcdErrorIndex returns the index associated with the error message and whether the
// index was available.
func
etcdErrorIndex
(
err
error
)
(
uint64
,
bool
)
{
if
etcdError
,
ok
:=
err
.
(
*
goetcd
.
EtcdError
);
ok
{
return
etcdError
.
Index
,
true
}
return
0
,
false
}
// GetEtcdVersion performs a version check against the provided Etcd server,
// GetEtcdVersion performs a version check against the provided Etcd server,
// returning the string response, and error (if any).
// returning the string response, and error (if any).
func
GetEtcdVersion
(
host
string
)
(
string
,
error
)
{
func
GetEtcdVersion
(
host
string
)
(
string
,
error
)
{
...
@@ -91,29 +75,6 @@ func GetEtcdVersion(host string) (string, error) {
...
@@ -91,29 +75,6 @@ func GetEtcdVersion(host string) (string, error) {
return
string
(
versionBytes
),
nil
return
string
(
versionBytes
),
nil
}
}
func
startEtcd
()
(
*
exec
.
Cmd
,
error
)
{
cmd
:=
exec
.
Command
(
"etcd"
)
err
:=
cmd
.
Start
()
if
err
!=
nil
{
return
nil
,
err
}
return
cmd
,
nil
}
func
NewEtcdClientStartServerIfNecessary
(
server
string
)
(
tools
.
EtcdClient
,
error
)
{
_
,
err
:=
GetEtcdVersion
(
server
)
if
err
!=
nil
{
glog
.
Infof
(
"Failed to find etcd, attempting to start."
)
_
,
err
:=
startEtcd
()
if
err
!=
nil
{
return
nil
,
err
}
}
servers
:=
[]
string
{
server
}
return
goetcd
.
NewClient
(
servers
),
nil
}
type
etcdHealth
struct
{
type
etcdHealth
struct
{
// Note this has to be public so the json library can modify it.
// Note this has to be public so the json library can modify it.
Health
string
`json:"health"`
Health
string
`json:"health"`
...
...
pkg/storage/etcd/util/etcd_util_test.go
0 → 100644
View file @
20ead45a
/*
Copyright 2014 The Kubernetes Authors All rights reserved.
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
util
import
(
"fmt"
"math/rand"
"net"
"net/http"
"net/http/httptest"
"strconv"
"testing"
"time"
"github.com/coreos/go-etcd/etcd"
"github.com/stretchr/testify/assert"
// TODO: once fakeClient has been purged move utils
// and eliminate these deps
"k8s.io/kubernetes/pkg/tools"
)
const
validEtcdVersion
=
"etcd 2.0.9"
func
TestIsEtcdNotFound
(
t
*
testing
.
T
)
{
try
:=
func
(
err
error
,
isNotFound
bool
)
{
if
IsEtcdNotFound
(
err
)
!=
isNotFound
{
t
.
Errorf
(
"Expected %#v to return %v, but it did not"
,
err
,
isNotFound
)
}
}
try
(
tools
.
EtcdErrorNotFound
,
true
)
try
(
&
etcd
.
EtcdError
{
ErrorCode
:
101
},
false
)
try
(
nil
,
false
)
try
(
fmt
.
Errorf
(
"some other kind of error"
),
false
)
}
func
TestGetEtcdVersion_ValidVersion
(
t
*
testing
.
T
)
{
testServer
:=
httptest
.
NewServer
(
http
.
HandlerFunc
(
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
fmt
.
Fprint
(
w
,
validEtcdVersion
)
}))
defer
testServer
.
Close
()
var
version
string
var
err
error
if
version
,
err
=
GetEtcdVersion
(
testServer
.
URL
);
err
!=
nil
{
t
.
Errorf
(
"Unexpected error: %v"
,
err
)
}
assert
.
Equal
(
t
,
validEtcdVersion
,
version
,
"Unexpected version"
)
assert
.
Nil
(
t
,
err
)
}
func
TestGetEtcdVersion_ErrorStatus
(
t
*
testing
.
T
)
{
testServer
:=
httptest
.
NewServer
(
http
.
HandlerFunc
(
func
(
w
http
.
ResponseWriter
,
r
*
http
.
Request
)
{
w
.
WriteHeader
(
http
.
StatusServiceUnavailable
)
}))
defer
testServer
.
Close
()
_
,
err
:=
GetEtcdVersion
(
testServer
.
URL
)
assert
.
NotNil
(
t
,
err
)
}
func
TestGetEtcdVersion_NotListening
(
t
*
testing
.
T
)
{
portIsOpen
:=
func
(
port
int
)
bool
{
conn
,
err
:=
net
.
DialTimeout
(
"tcp"
,
"127.0.0.1:"
+
strconv
.
Itoa
(
port
),
1
*
time
.
Second
)
if
err
==
nil
{
conn
.
Close
()
return
true
}
return
false
}
port
:=
rand
.
Intn
((
1
<<
16
)
-
1
)
for
tried
:=
0
;
portIsOpen
(
port
);
tried
++
{
if
tried
>=
10
{
t
.
Fatal
(
"Couldn't find a closed TCP port to continue testing"
)
}
port
++
}
_
,
err
:=
GetEtcdVersion
(
"http://127.0.0.1:"
+
strconv
.
Itoa
(
port
))
assert
.
NotNil
(
t
,
err
)
}
func
TestEtcdHealthCheck
(
t
*
testing
.
T
)
{
tests
:=
[]
struct
{
data
string
expectErr
bool
}{
{
data
:
"{
\"
health
\"
:
\"
true
\"
}"
,
expectErr
:
false
,
},
{
data
:
"{
\"
health
\"
:
\"
false
\"
}"
,
expectErr
:
true
,
},
{
data
:
"invalid json"
,
expectErr
:
true
,
},
}
for
_
,
test
:=
range
tests
{
err
:=
EtcdHealthCheck
([]
byte
(
test
.
data
))
if
err
!=
nil
&&
!
test
.
expectErr
{
t
.
Errorf
(
"unexpected error: %v"
,
err
)
}
if
err
==
nil
&&
test
.
expectErr
{
t
.
Error
(
"unexpected non-error"
)
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment