Skip to content

Commit

Permalink
Add blueprint validation logic to deferPhases as well (#1370)
Browse files Browse the repository at this point in the history
* Support `deferPhase` in blueprint action

Blueprints can now define `deferPhase` for every action
that would be run once all (some in case of failure) the
phases of a blueprint action are run.

* Update docs for deferPhase changes

* Refactor code and add test for utility functions

* Address review comment, modularise functions

* Address review comment, reword comments and docs

* Add blueprint validation logic to deferPhases as well

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
viveksinghggits and mergify[bot] authored Apr 12, 2022
1 parent 6e3375a commit 993b263
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 0 deletions.
16 changes: 16 additions & 0 deletions pkg/blueprint/validate/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,22 @@ func Do(bp *crv1alpha1.Blueprint, funcVersion string) error {
return errors.Wrapf(err, "%s action %s", BPValidationErr, name)
}

// validate deferPhase's argument
deferPhase, err := kanister.GetDeferPhase(*bp, name, funcVersion, param.TemplateParams{})
if err != nil {
utils.PrintStage(fmt.Sprintf("validation of action %s", name), utils.Fail)
return errors.Wrapf(err, "%s action %s", BPValidationErr, name)
}

if deferPhase != nil {
if err := deferPhase.Validate(action.DeferPhase.Args); err != nil {
utils.PrintStage(fmt.Sprintf("validation of phase %s in action %s", deferPhase.Name(), name), utils.Fail)
return errors.Wrapf(err, "%s phase %s in action %s", BPValidationErr, deferPhase.Name(), name)
}
utils.PrintStage(fmt.Sprintf("validation of phase %s in action %s", deferPhase.Name(), name), utils.Pass)
}

// validate main phases' arguments
for i, phase := range phases {
// validate function's mandatory arguments
if err := phase.Validate(action.Phases[i].Args); err != nil {
Expand Down
72 changes: 72 additions & 0 deletions pkg/blueprint/validate/validate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ func (v *ValidateBlueprint) TestValidate(c *C) {
phases []crv1alpha1.BlueprintPhase
err Checker
errContains string
deferPhase *crv1alpha1.BlueprintPhase
}{
{
phases: []crv1alpha1.BlueprintPhase{
Expand Down Expand Up @@ -140,9 +141,80 @@ func (v *ValidateBlueprint) TestValidate(c *C) {
errContains: "Required arg missing: command",
err: NotNil,
},
{
phases: []crv1alpha1.BlueprintPhase{
{
Func: "PrepareData",
Name: "50",
Args: map[string]interface{}{
"namespace": "",
"image": "",
},
},
},
errContains: "Required arg missing: command",
err: NotNil,
deferPhase: &crv1alpha1.BlueprintPhase{
Func: "PrepareData",
Name: "51",
Args: map[string]interface{}{
"namespace": "",
"image": "",
},
},
},
{
phases: []crv1alpha1.BlueprintPhase{
{
Func: "PrepareData",
Name: "60",
Args: map[string]interface{}{
"namespace": "",
"image": "",
"command": "",
},
},
},
errContains: "Required arg missing: command",
err: NotNil,
deferPhase: &crv1alpha1.BlueprintPhase{
Func: "PrepareData",
Name: "61",
Args: map[string]interface{}{
"namespace": "",
"image": "",
},
},
},
{
phases: []crv1alpha1.BlueprintPhase{
{
Func: "PrepareData",
Name: "70",
Args: map[string]interface{}{
"namespace": "",
"image": "",
"command": "",
},
},
},
err: IsNil,
deferPhase: &crv1alpha1.BlueprintPhase{
Func: "PrepareData",
Name: "71",
Args: map[string]interface{}{
"namespace": "",
"image": "",
"command": "",
},
},
},
} {
bp := blueprint()
bp.Actions["backup"].Phases = tc.phases
if tc.deferPhase != nil {
bp.Actions["backup"].DeferPhase = tc.deferPhase
}
err := Do(bp, kanister.DefaultVersion)
if err != nil {
c.Assert(strings.Contains(err.Error(), tc.errContains), Equals, true)
Expand Down

0 comments on commit 993b263

Please sign in to comment.