-
Notifications
You must be signed in to change notification settings - Fork 2k
/
Copy pathfail_hook.go
118 lines (94 loc) · 2.56 KB
/
fail_hook.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
// FailHook is designed to fail for testing purposes,
// so should never be included in a release.
//go:build !release
package allocrunner
import (
"errors"
"fmt"
"os"
"github.com/hashicorp/go-hclog"
"github.com/hashicorp/hcl/v2/hclsimple"
"github.com/hashicorp/nomad/client/allocrunner/interfaces"
)
var ErrFailHookError = errors.New("failed successfully")
func NewFailHook(l hclog.Logger, name string) *FailHook {
return &FailHook{
name: name,
logger: l.Named(name),
}
}
type FailHook struct {
name string
logger hclog.Logger
Fail struct {
Prerun bool `hcl:"prerun,optional"`
PreKill bool `hcl:"prekill,optional"`
Postrun bool `hcl:"postrun,optional"`
Destroy bool `hcl:"destroy,optional"`
Update bool `hcl:"update,optional"`
PreTaskRestart bool `hcl:"pretaskrestart,optional"`
Shutdown bool `hcl:"shutdown,optional"`
}
}
func (h *FailHook) Name() string {
return h.name
}
func (h *FailHook) LoadConfig(path string) *FailHook {
if _, err := os.Stat(path); os.IsNotExist(err) {
h.logger.Error("couldn't load config", "error", err)
return h
}
if err := hclsimple.DecodeFile(path, nil, &h.Fail); err != nil {
h.logger.Error("error parsing config", "path", path, "error", err)
}
return h
}
var _ interfaces.RunnerPrerunHook = &FailHook{}
func (h *FailHook) Prerun() error {
if h.Fail.Prerun {
return fmt.Errorf("prerun %w", ErrFailHookError)
}
return nil
}
var _ interfaces.RunnerPreKillHook = &FailHook{}
func (h *FailHook) PreKill() {
if h.Fail.PreKill {
h.logger.Error("prekill", "error", ErrFailHookError)
}
}
var _ interfaces.RunnerPostrunHook = &FailHook{}
func (h *FailHook) Postrun() error {
if h.Fail.Postrun {
return fmt.Errorf("postrun %w", ErrFailHookError)
}
return nil
}
var _ interfaces.RunnerDestroyHook = &FailHook{}
func (h *FailHook) Destroy() error {
if h.Fail.Destroy {
return fmt.Errorf("destroy %w", ErrFailHookError)
}
return nil
}
var _ interfaces.RunnerUpdateHook = &FailHook{}
func (h *FailHook) Update(request *interfaces.RunnerUpdateRequest) error {
if h.Fail.Update {
return fmt.Errorf("update %w", ErrFailHookError)
}
return nil
}
var _ interfaces.RunnerTaskRestartHook = &FailHook{}
func (h *FailHook) PreTaskRestart() error {
if h.Fail.PreTaskRestart {
return fmt.Errorf("destroy %w", ErrFailHookError)
}
return nil
}
var _ interfaces.ShutdownHook = &FailHook{}
func (h *FailHook) Shutdown() {
if h.Fail.Shutdown {
h.logger.Error("shutdown", "error", ErrFailHookError)
}
}