/
retrier_client.go
155 lines (136 loc) Β· 6.07 KB
/
retrier_client.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package clustermanager
import (
"context"
"k8s.io/apimachinery/pkg/runtime"
"github.com/aws/eks-anywhere/pkg/clients/kubernetes"
"github.com/aws/eks-anywhere/pkg/retrier"
"github.com/aws/eks-anywhere/pkg/types"
)
// KubernetesRetrierClient wraps around a KubernetesClient, offering retry functionality for some operations.
type KubernetesRetrierClient struct {
KubernetesClient
retrier *retrier.Retrier
}
// NewRetrierClient constructs a new RetrierClient.
func NewRetrierClient(client KubernetesClient, retrier *retrier.Retrier) *KubernetesRetrierClient {
return &KubernetesRetrierClient{
KubernetesClient: client,
retrier: retrier,
}
}
// ApplyKubeSpecFromBytes creates/updates the objects defined in a yaml manifest against the api server following a client side apply mechanism.
func (c *KubernetesRetrierClient) ApplyKubeSpecFromBytes(ctx context.Context, cluster *types.Cluster, data []byte) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.ApplyKubeSpecFromBytes(ctx, cluster, data)
},
)
}
// Apply creates/updates an object against the api server following a client side apply mechanism.
func (c *KubernetesRetrierClient) Apply(ctx context.Context, kubeconfigPath string, obj runtime.Object, opts ...kubernetes.KubectlApplyOption) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.Apply(ctx, kubeconfigPath, obj, opts...)
},
)
}
// PauseCAPICluster adds a `spec.Paused: true` to the CAPI cluster resource. This will cause all
// downstream CAPI + provider controllers to skip reconciling on the paused cluster's objects.
func (c *KubernetesRetrierClient) PauseCAPICluster(ctx context.Context, cluster, kubeconfig string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.PauseCAPICluster(ctx, cluster, kubeconfig)
},
)
}
// ResumeCAPICluster removes the `spec.Paused` on the CAPI cluster resource. This will cause all
// downstream CAPI + provider controllers to resume reconciling on the paused cluster's objects.
func (c *KubernetesRetrierClient) ResumeCAPICluster(ctx context.Context, cluster, kubeconfig string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.ResumeCAPICluster(ctx, cluster, kubeconfig)
},
)
}
// ApplyKubeSpecFromBytesForce creates/updates the objects defined in a yaml manifest against the api server following a client side apply mechanism.
// It forces the operation, so if api validation failed, it will delete and re-create the object.
func (c *KubernetesRetrierClient) ApplyKubeSpecFromBytesForce(ctx context.Context, cluster *types.Cluster, data []byte) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.ApplyKubeSpecFromBytesForce(ctx, cluster, data)
},
)
}
// ApplyKubeSpecFromBytesWithNamespace creates/updates the objects defined in a yaml manifest against the api server following a client side apply mechanism.
// It applies all objects in the given namespace.
func (c *KubernetesRetrierClient) ApplyKubeSpecFromBytesWithNamespace(ctx context.Context, cluster *types.Cluster, data []byte, namespace string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.ApplyKubeSpecFromBytesWithNamespace(ctx, cluster, data, namespace)
},
)
}
// UpdateAnnotationInNamespace adds/updates an annotation for the given kubernetes resource.
func (c *KubernetesRetrierClient) UpdateAnnotationInNamespace(ctx context.Context, resourceType, objectName string, annotations map[string]string, cluster *types.Cluster, namespace string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.UpdateAnnotationInNamespace(ctx, resourceType, objectName, annotations, cluster, namespace)
},
)
}
// RemoveAnnotationInNamespace deletes an annotation for the given kubernetes resource if present.
func (c *KubernetesRetrierClient) RemoveAnnotationInNamespace(ctx context.Context, resourceType, objectName, key string, cluster *types.Cluster, namespace string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.RemoveAnnotationInNamespace(ctx, resourceType, objectName, key, cluster, namespace)
},
)
}
// ListObjects reads all Objects of a particular resource type in a namespace.
func (c *KubernetesRetrierClient) ListObjects(ctx context.Context, resourceType, namespace, kubeconfig string, list kubernetes.ObjectList) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.ListObjects(ctx, resourceType, namespace, kubeconfig, list)
},
)
}
// DeleteGitOpsConfig deletes a GitOpsConfigObject from the cluster.
func (c *KubernetesRetrierClient) DeleteGitOpsConfig(ctx context.Context, cluster *types.Cluster, name string, namespace string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.DeleteGitOpsConfig(ctx, cluster, name, namespace)
},
)
}
// DeleteEKSACluster deletes an EKSA Cluster object from the cluster.
func (c *KubernetesRetrierClient) DeleteEKSACluster(ctx context.Context, cluster *types.Cluster, name string, namespace string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.DeleteEKSACluster(ctx, cluster, name, namespace)
},
)
}
// DeleteAWSIamConfig deletes an AWSIamConfig object from the cluster.
func (c *KubernetesRetrierClient) DeleteAWSIamConfig(ctx context.Context, cluster *types.Cluster, name string, namespace string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.DeleteAWSIamConfig(ctx, cluster, name, namespace)
},
)
}
// DeleteOIDCConfig deletes a OIDCConfig object from the cluster.
func (c *KubernetesRetrierClient) DeleteOIDCConfig(ctx context.Context, cluster *types.Cluster, name string, namespace string) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.DeleteOIDCConfig(ctx, cluster, name, namespace)
},
)
}
// DeleteCluster deletes a CAPI Cluster from the cluster.
func (c *KubernetesRetrierClient) DeleteCluster(ctx context.Context, cluster, clusterToDelete *types.Cluster) error {
return c.retrier.Retry(
func() error {
return c.KubernetesClient.DeleteCluster(ctx, cluster, clusterToDelete)
},
)
}