This repository has been archived by the owner on Nov 2, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
actions.go
119 lines (93 loc) · 2.74 KB
/
actions.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
119
package main
import (
"context"
"time"
arangoapi "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
"github.com/pkg/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type ActionType string
const (
ActionTypeCreateDeployment ActionType = "CreateDeployment"
ActionTypeDeleteDeployment ActionType = "DeleteDeployment"
ActionTypeDeployOperator ActionType = "DeployOperator"
ActionTypeDeleteOperator ActionType = "DeleteOperator"
ActionTypeDeletePod ActionType = "DeletePod"
ActionTypeEvictPod ActionType = "EvictPod"
ActionTypeDrainNode ActionType = "DrainNode"
ActionDeletePVC ActionType = "DeletePVC"
ActionKillNode ActionType = "KillNode"
)
type ActionCreateDeploymentDescription struct {
Spec arangoapi.DeploymentSpec
}
type ActionDeployOperatorDescription struct {
Image string
}
type ActionDeletePodDescription struct {
Target PodTarget `json:"target"`
WaitForCompletion bool `json:"waitForCompletion"`
}
type ActionDescription struct {
Type ActionType `json:"action"`
WaitForHealth bool `json:"waitForHealth"`
Delay time.Duration `json:"delay"`
CreateDeployment *ActionCreateDeploymentDescription `json:inline`
DeployOperator *ActionDeployOperatorDescription `json:inline`
}
type ActionInterface interface {
Nodes() NodeManager
Pods() PodManager
Deployment() DeploymentManager
ErrorChannel() chan error
}
type Action interface {
Run(ctx context.Context, iface ActionInterface) error
}
type ActionDescriptionList []ActionDescription
type ActionScript struct {
Cluster ClusterConfig `json:"clusterConfig"`
Actions ActionDescriptionList `json:"actions"`
}
func NewAction(desc ActionDescription) (Action, error) {
return nil, nil
}
type actionDeletePod struct {
target PodTarget
waitForCompletion bool
}
func newActionDeletePod(desc ActionDeletePodDescription) Action {
return &actionDeletePod{
target: desc.Target,
waitForCompletion: desc.WaitForCompletion,
}
}
func newErrorChannelOrDefault(iface ActionInterface, new bool) chan error {
if new {
return make(chan error)
}
return iface.ErrorChannel()
}
func waitForCompletion(ctx context.Context, completed <-chan error) error {
select {
case err, ok := <-completed:
if ok {
return err
}
return errors.New("Error channel closed unexpectedly")
case <-ctx.Done():
return ctx.Err()
}
}
func (a *actionDeletePod) Run(ctx context.Context, iface ActionInterface) error {
options := metav1.DeleteOptions{}
channel := newErrorChannelOrDefault(iface, a.waitForCompletion)
if err := iface.Pods().Target(a.target).Delete(ctx, channel, &options); err != nil {
return nil
}
if a.waitForCompletion {
defer close(channel)
waitForCompletion(ctx, channel)
}
return nil
}