forked from kluctl/kluctl
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cmd_validate.go
77 lines (66 loc) · 2.01 KB
/
cmd_validate.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package commands
import (
"fmt"
"github.com/codablock/kluctl/cmd/kluctl/args"
"github.com/codablock/kluctl/pkg/deployment/commands"
"os"
"time"
)
type validateCmd struct {
args.ProjectFlags
args.TargetFlags
args.ArgsFlags
args.InclusionFlags
args.OutputFlags
args.RenderOutputDirFlags
Wait time.Duration `group:"misc" help:"Wait for the given amount of time until the deployment validates"`
Sleep time.Duration `group:"misc" help:"Sleep duration between validation attempts" default:"5s"`
WarningsAsErrors bool `group:"misc" help:"Consider warnings as failures"`
}
func (cmd *validateCmd) Help() string {
return `This means that all objects are retrieved from the cluster and checked for readiness.
TODO: This needs to be better documented!`
}
func (cmd *validateCmd) Run() error {
ptArgs := projectTargetCommandArgs{
projectFlags: cmd.ProjectFlags,
targetFlags: cmd.TargetFlags,
argsFlags: cmd.ArgsFlags,
inclusionFlags: cmd.InclusionFlags,
renderOutputDirFlags: cmd.RenderOutputDirFlags,
}
return withProjectCommandContext(ptArgs, func(ctx *commandCtx) error {
startTime := time.Now()
cmd2 := commands.NewValidateCommand(ctx.deploymentCollection)
for true {
result, err := cmd2.Run(ctx.k)
if err != nil {
return err
}
failed := len(result.Errors) != 0 || (cmd.WarningsAsErrors && len(result.Warnings) != 0)
err = outputValidateResult(cmd.Output, result)
if err != nil {
return err
}
if !failed {
_, _ = os.Stderr.WriteString("Validation succeeded\n")
return nil
}
if cmd.Wait <= 0 || time.Now().Sub(startTime) > cmd.Wait {
return fmt.Errorf("Validation failed")
}
time.Sleep(cmd.Sleep)
// Need to force re-requesting these objects
for _, e := range result.Results {
cmd2.ForgetRemoteObject(e.Ref)
}
for _, e := range result.Warnings {
cmd2.ForgetRemoteObject(e.Ref)
}
for _, e := range result.Errors {
cmd2.ForgetRemoteObject(e.Ref)
}
}
return nil
})
}