From 19c2b75ef1f5742ff99c71dd80e75b93844604c8 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 5 Nov 2018 22:13:05 +0100 Subject: [PATCH] Return correct error-codes on conflicting names Signed-off-by: Sebastiaan van Stijn (cherry picked from commit 2061af766f61f6bc8d3e43d5553fba315f569597) Signed-off-by: Sebastiaan van Stijn --- manager/controlapi/service.go | 18 ++++++++++++------ manager/controlapi/service_test.go | 18 ++++++++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/manager/controlapi/service.go b/manager/controlapi/service.go index 17bc2500e2..06141d281b 100644 --- a/manager/controlapi/service.go +++ b/manager/controlapi/service.go @@ -680,13 +680,14 @@ func (s *Server) CreateService(ctx context.Context, request *api.CreateServiceRe return store.CreateService(tx, service) }) - if err != nil { + switch err { + case store.ErrNameConflict: + return nil, status.Errorf(codes.AlreadyExists, "service %s already exists", request.Spec.Annotations.Name) + case nil: + return &api.CreateServiceResponse{Service: service}, nil + default: return nil, err } - - return &api.CreateServiceResponse{ - Service: service, - }, nil } // GetService returns a Service given a ServiceID. @@ -896,7 +897,12 @@ func (s *Server) ListServices(ctx context.Context, request *api.ListServicesRequ } }) if err != nil { - return nil, err + switch err { + case store.ErrInvalidFindBy: + return nil, status.Errorf(codes.InvalidArgument, err.Error()) + default: + return nil, err + } } if request.Filters != nil { diff --git a/manager/controlapi/service_test.go b/manager/controlapi/service_test.go index b560a4d659..9ea1192028 100644 --- a/manager/controlapi/service_test.go +++ b/manager/controlapi/service_test.go @@ -615,6 +615,14 @@ func TestCreateService(t *testing.T) { _, err = ts.Client.CreateService(context.Background(), &api.CreateServiceRequest{Spec: spec}) assert.Error(t, err) assert.Equal(t, codes.InvalidArgument, testutils.ErrorCode(err)) + + spec = createSpec("notunique", "image", 1) + _, err = ts.Client.CreateService(context.Background(), &api.CreateServiceRequest{Spec: spec}) + assert.NoError(t, err) + + r, err = ts.Client.CreateService(context.Background(), &api.CreateServiceRequest{Spec: spec}) + assert.Error(t, err) + assert.Equal(t, codes.AlreadyExists, testutils.ErrorCode(err)) } func TestSecretValidation(t *testing.T) { @@ -870,6 +878,16 @@ func TestUpdateService(t *testing.T) { }) assert.Error(t, err) + // Attempt to update service name; renaming is not implemented + r.Service.Spec.Annotations.Name = "newname" + _, err = ts.Client.UpdateService(context.Background(), &api.UpdateServiceRequest{ + ServiceID: service.ID, + Spec: &r.Service.Spec, + ServiceVersion: version, + }) + assert.Error(t, err) + assert.Equal(t, codes.Unimplemented, testutils.ErrorCode(err)) + // test port conflicts spec2 := createSpec("name2", "image", 1) spec2.Endpoint = &api.EndpointSpec{Ports: []*api.PortConfig{