refactor create / find / delete end points for cards (#3159)

* refactor create / find / delete end points for cards
This commit is contained in:
Eoin McAfee 2021-11-12 10:23:08 +00:00 committed by GitHub
parent df2da1c646
commit 8a27f0f0e8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 64 additions and 17 deletions

View file

@ -78,16 +78,16 @@ func InitializeApplication(config2 config.Config) (application, error) {
reaper := provideReaper(repositoryStore, buildStore, stageStore, coreCanceler, config2) reaper := provideReaper(repositoryStore, buildStore, stageStore, coreCanceler, config2)
coreLicense := provideLicense(client, config2) coreLicense := provideLicense(client, config2)
datadog := provideDatadog(userStore, repositoryStore, buildStore, system, coreLicense, config2) datadog := provideDatadog(userStore, repositoryStore, buildStore, system, coreLicense, config2)
cardStore := card.New(db)
logStore := provideLogStore(db, config2) logStore := provideLogStore(db, config2)
logStream := livelog.New(redisDB) logStream := livelog.New(redisDB)
netrcService := provideNetrcService(client, renewer, config2) netrcService := provideNetrcService(client, renewer, config2)
secretStore := secret.New(db, encrypter) secretStore := secret.New(db, encrypter)
globalSecretStore := global.New(db, encrypter) globalSecretStore := global.New(db, encrypter)
buildManager := manager.New(buildStore, configService, convertService, corePubsub, logStore, logStream, netrcService, repositoryStore, scheduler, secretStore, globalSecretStore, statusService, stageStore, stepStore, system, userStore, webhookSender) buildManager := manager.New(buildStore, cardStore, configService, convertService, corePubsub, logStore, logStream, netrcService, repositoryStore, scheduler, secretStore, globalSecretStore, statusService, stageStore, stepStore, system, userStore, webhookSender)
secretService := provideSecretPlugin(config2) secretService := provideSecretPlugin(config2)
registryService := provideRegistryPlugin(config2) registryService := provideRegistryPlugin(config2)
runner := provideRunner(buildManager, secretService, registryService, config2) runner := provideRunner(buildManager, secretService, registryService, config2)
cardStore := card.New(db)
hookService := provideHookService(client, renewer, config2) hookService := provideHookService(client, renewer, config2)
licenseService := license.NewService(userStore, repositoryStore, buildStore, coreLicense) licenseService := license.NewService(userStore, repositoryStore, buildStore, coreLicense)
organizationService := provideOrgService(client, renewer) organizationService := provideOrgService(client, renewer)

View file

@ -16,9 +16,15 @@ package core
import ( import (
"context" "context"
"encoding/json"
"io" "io"
) )
type CardInput struct {
Schema string `json:"schema"`
Data json.RawMessage `json:"data"`
}
// CardStore manages repository cards. // CardStore manages repository cards.
type CardStore interface { type CardStore interface {
// Find returns a card data stream from the datastore. // Find returns a card data stream from the datastore.

2
go.mod
View file

@ -60,4 +60,4 @@ require (
replace github.com/h2non/gock => gopkg.in/h2non/gock.v1 v1.0.14 replace github.com/h2non/gock => gopkg.in/h2non/gock.v1 v1.0.14
go 1.13 go 1.13

5
go.sum
View file

@ -78,10 +78,6 @@ github.com/drone/drone-go v1.4.1-0.20201109202657-b9e58bbbcf27/go.mod h1:fxCf9jA
github.com/drone/drone-runtime v1.0.7-0.20190729202838-87c84080f4a1/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs= github.com/drone/drone-runtime v1.0.7-0.20190729202838-87c84080f4a1/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs=
github.com/drone/drone-runtime v1.1.1-0.20200623162453-61e33e2cab5d h1:P5HI/Y9hARTZ3F3EKs0kYijhjXZWQRQHYn1neTi0pWM= github.com/drone/drone-runtime v1.1.1-0.20200623162453-61e33e2cab5d h1:P5HI/Y9hARTZ3F3EKs0kYijhjXZWQRQHYn1neTi0pWM=
github.com/drone/drone-runtime v1.1.1-0.20200623162453-61e33e2cab5d/go.mod h1:4/2QToW5+HGD0y1sTw7X35W1f7YINS14UfDY4isggT8= github.com/drone/drone-runtime v1.1.1-0.20200623162453-61e33e2cab5d/go.mod h1:4/2QToW5+HGD0y1sTw7X35W1f7YINS14UfDY4isggT8=
github.com/drone/drone-ui v2.2.1+incompatible h1:j5Py26SOjyPHCp294qmVCASeCQ+Q8l/fBNw8UqBPyNU=
github.com/drone/drone-ui v2.2.1+incompatible/go.mod h1:NBtVWW7NNJpD9+huMD/5TAE1db2nrEh0i35/9Rf1MPI=
github.com/drone/drone-ui v2.3.0+incompatible h1:iFNrvqF/huhKCmGFH80FapiIF4JscNkCfT9lSnm4+Is=
github.com/drone/drone-ui v2.3.0+incompatible/go.mod h1:NBtVWW7NNJpD9+huMD/5TAE1db2nrEh0i35/9Rf1MPI=
github.com/drone/drone-ui v2.3.1+incompatible h1:JYOer5JRttNjXGJhJnH/ELksr3ORO/OWZS19VdlGtro= github.com/drone/drone-ui v2.3.1+incompatible h1:JYOer5JRttNjXGJhJnH/ELksr3ORO/OWZS19VdlGtro=
github.com/drone/drone-ui v2.3.1+incompatible/go.mod h1:NBtVWW7NNJpD9+huMD/5TAE1db2nrEh0i35/9Rf1MPI= github.com/drone/drone-ui v2.3.1+incompatible/go.mod h1:NBtVWW7NNJpD9+huMD/5TAE1db2nrEh0i35/9Rf1MPI=
github.com/drone/drone-yaml v1.2.4-0.20200326192514-6f4d6dfb39e4 h1:XsstoCeXC2t8lA9OLTdoFwckaptqahxwjCWsenySfX8= github.com/drone/drone-yaml v1.2.4-0.20200326192514-6f4d6dfb39e4 h1:XsstoCeXC2t8lA9OLTdoFwckaptqahxwjCWsenySfX8=
@ -350,7 +346,6 @@ golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGm
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=

View file

@ -19,11 +19,6 @@ import (
"github.com/go-chi/chi" "github.com/go-chi/chi"
) )
type cardInput struct {
Schema string `json:"schema"`
Data json.RawMessage `json:"data"`
}
// HandleCreate returns an http.HandlerFunc that processes http // HandleCreate returns an http.HandlerFunc that processes http
// requests to create a new card. // requests to create a new card.
func HandleCreate( func HandleCreate(
@ -57,7 +52,7 @@ func HandleCreate(
return return
} }
in := new(cardInput) in := new(core.CardInput)
err = json.NewDecoder(r.Body).Decode(in) err = json.NewDecoder(r.Body).Decode(in)
if err != nil { if err != nil {
render.BadRequest(w, err) render.BadRequest(w, err)

View file

@ -18,6 +18,7 @@ import (
"bytes" "bytes"
"context" "context"
"io" "io"
"io/ioutil"
"time" "time"
"github.com/drone/drone-yaml/yaml/converter" "github.com/drone/drone-yaml/yaml/converter"
@ -65,10 +66,10 @@ type (
// After signals the build step is complete. // After signals the build step is complete.
After(ctx context.Context, step *core.Step) error After(ctx context.Context, step *core.Step) error
// Before signals the build stage is about to start. // BeforeAll signals the build stage is about to start.
BeforeAll(ctx context.Context, stage *core.Stage) error BeforeAll(ctx context.Context, stage *core.Stage) error
// After signals the build stage is complete. // AfterAll signals the build stage is complete.
AfterAll(ctx context.Context, stage *core.Stage) error AfterAll(ctx context.Context, stage *core.Stage) error
// Watch watches for build cancellation requests. // Watch watches for build cancellation requests.
@ -82,6 +83,9 @@ type (
// UploadBytes uploads the full logs // UploadBytes uploads the full logs
UploadBytes(ctx context.Context, step int64, b []byte) error UploadBytes(ctx context.Context, step int64, b []byte) error
// UploadCard creates a new card
UploadCard(ctx context.Context, step int64, input *core.CardInput) error
} }
// Request provides filters when requesting a pending // Request provides filters when requesting a pending
@ -101,6 +105,7 @@ type (
// New returns a new Manager. // New returns a new Manager.
func New( func New(
builds core.BuildStore, builds core.BuildStore,
cards core.CardStore,
config core.ConfigService, config core.ConfigService,
converter core.ConvertService, converter core.ConvertService,
events core.Pubsub, events core.Pubsub,
@ -120,6 +125,7 @@ func New(
) BuildManager { ) BuildManager {
return &Manager{ return &Manager{
Builds: builds, Builds: builds,
Cards: cards,
Config: config, Config: config,
Converter: converter, Converter: converter,
Events: events, Events: events,
@ -143,6 +149,7 @@ func New(
// can more easily interact with the server. // can more easily interact with the server.
type Manager struct { type Manager struct {
Builds core.BuildStore Builds core.BuildStore
Cards core.CardStore
Config core.ConfigService Config core.ConfigService
Converter core.ConvertService Converter core.ConvertService
Events core.Pubsub Events core.Pubsub
@ -535,3 +542,16 @@ func (m *Manager) UploadBytes(ctx context.Context, step int64, data []byte) erro
} }
return err return err
} }
// UploadCard creates card for step.
func (m *Manager) UploadCard(ctx context.Context, stepId int64, input *core.CardInput) error {
data := ioutil.NopCloser(
bytes.NewBuffer(input.Data),
)
err := m.Cards.Create(ctx, stepId, data)
if err != nil {
logger := logrus.WithError(err)
logger.Warnln("manager: cannot create card")
}
return nil
}

View file

@ -9,6 +9,7 @@ package rpc
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"io" "io"
"io/ioutil" "io/ioutil"
@ -208,6 +209,10 @@ func (s *Client) UploadBytes(ctx context.Context, step int64, data []byte) error
return s.upload(noContext, endpoint, data) return s.upload(noContext, endpoint, data)
} }
func (s *Client) UploadCard(ctx context.Context, step int64, input *core.CardInput) error {
return errors.New("rpc upload card not supported")
}
func (s *Client) send(ctx context.Context, path string, in, out interface{}) error { func (s *Client) send(ctx context.Context, path string, in, out interface{}) error {
// Source a buffer from a pool. The agent may generate a // Source a buffer from a pool. The agent may generate a
// large number of small requests for log entries. This will // large number of small requests for log entries. This will

View file

@ -29,6 +29,7 @@ import (
"github.com/go-chi/chi" "github.com/go-chi/chi"
"github.com/drone/drone/core" "github.com/drone/drone/core"
"github.com/drone/drone/handler/api/render"
"github.com/drone/drone/operator/manager" "github.com/drone/drone/operator/manager"
"github.com/drone/drone/store/shared/db" "github.com/drone/drone/store/shared/db"
) )
@ -270,6 +271,31 @@ func HandleLogUpload(m manager.BuildManager) http.HandlerFunc {
} }
} }
// HandleCardUpload returns an http.HandlerFunc that accepts an
// http.Request to upload and persist a card for a pipeline step.
//
// POST /rpc/v2/step/{step}/card
func HandleCardUpload(m manager.BuildManager) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
step, _ := strconv.ParseInt(
chi.URLParam(r, "step"), 10, 64)
in := new(core.CardInput)
err := json.NewDecoder(r.Body).Decode(in)
if err != nil {
render.BadRequest(w, err)
return
}
err = m.UploadCard(noContext, step, in)
if err != nil {
writeError(w, err)
} else {
writeOK(w)
}
}
}
// write a 200 Status OK to the response body. // write a 200 Status OK to the response body.
func writeJSON(w http.ResponseWriter, v interface{}) { func writeJSON(w http.ResponseWriter, v interface{}) {
json.NewEncoder(w).Encode(v) json.NewEncoder(w).Encode(v)

View file

@ -37,6 +37,7 @@ func NewServer(manager manager.BuildManager, secret string) Server {
r.Post("/build/{build}/watch", HandleWatch(manager)) r.Post("/build/{build}/watch", HandleWatch(manager))
r.Post("/step/{step}/logs/batch", HandleLogBatch(manager)) r.Post("/step/{step}/logs/batch", HandleLogBatch(manager))
r.Post("/step/{step}/logs/upload", HandleLogUpload(manager)) r.Post("/step/{step}/logs/upload", HandleLogUpload(manager))
r.Post("/step/{step}/card", HandleCardUpload(manager))
return Server(r) return Server(r)
} }
@ -55,4 +56,3 @@ func authorization(token string) func(http.Handler) http.Handler {
}) })
} }
} }