From a8cc66b37adc95aa9ef58cc859456399cfed87af Mon Sep 17 00:00:00 2001 From: "Justin Terry (VM)" Date: Mon, 27 Jan 2020 09:44:04 -0800 Subject: [PATCH] Fix store error serialization to gRPC status codes The pkg/store errors are duplicated errors of NotFound and AlreadyExist from containerd's errdefs package and thus do not properly serialize when running errdefs.ToGRPC on them. CRI runs this function on every return from a CRI method so the conversion fails if there is a cache miss from the store caches for containers or sandboxes. This change verifies that the errors are properly converted to their gRPC values. Signed-off-by: Justin Terry (VM) --- pkg/store/errors.go | 12 +++++++--- pkg/store/errors_test.go | 48 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 pkg/store/errors_test.go diff --git a/pkg/store/errors.go b/pkg/store/errors.go index 37652b3e7..ba2ca8ecf 100644 --- a/pkg/store/errors.go +++ b/pkg/store/errors.go @@ -16,12 +16,18 @@ limitations under the License. package store -import "errors" +import "github.com/containerd/containerd/errdefs" var ( // ErrAlreadyExist is the error returned when data added in the store // already exists. - ErrAlreadyExist = errors.New("already exists") + // + // This error has been DEPRECATED and will be removed in 1.5. Please switch + // usage directly to `errdefs.ErrAlreadyExists`. + ErrAlreadyExist = errdefs.ErrAlreadyExists // ErrNotExist is the error returned when data is not in the store. - ErrNotExist = errors.New("does not exist") + // + // This error has been DEPRECATED and will be removed in 1.5. Please switch + // usage directly to `errdefs.ErrNotFound`. + ErrNotExist = errdefs.ErrNotFound ) diff --git a/pkg/store/errors_test.go b/pkg/store/errors_test.go new file mode 100644 index 000000000..053dd59b9 --- /dev/null +++ b/pkg/store/errors_test.go @@ -0,0 +1,48 @@ +/* +Copyright 2020 The Kubernetes Authors. + +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 store + +import ( + "testing" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/containerd/containerd/errdefs" +) + +func TestStoreErrAlreadyExistGRPCStatus(t *testing.T) { + err := errdefs.ToGRPC(ErrAlreadyExist) + s, ok := status.FromError(err) + if !ok { + t.Fatalf("failed to convert err: %v to status: %d", err, codes.AlreadyExists) + } + if s.Code() != codes.AlreadyExists { + t.Fatalf("expected code: %d got: %d", codes.AlreadyExists, s.Code()) + } +} + +func TestStoreErrNotExistGRPCStatus(t *testing.T) { + err := errdefs.ToGRPC(ErrNotExist) + s, ok := status.FromError(err) + if !ok { + t.Fatalf("failed to convert err: %v to status: %d", err, codes.NotFound) + } + if s.Code() != codes.NotFound { + t.Fatalf("expected code: %d got: %d", codes.NotFound, s.Code()) + } +}