-
Notifications
You must be signed in to change notification settings - Fork 34
/
wait.go
115 lines (112 loc) · 3.3 KB
/
wait.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
package kubectl
import (
"errors"
"fmt"
"github.com/jmespath-community/go-jmespath/pkg/binding"
"github.com/kyverno/chainsaw/pkg/apis/v1alpha1"
"github.com/kyverno/chainsaw/pkg/client"
apibindings "github.com/kyverno/chainsaw/pkg/runner/bindings"
)
func Wait(client client.Client, bindings binding.Bindings, collector *v1alpha1.Wait) (*v1alpha1.Command, error) {
if collector == nil {
return nil, errors.New("collector is null")
}
name, err := apibindings.String(collector.Name, bindings)
if err != nil {
return nil, err
}
namespace, err := apibindings.String(collector.Namespace, bindings)
if err != nil {
return nil, err
}
selector, err := apibindings.String(collector.Selector, bindings)
if err != nil {
return nil, err
}
format, err := apibindings.String(string(collector.Format), bindings)
if err != nil {
return nil, err
}
cluster, err := apibindings.String(collector.Cluster, bindings)
if err != nil {
return nil, err
}
if name != "" && selector != "" {
return nil, errors.New("name cannot be provided when a selector is specified")
}
resource, clustered, err := mapResource(client, bindings, collector.ResourceReference)
if err != nil {
return nil, err
}
cmd := v1alpha1.Command{
Cluster: cluster,
Clusters: collector.Clusters,
Timeout: collector.Timeout,
Entrypoint: "kubectl",
Args: []string{"wait", resource},
}
if collector.For.Deletion != nil {
cmd.Args = append(cmd.Args, "--for=delete")
} else if collector.For.Condition != nil {
name, err := apibindings.String(collector.For.Condition.Name, bindings)
if err != nil {
return nil, err
}
if name == "" {
return nil, errors.New("a condition name must be specified for condition wait type")
}
if collector.For.Condition.Value != nil {
value, err := apibindings.String(*collector.For.Condition.Value, bindings)
if err != nil {
return nil, err
}
cmd.Args = append(cmd.Args, fmt.Sprintf(`--for=condition=%s=%s`, name, value))
} else {
cmd.Args = append(cmd.Args, fmt.Sprintf("--for=condition=%s", name))
}
} else if collector.For.JsonPath != nil {
path, err := apibindings.String(collector.For.JsonPath.Path, bindings)
if err != nil {
return nil, err
}
if path == "" {
return nil, errors.New("a path must be specified for jsonpath wait type")
}
value, err := apibindings.String(collector.For.JsonPath.Value, bindings)
if err != nil {
return nil, err
}
if value == "" {
return nil, errors.New("a value must be specified for jsonpath wait type")
}
cmd.Args = append(cmd.Args, fmt.Sprintf(`--for=jsonpath=%s=%s`, path, value))
} else {
return nil, errors.New("either a deletion or a condition must be specified")
}
if name != "" {
cmd.Args = append(cmd.Args, name)
} else if selector != "" {
cmd.Args = append(cmd.Args, "-l", selector)
} else {
cmd.Args = append(cmd.Args, "--all")
}
if !clustered {
if namespace == "*" {
cmd.Args = append(cmd.Args, "--all-namespaces")
} else {
if namespace == "" {
namespace = "$NAMESPACE"
}
cmd.Args = append(cmd.Args, "-n", namespace)
}
}
if format != "" {
cmd.Args = append(cmd.Args, "-o", format)
}
if collector.Timeout != nil {
cmd.Args = append(cmd.Args, "--timeout", collector.Timeout.Duration.String())
} else {
cmd.Args = append(cmd.Args, "--timeout=-1s")
}
return &cmd, nil
}