feat(pkger): add stack foundation

pull/17373/head
Johnny Steenbergen 2020-03-19 19:08:35 -07:00 committed by Johnny Steenbergen
parent 481ee1653d
commit 583e512451
6 changed files with 83 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package pkger
import ( import (
"context" "context"
"net/http" "net/http"
"net/url"
"github.com/influxdata/influxdb" "github.com/influxdata/influxdb"
"github.com/influxdata/influxdb/pkg/httpc" "github.com/influxdata/influxdb/pkg/httpc"
@ -15,6 +16,10 @@ type HTTPRemoteService struct {
var _ SVC = (*HTTPRemoteService)(nil) var _ SVC = (*HTTPRemoteService)(nil)
func (s *HTTPRemoteService) InitStack(ctx context.Context, orgID, userID influxdb.ID, urls ...url.URL) (Stack, error) {
panic("not implemented yet")
}
// CreatePkg will produce a pkg from the parameters provided. // CreatePkg will produce a pkg from the parameters provided.
func (s *HTTPRemoteService) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (*Pkg, error) { func (s *HTTPRemoteService) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (*Pkg, error) {
var opt CreateOpt var opt CreateOpt

View File

@ -475,6 +475,10 @@ type fakeSVC struct {
ApplyFn func(ctx context.Context, orgID, userID influxdb.ID, pkg *pkger.Pkg, opts ...pkger.ApplyOptFn) (pkger.Summary, error) ApplyFn func(ctx context.Context, orgID, userID influxdb.ID, pkg *pkger.Pkg, opts ...pkger.ApplyOptFn) (pkger.Summary, error)
} }
func (f *fakeSVC) InitStack(ctx context.Context, orgID, userID influxdb.ID, urls ...url.URL) (pkger.Stack, error) {
panic("not implemented")
}
func (f *fakeSVC) CreatePkg(ctx context.Context, setters ...pkger.CreatePkgSetFn) (*pkger.Pkg, error) { func (f *fakeSVC) CreatePkg(ctx context.Context, setters ...pkger.CreatePkgSetFn) (*pkger.Pkg, error) {
panic("not implemented") panic("not implemented")
} }

View File

@ -4,6 +4,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"net/url"
"sort" "sort"
"strings" "strings"
"sync" "sync"
@ -17,8 +18,26 @@ import (
// APIVersion marks the current APIVersion for influx packages. // APIVersion marks the current APIVersion for influx packages.
const APIVersion = "influxdata.com/v2alpha1" const APIVersion = "influxdata.com/v2alpha1"
type (
Stack struct {
ID influxdb.ID
CreatedAt time.Time
UpdatedAt time.Time
URLS []url.URL
Resources []StackResource
}
StackResource struct {
APIVersion string
ID influxdb.ID
Kind Kind
Name string
}
)
// SVC is the packages service interface. // SVC is the packages service interface.
type SVC interface { type SVC interface {
InitStack(ctx context.Context, orgID, userID influxdb.ID, urls ...url.URL) (Stack, error)
CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (*Pkg, error) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (*Pkg, error)
DryRun(ctx context.Context, orgID, userID influxdb.ID, pkg *Pkg, opts ...ApplyOptFn) (Summary, Diff, error) DryRun(ctx context.Context, orgID, userID influxdb.ID, pkg *Pkg, opts ...ApplyOptFn) (Summary, Diff, error)
Apply(ctx context.Context, orgID, userID influxdb.ID, pkg *Pkg, opts ...ApplyOptFn) (Summary, error) Apply(ctx context.Context, orgID, userID influxdb.ID, pkg *Pkg, opts ...ApplyOptFn) (Summary, error)
@ -124,11 +143,24 @@ func WithVariableSVC(varSVC influxdb.VariableService) ServiceSetterFn {
} }
} }
type Store interface {
CreateStack(ctx context.Context, orgID influxdb.ID, stack Stack) error
ReadStackByID(ctx context.Context, id influxdb.ID) (Stack, error)
UpdateStack(ctx context.Context, orgID influxdb.ID, stack Stack) error
DeleteStack(ctx context.Context, id influxdb.ID) error
}
// Service provides the pkger business logic including all the dependencies to make // Service provides the pkger business logic including all the dependencies to make
// this resource sausage. // this resource sausage.
type Service struct { type Service struct {
log *zap.Logger log *zap.Logger
// internal dependencies
idGen influxdb.IDGenerator
timeGen influxdb.TimeGenerator
store Store
// external service dependencies
bucketSVC influxdb.BucketService bucketSVC influxdb.BucketService
checkSVC influxdb.CheckService checkSVC influxdb.CheckService
dashSVC influxdb.DashboardService dashSVC influxdb.DashboardService
@ -171,6 +203,12 @@ func NewService(opts ...ServiceSetterFn) *Service {
} }
} }
func (s *Service) InitStack(ctx context.Context, orgID, userID influxdb.ID, urls ...url.URL) (Stack, error) {
stack := Stack{
}
return stack, nil
}
type ( type (
// CreatePkgSetFn is a functional input for setting the pkg fields. // CreatePkgSetFn is a functional input for setting the pkg fields.
CreatePkgSetFn func(opt *CreateOpt) error CreatePkgSetFn func(opt *CreateOpt) error

View File

@ -2,6 +2,7 @@ package pkger
import ( import (
"context" "context"
"net/url"
"time" "time"
"github.com/influxdata/influxdb" "github.com/influxdata/influxdb"
@ -25,6 +26,27 @@ func MWLogging(log *zap.Logger) SVCMiddleware {
var _ SVC = (*loggingMW)(nil) var _ SVC = (*loggingMW)(nil)
func (s *loggingMW) InitStack(ctx context.Context, orgID, userID influxdb.ID, urls ...url.URL) (stack Stack, err error) {
defer func(start time.Time) {
if err != nil {
urlStrs := make([]string, 0, len(urls))
for _, u := range urls {
urlStrs = append(urlStrs, u.String())
}
s.logger.Error(
"failed to init stack",
zap.Error(err),
zap.Duration("took", time.Since(start)),
zap.Stringer("orgID", orgID),
zap.Stringer("userID", userID),
zap.Strings("urls", urlStrs),
)
return
}
}(time.Now())
return s.next.InitStack(ctx, orgID, userID, urls...)
}
func (s *loggingMW) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (pkg *Pkg, err error) { func (s *loggingMW) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (pkg *Pkg, err error) {
defer func(start time.Time) { defer func(start time.Time) {
dur := zap.Duration("took", time.Since(start)) dur := zap.Duration("took", time.Since(start))

View File

@ -2,6 +2,7 @@ package pkger
import ( import (
"context" "context"
"net/url"
"github.com/influxdata/influxdb" "github.com/influxdata/influxdb"
"github.com/influxdata/influxdb/kit/metric" "github.com/influxdata/influxdb/kit/metric"
@ -27,6 +28,12 @@ func MWMetrics(reg *prom.Registry) SVCMiddleware {
} }
} }
func (s *mwMetrics) InitStack(ctx context.Context, orgID, userID influxdb.ID, urls ...url.URL) (Stack, error) {
rec := s.rec.Record("init_stack")
stack, err := s.next.InitStack(ctx, orgID, userID, urls...)
return stack, rec(err)
}
func (s *mwMetrics) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (*Pkg, error) { func (s *mwMetrics) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (*Pkg, error) {
rec := s.rec.Record("create_pkg") rec := s.rec.Record("create_pkg")
pkg, err := s.next.CreatePkg(ctx, setters...) pkg, err := s.next.CreatePkg(ctx, setters...)

View File

@ -2,6 +2,7 @@ package pkger
import ( import (
"context" "context"
"net/url"
"github.com/influxdata/influxdb" "github.com/influxdata/influxdb"
"github.com/influxdata/influxdb/kit/tracing" "github.com/influxdata/influxdb/kit/tracing"
@ -20,6 +21,12 @@ func MWTracing() SVCMiddleware {
var _ SVC = (*traceMW)(nil) var _ SVC = (*traceMW)(nil)
func (s *traceMW) InitStack(ctx context.Context, orgID, userID influxdb.ID, urls ...url.URL) (Stack, error) {
span, ctx := tracing.StartSpanFromContextWithOperationName(ctx, "InitStack")
defer span.Finish()
return s.next.InitStack(ctx, orgID, userID, urls...)
}
func (s *traceMW) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (pkg *Pkg, err error) { func (s *traceMW) CreatePkg(ctx context.Context, setters ...CreatePkgSetFn) (pkg *Pkg, err error) {
span, ctx := tracing.StartSpanFromContextWithOperationName(ctx, "CreatePkg") span, ctx := tracing.StartSpanFromContextWithOperationName(ctx, "CreatePkg")
defer span.Finish() defer span.Finish()