/
track_resource_readiness_operation.go
135 lines (118 loc) · 5.45 KB
/
track_resource_readiness_operation.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package opertn
import (
"context"
"fmt"
"regexp"
"time"
"k8s.io/apimachinery/pkg/api/meta"
"k8s.io/client-go/discovery"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"github.com/werf/kubedog/pkg/trackers/dyntracker"
"github.com/werf/kubedog/pkg/trackers/dyntracker/logstore"
"github.com/werf/kubedog/pkg/trackers/dyntracker/statestore"
"github.com/werf/kubedog/pkg/trackers/dyntracker/util"
"github.com/werf/nelm/pkg/resrcid"
)
var _ Operation = (*TrackResourceReadinessOperation)(nil)
const TypeTrackResourceReadinessOperation = "track-resource-readiness"
func NewTrackResourceReadinessOperation(
resource *resrcid.ResourceID,
taskState *util.Concurrent[*statestore.ReadinessTaskState],
logStore *util.Concurrent[*logstore.LogStore],
staticClient kubernetes.Interface,
dynamicClient dynamic.Interface,
discoveryClient discovery.CachedDiscoveryInterface,
mapper meta.ResettableRESTMapper,
opts TrackResourceReadinessOperationOptions,
) *TrackResourceReadinessOperation {
return &TrackResourceReadinessOperation{
resource: resource,
taskState: taskState,
logStore: logStore,
staticClient: staticClient,
dynamicClient: dynamicClient,
discoveryClient: discoveryClient,
mapper: mapper,
timeout: opts.Timeout,
noActivityTimeout: opts.NoActivityTimeout,
ignoreReadinessProbeFailsByContainerName: opts.IgnoreReadinessProbeFailsByContainerName,
captureLogsFromTime: opts.CaptureLogsFromTime,
saveLogsOnlyForContainers: opts.SaveLogsOnlyForContainers,
saveLogsByRegex: opts.SaveLogsByRegex,
saveLogsByRegexForContainers: opts.SaveLogsByRegexForContainers,
ignoreLogs: opts.IgnoreLogs,
ignoreLogsForContainers: opts.IgnoreLogsForContainers,
saveEvents: opts.SaveEvents,
}
}
type TrackResourceReadinessOperationOptions struct {
Timeout time.Duration
NoActivityTimeout time.Duration
IgnoreReadinessProbeFailsByContainerName map[string]time.Duration
CaptureLogsFromTime time.Time
SaveLogsOnlyForContainers []string
SaveLogsByRegex *regexp.Regexp
SaveLogsByRegexForContainers map[string]*regexp.Regexp
IgnoreLogs bool
IgnoreLogsForContainers []string
SaveEvents bool
}
type TrackResourceReadinessOperation struct {
resource *resrcid.ResourceID
taskState *util.Concurrent[*statestore.ReadinessTaskState]
logStore *util.Concurrent[*logstore.LogStore]
staticClient kubernetes.Interface
dynamicClient dynamic.Interface
discoveryClient discovery.CachedDiscoveryInterface
mapper meta.ResettableRESTMapper
timeout time.Duration
noActivityTimeout time.Duration
ignoreReadinessProbeFailsByContainerName map[string]time.Duration
captureLogsFromTime time.Time
saveLogsOnlyForContainers []string
saveLogsByRegex *regexp.Regexp
saveLogsByRegexForContainers map[string]*regexp.Regexp
ignoreLogs bool
ignoreLogsForContainers []string
saveEvents bool
status Status
}
func (o *TrackResourceReadinessOperation) Execute(ctx context.Context) error {
tracker, err := dyntracker.NewDynamicReadinessTracker(ctx, o.taskState, o.logStore, o.staticClient, o.dynamicClient, o.discoveryClient, o.mapper, dyntracker.DynamicReadinessTrackerOptions{
Timeout: o.timeout,
NoActivityTimeout: o.noActivityTimeout,
IgnoreReadinessProbeFailsByContainerName: o.ignoreReadinessProbeFailsByContainerName,
CaptureLogsFromTime: o.captureLogsFromTime,
SaveLogsOnlyForContainers: o.saveLogsOnlyForContainers,
SaveLogsByRegex: o.saveLogsByRegex,
SaveLogsByRegexForContainers: o.saveLogsByRegexForContainers,
IgnoreLogs: o.ignoreLogs,
IgnoreLogsForContainers: o.ignoreLogsForContainers,
SaveEvents: o.saveEvents,
})
if err != nil {
return fmt.Errorf("create readiness tracker: %w", err)
}
if err := tracker.Track(ctx); err != nil {
o.status = StatusFailed
return fmt.Errorf("track resource readiness: %w", err)
}
o.status = StatusCompleted
return nil
}
func (o *TrackResourceReadinessOperation) ID() string {
return TypeTrackResourceReadinessOperation + "/" + o.resource.ID()
}
func (o *TrackResourceReadinessOperation) HumanID() string {
return "track resource readiness: " + o.resource.HumanID()
}
func (o *TrackResourceReadinessOperation) Status() Status {
return o.status
}
func (o *TrackResourceReadinessOperation) Type() Type {
return TypeTrackResourceReadinessOperation
}
func (o *TrackResourceReadinessOperation) Empty() bool {
return false
}