Skip to content

Commit c0db352

Browse files
author
shiftstack-merge-bot
committed
2 parents 96a060a + 3601912 commit c0db352

File tree

13 files changed

+360
-39
lines changed

13 files changed

+360
-39
lines changed

api/v1alpha6/openstackcluster_conversion.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,10 @@ func Convert_v1beta1_OpenStackClusterSpec_To_v1alpha6_OpenStackClusterSpec(in *i
364364
}
365365

366366
out.CloudName = in.IdentityRef.CloudName
367-
out.IdentityRef = &OpenStackIdentityReference{Name: in.IdentityRef.Name}
367+
out.IdentityRef = &OpenStackIdentityReference{}
368+
if err := Convert_v1beta1_OpenStackIdentityReference_To_v1alpha6_OpenStackIdentityReference(&in.IdentityRef, out.IdentityRef, s); err != nil {
369+
return err
370+
}
368371

369372
if in.APIServerLoadBalancer != nil {
370373
if err := Convert_v1beta1_APIServerLoadBalancer_To_v1alpha6_APIServerLoadBalancer(in.APIServerLoadBalancer, &out.APIServerLoadBalancer, s); err != nil {

api/v1alpha6/openstackmachine_conversion.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,6 @@ func Convert_v1beta1_OpenStackMachineSpec_To_v1alpha6_OpenStackMachineSpec(in *i
373373
}
374374

375375
if in.IdentityRef != nil {
376-
out.IdentityRef = &OpenStackIdentityReference{Name: in.IdentityRef.Name}
377376
out.CloudName = in.IdentityRef.CloudName
378377
}
379378

api/v1alpha6/types_conversion.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,8 @@ func Convert_v1alpha6_OpenStackIdentityReference_To_v1beta1_OpenStackIdentityRef
534534

535535
func Convert_v1beta1_OpenStackIdentityReference_To_v1alpha6_OpenStackIdentityReference(in *infrav1.OpenStackIdentityReference, out *OpenStackIdentityReference, _ apiconversion.Scope) error {
536536
out.Name = in.Name
537+
// Kind will be overwritten during restore if it was previously set to some other value, but if not then some value is still required
538+
out.Kind = "Secret"
537539
return nil
538540
}
539541

api/v1alpha7/openstackcluster_conversion.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,10 @@ func Convert_v1beta1_OpenStackClusterSpec_To_v1alpha7_OpenStackClusterSpec(in *i
361361
}
362362

363363
out.CloudName = in.IdentityRef.CloudName
364-
out.IdentityRef = &OpenStackIdentityReference{Name: in.IdentityRef.Name}
364+
out.IdentityRef = &OpenStackIdentityReference{}
365+
if err := Convert_v1beta1_OpenStackIdentityReference_To_v1alpha7_OpenStackIdentityReference(&in.IdentityRef, out.IdentityRef, s); err != nil {
366+
return err
367+
}
365368

366369
if in.APIServerLoadBalancer != nil {
367370
if err := Convert_v1beta1_APIServerLoadBalancer_To_v1alpha7_APIServerLoadBalancer(in.APIServerLoadBalancer, &out.APIServerLoadBalancer, s); err != nil {

api/v1alpha7/types_conversion.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,8 @@ func Convert_v1alpha7_OpenStackIdentityReference_To_v1beta1_OpenStackIdentityRef
536536

537537
func Convert_v1beta1_OpenStackIdentityReference_To_v1alpha7_OpenStackIdentityReference(in *infrav1.OpenStackIdentityReference, out *OpenStackIdentityReference, _ apiconversion.Scope) error {
538538
out.Name = in.Name
539+
// Kind will be overwritten during restore if it was previously set to some other value, but if not then some value is still required
540+
out.Kind = "Secret"
539541
return nil
540542
}
541543

controllers/openstackmachine_controller_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ func Test_reconcileDelete(t *testing.T) {
265265
trunkExtension.Alias = "trunk"
266266
r.network.ListExtensions().Return([]extensions.Extension{trunkExtension}, nil)
267267
r.network.ListTrunk(trunks.ListOpts{PortID: portUUID}).Return([]trunks.Trunk{{ID: trunkUUID}}, nil)
268+
r.network.ListTrunkSubports(trunkUUID).Return([]trunks.Subport{}, nil)
268269
r.network.DeleteTrunk(trunkUUID).Return(nil)
269270
r.network.DeletePort(portUUID).Return(nil)
270271
}

pkg/clients/mock/network.go

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/clients/networking.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ type NetworkClient interface {
5353
CreateTrunk(opts trunks.CreateOptsBuilder) (*trunks.Trunk, error)
5454
DeleteTrunk(id string) error
5555

56+
ListTrunkSubports(trunkID string) ([]trunks.Subport, error)
57+
RemoveSubports(id string, opts trunks.RemoveSubportsOpts) error
58+
5659
ListRouter(opts routers.ListOpts) ([]routers.Router, error)
5760
CreateRouter(opts routers.CreateOptsBuilder) (*routers.Router, error)
5861
DeleteRouter(id string) error
@@ -238,6 +241,24 @@ func (c networkClient) DeleteTrunk(id string) error {
238241
return mc.ObserveRequestIgnoreNotFound(trunks.Delete(c.serviceClient, id).ExtractErr())
239242
}
240243

244+
func (c networkClient) ListTrunkSubports(trunkID string) ([]trunks.Subport, error) {
245+
mc := metrics.NewMetricPrometheusContext("trunk", "listsubports")
246+
subports, err := trunks.GetSubports(c.serviceClient, trunkID).Extract()
247+
if mc.ObserveRequest(err) != nil {
248+
return nil, err
249+
}
250+
return subports, nil
251+
}
252+
253+
func (c networkClient) RemoveSubports(id string, opts trunks.RemoveSubportsOpts) error {
254+
mc := metrics.NewMetricPrometheusContext("trunk", "deletesubports")
255+
_, err := trunks.RemoveSubports(c.serviceClient, id, opts).Extract()
256+
if mc.ObserveRequest(err) != nil {
257+
return err
258+
}
259+
return nil
260+
}
261+
241262
func (c networkClient) ListTrunk(opts trunks.ListOptsBuilder) ([]trunks.Trunk, error) {
242263
mc := metrics.NewMetricPrometheusContext("trunk", "list")
243264
allPages, err := trunks.List(c.serviceClient, opts).AllPages()

pkg/cloud/services/networking/trunk.go

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ import (
3131
)
3232

3333
const (
34-
timeoutTrunkDelete = 3 * time.Minute
35-
retryIntervalTrunkDelete = 5 * time.Second
34+
timeoutTrunkDelete = 3 * time.Minute
35+
retryIntervalTrunkDelete = 5 * time.Second
36+
retryIntervalSubportDelete = 30 * time.Second
3637
)
3738

3839
func (s *Service) GetTrunkSupport() (bool, error) {
@@ -77,6 +78,42 @@ func (s *Service) getOrCreateTrunkForPort(eventObject runtime.Object, port *port
7778
return trunk, nil
7879
}
7980

81+
func (s *Service) RemoveTrunkSubports(trunkID string) error {
82+
subports, err := s.client.ListTrunkSubports(trunkID)
83+
if err != nil {
84+
return err
85+
}
86+
87+
if len(subports) == 0 {
88+
return nil
89+
}
90+
91+
portList := make([]trunks.RemoveSubport, len(subports))
92+
for i, subport := range subports {
93+
portList[i] = trunks.RemoveSubport{
94+
PortID: subport.PortID,
95+
}
96+
}
97+
98+
removeSubportsOpts := trunks.RemoveSubportsOpts{
99+
Subports: portList,
100+
}
101+
102+
err = s.client.RemoveSubports(trunkID, removeSubportsOpts)
103+
if err != nil {
104+
return err
105+
}
106+
107+
for _, subPort := range subports {
108+
err := s.client.DeletePort(subPort.PortID)
109+
if err != nil {
110+
return err
111+
}
112+
}
113+
114+
return nil
115+
}
116+
80117
func (s *Service) DeleteTrunk(eventObject runtime.Object, portID string) error {
81118
listOpts := trunks.ListOpts{
82119
PortID: portID,
@@ -88,6 +125,22 @@ func (s *Service) DeleteTrunk(eventObject runtime.Object, portID string) error {
88125
if len(trunkInfo) != 1 {
89126
return nil
90127
}
128+
// Delete sub-ports if trunk is associated with sub-ports
129+
err = wait.PollUntilContextTimeout(context.TODO(), retryIntervalSubportDelete, timeoutTrunkDelete, true, func(_ context.Context) (bool, error) {
130+
if err := s.RemoveTrunkSubports(trunkInfo[0].ID); err != nil {
131+
if capoerrors.IsNotFound(err) || capoerrors.IsConflict(err) || capoerrors.IsRetryable(err) {
132+
return false, nil
133+
}
134+
return false, err
135+
}
136+
return true, nil
137+
})
138+
if err != nil {
139+
record.Warnf(eventObject, "FailedRemoveTrunkSubports", "Failed to delete sub ports trunk %s with id %s: %v", trunkInfo[0].Name, trunkInfo[0].ID, err)
140+
return err
141+
}
142+
143+
record.Eventf(eventObject, "SuccessfulRemoveTrunkSubports", "Removed trunk sub ports %s with id %s", trunkInfo[0].Name, trunkInfo[0].ID)
91144

92145
err = wait.PollUntilContextTimeout(context.TODO(), retryIntervalTrunkDelete, timeoutTrunkDelete, true, func(_ context.Context) (bool, error) {
93146
if err := s.client.DeleteTrunk(trunkInfo[0].ID); err != nil {

0 commit comments

Comments
 (0)