@@ -26,18 +26,18 @@ const (
26
26
)
27
27
28
28
type ShareReconciler struct {
29
- ramClient resolver.RAMClient
29
+ awsClients resolver.AWSClients
30
30
clusterClient AWSClusterClient
31
31
managementCluster k8stypes.NamespacedName
32
32
}
33
33
34
34
func NewShareReconciler (
35
35
managementCluster types.NamespacedName ,
36
36
clusterClient AWSClusterClient ,
37
- ramClient resolver.RAMClient ,
37
+ awsClients resolver.AWSClients ,
38
38
) * ShareReconciler {
39
39
return & ShareReconciler {
40
- ramClient : ramClient ,
40
+ awsClients : awsClients ,
41
41
clusterClient : clusterClient ,
42
42
managementCluster : managementCluster ,
43
43
}
@@ -75,25 +75,59 @@ func (r *ShareReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
75
75
return r .reconcileNormal (ctx , cluster )
76
76
}
77
77
78
+ func (r * ShareReconciler ) getRamClient (ctx context.Context ) (resolver.RAMClient , error ) {
79
+ logger := log .FromContext (ctx )
80
+
81
+ managementCluster , err := r .clusterClient .GetAWSCluster (ctx , r .managementCluster )
82
+ if err != nil {
83
+ logger .Error (err , "failed to get management cluster" )
84
+ return nil , errors .WithStack (err )
85
+ }
86
+
87
+ return r .getRamClientFromCluster (ctx , managementCluster )
88
+ }
89
+
90
+ func (r * ShareReconciler ) getRamClientFromCluster (ctx context.Context , cluster * capa.AWSCluster ) (resolver.RAMClient , error ) {
91
+ logger := log .FromContext (ctx )
92
+
93
+ identity , err := r .clusterClient .GetIdentity (ctx , cluster )
94
+ if err != nil {
95
+ logger .Error (err , "Failed to get cluster identity" )
96
+ return nil , errors .WithStack (err )
97
+ }
98
+
99
+ ramClient , err := r .awsClients .NewRAMClient (cluster .Spec .Region , identity .Spec .RoleArn )
100
+ if err != nil {
101
+ logger .Error (err , "Failed to create ram client" )
102
+ return nil , errors .WithStack (err )
103
+ }
104
+
105
+ return ramClient , err
106
+ }
107
+
78
108
func (r * ShareReconciler ) reconcileDelete (ctx context.Context , cluster * capa.AWSCluster ) (ctrl.Result , error ) {
79
109
if ! controllerutil .ContainsFinalizer (cluster , FinalizerResourceShare ) {
80
110
return ctrl.Result {}, nil
81
111
}
82
112
83
113
logger := log .FromContext (ctx )
114
+ ramClient , err := r .getRamClient (ctx )
115
+ if err != nil {
116
+ return ctrl.Result {}, err
117
+ }
84
118
85
119
if resourcesStillInUse (cluster ) {
86
120
logger .Info ("Transit gateway and prefix list not yet cleaned up. Skipping..." )
87
121
return ctrl.Result {}, nil
88
122
}
89
123
90
- err := r . ramClient .DeleteResourceShare (ctx , getTransitGatewayResourceShareName (cluster ))
124
+ err = ramClient .DeleteResourceShare (ctx , getTransitGatewayResourceShareName (cluster ))
91
125
if err != nil {
92
126
logger .Error (err , "failed to delete resource share" )
93
127
return ctrl.Result {}, err
94
128
}
95
129
96
- err = r . ramClient .DeleteResourceShare (ctx , getPrefixListResourceShareName (cluster ))
130
+ err = ramClient .DeleteResourceShare (ctx , getPrefixListResourceShareName (cluster ))
97
131
if err != nil {
98
132
logger .Error (err , "failed to delete resource share" )
99
133
return ctrl.Result {}, err
@@ -108,6 +142,13 @@ func (r *ShareReconciler) reconcileDelete(ctx context.Context, cluster *capa.AWS
108
142
return ctrl.Result {}, nil
109
143
}
110
144
145
+ type shareScope struct {
146
+ cluster * capa.AWSCluster
147
+ managementCluster * capa.AWSCluster
148
+ accountID string
149
+ ramClient resolver.RAMClient
150
+ }
151
+
111
152
func (r * ShareReconciler ) reconcileNormal (ctx context.Context , cluster * capa.AWSCluster ) (ctrl.Result , error ) {
112
153
logger := log .FromContext (ctx )
113
154
accountID , err := r .getAccountId (ctx , cluster )
@@ -118,23 +159,34 @@ func (r *ShareReconciler) reconcileNormal(ctx context.Context, cluster *capa.AWS
118
159
managementCluster , err := r .clusterClient .GetAWSCluster (ctx , r .managementCluster )
119
160
if err != nil {
120
161
logger .Error (err , "failed to get management cluster" )
121
- return ctrl.Result {}, errors . WithStack ( err )
162
+ return ctrl.Result {}, err
122
163
}
123
164
165
+ ramClient , err := r .getRamClientFromCluster (ctx , managementCluster )
166
+ if err != nil {
167
+ return ctrl.Result {}, err
168
+ }
169
+
170
+ scope := shareScope {
171
+ cluster : cluster ,
172
+ managementCluster : managementCluster ,
173
+ accountID : accountID ,
174
+ ramClient : ramClient ,
175
+ }
124
176
// We need to share the transit gateway separately from the prefix list, as
125
177
// the networktopology reconciler needs to attach the transit gateway
126
178
// first, before moving on to creating the prefix list. If the transit
127
179
// gateway isn't shared it won't be visible in the WC's account
128
180
result := ctrl.Result {}
129
- requeue , err := r .shareTransitGateway (ctx , cluster , managementCluster , accountID )
181
+ requeue , err := r .shareTransitGateway (ctx , scope )
130
182
if err != nil {
131
183
return ctrl.Result {}, err
132
184
}
133
185
if requeue {
134
186
result .RequeueAfter = ResourceMissingRequeDuration
135
187
}
136
188
137
- requeue , err = r .sharePrefixList (ctx , cluster , managementCluster , accountID )
189
+ requeue , err = r .sharePrefixList (ctx , scope )
138
190
if err != nil {
139
191
return ctrl.Result {}, err
140
192
}
@@ -171,10 +223,10 @@ func getPrefixListResourceShareName(cluster *capa.AWSCluster) string {
171
223
return fmt .Sprintf ("%s-%s" , cluster .Name , "prefix-list" )
172
224
}
173
225
174
- func (r * ShareReconciler ) shareTransitGateway (ctx context.Context , cluster , managementCluster * capa. AWSCluster , accountID string ) (requeue bool , err error ) {
226
+ func (r * ShareReconciler ) shareTransitGateway (ctx context.Context , scope shareScope ) (requeue bool , err error ) {
175
227
logger := log .FromContext (ctx )
176
228
177
- transitGatewayARN := getTransitGatewayARN (cluster , managementCluster )
229
+ transitGatewayARN := getTransitGatewayARN (scope . cluster , scope . managementCluster )
178
230
179
231
if transitGatewayARN == "" {
180
232
logger .Info ("transit gateway arn annotation not set yet" )
@@ -183,18 +235,18 @@ func (r *ShareReconciler) shareTransitGateway(ctx context.Context, cluster, mana
183
235
184
236
logger = logger .WithValues ("transit-gateway-annotation" , transitGatewayARN )
185
237
186
- err = r .clusterClient .AddFinalizer (ctx , cluster , FinalizerResourceShare )
238
+ err = r .clusterClient .AddFinalizer (ctx , scope . cluster , FinalizerResourceShare )
187
239
if err != nil {
188
240
logger .Error (err , "failed to add finalizer" )
189
241
return false , err
190
242
}
191
243
192
- err = r .ramClient .ApplyResourceShare (ctx , resolver.ResourceShare {
193
- Name : getTransitGatewayResourceShareName (cluster ),
244
+ err = scope .ramClient .ApplyResourceShare (ctx , resolver.ResourceShare {
245
+ Name : getTransitGatewayResourceShareName (scope . cluster ),
194
246
ResourceArns : []string {
195
247
transitGatewayARN ,
196
248
},
197
- ExternalAccountID : accountID ,
249
+ ExternalAccountID : scope . accountID ,
198
250
})
199
251
if err != nil {
200
252
logger .Error (err , "failed to apply resource share" )
@@ -204,9 +256,9 @@ func (r *ShareReconciler) shareTransitGateway(ctx context.Context, cluster, mana
204
256
return false , nil
205
257
}
206
258
207
- func (r * ShareReconciler ) sharePrefixList (ctx context.Context , cluster , managementCluster * capa. AWSCluster , accountID string ) (requeue bool , err error ) {
259
+ func (r * ShareReconciler ) sharePrefixList (ctx context.Context , scope shareScope ) (requeue bool , err error ) {
208
260
logger := log .FromContext (ctx )
209
- prefixListARN := getPrefixListARN (cluster , managementCluster )
261
+ prefixListARN := getPrefixListARN (scope . cluster , scope . managementCluster )
210
262
211
263
if prefixListARN == "" {
212
264
logger .Info ("prefix list arn annotation not set yet" )
@@ -215,12 +267,12 @@ func (r *ShareReconciler) sharePrefixList(ctx context.Context, cluster, manageme
215
267
216
268
logger = logger .WithValues ("prefix-list-annotation" , prefixListARN )
217
269
218
- err = r .ramClient .ApplyResourceShare (ctx , resolver.ResourceShare {
219
- Name : getPrefixListResourceShareName (cluster ),
270
+ err = scope .ramClient .ApplyResourceShare (ctx , resolver.ResourceShare {
271
+ Name : getPrefixListResourceShareName (scope . cluster ),
220
272
ResourceArns : []string {
221
273
prefixListARN ,
222
274
},
223
- ExternalAccountID : accountID ,
275
+ ExternalAccountID : scope . accountID ,
224
276
})
225
277
if err != nil {
226
278
logger .Error (err , "failed to apply resource share" )
0 commit comments