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
b6e32965
Commit
b6e32965
authored
Nov 12, 2016
by
Hongchao Deng
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
etcd2: have prefix always prepended
parent
2c61d2f8
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
71 deletions
+35
-71
etcd_helper.go
pkg/storage/etcd/etcd_helper.go
+8
-16
etcd_helper_test.go
pkg/storage/etcd/etcd_helper_test.go
+20
-48
etcd_watcher_test.go
pkg/storage/etcd/etcd_watcher_test.go
+7
-7
No files found.
pkg/storage/etcd/etcd_helper.go
View file @
b6e32965
...
...
@@ -21,7 +21,6 @@ import (
"fmt"
"path"
"reflect"
"strings"
"time"
"k8s.io/kubernetes/pkg/api"
...
...
@@ -97,7 +96,7 @@ func (h *etcdHelper) Create(ctx context.Context, key string, obj, out runtime.Ob
if
ctx
==
nil
{
glog
.
Errorf
(
"Context is nil"
)
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
data
,
err
:=
runtime
.
Encode
(
h
.
codec
,
obj
)
trace
.
Step
(
"Object encoded"
)
if
err
!=
nil
{
...
...
@@ -148,7 +147,7 @@ func (h *etcdHelper) Delete(ctx context.Context, key string, out runtime.Object,
if
ctx
==
nil
{
glog
.
Errorf
(
"Context is nil"
)
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
v
,
err
:=
conversion
.
EnforcePtr
(
out
)
if
err
!=
nil
{
panic
(
"unable to convert output object to pointer"
)
...
...
@@ -210,7 +209,7 @@ func (h *etcdHelper) Watch(ctx context.Context, key string, resourceVersion stri
if
err
!=
nil
{
return
nil
,
err
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
w
:=
newEtcdWatcher
(
false
,
h
.
quorum
,
nil
,
storage
.
SimpleFilter
(
pred
),
h
.
codec
,
h
.
versioner
,
nil
,
h
)
go
w
.
etcdWatch
(
ctx
,
h
.
etcdKeysAPI
,
key
,
watchRV
)
return
w
,
nil
...
...
@@ -225,7 +224,7 @@ func (h *etcdHelper) WatchList(ctx context.Context, key string, resourceVersion
if
err
!=
nil
{
return
nil
,
err
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
w
:=
newEtcdWatcher
(
true
,
h
.
quorum
,
exceptKey
(
key
),
storage
.
SimpleFilter
(
pred
),
h
.
codec
,
h
.
versioner
,
nil
,
h
)
go
w
.
etcdWatch
(
ctx
,
h
.
etcdKeysAPI
,
key
,
watchRV
)
return
w
,
nil
...
...
@@ -236,7 +235,7 @@ func (h *etcdHelper) Get(ctx context.Context, key string, resourceVersion string
if
ctx
==
nil
{
glog
.
Errorf
(
"Context is nil"
)
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
_
,
_
,
_
,
err
:=
h
.
bodyAndExtractObj
(
ctx
,
key
,
objPtr
,
ignoreNotFound
)
return
err
}
...
...
@@ -306,7 +305,7 @@ func (h *etcdHelper) GetToList(ctx context.Context, key string, resourceVersion
if
err
!=
nil
{
return
err
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
startTime
:=
time
.
Now
()
trace
.
Step
(
"About to read etcd node"
)
...
...
@@ -389,7 +388,7 @@ func (h *etcdHelper) List(ctx context.Context, key string, resourceVersion strin
if
err
!=
nil
{
return
err
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
startTime
:=
time
.
Now
()
trace
.
Step
(
"About to list etcd node"
)
nodes
,
index
,
err
:=
h
.
listEtcdNode
(
ctx
,
key
)
...
...
@@ -446,7 +445,7 @@ func (h *etcdHelper) GuaranteedUpdate(
// Panic is appropriate, because this is a programming error.
panic
(
"need ptr to type"
)
}
key
=
h
.
prefixEtcdKey
(
key
)
key
=
path
.
Join
(
h
.
pathPrefix
,
key
)
for
{
obj
:=
reflect
.
New
(
v
.
Type
())
.
Interface
()
.
(
runtime
.
Object
)
origBody
,
node
,
res
,
err
:=
h
.
bodyAndExtractObj
(
ctx
,
key
,
obj
,
ignoreNotFound
)
...
...
@@ -540,13 +539,6 @@ func (h *etcdHelper) GuaranteedUpdate(
}
}
func
(
h
*
etcdHelper
)
prefixEtcdKey
(
key
string
)
string
{
if
strings
.
HasPrefix
(
key
,
h
.
pathPrefix
)
{
return
key
}
return
path
.
Join
(
h
.
pathPrefix
,
key
)
}
// etcdCache defines interface used for caching objects stored in etcd. Objects are keyed by
// their Node.ModifiedIndex, which is unique across all types.
// All implementations must be thread-safe.
...
...
pkg/storage/etcd/etcd_helper_test.go
View file @
b6e32965
...
...
@@ -24,7 +24,6 @@ import (
"time"
etcd
"github.com/coreos/etcd/client"
"github.com/stretchr/testify/assert"
"golang.org/x/net/context"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
...
...
@@ -99,8 +98,7 @@ func createPodList(t *testing.T, helper etcdHelper, list *api.PodList) error {
func
TestList
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
key
)
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
etcdtest
.
PathPrefix
())
list
:=
api
.
PodList
{
Items
:
[]
api
.
Pod
{
...
...
@@ -123,7 +121,7 @@ func TestList(t *testing.T) {
var
got
api
.
PodList
// TODO: a sorted filter function could be applied such implied
// ordering on the returned list doesn't matter.
err
:=
helper
.
List
(
context
.
TODO
(),
key
,
""
,
storage
.
Everything
,
&
got
)
err
:=
helper
.
List
(
context
.
TODO
(),
"/"
,
""
,
storage
.
Everything
,
&
got
)
if
err
!=
nil
{
t
.
Errorf
(
"Unexpected error %v"
,
err
)
}
...
...
@@ -136,8 +134,7 @@ func TestList(t *testing.T) {
func
TestListFiltered
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
key
)
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
etcdtest
.
PathPrefix
())
list
:=
api
.
PodList
{
Items
:
[]
api
.
Pod
{
...
...
@@ -167,7 +164,7 @@ func TestListFiltered(t *testing.T) {
},
}
var
got
api
.
PodList
err
:=
helper
.
List
(
context
.
TODO
(),
key
,
""
,
p
,
&
got
)
err
:=
helper
.
List
(
context
.
TODO
(),
"/"
,
""
,
p
,
&
got
)
if
err
!=
nil
{
t
.
Errorf
(
"Unexpected error %v"
,
err
)
}
...
...
@@ -181,13 +178,10 @@ func TestListFiltered(t *testing.T) {
func
TestListAcrossDirectories
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
rootkey
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
key1
:=
etcdtest
.
AddPrefix
(
"/some/key/directory1"
)
key2
:=
etcdtest
.
AddPrefix
(
"/some/key/directory2"
)
roothelper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
rootkey
)
helper1
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
key1
)
helper2
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
key2
)
roothelper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
etcdtest
.
PathPrefix
()
)
helper1
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
etcdtest
.
PathPrefix
()
+
"/dir1"
)
helper2
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
etcdtest
.
PathPrefix
()
+
"/dir2"
)
list
:=
api
.
PodList
{
Items
:
[]
api
.
Pod
{
...
...
@@ -217,7 +211,7 @@ func TestListAcrossDirectories(t *testing.T) {
list
.
Items
[
2
]
=
*
returnedObj
var
got
api
.
PodList
err
:=
roothelper
.
List
(
context
.
TODO
(),
rootkey
,
""
,
storage
.
Everything
,
&
got
)
err
:=
roothelper
.
List
(
context
.
TODO
(),
"/"
,
""
,
storage
.
Everything
,
&
got
)
if
err
!=
nil
{
t
.
Errorf
(
"Unexpected error %v"
,
err
)
}
...
...
@@ -229,8 +223,8 @@ func TestListAcrossDirectories(t *testing.T) {
func
TestGet
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
key
)
key
:=
"/some/key"
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
etcdtest
.
PathPrefix
()
)
expect
:=
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
},
Spec
:
apitesting
.
DeepEqualSafePodSpec
(),
...
...
@@ -251,14 +245,13 @@ func TestGet(t *testing.T) {
func
TestGetNotFoundErr
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
boguskey
:=
etcdtest
.
AddPrefix
(
"/some/boguskey"
)
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
key
)
boguskey
:=
"/some/boguskey"
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
etcdtest
.
PathPrefix
())
var
got
api
.
Pod
err
:=
helper
.
Get
(
context
.
TODO
(),
boguskey
,
""
,
&
got
,
false
)
if
!
storage
.
IsNotFound
(
err
)
{
t
.
Errorf
(
"Unexpected reponse on key=%v, err=%v"
,
key
,
err
)
t
.
Errorf
(
"Unexpected reponse on key=%v, err=%v"
,
bogus
key
,
err
)
}
}
...
...
@@ -304,8 +297,8 @@ func TestGuaranteedUpdate(t *testing.T) {
_
,
codec
:=
testScheme
(
t
)
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
helper
:=
newEtcdHelper
(
server
.
Client
,
codec
,
key
)
key
:=
"/some/key"
helper
:=
newEtcdHelper
(
server
.
Client
,
codec
,
etcdtest
.
PathPrefix
()
)
obj
:=
&
storagetesting
.
TestResource
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
},
Value
:
1
}
err
:=
helper
.
GuaranteedUpdate
(
context
.
TODO
(),
key
,
&
storagetesting
.
TestResource
{},
true
,
nil
,
storage
.
SimpleUpdate
(
func
(
in
runtime
.
Object
)
(
runtime
.
Object
,
error
)
{
...
...
@@ -349,8 +342,8 @@ func TestGuaranteedUpdateNoChange(t *testing.T) {
_
,
codec
:=
testScheme
(
t
)
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
helper
:=
newEtcdHelper
(
server
.
Client
,
codec
,
key
)
key
:=
"/some/key"
helper
:=
newEtcdHelper
(
server
.
Client
,
codec
,
etcdtest
.
PathPrefix
()
)
obj
:=
&
storagetesting
.
TestResource
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
},
Value
:
1
}
err
:=
helper
.
GuaranteedUpdate
(
context
.
TODO
(),
key
,
&
storagetesting
.
TestResource
{},
true
,
nil
,
storage
.
SimpleUpdate
(
func
(
in
runtime
.
Object
)
(
runtime
.
Object
,
error
)
{
...
...
@@ -379,8 +372,8 @@ func TestGuaranteedUpdateKeyNotFound(t *testing.T) {
_
,
codec
:=
testScheme
(
t
)
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
helper
:=
newEtcdHelper
(
server
.
Client
,
codec
,
key
)
key
:=
"/some/key"
helper
:=
newEtcdHelper
(
server
.
Client
,
codec
,
etcdtest
.
PathPrefix
()
)
// Create a new node.
obj
:=
&
storagetesting
.
TestResource
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
},
Value
:
1
}
...
...
@@ -406,7 +399,7 @@ func TestGuaranteedUpdate_CreateCollision(t *testing.T) {
_
,
codec
:=
testScheme
(
t
)
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
key
:=
"/some/key"
helper
:=
newEtcdHelper
(
server
.
Client
,
codec
,
etcdtest
.
PathPrefix
())
const
concurrency
=
10
...
...
@@ -471,27 +464,6 @@ func TestGuaranteedUpdateUIDMismatch(t *testing.T) {
}
}
func
TestPrefixEtcdKey
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
prefix
:=
path
.
Join
(
"/"
,
etcdtest
.
PathPrefix
())
helper
:=
newEtcdHelper
(
server
.
Client
,
testapi
.
Default
.
Codec
(),
prefix
)
baseKey
:=
"/some/key"
// Verify prefix is added
keyBefore
:=
baseKey
keyAfter
:=
helper
.
prefixEtcdKey
(
keyBefore
)
assert
.
Equal
(
t
,
keyAfter
,
path
.
Join
(
prefix
,
baseKey
),
"Prefix incorrectly added by EtcdHelper"
)
// Verify prefix is not added
keyBefore
=
path
.
Join
(
prefix
,
baseKey
)
keyAfter
=
helper
.
prefixEtcdKey
(
keyBefore
)
assert
.
Equal
(
t
,
keyBefore
,
keyAfter
,
"Prefix incorrectly added by EtcdHelper"
)
}
func
TestDeleteUIDMismatch
(
t
*
testing
.
T
)
{
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
...
...
pkg/storage/etcd/etcd_watcher_test.go
View file @
b6e32965
...
...
@@ -341,7 +341,7 @@ func makeSubsets(ip string, port int) []api.EndpointSubset {
func
TestWatchEtcdState
(
t
*
testing
.
T
)
{
codec
:=
testapi
.
Default
.
Codec
()
key
:=
etcdtest
.
AddPrefix
(
"/somekey/foo"
)
key
:=
"/somekey/foo"
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
...
...
@@ -399,7 +399,7 @@ func TestWatchFromZeroIndex(t *testing.T) {
codec
:=
testapi
.
Default
.
Codec
()
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
}}
key
:=
etcdtest
.
AddPrefix
(
"/somekey/foo"
)
key
:=
"/somekey/foo"
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
...
...
@@ -458,18 +458,18 @@ func TestWatchFromZeroIndex(t *testing.T) {
func
TestWatchListFromZeroIndex
(
t
*
testing
.
T
)
{
codec
:=
testapi
.
Default
.
Codec
()
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
prefix
:=
"/some/key"
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
h
:=
newEtcdHelper
(
server
.
Client
,
codec
,
key
)
h
:=
newEtcdHelper
(
server
.
Client
,
codec
,
prefix
)
watching
,
err
:=
h
.
WatchList
(
context
.
TODO
(),
key
,
"0"
,
storage
.
Everything
)
watching
,
err
:=
h
.
WatchList
(
context
.
TODO
(),
"/"
,
"0"
,
storage
.
Everything
)
if
err
!=
nil
{
t
.
Fatalf
(
"Unexpected error: %v"
,
err
)
}
defer
watching
.
Stop
()
// creates
key/foo which should trigger the WatchList for "key
"
// creates
foo which should trigger the WatchList for "/
"
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
}}
err
=
h
.
Create
(
context
.
TODO
(),
pod
.
Name
,
pod
,
pod
,
0
)
if
err
!=
nil
{
...
...
@@ -489,7 +489,7 @@ func TestWatchListFromZeroIndex(t *testing.T) {
func
TestWatchListIgnoresRootKey
(
t
*
testing
.
T
)
{
codec
:=
testapi
.
Default
.
Codec
()
pod
:=
&
api
.
Pod
{
ObjectMeta
:
api
.
ObjectMeta
{
Name
:
"foo"
}}
key
:=
etcdtest
.
AddPrefix
(
"/some/key"
)
key
:=
"/some/key"
server
:=
etcdtesting
.
NewEtcdTestClientServer
(
t
)
defer
server
.
Terminate
(
t
)
h
:=
newEtcdHelper
(
server
.
Client
,
codec
,
key
)
...
...
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