Skip to content

Commit 3619d72

Browse files
committed
Take 2
1 parent 512e572 commit 3619d72

File tree

6 files changed

+69
-32
lines changed

6 files changed

+69
-32
lines changed

controllers/openstackcluster_controller.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -237,8 +237,9 @@ func deleteBastion(scope scope.Scope, cluster *clusterv1.Cluster, openStackClust
237237
}
238238
}
239239

240-
rootVolume := openStackCluster.Spec.Bastion.Instance.RootVolume
241-
if err = computeService.DeleteInstance(openStackCluster, instanceStatus, instanceName, rootVolume); err != nil {
240+
instanceSpec := bastionToInstanceSpec(openStackCluster, cluster.Name)
241+
242+
if err = computeService.DeleteInstance(openStackCluster, openStackCluster, instanceStatus, instanceSpec); err != nil {
242243
handleUpdateOSCError(openStackCluster, fmt.Errorf("failed to delete bastion: %w", err))
243244
return fmt.Errorf("failed to delete bastion: %w", err)
244245
}

controllers/openstackmachine_controller.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,9 @@ func (r *OpenStackMachineReconciler) reconcileDelete(scope scope.Scope, cluster
273273
}
274274
}
275275

276-
if err := computeService.DeleteInstance(openStackMachine, instanceStatus, openStackMachine.Name, openStackMachine.Spec.RootVolume); err != nil {
276+
instanceSpec := machineToInstanceSpec(openStackCluster, machine, openStackMachine, "")
277+
278+
if err := computeService.DeleteInstance(openStackCluster, openStackMachine, instanceStatus, instanceSpec); err != nil {
277279
conditions.MarkFalse(openStackMachine, infrav1.InstanceReadyCondition, infrav1.InstanceDeleteFailedReason, clusterv1.ConditionSeverityError, "Deleting instance failed: %v", err)
278280
return ctrl.Result{}, fmt.Errorf("delete instance: %w", err)
279281
}

pkg/cloud/services/compute/instance.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -542,7 +542,7 @@ func (s *Service) GetManagementPort(openStackCluster *infrav1.OpenStackCluster,
542542
return &allPorts[0], nil
543543
}
544544

545-
func (s *Service) DeleteInstance(eventObject runtime.Object, instanceStatus *InstanceStatus, instanceName string, rootVolume *infrav1.RootVolume) error {
545+
func (s *Service) DeleteInstance(openStackCluster *infrav1.OpenStackCluster, eventObject runtime.Object, instanceStatus *InstanceStatus, instanceSpec *InstanceSpec) error {
546546
if instanceStatus == nil {
547547
/*
548548
We create a boot-from-volume instance in 2 steps:
@@ -562,8 +562,8 @@ func (s *Service) DeleteInstance(eventObject runtime.Object, instanceStatus *Ins
562562
Note that we don't need to separately delete the root volume when deleting the instance because
563563
DeleteOnTermination will ensure it is deleted in that case.
564564
*/
565-
if hasRootVolume(rootVolume) {
566-
name := rootVolumeName(instanceName)
565+
if hasRootVolume(instanceSpec.RootVolume) {
566+
name := rootVolumeName(instanceSpec.Name)
567567
volume, err := s.getVolumeByName(name)
568568
if err != nil {
569569
return err
@@ -612,7 +612,12 @@ func (s *Service) DeleteInstance(eventObject runtime.Object, instanceStatus *Ins
612612

613613
// delete port of error instance
614614
if instanceStatus.State() == infrav1.InstanceStateError {
615-
if err := networkingService.GarbageCollectErrorInstancesPort(eventObject, instanceStatus.Name()); err != nil {
615+
portOpts, err := s.constructPorts(openStackCluster, instanceSpec)
616+
if err != nil {
617+
return err
618+
}
619+
620+
if err := networkingService.GarbageCollectErrorInstancesPort(eventObject, instanceSpec.Name, portOpts); err != nil {
616621
return err
617622
}
618623
}

pkg/cloud/services/compute/instance_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,13 @@ func TestService_DeleteInstance(t *testing.T) {
820820
if err != nil {
821821
t.Fatalf("Failed to create service: %v", err)
822822
}
823-
if err := s.DeleteInstance(tt.eventObject, tt.instanceStatus(), openStackMachineName, tt.rootVolume); (err != nil) != tt.wantErr {
823+
824+
instanceSpec := &InstanceSpec{
825+
Name: openStackMachineName,
826+
RootVolume: tt.rootVolume,
827+
}
828+
829+
if err := s.DeleteInstance(&infrav1.OpenStackCluster{}, tt.eventObject, tt.instanceStatus(), instanceSpec); (err != nil) != tt.wantErr {
824830
t.Errorf("Service.DeleteInstance() error = %v, wantErr %v", err, tt.wantErr)
825831
}
826832
})

pkg/cloud/services/networking/port.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -289,23 +289,24 @@ func (s *Service) DeletePorts(openStackCluster *infrav1.OpenStackCluster) error
289289
return nil
290290
}
291291

292-
func (s *Service) GarbageCollectErrorInstancesPort(eventObject runtime.Object, instanceName string) error {
293-
// NOTE: when creating an instance, ports are named using getPortName(), which
294-
// features an index, so we must list all ports and delete those that start with
295-
// the instance name. Specifying the name in the list options will only return
296-
// a direct match.
297-
portList, err := s.client.ListPort(ports.ListOpts{})
298-
if err != nil {
299-
return err
300-
}
292+
func (s *Service) GarbageCollectErrorInstancesPort(eventObject runtime.Object, instanceName string, portOpts []infrav1.PortOpts) error {
293+
for i := range portOpts {
294+
portOpt := &portOpts[i]
301295

302-
for _, p := range portList {
303-
if !strings.HasPrefix(p.Name, instanceName) {
304-
continue
296+
// TODO: whould be nice if gophercloud could be persuaded to accept multiple
297+
// names as is allowed by the API in order to reduce API traffic.
298+
portList, err := s.client.ListPort(ports.ListOpts{Name: GetPortName(instanceName, portOpt, i)})
299+
if err != nil {
300+
return err
305301
}
306302

307-
if err := s.DeletePort(eventObject, p.ID); err != nil {
308-
return err
303+
// NOTE: https://github.com/kubernetes-sigs/cluster-api-provider-openstack/issues/1476
304+
// It is up to the end user to specify a UNIQUE cluster name when provisioning in the
305+
// same project, otherwise things will alias and we could delete more than we should.
306+
for _, p := range portList {
307+
if err := s.DeletePort(eventObject, p.ID); err != nil {
308+
return err
309+
}
309310
}
310311
}
311312

pkg/cloud/services/networking/port_test.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/gophercloud/gophercloud/openstack/networking/v2/ports"
2828
"github.com/gophercloud/gophercloud/openstack/networking/v2/subnets"
2929
. "github.com/onsi/gomega"
30+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3031

3132
infrav1 "sigs.k8s.io/cluster-api-provider-openstack/api/v1alpha7"
3233
"sigs.k8s.io/cluster-api-provider-openstack/pkg/clients/mock"
@@ -546,36 +547,56 @@ func Test_GarbageCollectErrorInstancesPort(t *testing.T) {
546547
portName2 := GetPortName(instanceName, nil, 1)
547548

548549
tests := []struct {
549-
name string
550-
expect func(m *mock.MockNetworkClientMockRecorder)
550+
// man is the name of the test.
551+
name string
552+
// expect allows definition of any expected calls to the mock.
553+
expect func(m *mock.MockNetworkClientMockRecorder)
554+
// portOpts defines the instance ports as defined in the OSM spec.
555+
portOpts []infrav1.PortOpts
556+
// wantErr defines whether the test is supposed to fail.
551557
wantErr bool
552558
}{
553559
{
554560
name: "garbage collects all ports for an instance",
555561
expect: func(m *mock.MockNetworkClientMockRecorder) {
556-
p := []ports.Port{
557-
{
558-
ID: "9278e096-5c63-4ffb-9289-2bacf948dc51",
559-
Name: "bar-0",
560-
},
562+
o1 := ports.ListOpts{
563+
Name: portName1,
564+
}
565+
p1 := []ports.Port{
561566
{
562567
ID: portID1,
563568
Name: portName1,
564569
},
570+
}
571+
m.ListPort(o1).Return(p1, nil)
572+
m.DeletePort(portID1)
573+
o2 := ports.ListOpts{
574+
Name: portName2,
575+
}
576+
p2 := []ports.Port{
565577
{
566578
ID: portID2,
567579
Name: portName2,
568580
},
569581
}
570-
m.ListPort(ports.ListOpts{}).Return(p, nil)
571-
m.DeletePort(portID1)
582+
583+
m.ListPort(o2).Return(p2, nil)
572584
m.DeletePort(portID2)
573585
},
586+
portOpts: []infrav1.PortOpts{
587+
{},
588+
{},
589+
},
574590
wantErr: false,
575591
},
576592
}
577593

578-
eventObject := &infrav1.OpenStackMachine{}
594+
eventObject := &infrav1.OpenStackMachine{
595+
ObjectMeta: metav1.ObjectMeta{
596+
Name: instanceName,
597+
},
598+
}
599+
579600
for _, tt := range tests {
580601
t.Run(tt.name, func(t *testing.T) {
581602
g := NewWithT(t)
@@ -587,6 +608,7 @@ func Test_GarbageCollectErrorInstancesPort(t *testing.T) {
587608
err := s.GarbageCollectErrorInstancesPort(
588609
eventObject,
589610
instanceName,
611+
tt.portOpts,
590612
)
591613
if tt.wantErr {
592614
g.Expect(err).To(HaveOccurred())

0 commit comments

Comments
 (0)