Skip to content

Commit 0d46dd6

Browse files
committed
Delete router/network/subnet
1 parent a0cf06a commit 0d46dd6

File tree

3 files changed

+92
-1
lines changed

3 files changed

+92
-1
lines changed

controllers/openstackcluster_controller.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,24 @@ 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+
err := networkingService.DeleteRouter(openStackCluster.Status.Network)
156+
if err != nil {
157+
return ctrl.Result{}, errors.Errorf("failed to delete router: %v", err)
158+
}
159+
log.Info("OpenStack router deleted successfully")
160+
}
161+
162+
if openStackCluster.Status.Network != nil {
163+
log.Info("Deleting network", "name", openStackCluster.Status.Network.Name)
164+
err := networkingService.DeleteNetwork(openStackCluster.Status.Network)
165+
if err != nil {
166+
return ctrl.Result{}, errors.Errorf("failed to delete network: %v", err)
167+
}
168+
log.Info("OpenStack network deleted successfully")
169+
}
170+
log.Info("OpenStack cluster deleted successfully")
154171

155172
// Cluster is deleted so remove the finalizer.
156173
controllerutil.RemoveFinalizer(openStackCluster, infrav1.ClusterFinalizer)
@@ -297,6 +314,7 @@ func (r *OpenStackClusterReconciler) reconcileNormal(ctx context.Context, log lo
297314
}
298315

299316
openStackCluster.Status.Ready = true
317+
log.Info("Reconciled Cluster create successfully")
300318
return ctrl.Result{}, nil
301319
}
302320

pkg/cloud/services/networking/network.go

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

94+
func (s *Service) DeleteNetwork(network *infrav1.Network) error {
95+
exists, err := s.existsNetwork(network.ID)
96+
if err != nil {
97+
return err
98+
}
99+
if exists {
100+
err = networks.Delete(s.client, network.ID).ExtractErr()
101+
} else {
102+
s.logger.Info("No network", "network", network.ID)
103+
}
104+
return err
105+
}
106+
94107
func (s *Service) ReconcileSubnet(clusterName string, openStackCluster *infrav1.OpenStackCluster) error {
95108

96109
if openStackCluster.Status.Network == nil || openStackCluster.Status.Network.ID == "" {
@@ -188,3 +201,21 @@ func (s *Service) getNetworkByName(networkName string) (networks.Network, error)
188201
}
189202
return networks.Network{}, errors.New("too many resources")
190203
}
204+
205+
func (s *Service) existsNetwork(networkID string) (bool, error) {
206+
opts := networks.ListOpts{
207+
ID: networkID,
208+
}
209+
allPages, err := networks.List(s.client, opts).AllPages()
210+
if err != nil {
211+
return false, err
212+
}
213+
allNetworks, err := networks.ExtractNetworks(allPages)
214+
if err != nil {
215+
return false, err
216+
}
217+
if len(allNetworks) == 0 {
218+
return false, nil
219+
}
220+
return true, nil
221+
}

pkg/cloud/services/networking/router.go

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

168+
func (s *Service) DeleteRouter(network *infrav1.Network) error {
169+
exists, err := s.existsRouter(network.Router.ID)
170+
if err != nil {
171+
return err
172+
}
173+
if exists {
174+
if network.Subnet == nil || network.Subnet.ID == "" {
175+
s.logger.V(4).Info("No need to remove router interface since no subnet exists.")
176+
} else {
177+
_, err := routers.RemoveInterface(s.client, network.Router.ID, routers.RemoveInterfaceOpts{
178+
SubnetID: network.Subnet.ID,
179+
}).Extract()
180+
if err != nil {
181+
return fmt.Errorf("unable to remove router interface: %v", err)
182+
}
183+
s.logger.V(4).Info("Removed RouterInterface of Router", "id", network.Router.ID)
184+
}
185+
err = routers.Delete(s.client, network.Router.ID).ExtractErr()
186+
} else {
187+
s.logger.Info("No router", "router", network.Router.ID)
188+
}
189+
return err
190+
}
191+
168192
func (s *Service) getRouterInterfaces(routerID string) ([]ports.Port, error) {
169193
allPages, err := ports.List(s.client, ports.ListOpts{
170194
DeviceID: routerID,
@@ -247,3 +271,21 @@ func GetSubnetsByFilter(networkClient *gophercloud.ServiceClient, opts subnets.L
247271
}
248272
return snets, nil
249273
}
274+
275+
func (s *Service) existsRouter(routerID string) (bool, error) {
276+
opts := routers.ListOpts{
277+
ID: routerID,
278+
}
279+
allPages, err := routers.List(s.client, opts).AllPages()
280+
if err != nil {
281+
return false, err
282+
}
283+
allRouters, err := routers.ExtractRouters(allPages)
284+
if err != nil {
285+
return false, err
286+
}
287+
if len(allRouters) == 0 {
288+
return false, nil
289+
}
290+
return true, nil
291+
}

0 commit comments

Comments
 (0)