Update lease service errors

Ensure delete returns a typed error on not found

Signed-off-by: Derek McGowan <derek@mcgstyle.net>
This commit is contained in:
Derek McGowan 2018-07-24 14:49:23 -07:00
parent 94e132fd07
commit b760cee65a
No known key found for this signature in database
GPG Key ID: F58C5D0A4405ACDB
4 changed files with 29 additions and 17 deletions

View File

@ -20,6 +20,7 @@ import (
"context"
leasesapi "github.com/containerd/containerd/api/services/leases/v1"
"github.com/containerd/containerd/errdefs"
"github.com/containerd/containerd/leases"
)
@ -47,7 +48,7 @@ func (pm *proxyManager) Create(ctx context.Context, opts ...leases.Opt) (leases.
Labels: l.Labels,
})
if err != nil {
return leases.Lease{}, err
return leases.Lease{}, errdefs.FromGRPC(err)
}
return leases.Lease{
@ -69,7 +70,7 @@ func (pm *proxyManager) Delete(ctx context.Context, l leases.Lease, opts ...leas
ID: l.ID,
Sync: do.Synchronous,
})
return err
return errdefs.FromGRPC(err)
}
func (pm *proxyManager) List(ctx context.Context, filters ...string) ([]leases.Lease, error) {
@ -77,7 +78,7 @@ func (pm *proxyManager) List(ctx context.Context, filters ...string) ([]leases.L
Filters: filters,
})
if err != nil {
return nil, err
return nil, errdefs.FromGRPC(err)
}
l := make([]leases.Lease, len(resp.Leases))
for i := range resp.Leases {

View File

@ -102,9 +102,12 @@ func (lm *LeaseManager) Delete(ctx context.Context, lease leases.Lease, _ ...lea
topbkt := getBucket(lm.tx, bucketKeyVersion, []byte(namespace), bucketKeyObjectLeases)
if topbkt == nil {
return nil
return errors.Wrapf(errdefs.ErrNotFound, "lease %q", lease.ID)
}
if err := topbkt.DeleteBucket([]byte(lease.ID)); err != nil && err != bolt.ErrBucketNotFound {
if err := topbkt.DeleteBucket([]byte(lease.ID)); err != nil {
if err == bolt.ErrBucketNotFound {
err = errors.Wrapf(errdefs.ErrNotFound, "lease %q", lease.ID)
}
return err
}
return nil

View File

@ -30,15 +30,17 @@ func TestLeases(t *testing.T) {
defer cancel()
testCases := []struct {
ID string
Cause error
ID string
CreateErr error
DeleteErr error
}{
{
ID: "tx1",
},
{
ID: "tx1",
Cause: errdefs.ErrAlreadyExists,
ID: "tx1",
CreateErr: errdefs.ErrAlreadyExists,
DeleteErr: errdefs.ErrNotFound,
},
{
ID: "tx2",
@ -51,7 +53,7 @@ func TestLeases(t *testing.T) {
if err := db.Update(func(tx *bolt.Tx) error {
lease, err := NewLeaseManager(tx).Create(ctx, leases.WithID(tc.ID))
if err != nil {
if tc.Cause != nil && errors.Cause(err) == tc.Cause {
if tc.CreateErr != nil && errors.Cause(err) == tc.CreateErr {
return nil
}
return err
@ -91,7 +93,10 @@ func TestLeases(t *testing.T) {
ID: tc.ID,
})
}); err != nil {
t.Fatal(err)
if tc.DeleteErr == nil && errors.Cause(err) != tc.DeleteErr {
t.Fatal(err)
}
}
}
@ -248,12 +253,14 @@ func TestLeasesList(t *testing.T) {
t.Fatal(err)
}
// try it again, get nil
// try it again, get not found
if err := db.Update(func(tx *bolt.Tx) error {
lm := NewLeaseManager(tx)
return lm.Delete(ctx, lease)
}); err != nil {
t.Fatalf("unexpected error %v", err)
}); err == nil {
t.Fatalf("expected error deleting non-existent lease")
} else if !errdefs.IsNotFound(err) {
t.Fatalf("unexpected error: %s", err)
}
}
}

View File

@ -22,6 +22,7 @@ import (
"google.golang.org/grpc"
api "github.com/containerd/containerd/api/services/leases/v1"
"github.com/containerd/containerd/errdefs"
"github.com/containerd/containerd/leases"
"github.com/containerd/containerd/plugin"
"github.com/containerd/containerd/services"
@ -75,7 +76,7 @@ func (s *service) Create(ctx context.Context, r *api.CreateRequest) (*api.Create
l, err := s.lm.Create(ctx, opts...)
if err != nil {
return nil, err
return nil, errdefs.ToGRPC(err)
}
return &api.CreateResponse{
@ -91,7 +92,7 @@ func (s *service) Delete(ctx context.Context, r *api.DeleteRequest) (*ptypes.Emp
if err := s.lm.Delete(ctx, leases.Lease{
ID: r.ID,
}, opts...); err != nil {
return nil, err
return nil, errdefs.ToGRPC(err)
}
return &ptypes.Empty{}, nil
}
@ -99,7 +100,7 @@ func (s *service) Delete(ctx context.Context, r *api.DeleteRequest) (*ptypes.Emp
func (s *service) List(ctx context.Context, r *api.ListRequest) (*api.ListResponse, error) {
l, err := s.lm.List(ctx, r.Filters...)
if err != nil {
return nil, err
return nil, errdefs.ToGRPC(err)
}
apileases := make([]*api.Lease, len(l))