-
Notifications
You must be signed in to change notification settings - Fork 1
/
plan.go
41 lines (38 loc) · 1.08 KB
/
plan.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package golden
import (
"fmt"
"github.com/hashicorp/go-multierror"
)
type Plan interface {
String() string
Apply() error
}
func dagPlan(b Block) error {
decodeErr := Decode(b)
if decodeErr != nil {
return fmt.Errorf("%s(%s) Decode error: %+v", b.Address(), b.HclBlock().Range().String(), decodeErr)
}
if validateErr := Validate.Struct(b); validateErr != nil {
return fmt.Errorf("%s.%s.%s is not valid: %s", b.BlockType(), b.Type(), b.Name(), validateErr.Error())
}
failedChecks, preConditionCheckError := b.PreConditionCheck(b.EvalContext())
if preConditionCheckError != nil {
return preConditionCheckError
}
if len(failedChecks) > 0 {
var err error
for _, c := range failedChecks {
err = multierror.Append(err, fmt.Errorf("precondition check error: %s, %s", c.ErrorMessage, c.Body.Range().String()))
}
return err
}
pa, ok := b.(PlanBlock)
if ok {
execErr := pa.ExecuteDuringPlan()
if execErr != nil {
return fmt.Errorf("%s.%s.%s(%s) exec error: %+v", b.Type(), b.Type(), b.Name(), b.HclBlock().Range().String(), execErr)
}
b.markReady()
}
return nil
}