Skip to content
This repository was archived by the owner on May 30, 2024. It is now read-only.

Provide the dynamic_payload field #389

Merged
merged 4 commits into from
Mar 26, 2022
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
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ require (
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
golang.org/x/text v0.3.7 // indirect
golang.org/x/tools v0.1.9-0.20211216111533-8d383106f7e7 // indirect
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.26.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
Expand Down
1 change: 1 addition & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,7 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.9-0.20211216111533-8d383106f7e7 h1:M1gcVrIb2lSn2FIL19DG0+/b8nNVKJ7W7b4WcAGZAYM=
golang.org/x/tools v0.1.9-0.20211216111533-8d383106f7e7/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
Expand Down
18 changes: 12 additions & 6 deletions internal/interactor/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,31 +71,37 @@ type (
// Deploy posts a new deployment to SCM with the payload.
// But if it requires a review, it saves the payload on the store and waits until reviewed.
// It returns an error for a undeployable payload.
func (i *DeploymentInteractor) Deploy(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, env *extent.Env) (*ent.Deployment, error) {
func (i *DeploymentInteractor) Deploy(ctx context.Context, u *ent.User, r *ent.Repo, t *ent.Deployment, env *extent.Env) (*ent.Deployment, error) {
number, err := i.store.GetNextDeploymentNumberOfRepo(ctx, r)
if err != nil {
return nil, e.NewError(e.ErrorCodeInternalError, err)
}

i.log.Debug("Get the next number, and build the deployment.")
d = &ent.Deployment{
d := &ent.Deployment{
Number: number,
Type: d.Type,
Env: d.Env,
Ref: d.Ref,
Type: t.Type,
Env: t.Env,
Ref: t.Ref,
Status: deployment.DefaultStatus,
ProductionEnvironment: env.IsProductionEnvironment(),
IsRollback: d.IsRollback,
IsRollback: t.IsRollback,
UserID: u.ID,
RepoID: r.ID,
}

if env.IsDynamicPayloadEnabled() {
i.log.Debug("Set the dynamic payload.")
d.DynamicPayload = t.DynamicPayload
}

i.log.Debug("Validate the deployment before a request.")
v := NewDeploymentValidator([]Validator{
&RefValidator{Env: env},
&FrozenWindowValidator{Env: env},
&LockValidator{Repo: r, Store: i.store},
&SerializationValidator{Env: env, Store: i.store},
&DynamicPayloadValidator{Env: env},
})
if err := v.Validate(d); err != nil {
return nil, err
Expand Down
14 changes: 14 additions & 0 deletions internal/interactor/validator.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,3 +168,17 @@ func (v *SerializationValidator) Validate(d *ent.Deployment) error {

return err
}

// DynamicPayloadValidator validate the payload with
// the specifications defined in the configuration file.
type DynamicPayloadValidator struct {
Env *extent.Env
}

func (v *DynamicPayloadValidator) Validate(d *ent.Deployment) error {
if !v.Env.IsDynamicPayloadEnabled() {
return nil
}

return v.Env.ValidateDynamicPayload(d.DynamicPayload)
}
8 changes: 7 additions & 1 deletion internal/pkg/github/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ import (
)

func (g *Github) CreateRemoteDeployment(ctx context.Context, u *ent.User, r *ent.Repo, d *ent.Deployment, env *extent.Env) (*extent.RemoteDeployment, error) {
// If there is a dynamic payload, set it as the payload.
payload := env.Payload
if d.DynamicPayload != nil {
payload = d.DynamicPayload
}

Comment on lines +16 to +21
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If there is a dynamic payload, set it as the payload for deployment API.

gd, res, err := g.Client(ctx, u.Token).
Repositories.
CreateDeployment(ctx, r.Namespace, r.Name, &github.DeploymentRequest{
Expand All @@ -22,7 +28,7 @@ func (g *Github) CreateRemoteDeployment(ctx context.Context, u *ent.User, r *ent
Description: env.Description,
AutoMerge: env.AutoMerge,
RequiredContexts: env.RequiredContexts,
Payload: env.Payload,
Payload: payload,
ProductionEnvironment: env.ProductionEnvironment,
})
if res.StatusCode == http.StatusConflict {
Expand Down
6 changes: 2 additions & 4 deletions internal/pkg/store/deployment.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ func (s *Store) CreateDeployment(ctx context.Context, d *ent.Deployment) (*ent.D
SetType(d.Type).
SetRef(d.Ref).
SetEnv(d.Env).
SetDynamicPayload(d.DynamicPayload).
SetUID(d.UID).
SetSha(d.Sha).
SetHTMLURL(d.HTMLURL).
Expand All @@ -277,10 +278,7 @@ func (s *Store) CreateDeployment(ctx context.Context, d *ent.Deployment) (*ent.D
if ent.IsConstraintError(err) {
return nil, e.NewError(e.ErrorCodeDeploymentConflict, err)
} else if ent.IsValidationError(err) {
return nil, e.NewErrorWithMessage(
e.ErrorCodeEntityUnprocessable,
fmt.Sprintf("Failed to create a deployment. The value of \"%s\" field is invalid.", err.(*ent.ValidationError).Name),
err)
return nil, e.NewErrorWithMessage(e.ErrorCodeEntityUnprocessable, fmt.Sprintf("Failed to create a deployment. The value of \"%s\" field is invalid.", err.(*ent.ValidationError).Name), err)
} else if err != nil {
return nil, e.NewError(e.ErrorCodeInternalError, err)
}
Expand Down
14 changes: 8 additions & 6 deletions internal/server/api/v1/repos/deployment_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ import (

type (
DeploymentPostPayload struct {
Type string `json:"type"`
Ref string `json:"ref"`
Env string `json:"env"`
Type string `json:"type"`
Ref string `json:"ref"`
Env string `json:"env"`
DynamicPayload map[string]interface{} `json:"dynamic_payload"`
}
)

Expand Down Expand Up @@ -56,9 +57,10 @@ func (s *DeploymentAPI) Create(c *gin.Context) {

d, err := s.i.Deploy(ctx, u, re,
&ent.Deployment{
Type: deployment.Type(p.Type),
Env: p.Env,
Ref: p.Ref,
Type: deployment.Type(p.Type),
Env: p.Env,
Ref: p.Ref,
DynamicPayload: p.DynamicPayload,
},
env)
if err != nil {
Expand Down
15 changes: 15 additions & 0 deletions model/ent/deployment.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions model/ent/deployment/deployment.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions model/ent/deployment/where.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions model/ent/deployment_create.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

50 changes: 50 additions & 0 deletions model/ent/deployment_update.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading