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
788218d7
Commit
788218d7
authored
Dec 03, 2015
by
Wojciech Tyczynski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Better traces for api calls.
parent
d6134e54
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
27 additions
and
18 deletions
+27
-18
resthandler.go
pkg/apiserver/resthandler.go
+27
-0
etcd.go
pkg/registry/generic/etcd/etcd.go
+0
-18
No files found.
pkg/apiserver/resthandler.go
View file @
788218d7
...
@@ -115,6 +115,9 @@ func getResourceHandler(scope RequestScope, getter getterFunc) restful.RouteFunc
...
@@ -115,6 +115,9 @@ func getResourceHandler(scope RequestScope, getter getterFunc) restful.RouteFunc
func
GetResource
(
r
rest
.
Getter
,
scope
RequestScope
)
restful
.
RouteFunction
{
func
GetResource
(
r
rest
.
Getter
,
scope
RequestScope
)
restful
.
RouteFunction
{
return
getResourceHandler
(
scope
,
return
getResourceHandler
(
scope
,
func
(
ctx
api
.
Context
,
name
string
,
req
*
restful
.
Request
)
(
runtime
.
Object
,
error
)
{
func
(
ctx
api
.
Context
,
name
string
,
req
*
restful
.
Request
)
(
runtime
.
Object
,
error
)
{
// For performance tracking purposes.
trace
:=
util
.
NewTrace
(
"Get "
+
req
.
Request
.
URL
.
Path
)
defer
trace
.
LogIfLong
(
250
*
time
.
Millisecond
)
return
r
.
Get
(
ctx
,
name
)
return
r
.
Get
(
ctx
,
name
)
})
})
}
}
...
@@ -322,6 +325,10 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch
...
@@ -322,6 +325,10 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch
func
createHandler
(
r
rest
.
NamedCreater
,
scope
RequestScope
,
typer
runtime
.
ObjectTyper
,
admit
admission
.
Interface
,
includeName
bool
)
restful
.
RouteFunction
{
func
createHandler
(
r
rest
.
NamedCreater
,
scope
RequestScope
,
typer
runtime
.
ObjectTyper
,
admit
admission
.
Interface
,
includeName
bool
)
restful
.
RouteFunction
{
return
func
(
req
*
restful
.
Request
,
res
*
restful
.
Response
)
{
return
func
(
req
*
restful
.
Request
,
res
*
restful
.
Response
)
{
// For performance tracking purposes.
trace
:=
util
.
NewTrace
(
"Create "
+
req
.
Request
.
URL
.
Path
)
defer
trace
.
LogIfLong
(
250
*
time
.
Millisecond
)
w
:=
res
.
ResponseWriter
w
:=
res
.
ResponseWriter
// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
...
@@ -351,12 +358,14 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
...
@@ -351,12 +358,14 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
}
}
obj
:=
r
.
New
()
obj
:=
r
.
New
()
trace
.
Step
(
"About to convert to expected version"
)
// TODO this cleans up with proper typing
// TODO this cleans up with proper typing
if
err
:=
scope
.
Codec
.
DecodeIntoWithSpecifiedVersionKind
(
body
,
obj
,
scope
.
Kind
);
err
!=
nil
{
if
err
:=
scope
.
Codec
.
DecodeIntoWithSpecifiedVersionKind
(
body
,
obj
,
scope
.
Kind
);
err
!=
nil
{
err
=
transformDecodeError
(
typer
,
err
,
obj
,
body
)
err
=
transformDecodeError
(
typer
,
err
,
obj
,
body
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
return
return
}
}
trace
.
Step
(
"Conversion done"
)
if
admit
!=
nil
&&
admit
.
Handles
(
admission
.
Create
)
{
if
admit
!=
nil
&&
admit
.
Handles
(
admission
.
Create
)
{
userInfo
,
_
:=
api
.
UserFrom
(
ctx
)
userInfo
,
_
:=
api
.
UserFrom
(
ctx
)
...
@@ -368,6 +377,7 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
...
@@ -368,6 +377,7 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
}
}
}
}
trace
.
Step
(
"About to store object in database"
)
result
,
err
:=
finishRequest
(
timeout
,
func
()
(
runtime
.
Object
,
error
)
{
result
,
err
:=
finishRequest
(
timeout
,
func
()
(
runtime
.
Object
,
error
)
{
out
,
err
:=
r
.
Create
(
ctx
,
name
,
obj
)
out
,
err
:=
r
.
Create
(
ctx
,
name
,
obj
)
if
status
,
ok
:=
out
.
(
*
unversioned
.
Status
);
ok
&&
err
==
nil
&&
status
.
Code
==
0
{
if
status
,
ok
:=
out
.
(
*
unversioned
.
Status
);
ok
&&
err
==
nil
&&
status
.
Code
==
0
{
...
@@ -379,11 +389,13 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
...
@@ -379,11 +389,13 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
return
return
}
}
trace
.
Step
(
"Object stored in database"
)
if
err
:=
setSelfLink
(
result
,
req
,
scope
.
Namer
);
err
!=
nil
{
if
err
:=
setSelfLink
(
result
,
req
,
scope
.
Namer
);
err
!=
nil
{
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
return
return
}
}
trace
.
Step
(
"Self-link added"
)
write
(
http
.
StatusCreated
,
scope
.
Kind
.
GroupVersion
(),
scope
.
Codec
,
result
,
w
,
req
.
Request
)
write
(
http
.
StatusCreated
,
scope
.
Kind
.
GroupVersion
(),
scope
.
Codec
,
result
,
w
,
req
.
Request
)
}
}
...
@@ -565,6 +577,10 @@ func patchResource(ctx api.Context, timeout time.Duration, versionedObj runtime.
...
@@ -565,6 +577,10 @@ func patchResource(ctx api.Context, timeout time.Duration, versionedObj runtime.
// UpdateResource returns a function that will handle a resource update
// UpdateResource returns a function that will handle a resource update
func
UpdateResource
(
r
rest
.
Updater
,
scope
RequestScope
,
typer
runtime
.
ObjectTyper
,
admit
admission
.
Interface
)
restful
.
RouteFunction
{
func
UpdateResource
(
r
rest
.
Updater
,
scope
RequestScope
,
typer
runtime
.
ObjectTyper
,
admit
admission
.
Interface
)
restful
.
RouteFunction
{
return
func
(
req
*
restful
.
Request
,
res
*
restful
.
Response
)
{
return
func
(
req
*
restful
.
Request
,
res
*
restful
.
Response
)
{
// For performance tracking purposes.
trace
:=
util
.
NewTrace
(
"Update "
+
req
.
Request
.
URL
.
Path
)
defer
trace
.
LogIfLong
(
250
*
time
.
Millisecond
)
w
:=
res
.
ResponseWriter
w
:=
res
.
ResponseWriter
// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
...
@@ -585,11 +601,13 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
...
@@ -585,11 +601,13 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
}
}
obj
:=
r
.
New
()
obj
:=
r
.
New
()
trace
.
Step
(
"About to convert to expected version"
)
if
err
:=
scope
.
Codec
.
DecodeIntoWithSpecifiedVersionKind
(
body
,
obj
,
scope
.
Kind
);
err
!=
nil
{
if
err
:=
scope
.
Codec
.
DecodeIntoWithSpecifiedVersionKind
(
body
,
obj
,
scope
.
Kind
);
err
!=
nil
{
err
=
transformDecodeError
(
typer
,
err
,
obj
,
body
)
err
=
transformDecodeError
(
typer
,
err
,
obj
,
body
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
return
return
}
}
trace
.
Step
(
"Conversion done"
)
if
err
:=
checkName
(
obj
,
name
,
namespace
,
scope
.
Namer
);
err
!=
nil
{
if
err
:=
checkName
(
obj
,
name
,
namespace
,
scope
.
Namer
);
err
!=
nil
{
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
...
@@ -606,6 +624,7 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
...
@@ -606,6 +624,7 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
}
}
}
}
trace
.
Step
(
"About to store object in database"
)
wasCreated
:=
false
wasCreated
:=
false
result
,
err
:=
finishRequest
(
timeout
,
func
()
(
runtime
.
Object
,
error
)
{
result
,
err
:=
finishRequest
(
timeout
,
func
()
(
runtime
.
Object
,
error
)
{
obj
,
created
,
err
:=
r
.
Update
(
ctx
,
obj
)
obj
,
created
,
err
:=
r
.
Update
(
ctx
,
obj
)
...
@@ -616,11 +635,13 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
...
@@ -616,11 +635,13 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
return
return
}
}
trace
.
Step
(
"Object stored in database"
)
if
err
:=
setSelfLink
(
result
,
req
,
scope
.
Namer
);
err
!=
nil
{
if
err
:=
setSelfLink
(
result
,
req
,
scope
.
Namer
);
err
!=
nil
{
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
return
return
}
}
trace
.
Step
(
"Self-link added"
)
status
:=
http
.
StatusOK
status
:=
http
.
StatusOK
if
wasCreated
{
if
wasCreated
{
...
@@ -633,6 +654,10 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
...
@@ -633,6 +654,10 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
// DeleteResource returns a function that will handle a resource deletion
// DeleteResource returns a function that will handle a resource deletion
func
DeleteResource
(
r
rest
.
GracefulDeleter
,
checkBody
bool
,
scope
RequestScope
,
admit
admission
.
Interface
)
restful
.
RouteFunction
{
func
DeleteResource
(
r
rest
.
GracefulDeleter
,
checkBody
bool
,
scope
RequestScope
,
admit
admission
.
Interface
)
restful
.
RouteFunction
{
return
func
(
req
*
restful
.
Request
,
res
*
restful
.
Response
)
{
return
func
(
req
*
restful
.
Request
,
res
*
restful
.
Response
)
{
// For performance tracking purposes.
trace
:=
util
.
NewTrace
(
"Delete "
+
req
.
Request
.
URL
.
Path
)
defer
trace
.
LogIfLong
(
250
*
time
.
Millisecond
)
w
:=
res
.
ResponseWriter
w
:=
res
.
ResponseWriter
// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
// TODO: we either want to remove timeout or document it (if we document, move timeout out of this function and declare it in api_installer)
...
@@ -671,6 +696,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope,
...
@@ -671,6 +696,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope,
}
}
}
}
trace
.
Step
(
"About do delete object from database"
)
result
,
err
:=
finishRequest
(
timeout
,
func
()
(
runtime
.
Object
,
error
)
{
result
,
err
:=
finishRequest
(
timeout
,
func
()
(
runtime
.
Object
,
error
)
{
return
r
.
Delete
(
ctx
,
name
,
options
)
return
r
.
Delete
(
ctx
,
name
,
options
)
})
})
...
@@ -678,6 +704,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope,
...
@@ -678,6 +704,7 @@ func DeleteResource(r rest.GracefulDeleter, checkBody bool, scope RequestScope,
errorJSON
(
err
,
scope
.
Codec
,
w
)
errorJSON
(
err
,
scope
.
Codec
,
w
)
return
return
}
}
trace
.
Step
(
"Object deleted from database"
)
// if the rest.Deleter returns a nil object, fill out a status. Callers may return a valid
// if the rest.Deleter returns a nil object, fill out a status. Callers may return a valid
// object with the response.
// object with the response.
...
...
pkg/registry/generic/etcd/etcd.go
View file @
788218d7
...
@@ -18,8 +18,6 @@ package etcd
...
@@ -18,8 +18,6 @@ package etcd
import
(
import
(
"fmt"
"fmt"
"reflect"
"time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
kubeerr
"k8s.io/kubernetes/pkg/api/errors"
kubeerr
"k8s.io/kubernetes/pkg/api/errors"
...
@@ -32,7 +30,6 @@ import (
...
@@ -32,7 +30,6 @@ import (
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/util"
"k8s.io/kubernetes/pkg/watch"
"k8s.io/kubernetes/pkg/watch"
"github.com/golang/glog"
"github.com/golang/glog"
...
@@ -198,8 +195,6 @@ func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher, options *unvers
...
@@ -198,8 +195,6 @@ func (e *Etcd) ListPredicate(ctx api.Context, m generic.Matcher, options *unvers
// Create inserts a new item according to the unique key from the object.
// Create inserts a new item according to the unique key from the object.
func
(
e
*
Etcd
)
Create
(
ctx
api
.
Context
,
obj
runtime
.
Object
)
(
runtime
.
Object
,
error
)
{
func
(
e
*
Etcd
)
Create
(
ctx
api
.
Context
,
obj
runtime
.
Object
)
(
runtime
.
Object
,
error
)
{
trace
:=
util
.
NewTrace
(
"Create "
+
reflect
.
TypeOf
(
obj
)
.
String
())
defer
trace
.
LogIfLong
(
time
.
Second
)
if
err
:=
rest
.
BeforeCreate
(
e
.
CreateStrategy
,
ctx
,
obj
);
err
!=
nil
{
if
err
:=
rest
.
BeforeCreate
(
e
.
CreateStrategy
,
ctx
,
obj
);
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -215,14 +210,12 @@ func (e *Etcd) Create(ctx api.Context, obj runtime.Object) (runtime.Object, erro
...
@@ -215,14 +210,12 @@ func (e *Etcd) Create(ctx api.Context, obj runtime.Object) (runtime.Object, erro
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
trace
.
Step
(
"About to create object"
)
out
:=
e
.
NewFunc
()
out
:=
e
.
NewFunc
()
if
err
:=
e
.
Storage
.
Create
(
ctx
,
key
,
obj
,
out
,
ttl
);
err
!=
nil
{
if
err
:=
e
.
Storage
.
Create
(
ctx
,
key
,
obj
,
out
,
ttl
);
err
!=
nil
{
err
=
etcderr
.
InterpretCreateError
(
err
,
e
.
EndpointName
,
name
)
err
=
etcderr
.
InterpretCreateError
(
err
,
e
.
EndpointName
,
name
)
err
=
rest
.
CheckGeneratedNameError
(
e
.
CreateStrategy
,
err
,
obj
)
err
=
rest
.
CheckGeneratedNameError
(
e
.
CreateStrategy
,
err
,
obj
)
return
nil
,
err
return
nil
,
err
}
}
trace
.
Step
(
"Object created"
)
if
e
.
AfterCreate
!=
nil
{
if
e
.
AfterCreate
!=
nil
{
if
err
:=
e
.
AfterCreate
(
out
);
err
!=
nil
{
if
err
:=
e
.
AfterCreate
(
out
);
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
@@ -240,8 +233,6 @@ func (e *Etcd) Create(ctx api.Context, obj runtime.Object) (runtime.Object, erro
...
@@ -240,8 +233,6 @@ func (e *Etcd) Create(ctx api.Context, obj runtime.Object) (runtime.Object, erro
// or an error. If the registry allows create-on-update, the create flow will be executed.
// or an error. If the registry allows create-on-update, the create flow will be executed.
// A bool is returned along with the object and any errors, to indicate object creation.
// A bool is returned along with the object and any errors, to indicate object creation.
func
(
e
*
Etcd
)
Update
(
ctx
api
.
Context
,
obj
runtime
.
Object
)
(
runtime
.
Object
,
bool
,
error
)
{
func
(
e
*
Etcd
)
Update
(
ctx
api
.
Context
,
obj
runtime
.
Object
)
(
runtime
.
Object
,
bool
,
error
)
{
trace
:=
util
.
NewTrace
(
"Update "
+
reflect
.
TypeOf
(
obj
)
.
String
())
defer
trace
.
LogIfLong
(
time
.
Second
)
name
,
err
:=
e
.
ObjectNameFunc
(
obj
)
name
,
err
:=
e
.
ObjectNameFunc
(
obj
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
false
,
err
...
@@ -344,17 +335,13 @@ func (e *Etcd) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool
...
@@ -344,17 +335,13 @@ func (e *Etcd) Update(ctx api.Context, obj runtime.Object) (runtime.Object, bool
// Get retrieves the item from etcd.
// Get retrieves the item from etcd.
func
(
e
*
Etcd
)
Get
(
ctx
api
.
Context
,
name
string
)
(
runtime
.
Object
,
error
)
{
func
(
e
*
Etcd
)
Get
(
ctx
api
.
Context
,
name
string
)
(
runtime
.
Object
,
error
)
{
obj
:=
e
.
NewFunc
()
obj
:=
e
.
NewFunc
()
trace
:=
util
.
NewTrace
(
"Get "
+
reflect
.
TypeOf
(
obj
)
.
String
())
defer
trace
.
LogIfLong
(
time
.
Second
)
key
,
err
:=
e
.
KeyFunc
(
ctx
,
name
)
key
,
err
:=
e
.
KeyFunc
(
ctx
,
name
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
trace
.
Step
(
"About to read object"
)
if
err
:=
e
.
Storage
.
Get
(
ctx
,
key
,
obj
,
false
);
err
!=
nil
{
if
err
:=
e
.
Storage
.
Get
(
ctx
,
key
,
obj
,
false
);
err
!=
nil
{
return
nil
,
etcderr
.
InterpretGetError
(
err
,
e
.
EndpointName
,
name
)
return
nil
,
etcderr
.
InterpretGetError
(
err
,
e
.
EndpointName
,
name
)
}
}
trace
.
Step
(
"Object read"
)
if
e
.
Decorator
!=
nil
{
if
e
.
Decorator
!=
nil
{
if
err
:=
e
.
Decorator
(
obj
);
err
!=
nil
{
if
err
:=
e
.
Decorator
(
obj
);
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
@@ -376,9 +363,6 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
...
@@ -376,9 +363,6 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
}
}
obj
:=
e
.
NewFunc
()
obj
:=
e
.
NewFunc
()
trace
:=
util
.
NewTrace
(
"Delete "
+
reflect
.
TypeOf
(
obj
)
.
String
())
defer
trace
.
LogIfLong
(
time
.
Second
)
trace
.
Step
(
"About to read object"
)
if
err
:=
e
.
Storage
.
Get
(
ctx
,
key
,
obj
,
false
);
err
!=
nil
{
if
err
:=
e
.
Storage
.
Get
(
ctx
,
key
,
obj
,
false
);
err
!=
nil
{
return
nil
,
etcderr
.
InterpretDeleteError
(
err
,
e
.
EndpointName
,
name
)
return
nil
,
etcderr
.
InterpretDeleteError
(
err
,
e
.
EndpointName
,
name
)
}
}
...
@@ -395,7 +379,6 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
...
@@ -395,7 +379,6 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
return
e
.
finalizeDelete
(
obj
,
false
)
return
e
.
finalizeDelete
(
obj
,
false
)
}
}
if
graceful
{
if
graceful
{
trace
.
Step
(
"Graceful deletion"
)
out
:=
e
.
NewFunc
()
out
:=
e
.
NewFunc
()
lastGraceful
:=
int64
(
0
)
lastGraceful
:=
int64
(
0
)
err
:=
e
.
Storage
.
GuaranteedUpdate
(
err
:=
e
.
Storage
.
GuaranteedUpdate
(
...
@@ -433,7 +416,6 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
...
@@ -433,7 +416,6 @@ func (e *Etcd) Delete(ctx api.Context, name string, options *api.DeleteOptions)
// delete immediately, or no graceful deletion supported
// delete immediately, or no graceful deletion supported
out
:=
e
.
NewFunc
()
out
:=
e
.
NewFunc
()
trace
.
Step
(
"About to delete object"
)
if
err
:=
e
.
Storage
.
Delete
(
ctx
,
key
,
out
);
err
!=
nil
{
if
err
:=
e
.
Storage
.
Delete
(
ctx
,
key
,
out
);
err
!=
nil
{
return
nil
,
etcderr
.
InterpretDeleteError
(
err
,
e
.
EndpointName
,
name
)
return
nil
,
etcderr
.
InterpretDeleteError
(
err
,
e
.
EndpointName
,
name
)
}
}
...
...
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