Skip to content

Commit 88d480a

Browse files
authored
Enable share reconciler (#216)
* Enable share reconciler * update CHANGELOG * Use management cluster account to add to prefix list entries Shared prefix lists cannot be modified
1 parent b8a4d02 commit 88d480a

File tree

6 files changed

+104
-32
lines changed

6 files changed

+104
-32
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Changed
11+
12+
- Enable ShareReconciler.
13+
1014
## [0.16.0] - 2024-08-21
1115

1216
### Changed

controllers/prefix_list_entry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func (r *PrefixListEntryReconciler) Reconcile(ctx context.Context, req ctrl.Requ
9494
logger = logger.WithValues("prefix-list-arn", prefixListARN)
9595
log.IntoContext(ctx, logger)
9696

97-
identity, err := r.clusterClient.GetIdentity(ctx, cluster)
97+
identity, err := r.clusterClient.GetIdentity(ctx, managementCluster)
9898
if err != nil {
9999
logger.Error(err, "failed to get cluster identity")
100100
return ctrl.Result{}, errors.WithStack(err)

controllers/prefix_list_entry_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ var _ = Describe("PrefixListEntryReconciler", func() {
5656
BeforeEach(func() {
5757
ctx = context.Background()
5858
prefixListARN = fmt.Sprintf("arn:aws:iam::123456789012:managed-prefix-lists/%s", uuid.NewString())
59-
identity, cluster = createRandomClusterWithIdentity(
59+
cluster = createRandomCluster(
6060
annotation.NetworkTopologyModeAnnotation,
6161
annotation.NetworkTopologyModeGiantSwarmManaged,
6262
)
6363

64-
managementCluster = createRandomCluster(
64+
identity, managementCluster = createRandomClusterWithIdentity(
6565
annotation.NetworkTopologyModeAnnotation,
6666
annotation.NetworkTopologyModeGiantSwarmManaged,
6767
annotation.NetworkTopologyPrefixListIDAnnotation,

controllers/share.go

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,18 @@ const (
2626
)
2727

2828
type ShareReconciler struct {
29-
ramClient resolver.RAMClient
29+
awsClients resolver.AWSClients
3030
clusterClient AWSClusterClient
3131
managementCluster k8stypes.NamespacedName
3232
}
3333

3434
func NewShareReconciler(
3535
managementCluster types.NamespacedName,
3636
clusterClient AWSClusterClient,
37-
ramClient resolver.RAMClient,
37+
awsClients resolver.AWSClients,
3838
) *ShareReconciler {
3939
return &ShareReconciler{
40-
ramClient: ramClient,
40+
awsClients: awsClients,
4141
clusterClient: clusterClient,
4242
managementCluster: managementCluster,
4343
}
@@ -75,25 +75,59 @@ func (r *ShareReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
7575
return r.reconcileNormal(ctx, cluster)
7676
}
7777

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+
78108
func (r *ShareReconciler) reconcileDelete(ctx context.Context, cluster *capa.AWSCluster) (ctrl.Result, error) {
79109
if !controllerutil.ContainsFinalizer(cluster, FinalizerResourceShare) {
80110
return ctrl.Result{}, nil
81111
}
82112

83113
logger := log.FromContext(ctx)
114+
ramClient, err := r.getRamClient(ctx)
115+
if err != nil {
116+
return ctrl.Result{}, err
117+
}
84118

85119
if resourcesStillInUse(cluster) {
86120
logger.Info("Transit gateway and prefix list not yet cleaned up. Skipping...")
87121
return ctrl.Result{}, nil
88122
}
89123

90-
err := r.ramClient.DeleteResourceShare(ctx, getTransitGatewayResourceShareName(cluster))
124+
err = ramClient.DeleteResourceShare(ctx, getTransitGatewayResourceShareName(cluster))
91125
if err != nil {
92126
logger.Error(err, "failed to delete resource share")
93127
return ctrl.Result{}, err
94128
}
95129

96-
err = r.ramClient.DeleteResourceShare(ctx, getPrefixListResourceShareName(cluster))
130+
err = ramClient.DeleteResourceShare(ctx, getPrefixListResourceShareName(cluster))
97131
if err != nil {
98132
logger.Error(err, "failed to delete resource share")
99133
return ctrl.Result{}, err
@@ -108,6 +142,13 @@ func (r *ShareReconciler) reconcileDelete(ctx context.Context, cluster *capa.AWS
108142
return ctrl.Result{}, nil
109143
}
110144

145+
type shareScope struct {
146+
cluster *capa.AWSCluster
147+
managementCluster *capa.AWSCluster
148+
accountID string
149+
ramClient resolver.RAMClient
150+
}
151+
111152
func (r *ShareReconciler) reconcileNormal(ctx context.Context, cluster *capa.AWSCluster) (ctrl.Result, error) {
112153
logger := log.FromContext(ctx)
113154
accountID, err := r.getAccountId(ctx, cluster)
@@ -118,23 +159,34 @@ func (r *ShareReconciler) reconcileNormal(ctx context.Context, cluster *capa.AWS
118159
managementCluster, err := r.clusterClient.GetAWSCluster(ctx, r.managementCluster)
119160
if err != nil {
120161
logger.Error(err, "failed to get management cluster")
121-
return ctrl.Result{}, errors.WithStack(err)
162+
return ctrl.Result{}, err
122163
}
123164

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+
}
124176
// We need to share the transit gateway separately from the prefix list, as
125177
// the networktopology reconciler needs to attach the transit gateway
126178
// first, before moving on to creating the prefix list. If the transit
127179
// gateway isn't shared it won't be visible in the WC's account
128180
result := ctrl.Result{}
129-
requeue, err := r.shareTransitGateway(ctx, cluster, managementCluster, accountID)
181+
requeue, err := r.shareTransitGateway(ctx, scope)
130182
if err != nil {
131183
return ctrl.Result{}, err
132184
}
133185
if requeue {
134186
result.RequeueAfter = ResourceMissingRequeDuration
135187
}
136188

137-
requeue, err = r.sharePrefixList(ctx, cluster, managementCluster, accountID)
189+
requeue, err = r.sharePrefixList(ctx, scope)
138190
if err != nil {
139191
return ctrl.Result{}, err
140192
}
@@ -171,10 +223,10 @@ func getPrefixListResourceShareName(cluster *capa.AWSCluster) string {
171223
return fmt.Sprintf("%s-%s", cluster.Name, "prefix-list")
172224
}
173225

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) {
175227
logger := log.FromContext(ctx)
176228

177-
transitGatewayARN := getTransitGatewayARN(cluster, managementCluster)
229+
transitGatewayARN := getTransitGatewayARN(scope.cluster, scope.managementCluster)
178230

179231
if transitGatewayARN == "" {
180232
logger.Info("transit gateway arn annotation not set yet")
@@ -183,18 +235,18 @@ func (r *ShareReconciler) shareTransitGateway(ctx context.Context, cluster, mana
183235

184236
logger = logger.WithValues("transit-gateway-annotation", transitGatewayARN)
185237

186-
err = r.clusterClient.AddFinalizer(ctx, cluster, FinalizerResourceShare)
238+
err = r.clusterClient.AddFinalizer(ctx, scope.cluster, FinalizerResourceShare)
187239
if err != nil {
188240
logger.Error(err, "failed to add finalizer")
189241
return false, err
190242
}
191243

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),
194246
ResourceArns: []string{
195247
transitGatewayARN,
196248
},
197-
ExternalAccountID: accountID,
249+
ExternalAccountID: scope.accountID,
198250
})
199251
if err != nil {
200252
logger.Error(err, "failed to apply resource share")
@@ -204,9 +256,9 @@ func (r *ShareReconciler) shareTransitGateway(ctx context.Context, cluster, mana
204256
return false, nil
205257
}
206258

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) {
208260
logger := log.FromContext(ctx)
209-
prefixListARN := getPrefixListARN(cluster, managementCluster)
261+
prefixListARN := getPrefixListARN(scope.cluster, scope.managementCluster)
210262

211263
if prefixListARN == "" {
212264
logger.Info("prefix list arn annotation not set yet")
@@ -215,12 +267,12 @@ func (r *ShareReconciler) sharePrefixList(ctx context.Context, cluster, manageme
215267

216268
logger = logger.WithValues("prefix-list-annotation", prefixListARN)
217269

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),
220272
ResourceArns: []string{
221273
prefixListARN,
222274
},
223-
ExternalAccountID: accountID,
275+
ExternalAccountID: scope.accountID,
224276
})
225277
if err != nil {
226278
logger.Error(err, "failed to apply resource share")

controllers/share_test.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/aws-resolver-rules-operator/controllers"
2121
"github.com/aws-resolver-rules-operator/controllers/controllersfakes"
2222
"github.com/aws-resolver-rules-operator/pkg/k8sclient"
23+
"github.com/aws-resolver-rules-operator/pkg/resolver"
2324
"github.com/aws-resolver-rules-operator/pkg/resolver/resolverfakes"
2425
)
2526

@@ -54,7 +55,7 @@ var _ = Describe("Share", func() {
5455
err := k8sClient.Patch(context.Background(), patchedIdentity, client.MergeFrom(identity))
5556
Expect(err).NotTo(HaveOccurred())
5657

57-
managementCluster = createRandomCluster(
58+
_, managementCluster = createRandomClusterWithIdentity(
5859
annotation.NetworkTopologyModeAnnotation,
5960
annotation.NetworkTopologyModeGiantSwarmManaged,
6061
annotation.NetworkTopologyTransitGatewayIDAnnotation,
@@ -71,11 +72,14 @@ var _ = Describe("Share", func() {
7172
}
7273

7374
ramClient = new(resolverfakes.FakeRAMClient)
75+
clientsFactory := &resolver.FakeClients{
76+
RAMClient: ramClient,
77+
}
7478
clusterClient := k8sclient.NewAWSClusterClient(k8sClient)
7579
reconciler = controllers.NewShareReconciler(
7680
client.ObjectKeyFromObject(managementCluster),
7781
clusterClient,
78-
ramClient,
82+
clientsFactory,
7983
)
8084
})
8185

@@ -300,7 +304,7 @@ var _ = Describe("Share", func() {
300304
reconciler = controllers.NewShareReconciler(
301305
client.ObjectKeyFromObject(managementCluster),
302306
fakeClusterClient,
303-
ramClient,
307+
&resolver.FakeClients{},
304308
)
305309
})
306310

main.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,12 @@ func wireNetworkTopologyReconcilers(cfg reconcilerConfig, mgr manager.Manager) {
219219
Name: cfg.managementClusterName,
220220
}
221221

222-
if err := (controllers.NewRouteReconciler(managementCluster, cfg.clusterClient, cfg.awsClients)).SetupWithManager(mgr); err != nil {
222+
routeReconciler := controllers.NewRouteReconciler(
223+
managementCluster,
224+
cfg.clusterClient,
225+
cfg.awsClients,
226+
)
227+
if err := routeReconciler.SetupWithManager(mgr); err != nil {
223228
setupLog.Error(err, "unable to create controller", "controller", "Route")
224229
os.Exit(1)
225230
}
@@ -229,9 +234,8 @@ func wireNetworkTopologyReconcilers(cfg reconcilerConfig, mgr manager.Manager) {
229234
cfg.awsClusterClient,
230235
cfg.awsClients,
231236
)
232-
233237
if err := mcTransitGatewayReconciler.SetupWithManager(mgr); err != nil {
234-
setupLog.Error(err, "unable to create controller")
238+
setupLog.Error(err, "unable to create controller", "controller", "ManagementClusterTransitGateway")
235239
os.Exit(1)
236240
}
237241

@@ -240,9 +244,8 @@ func wireNetworkTopologyReconcilers(cfg reconcilerConfig, mgr manager.Manager) {
240244
cfg.awsClusterClient,
241245
cfg.awsClients,
242246
)
243-
244247
if err := tgwAttachmentReconciler.SetupWithManager(mgr); err != nil {
245-
setupLog.Error(err, "unable to create controller")
248+
setupLog.Error(err, "unable to create controller", "controller", "TransitGatewayAttachment")
246249
os.Exit(1)
247250
}
248251

@@ -251,9 +254,18 @@ func wireNetworkTopologyReconcilers(cfg reconcilerConfig, mgr manager.Manager) {
251254
cfg.awsClusterClient,
252255
cfg.awsClients,
253256
)
254-
255257
if err := prefixListEntryReconciler.SetupWithManager(mgr); err != nil {
256-
setupLog.Error(err, "unable to create controller")
258+
setupLog.Error(err, "unable to create controller", "controller", "PrefixListEntry")
259+
os.Exit(1)
260+
}
261+
262+
shareReconciler := controllers.NewShareReconciler(
263+
managementCluster,
264+
cfg.awsClusterClient,
265+
cfg.awsClients,
266+
)
267+
if err := shareReconciler.SetupWithManager(mgr); err != nil {
268+
setupLog.Error(err, "unable to create controller", "controller", "Share")
257269
os.Exit(1)
258270
}
259271

0 commit comments

Comments
 (0)