Skip to content

Commit

Permalink
feat(pkger): extend stacks with update functionality
Browse files Browse the repository at this point in the history
references: #18548
  • Loading branch information
jsteenb2 committed Jun 17, 2020
1 parent a19604c commit 6a295f6
Show file tree
Hide file tree
Showing 12 changed files with 489 additions and 70 deletions.
8 changes: 8 additions & 0 deletions cmd/influx/pkg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,14 @@ func (f *fakePkgSVC) ExportStack(ctx context.Context, orgID, stackID influxdb.ID
panic("not implemented")
}

func (f *fakePkgSVC) ReadStack(ctx context.Context, id influxdb.ID) (pkger.Stack, error) {
panic("not implemented")
}

func (f *fakePkgSVC) UpdateStack(ctx context.Context, upd pkger.StackUpdate) (pkger.Stack, error) {
panic("not implemented")
}

func (f *fakePkgSVC) CreatePkg(ctx context.Context, setters ...pkger.CreatePkgSetFn) (*pkger.Pkg, error) {
if f.createFn != nil {
return f.createFn(ctx, setters...)
Expand Down
73 changes: 70 additions & 3 deletions cmd/influxd/launcher/pkger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,15 @@ func TestLauncher_Pkger(t *testing.T) {
newStack, err := svc.InitStack(ctx, l.User.ID, stack)
require.NoError(t, err)

assert.NotZero(t, newStack.OrgID)
assert.Equal(t, l.Org.ID, newStack.OrgID)
assert.Equal(t, stack.Name, newStack.Name)
assert.Equal(t, stack.Description, newStack.Description)
assert.Equal(t, stack.URLs, newStack.URLs)
assert.NotNil(t, newStack.Resources)
assert.NotNil(t, newStack.Resources, "failed to match stack resorces")
expectedURLs := stack.URLs
if expectedURLs == nil {
expectedURLs = []string{}
}
assert.Equal(t, expectedURLs, newStack.URLs, "failed to match stack URLs")
assert.NotZero(t, newStack.CRUDLog)

return newStack, func() {
Expand Down Expand Up @@ -371,6 +375,65 @@ func TestLauncher_Pkger(t *testing.T) {
})
})

t.Run("read a stack", func(t *testing.T) {
stacks, err := svc.ListStacks(ctx, l.Org.ID, pkger.ListFilter{})
require.NoError(t, err)
require.Empty(t, stacks)

newStack1, cleanup1 := newStackFn(t, pkger.Stack{
Name: "first stack",
})
defer cleanup1()

newStack2, cleanup2 := newStackFn(t, pkger.Stack{
Name: "second stack",
})
defer cleanup2()

actual, err := svc.ReadStack(ctx, newStack1.ID)
require.NoError(t, err)
assert.Equal(t, newStack1, actual)

actual, err = svc.ReadStack(ctx, newStack2.ID)
require.NoError(t, err)
assert.Equal(t, newStack2, actual)

_, err = svc.ReadStack(ctx, influxdb.ID(9000))
require.Equal(t, influxdb.ENotFound, influxdb.ErrorCode(err))
})

t.Run("updating a stack", func(t *testing.T) {
stack, cleanup := newStackFn(t, pkger.Stack{
OrgID: l.Org.ID,
Name: "first name",
Description: "first desc",
URLs: []string{},
})
defer cleanup()

assertStack := func(t *testing.T, st pkger.Stack) {
t.Helper()
assert.Equal(t, stack.ID, st.ID)
assert.Equal(t, "2nd name", st.Name)
assert.Equal(t, "2nd desc", st.Description)
assert.Equal(t, []string{"http://example.com"}, st.URLs)
assert.True(t, st.UpdatedAt.After(stack.UpdatedAt))
}

updStack, err := svc.UpdateStack(ctx, pkger.StackUpdate{
ID: stack.ID,
Name: strPtr("2nd name"),
Description: strPtr("2nd desc"),
URLs: []string{"http://example.com"},
})
require.NoError(t, err)
assertStack(t, updStack)

readStack, err := svc.ReadStack(ctx, stack.ID)
require.NoError(t, err)
assertStack(t, readStack)
})

t.Run("apply with only a stackID succeeds when stack has URLs", func(t *testing.T) {
svr := httptest.NewServer(nethttp.HandlerFunc(func(w nethttp.ResponseWriter, r *nethttp.Request) {
pkg := newPkg(newBucketObject("bucket-0", "", ""))
Expand Down Expand Up @@ -3664,3 +3727,7 @@ func sortLabels(labels []pkger.SummaryLabel) {
return labels[i].Name < labels[j].Name
})
}

func strPtr(s string) *string {
return &s
}
91 changes: 68 additions & 23 deletions pkger/http_remote_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ func (s *HTTPRemoteService) InitStack(ctx context.Context, userID influxdb.ID, s
URLs: stack.URLs,
}

var respBody RespCreateStack
var respBody RespStack
err := s.Client.
PostJSON(reqBody, RoutePrefix, "/stacks").
DecodeJSON(&respBody).
Expand All @@ -32,27 +32,7 @@ func (s *HTTPRemoteService) InitStack(ctx context.Context, userID influxdb.ID, s
return Stack{}, err
}

newStack := Stack{
Name: respBody.Name,
Description: respBody.Description,
URLs: respBody.URLs,
Resources: make([]StackResource, 0),
CRUDLog: respBody.CRUDLog,
}

id, err := influxdb.IDFromString(respBody.ID)
if err != nil {
return Stack{}, err
}
newStack.ID = *id

orgID, err := influxdb.IDFromString(respBody.OrgID)
if err != nil {
return Stack{}, err
}
newStack.OrgID = *orgID

return newStack, nil
return convertRespStackToStack(respBody)
}

func (s *HTTPRemoteService) DeleteStack(ctx context.Context, identifiers struct{ OrgID, UserID, StackID influxdb.ID }) error {
Expand Down Expand Up @@ -104,7 +84,47 @@ func (s *HTTPRemoteService) ListStacks(ctx context.Context, orgID influxdb.ID, f
if err != nil {
return nil, err
}
return resp.Stacks, nil

out := make([]Stack, 0, len(resp.Stacks))
for _, st := range resp.Stacks {
stack, err := convertRespStackToStack(st)
if err != nil {
continue
}
out = append(out, stack)
}
return out, nil
}

func (s *HTTPRemoteService) ReadStack(ctx context.Context, id influxdb.ID) (Stack, error) {
var respBody RespStack
err := s.Client.
Get(RoutePrefix, "/stacks", id.String()).
DecodeJSON(&respBody).
Do(ctx)
if err != nil {
return Stack{}, err
}
return convertRespStackToStack(respBody)
}

func (s *HTTPRemoteService) UpdateStack(ctx context.Context, upd StackUpdate) (Stack, error) {
reqBody := ReqUpdateStack{
Name: upd.Name,
Description: upd.Description,
URLs: upd.URLs,
}

var respBody RespStack
err := s.Client.
PutJSON(reqBody, RoutePrefix, "/stacks", upd.ID.String()).
DecodeJSON(&respBody).
Do(ctx)
if err != nil {
return Stack{}, err
}

return convertRespStackToStack(respBody)
}

// CreatePkg will produce a pkg from the parameters provided.
Expand Down Expand Up @@ -215,3 +235,28 @@ func (s *HTTPRemoteService) apply(ctx context.Context, orgID influxdb.ID, dryRun

return impact, NewParseError(resp.Errors...)
}

func convertRespStackToStack(respStack RespStack) (Stack, error) {
newStack := Stack{
Name: respStack.Name,
Description: respStack.Description,
Sources: respStack.Sources,
URLs: respStack.URLs,
Resources: respStack.Resources,
CRUDLog: respStack.CRUDLog,
}

id, err := influxdb.IDFromString(respStack.ID)
if err != nil {
return Stack{}, err
}
newStack.ID = *id

orgID, err := influxdb.IDFromString(respStack.OrgID)
if err != nil {
return Stack{}, err
}
newStack.OrgID = *orgID

return newStack, nil
}
Loading

0 comments on commit 6a295f6

Please sign in to comment.