mirror of
https://git.vectorsigma.ru/public/atlantis.git
synced 2026-08-02 08:28:29 +00:00
* Initial work. * Periodic push. * Fmt and start adding args to approve_policies cmd. * keep funcs for now. * Periodic push. * Periodic push. * fmt. * Move approve policies logic to project_command_runner. * update some tests * More test fixes. * update more tests. fix som logic. * more tests. add additional info to common data for custom templates. * fix apply with policies bug. update more tests/fmt * file perms * fix error parsing for conftest results. * Update more tests and linting. * update documentation. * Address no-fail case. Address comments. * Forgot changes. * fix markdown renderer * Fix policy fail logic. remove uneeded tmpl var * targeted policy approvals fix * Address PR comments. * empty commit to trigger build --------- Co-authored-by: PePe Amengual <jose.amengual@gmail.com> Co-authored-by: rkstrickland <ross.strickland@instacart.com> Co-authored-by: Dylan Page <dylan.page@autodesk.com>
88 lines
3.4 KiB
Go
88 lines
3.4 KiB
Go
package events
|
|
|
|
import (
|
|
"github.com/runatlantis/atlantis/server/core/config/raw"
|
|
"github.com/runatlantis/atlantis/server/core/config/valid"
|
|
"github.com/runatlantis/atlantis/server/events/command"
|
|
)
|
|
|
|
//go:generate pegomock generate -m --package mocks -o mocks/mock_command_requirement_handler.go CommandRequirementHandler
|
|
type CommandRequirementHandler interface {
|
|
ValidatePlanProject(repoDir string, ctx command.ProjectContext) (string, error)
|
|
ValidateApplyProject(repoDir string, ctx command.ProjectContext) (string, error)
|
|
ValidateImportProject(repoDir string, ctx command.ProjectContext) (string, error)
|
|
}
|
|
|
|
type DefaultCommandRequirementHandler struct {
|
|
WorkingDir WorkingDir
|
|
}
|
|
|
|
func (a *DefaultCommandRequirementHandler) ValidatePlanProject(repoDir string, ctx command.ProjectContext) (failure string, err error) {
|
|
for _, req := range ctx.PlanRequirements {
|
|
switch req {
|
|
case raw.ApprovedRequirement:
|
|
if !ctx.PullReqStatus.ApprovalStatus.IsApproved {
|
|
return "Pull request must be approved by at least one person other than the author before running plan.", nil
|
|
}
|
|
case raw.MergeableRequirement:
|
|
if !ctx.PullReqStatus.Mergeable {
|
|
return "Pull request must be mergeable before running plan.", nil
|
|
}
|
|
case raw.UnDivergedRequirement:
|
|
if a.WorkingDir.HasDiverged(ctx.Log, repoDir) {
|
|
return "Default branch must be rebased onto pull request before running plan.", nil
|
|
}
|
|
}
|
|
}
|
|
// Passed all plan requirements configured.
|
|
return "", nil
|
|
}
|
|
|
|
func (a *DefaultCommandRequirementHandler) ValidateApplyProject(repoDir string, ctx command.ProjectContext) (failure string, err error) {
|
|
for _, req := range ctx.ApplyRequirements {
|
|
switch req {
|
|
case raw.ApprovedRequirement:
|
|
if !ctx.PullReqStatus.ApprovalStatus.IsApproved {
|
|
return "Pull request must be approved by at least one person other than the author before running apply.", nil
|
|
}
|
|
// this should come before mergeability check since mergeability is a superset of this check.
|
|
case valid.PoliciesPassedCommandReq:
|
|
// We should rely on this function instead of plan status, since plan status after a failed apply will not carry the policy error over.
|
|
if !ctx.PolicyCleared() {
|
|
return "All policies must pass for project before running apply.", nil
|
|
}
|
|
case raw.MergeableRequirement:
|
|
if !ctx.PullReqStatus.Mergeable {
|
|
return "Pull request must be mergeable before running apply.", nil
|
|
}
|
|
case raw.UnDivergedRequirement:
|
|
if a.WorkingDir.HasDiverged(ctx.Log, repoDir) {
|
|
return "Default branch must be rebased onto pull request before running apply.", nil
|
|
}
|
|
}
|
|
}
|
|
// Passed all apply requirements configured.
|
|
return "", nil
|
|
}
|
|
|
|
func (a *DefaultCommandRequirementHandler) ValidateImportProject(repoDir string, ctx command.ProjectContext) (failure string, err error) {
|
|
for _, req := range ctx.ImportRequirements {
|
|
switch req {
|
|
case raw.ApprovedRequirement:
|
|
if !ctx.PullReqStatus.ApprovalStatus.IsApproved {
|
|
return "Pull request must be approved by at least one person other than the author before running import.", nil
|
|
}
|
|
case raw.MergeableRequirement:
|
|
if !ctx.PullReqStatus.Mergeable {
|
|
return "Pull request must be mergeable before running import.", nil
|
|
}
|
|
case raw.UnDivergedRequirement:
|
|
if a.WorkingDir.HasDiverged(ctx.Log, repoDir) {
|
|
return "Default branch must be rebased onto pull request before running import.", nil
|
|
}
|
|
}
|
|
}
|
|
// Passed all import requirements configured.
|
|
return "", nil
|
|
}
|