@@ -31,8 +31,9 @@ import (
3131)
3232
3333const (
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
3839func (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+
80117func (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