...
1
2
3
4 package statusreaders
5
6 import (
7 "context"
8 "fmt"
9
10 "k8s.io/apimachinery/pkg/api/meta"
11 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
12 "k8s.io/apimachinery/pkg/runtime/schema"
13 "sigs.k8s.io/cli-utils/pkg/kstatus/polling/engine"
14 "sigs.k8s.io/cli-utils/pkg/kstatus/polling/event"
15 "sigs.k8s.io/cli-utils/pkg/kstatus/status"
16 "sigs.k8s.io/cli-utils/pkg/object"
17 )
18
19
20
21
22 func NewDefaultStatusReader(mapper meta.RESTMapper) engine.StatusReader {
23 return NewStatusReader(mapper)
24 }
25
26
27
28 func NewStatusReader(mapper meta.RESTMapper, statusReaders ...engine.StatusReader) engine.StatusReader {
29 defaultStatusReader := NewGenericStatusReader(mapper, status.Compute)
30
31 replicaSetStatusReader := NewReplicaSetStatusReader(mapper, defaultStatusReader)
32 deploymentStatusReader := NewDeploymentResourceReader(mapper, replicaSetStatusReader)
33 statefulSetStatusReader := NewStatefulSetResourceReader(mapper, defaultStatusReader)
34
35 statusReaders = append(statusReaders,
36 deploymentStatusReader,
37 statefulSetStatusReader,
38 replicaSetStatusReader,
39 defaultStatusReader,
40 )
41
42 return &DelegatingStatusReader{
43 StatusReaders: statusReaders,
44 }
45 }
46
47 type DelegatingStatusReader struct {
48 StatusReaders []engine.StatusReader
49 }
50
51 func (dsr *DelegatingStatusReader) Supports(gk schema.GroupKind) bool {
52 for _, sr := range dsr.StatusReaders {
53 if sr.Supports(gk) {
54 return true
55 }
56 }
57 return false
58 }
59
60 func (dsr *DelegatingStatusReader) ReadStatus(
61 ctx context.Context,
62 reader engine.ClusterReader,
63 id object.ObjMetadata,
64 ) (*event.ResourceStatus, error) {
65 gk := id.GroupKind
66 for _, sr := range dsr.StatusReaders {
67 if sr.Supports(gk) {
68 return sr.ReadStatus(ctx, reader, id)
69 }
70 }
71 return nil, fmt.Errorf("no status reader supports this resource: %v", gk)
72 }
73
74 func (dsr *DelegatingStatusReader) ReadStatusForObject(
75 ctx context.Context,
76 reader engine.ClusterReader,
77 obj *unstructured.Unstructured,
78 ) (*event.ResourceStatus, error) {
79 gk := obj.GroupVersionKind().GroupKind()
80 for _, sr := range dsr.StatusReaders {
81 if sr.Supports(gk) {
82 return sr.ReadStatusForObject(ctx, reader, obj)
83 }
84 }
85 return nil, fmt.Errorf("no status reader supports this resource: %v", gk)
86 }
87
View as plain text