Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: return back the data just created via POST method in manager API #1277

Merged
merged 3 commits into from
Jan 17, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions api/internal/core/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import (
type Interface interface {
Get(key string) (interface{}, error)
List(input ListInput) (*ListOutput, error)
Create(ctx context.Context, obj interface{}) error
Create(ctx context.Context, obj interface{}) (interface{}, error)
Update(ctx context.Context, obj interface{}, createIfNotExist bool) error
BatchDelete(ctx context.Context, keys []string) error
}
Expand Down Expand Up @@ -240,36 +240,36 @@ func (s *GenericStore) ingestValidate(obj interface{}) (err error) {
return err
}

func (s *GenericStore) Create(ctx context.Context, obj interface{}) error {
func (s *GenericStore) Create(ctx context.Context, obj interface{}) (interface{}, error) {
if setter, ok := obj.(entity.BaseInfoSetter); ok {
info := setter.GetBaseInfo()
info.Creating()
}

if err := s.ingestValidate(obj); err != nil {
return err
return nil, err
}

key := s.opt.KeyFunc(obj)
if key == "" {
return fmt.Errorf("key is required")
return nil, fmt.Errorf("key is required")
}
_, ok := s.cache.Load(key)
if ok {
log.Warnf("key: %s is conflicted", key)
return fmt.Errorf("key: %s is conflicted", key)
return nil, fmt.Errorf("key: %s is conflicted", key)
}

bs, err := json.Marshal(obj)
if err != nil {
log.Errorf("json marshal failed: %s", err)
return fmt.Errorf("json marshal failed: %s", err)
return nil, fmt.Errorf("json marshal failed: %s", err)
}
if err := s.Stg.Create(ctx, s.GetObjStorageKey(obj), string(bs)); err != nil {
return err
return nil, err
}

return nil
return obj, nil
}

func (s *GenericStore) Update(ctx context.Context, obj interface{}, createIfNotExist bool) error {
Expand All @@ -284,7 +284,8 @@ func (s *GenericStore) Update(ctx context.Context, obj interface{}, createIfNotE
storedObj, ok := s.cache.Load(key)
if !ok {
if createIfNotExist {
return s.Create(ctx, obj)
_, err := s.Create(ctx, obj)
return err
}
log.Warnf("key: %s is not found", key)
return fmt.Errorf("key: %s is not found", key)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/core/store/store_mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package store

import (
"context"

"github.com/stretchr/testify/mock"
)

Expand Down Expand Up @@ -48,9 +49,9 @@ func (m *MockInterface) List(input ListInput) (*ListOutput, error) {
return r0, r1
}

func (m *MockInterface) Create(ctx context.Context, obj interface{}) error {
func (m *MockInterface) Create(ctx context.Context, obj interface{}) (interface{}, error) {
ret := m.Mock.Called(ctx, obj)
return ret.Error(0)
return ret.Get(0), ret.Error(1)
}

func (m *MockInterface) Update(ctx context.Context, obj interface{}, createOnFail bool) error {
Expand Down
7 changes: 6 additions & 1 deletion api/internal/core/store/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -613,12 +613,17 @@ func TestGenericStore_Create(t *testing.T) {

tc.giveStore.Stg = mStorage
tc.giveStore.opt.Validator = mValidator
err := tc.giveStore.Create(context.TODO(), tc.giveObj)
ret, err := tc.giveStore.Create(context.TODO(), tc.giveObj)
assert.True(t, validateCalled, tc.caseDesc)
if err != nil {
assert.Equal(t, tc.wantErr, err, tc.caseDesc)
continue
}
retTs, ok := ret.(*TestStruct)
assert.True(t, ok)
// The returned value (retTs) should be the same as the input (tc.giveObj)
assert.Equal(t, tc.giveObj.Field1, retTs.Field1, tc.caseDesc)
assert.Equal(t, tc.giveObj.Field2, retTs.Field2, tc.caseDesc)
assert.True(t, createCalled, tc.caseDesc)
}
}
Expand Down
9 changes: 5 additions & 4 deletions api/internal/handler/route/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -348,16 +348,17 @@ func (h *Handler) Create(c droplet.Context) (interface{}, error) {
}

//save original conf
if err = h.scriptStore.Create(c.Context(), script); err != nil {
if _, err = h.scriptStore.Create(c.Context(), script); err != nil {
return nil, err
}
}

if err := h.routeStore.Create(c.Context(), input); err != nil {
ret, err := h.routeStore.Create(c.Context(), input)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down Expand Up @@ -429,7 +430,7 @@ func (h *Handler) Update(c droplet.Context) (interface{}, error) {
if err = h.scriptStore.Update(c.Context(), script, true); err != nil {
//if not exists, create
if err.Error() == fmt.Sprintf("key: %s is not found", script.ID) {
if err := h.scriptStore.Create(c.Context(), script); err != nil {
if _, err := h.scriptStore.Create(c.Context(), script); err != nil {
return handler.SpecCodeResponse(err), err
}
} else {
Expand Down
27 changes: 20 additions & 7 deletions api/internal/handler/route/route_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,8 +391,12 @@ func TestRoute(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route)
assert.Nil(t, err)
ctx.SetInput(route)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
// check the returned valued
objRet, ok := ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -401,7 +405,7 @@ func TestRoute(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.Route)
assert.Nil(t, err)
assert.Equal(t, stored.ID, route.ID)
Expand Down Expand Up @@ -938,7 +942,7 @@ func TestRoute(t *testing.T) {
dataPage = retPage.(*store.ListOutput)
assert.Equal(t, len(dataPage.Rows), 1)

//sleep
// sleep
time.Sleep(time.Duration(100) * time.Millisecond)

// list search and status not match
Expand Down Expand Up @@ -1024,8 +1028,11 @@ func TestRoute(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route3)
assert.Nil(t, err)
ctx.SetInput(route3)
_, err = handler.Create(ctx)
ret, err = handler.Create(ctx)
assert.Nil(t, err)
objRet, ok = ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "2", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand Down Expand Up @@ -1153,8 +1160,11 @@ func TestRoute(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route11)
assert.Nil(t, err)
ctx.SetInput(route11)
_, err = handler.Create(ctx)
ret, err = handler.Create(ctx)
assert.Nil(t, err)
objRet, ok = ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "11", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand Down Expand Up @@ -1288,8 +1298,11 @@ func Test_Route_With_Script_Dag2lua(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route)
assert.Nil(t, err)
ctx.SetInput(route)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(20) * time.Millisecond)
Expand All @@ -1298,7 +1311,7 @@ func Test_Route_With_Script_Dag2lua(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.Route)
assert.Nil(t, err)
assert.Equal(t, stored.ID, route.ID)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/handler/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,12 @@ func (h *Handler) Create(c droplet.Context) (interface{}, error) {
}
}

if err := h.serviceStore.Create(c.Context(), input); err != nil {
ret, err := h.serviceStore.Create(c.Context(), input)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down
12 changes: 9 additions & 3 deletions api/internal/handler/service/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,11 @@ func TestService(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), service)
assert.Nil(t, err)
ctx.SetInput(service)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Service)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -78,7 +81,7 @@ func TestService(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.Service)
assert.Nil(t, err)
assert.Equal(t, stored.ID, service.ID)
Expand Down Expand Up @@ -173,8 +176,11 @@ func TestService(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), service11)
assert.Nil(t, err)
ctx.SetInput(service11)
_, err = handler.Create(ctx)
ret, err = handler.Create(ctx)
assert.Nil(t, err)
objRet, ok = ret.(*entity.Service)
assert.True(t, ok)
assert.Equal(t, "11", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/handler/ssl/ssl.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,12 @@ func (h *Handler) Create(c droplet.Context) (interface{}, error) {
ssl.ID = input.ID
//set default value for SSL status, if not set, it will be 0 which means disable.
ssl.Status = conf.SSLDefaultStatus
if err := h.sslStore.Create(c.Context(), ssl); err != nil {
ret, err := h.sslStore.Create(c.Context(), ssl)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down
7 changes: 5 additions & 2 deletions api/internal/handler/ssl/ssl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@ func TestSSL(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), ssl)
assert.Nil(t, err)
ctx.SetInput(ssl)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.SSL)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -64,7 +67,7 @@ func TestSSL(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.SSL)
assert.Nil(t, err)
assert.Equal(t, stored.ID, ssl.ID)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/handler/upstream/upstream.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,12 @@ func (h *Handler) List(c droplet.Context) (interface{}, error) {
func (h *Handler) Create(c droplet.Context) (interface{}, error) {
input := c.Input().(*entity.Upstream)

if err := h.upstreamStore.Create(c.Context(), input); err != nil {
ret, err := h.upstreamStore.Create(c.Context(), input)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down
14 changes: 10 additions & 4 deletions api/internal/handler/upstream/upstream_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,11 @@ func TestUpstream(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), upstream)
assert.Nil(t, err)
ctx.SetInput(upstream)
_, err = upstreamHandler.Create(ctx)
ret, err := upstreamHandler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Upstream)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -106,7 +109,7 @@ func TestUpstream(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := upstreamHandler.Get(ctx)
ret, err = upstreamHandler.Get(ctx)
stored := ret.(*entity.Upstream)
assert.Nil(t, err)
assert.Equal(t, stored.ID, upstream.ID)
Expand Down Expand Up @@ -205,8 +208,11 @@ func TestUpstream_Pass_Host(t *testing.T) {
err := json.Unmarshal([]byte(reqBody), upstream)
assert.Nil(t, err)
ctx.SetInput(upstream)
_, err = upstreamHandler.Create(ctx)
ret, err := upstreamHandler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Upstream)
assert.True(t, ok)
assert.Equal(t, "2", objRet.ID)

//sleep
time.Sleep(time.Duration(20) * time.Millisecond)
Expand All @@ -215,7 +221,7 @@ func TestUpstream_Pass_Host(t *testing.T) {
input := &GetInput{}
input.ID = "2"
ctx.SetInput(input)
ret, err := upstreamHandler.Get(ctx)
ret, err = upstreamHandler.Get(ctx)
stored := ret.(*entity.Upstream)
assert.Nil(t, err)
assert.Equal(t, stored.ID, upstream.ID)
Expand Down
Loading