Skip to content

Commit 4b9c46d

Browse files
committed
Delete router/network/subnet
1 parent 6853585 commit 4b9c46d

File tree

3 files changed

+89
-1
lines changed

3 files changed

+89
-1
lines changed

controllers/openstackcluster_controller.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,23 @@ func (r *OpenStackClusterReconciler) reconcileDelete(ctx context.Context, log lo
150150
}
151151
}
152152

153-
// TODO(sbueringer) Delete network/subnet/router/... if created by CAPO
153+
if openStackCluster.Status.Network.Router != nil {
154+
log.Info("Deleting router", "name", openStackCluster.Status.Network.Router.Name)
155+
if err := networkingService.DeleteRouter(openStackCluster.Status.Network); err != nil {
156+
return ctrl.Result{}, errors.Errorf("failed to delete router: %v", err)
157+
}
158+
log.Info("OpenStack router deleted successfully")
159+
}
160+
161+
if openStackCluster.Status.Network != nil {
162+
log.Info("Deleting network", "name", openStackCluster.Status.Network.Name)
163+
if err := networkingService.DeleteNetwork(openStackCluster.Status.Network); err != nil {
164+
return ctrl.Result{}, errors.Errorf("failed to delete network: %v", err)
165+
}
166+
log.Info("OpenStack network deleted successfully")
167+
}
168+
169+
log.Info("OpenStack cluster deleted successfully")
154170

155171
// Cluster is deleted so remove the finalizer.
156172
controllerutil.RemoveFinalizer(openStackCluster, infrav1.ClusterFinalizer)
@@ -297,6 +313,7 @@ func (r *OpenStackClusterReconciler) reconcileNormal(ctx context.Context, log lo
297313
}
298314

299315
openStackCluster.Status.Ready = true
316+
log.Info("Reconciled Cluster create successfully")
300317
return ctrl.Result{}, nil
301318
}
302319

pkg/cloud/services/networking/network.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,22 @@ func (s *Service) ReconcileNetwork(clusterName string, openStackCluster *infrav1
9191
return nil
9292
}
9393

94+
func (s *Service) DeleteNetwork(network *infrav1.Network) error {
95+
if network == nil || network.ID == "" {
96+
s.logger.V(4).Info("No need to delete network since no network exists.")
97+
return nil
98+
}
99+
exists, err := s.existsNetwork(network.ID)
100+
if err != nil {
101+
return err
102+
}
103+
if !exists {
104+
s.logger.Info("Skipping network deletion because network doesn't exist", "network", network.ID)
105+
return nil
106+
}
107+
return networks.Delete(s.client, network.ID).ExtractErr()
108+
}
109+
94110
func (s *Service) ReconcileSubnet(clusterName string, openStackCluster *infrav1.OpenStackCluster) error {
95111

96112
if openStackCluster.Status.Network == nil || openStackCluster.Status.Network.ID == "" {
@@ -188,3 +204,17 @@ func (s *Service) getNetworkByName(networkName string) (networks.Network, error)
188204
}
189205
return networks.Network{}, errors.New("too many resources")
190206
}
207+
208+
func (s *Service) existsNetwork(networkID string) (bool, error) {
209+
if networkID == "" {
210+
return false, nil
211+
}
212+
network, err := networks.Get(s.client, networkID).Extract()
213+
if err != nil {
214+
return false, err
215+
}
216+
if network == nil {
217+
return false, nil
218+
}
219+
return true, nil
220+
}

pkg/cloud/services/networking/router.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,33 @@ INTERFACE_LOOP:
165165
return nil
166166
}
167167

168+
func (s *Service) DeleteRouter(network *infrav1.Network) error {
169+
if network.Router == nil || network.Router.ID == "" {
170+
s.logger.V(4).Info("No need to delete router since no router exists.")
171+
return nil
172+
}
173+
exists, err := s.existsRouter(network.Router.ID)
174+
if err != nil {
175+
return err
176+
}
177+
if !exists {
178+
s.logger.Info("Skipping router deletion because router doesn't exist", "router", network.Router.ID)
179+
return nil
180+
}
181+
if network.Subnet == nil || network.Subnet.ID == "" {
182+
s.logger.V(4).Info("Skipping removing router interface since no subnet exists.")
183+
} else {
184+
_, err = routers.RemoveInterface(s.client, network.Router.ID, routers.RemoveInterfaceOpts{
185+
SubnetID: network.Subnet.ID,
186+
}).Extract()
187+
if err != nil {
188+
return fmt.Errorf("unable to remove router interface: %v", err)
189+
}
190+
s.logger.V(4).Info("Removed RouterInterface of Router", "id", network.Router.ID)
191+
}
192+
return routers.Delete(s.client, network.Router.ID).ExtractErr()
193+
}
194+
168195
func (s *Service) getRouterInterfaces(routerID string) ([]ports.Port, error) {
169196
allPages, err := ports.List(s.client, ports.ListOpts{
170197
DeviceID: routerID,
@@ -247,3 +274,17 @@ func GetSubnetsByFilter(networkClient *gophercloud.ServiceClient, opts subnets.L
247274
}
248275
return snets, nil
249276
}
277+
278+
func (s *Service) existsRouter(routerID string) (bool, error) {
279+
if routerID == "" {
280+
return false, nil
281+
}
282+
router, err := routers.Get(s.client, routerID).Extract()
283+
if err != nil {
284+
return false, err
285+
}
286+
if router == nil {
287+
return false, nil
288+
}
289+
return true, nil
290+
}

0 commit comments

Comments
 (0)