Skip to content

Commit cf4ccc5

Browse files
authored
Merge pull request #1845 from shiftstack/issue_1835
🐛 Fill up OpenStack cluster ReferencedResources with Image ID
2 parents 64fd897 + 26575b2 commit cf4ccc5

File tree

2 files changed

+57
-34
lines changed

2 files changed

+57
-34
lines changed

controllers/openstackcluster_controller.go

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,16 @@ func (r *OpenStackClusterReconciler) Reconcile(ctx context.Context, req ctrl.Req
119119
return reconcile.Result{}, err
120120
}
121121

122+
if openStackCluster.Spec.Bastion != nil && openStackCluster.Spec.Bastion.Enabled {
123+
if openStackCluster.Status.Bastion == nil {
124+
openStackCluster.Status.Bastion = &infrav1.BastionStatus{}
125+
}
126+
err = compute.ResolveReferencedMachineResources(scope, &openStackCluster.Spec.Bastion.Instance, &openStackCluster.Status.Bastion.ReferencedResources)
127+
if err != nil {
128+
return reconcile.Result{}, err
129+
}
130+
}
131+
122132
// Handle deleted clusters
123133
if !openStackCluster.DeletionTimestamp.IsZero() {
124134
return r.reconcileDelete(ctx, scope, cluster, openStackCluster)
@@ -253,11 +263,7 @@ func deleteBastion(scope scope.Scope, cluster *clusterv1.Cluster, openStackClust
253263
}
254264
}
255265

