@@ -31,8 +31,9 @@ import (
31
31
)
32
32
33
33
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
36
37
)
37
38
38
39
func (s * Service ) GetTrunkSupport () (bool , error ) {
@@ -77,6 +78,42 @@ func (s *Service) getOrCreateTrunkForPort(eventObject runtime.Object, port *port
77
78
return trunk , nil
78
79
}
79
80
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
+
80
117
func (s * Service ) DeleteTrunk (eventObject runtime.Object , portID string ) error {
81
118
listOpts := trunks.ListOpts {
82
119
PortID : portID ,
@@ -88,6 +125,22 @@ func (s *Service) DeleteTrunk(eventObject runtime.Object, portID string) error {
88
125
if len (trunkInfo ) != 1 {
89
126
return nil
90
127
}
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 )
91
144
92
145
err = wait .PollUntilContextTimeout (context .TODO (), retryIntervalTrunkDelete , timeoutTrunkDelete , true , func (_ context.Context ) (bool , error ) {
93
146
if err := s .client .DeleteTrunk (trunkInfo [0 ].ID ); err != nil {
0 commit comments