256-
instanceSpec, err := bastionToInstanceSpec(openStackCluster, cluster.Name, computeService)
257-
if err != nil {
258-
return fmt.Errorf("failed to create bastion InstanceSpec: %w", err)
259-
}
260-
266+
instanceSpec := bastionToInstanceSpec(openStackCluster, cluster.Name)
261267
if err = computeService.DeleteInstance(openStackCluster, openStackCluster, instanceStatus, instanceSpec); err != nil {
262268
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete bastion: %w", err))
263269
return fmt.Errorf("failed to delete bastion: %w", err)
@@ -340,11 +346,7 @@ func reconcileBastion(scope scope.Scope, cluster *clusterv1.Cluster, openStackCl
340346
return reconcile.Result{}, err
341347
}
342348

343-
instanceSpec, err := bastionToInstanceSpec(openStackCluster, cluster.Name, computeService)
344-
if err != nil {
345-
return reconcile.Result{}, fmt.Errorf("failed to create bastion InstanceSpec: %w", err)
346-
}
347-
349+
instanceSpec := bastionToInstanceSpec(openStackCluster, cluster.Name)
348350
bastionHash, err := compute.HashInstanceSpec(instanceSpec)
349351
if err != nil {
350352
return reconcile.Result{}, fmt.Errorf("failed computing bastion hash from instance spec: %w", err)
@@ -435,17 +437,12 @@ func reconcileBastion(scope scope.Scope, cluster *clusterv1.Cluster, openStackCl
435437
return ctrl.Result{}, nil
436438
}
437439

438-
func bastionToInstanceSpec(openStackCluster *infrav1.OpenStackCluster, clusterName string, computeService *compute.Service) (*compute.InstanceSpec, error) {
439-
imageID, err := computeService.GetImageID(openStackCluster.Spec.Bastion.Instance.Image)
440-
if err != nil {
441-
return nil, fmt.Errorf("failed to get image ID for bastion: %w", err)
442-
}
443-
440+
func bastionToInstanceSpec(openStackCluster *infrav1.OpenStackCluster, clusterName string) *compute.InstanceSpec {
444441
instanceSpec := &compute.InstanceSpec{
445442
Name: bastionName(clusterName),
446443
Flavor: openStackCluster.Spec.Bastion.Instance.Flavor,
447444
SSHKeyName: openStackCluster.Spec.Bastion.Instance.SSHKeyName,
448-
ImageID: imageID,
445+
ImageID: openStackCluster.Status.Bastion.ReferencedResources.ImageID,
449446
FailureDomain: openStackCluster.Spec.Bastion.AvailabilityZone,
450447
RootVolume: openStackCluster.Spec.Bastion.Instance.RootVolume,
451448
}
@@ -461,7 +458,7 @@ func bastionToInstanceSpec(openStackCluster *infrav1.OpenStackCluster, clusterNa
461458

462459
instanceSpec.Ports = openStackCluster.Spec.Bastion.Instance.Ports
463460

464-
return instanceSpec, nil
461+
return instanceSpec
465462
}
466463

467464
func bastionName(clusterName string) string {

controllers/openstackcluster_controller_test.go

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525
"github.com/gophercloud/gophercloud"
2626
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
2727
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
28-
"github.com/gophercloud/gophercloud/openstack/imageservice/v2/images"
2928
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions"
3029
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/external"
3130
"github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/floatingips"
@@ -234,6 +233,11 @@ var _ = Describe("OpenStackCluster controller", func() {
234233
err = k8sClient.Create(ctx, capiCluster)
235234
Expect(err).To(BeNil())
236235
testCluster.Status = infrav1.OpenStackClusterStatus{
236+
Bastion: &infrav1.BastionStatus{
237+
ReferencedResources: infrav1.ReferencedMachineResources{
238+
ImageID: "imageID",
239+
},
240+
},
237241
Network: &infrav1.NetworkStatusWithSubnets{
238242
NetworkStatus: infrav1.NetworkStatus{
239243
Name: "network-name",
@@ -250,9 +254,6 @@ var _ = Describe("OpenStackCluster controller", func() {
250254
server.ID = "adopted-bastion-uuid"
251255
server.Status = "ACTIVE"
252256

253-
imageClientRecorder := mockScopeFactory.ImageClient.EXPECT()
254-
imageClientRecorder.ListImages(gomock.Any()).Return([]images.Image{{ID: "imageID"}}, nil)
255-
256257
computeClientRecorder := mockScopeFactory.ComputeClient.EXPECT()
257258
computeClientRecorder.ListServers(servers.ListOpts{
258259
Name: "^capi-cluster-bastion$",
@@ -263,7 +264,13 @@ var _ = Describe("OpenStackCluster controller", func() {
263264
networkClientRecorder.ListFloatingIP(floatingips.ListOpts{PortID: "portID"}).Return(make([]floatingips.FloatingIP, 1), nil)
264265

265266
res, err := reconcileBastion(scope, capiCluster, testCluster)
266-
Expect(testCluster.Status.Bastion).To(Equal(&infrav1.BastionStatus{ID: "adopted-bastion-uuid", State: "ACTIVE"}))
267+
Expect(testCluster.Status.Bastion).To(Equal(&infrav1.BastionStatus{
268+
ID: "adopted-bastion-uuid",
269+
State: "ACTIVE",
270+
ReferencedResources: infrav1.ReferencedMachineResources{
271+
ImageID: "imageID",
272+
},
273+
}))
267274
Expect(err).To(BeNil())
268275
Expect(res).To(Equal(reconcile.Result{}))
269276
})
@@ -286,6 +293,9 @@ var _ = Describe("OpenStackCluster controller", func() {
286293
},
287294
Bastion: &infrav1.BastionStatus{
288295
ID: "adopted-fip-bastion-uuid",
296+
ReferencedResources: infrav1.ReferencedMachineResources{
297+
ImageID: "imageID",
298+
},
289299
},
290300
}
291301
err = k8sClient.Status().Update(ctx, testCluster)
@@ -298,9 +308,6 @@ var _ = Describe("OpenStackCluster controller", func() {
298308
server.ID = "adopted-fip-bastion-uuid"
299309
server.Status = "ACTIVE"
300310

301-
imageClientRecorder := mockScopeFactory.ImageClient.EXPECT()
302-
imageClientRecorder.ListImages(gomock.Any()).Return([]images.Image{{ID: "imageID"}}, nil)
303-
304311
computeClientRecorder := mockScopeFactory.ComputeClient.EXPECT()
305312
computeClientRecorder.GetServer("adopted-fip-bastion-uuid").Return(&server, nil)
306313

@@ -309,7 +316,14 @@ var _ = Describe("OpenStackCluster controller", func() {
309316
networkClientRecorder.ListFloatingIP(floatingips.ListOpts{PortID: "portID"}).Return([]floatingips.FloatingIP{{FloatingIP: "1.2.3.4"}}, nil)
310317

311318
res, err := reconcileBastion(scope, capiCluster, testCluster)
312-
Expect(testCluster.Status.Bastion).To(Equal(&infrav1.BastionStatus{ID: "adopted-fip-bastion-uuid", State: "ACTIVE", FloatingIP: "1.2.3.4"}))
319+
Expect(testCluster.Status.Bastion).To(Equal(&infrav1.BastionStatus{
320+
ID: "adopted-fip-bastion-uuid",
321+
FloatingIP: "1.2.3.4",
322+
State: "ACTIVE",
323+
ReferencedResources: infrav1.ReferencedMachineResources{
324+
ImageID: "imageID",
325+
},
326+
}))
313327
Expect(err).To(BeNil())
314328
Expect(res).To(Equal(reconcile.Result{}))
315329
})
@@ -332,6 +346,9 @@ var _ = Describe("OpenStackCluster controller", func() {
332346
},
333347
Bastion: &infrav1.BastionStatus{
334348
ID: "requeue-bastion-uuid",
349+
ReferencedResources: infrav1.ReferencedMachineResources{
350+
ImageID: "imageID",
351+
},
335352
},
336353
}
337354
err = k8sClient.Status().Update(ctx, testCluster)
@@ -344,14 +361,17 @@ var _ = Describe("OpenStackCluster controller", func() {
344361
server.ID = "requeue-bastion-uuid"
345362
server.Status = "BUILD"
346363

347-
imageClientRecorder := mockScopeFactory.ImageClient.EXPECT()
348-
imageClientRecorder.ListImages(gomock.Any()).Return([]images.Image{{ID: "imageID"}}, nil)
349-
350364
computeClientRecorder := mockScopeFactory.ComputeClient.EXPECT()
351365
computeClientRecorder.GetServer("requeue-bastion-uuid").Return(&server, nil)
352366

353367
res, err := reconcileBastion(scope, capiCluster, testCluster)
354-
Expect(testCluster.Status.Bastion).To(Equal(&infrav1.BastionStatus{ID: "requeue-bastion-uuid", State: "BUILD"}))
368+
Expect(testCluster.Status.Bastion).To(Equal(&infrav1.BastionStatus{
369+
ID: "requeue-bastion-uuid",
370+
State: "BUILD",
371+
ReferencedResources: infrav1.ReferencedMachineResources{
372+
ImageID: "imageID",
373+
},
374+
}))
355375
Expect(err).To(BeNil())
356376
Expect(res).To(Equal(reconcile.Result{RequeueAfter: waitForBuildingInstanceToReconcile}))
357377
})
@@ -364,16 +384,22 @@ var _ = Describe("OpenStackCluster controller", func() {
364384
Expect(err).To(BeNil())
365385
err = k8sClient.Create(ctx, capiCluster)
366386
Expect(err).To(BeNil())
387+
testCluster.Status = infrav1.OpenStackClusterStatus{
388+
Bastion: &infrav1.BastionStatus{
389+
ReferencedResources: infrav1.ReferencedMachineResources{
390+
ImageID: "imageID",
391+
},
392+
},
393+
}
394+
err = k8sClient.Status().Update(ctx, testCluster)
395+
Expect(err).To(BeNil())
367396

368397
scope, err := mockScopeFactory.NewClientScopeFromCluster(ctx, k8sClient, testCluster, nil, logr.Discard())
369398
Expect(err).To(BeNil())
370399

371400
server := clients.ServerExt{}
372401
server.ID = "delete-bastion-uuid"
373402

374-
imageClientRecorder := mockScopeFactory.ImageClient.EXPECT()
375-
imageClientRecorder.ListImages(gomock.Any()).Return([]images.Image{{ID: "imageID"}}, nil)
376-
377403
computeClientRecorder := mockScopeFactory.ComputeClient.EXPECT()
378404
computeClientRecorder.ListServers(servers.ListOpts{
379405
Name: "^capi-cluster-bastion$",

0 commit comments

Comments
 (0)