You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ro...@apache.org on 2020/08/12 07:59:33 UTC

[cloudstack] branch 4.13 updated: server: Fixed private gateway can't be deleted (#4016)

This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.13
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.13 by this push:
     new 86939e7  server: Fixed private gateway can't be deleted (#4016)
86939e7 is described below

commit 86939e7f9dae71c09c98e7bc7f53c5b37bbad4ce
Author: Spaceman1984 <49...@users.noreply.github.com>
AuthorDate: Wed Aug 12 09:59:12 2020 +0200

    server: Fixed private gateway can't be deleted (#4016)
    
    When the static route service is not available on the VPC and a static route is created, the static route is created in a revoked state.
    
    Currently, the UI doesn't distinguish between active or revoked static routes.
    
    This PR adds the missing state filter to the list routes command and only lists active routes in the UI.
    It also ignores revoked routes when the private gateway is being removed but clears out the inactive routes before the gateway is removed.
    
    Fixes #2908
---
 .../api/command/user/vpc/CreateStaticRouteCmd.java     |  2 +-
 .../api/command/user/vpc/ListStaticRoutesCmd.java      |  7 +++++++
 .../java/com/cloud/network/vpc/dao/StaticRouteDao.java |  2 ++
 .../com/cloud/network/vpc/dao/StaticRouteDaoImpl.java  |  9 +++++++++
 .../java/com/cloud/network/vpc/VpcManagerImpl.java     | 18 +++++++++++++++++-
 ui/scripts/vpc.js                                      |  3 ++-
 6 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java
index 622143f..849d1ec 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java
@@ -109,7 +109,7 @@ public class CreateStaticRouteCmd extends BaseAsyncCreateCmd {
             routeResponse.setResponseName(getCommandName());
         } finally {
             if (!success || route == null) {
-                _vpcService.revokeStaticRoute(getEntityId());
+                _entityMgr.remove(StaticRoute.class, getEntityId());
                 throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create static route");
             }
         }
diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java
index 3dba84c..3ad2f44 100644
--- a/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java
+++ b/api/src/main/java/org/apache/cloudstack/api/command/user/vpc/ListStaticRoutesCmd.java
@@ -48,6 +48,9 @@ public class ListStaticRoutesCmd extends BaseListTaggedResourcesCmd {
     @Parameter(name = ApiConstants.GATEWAY_ID, type = CommandType.UUID, entityType = PrivateGatewayResponse.class, description = "list static routes by gateway id")
     private Long gatewayId;
 
+    @Parameter(name = ApiConstants.STATE, type = CommandType.STRING, description = "list static routes by state")
+    private String state;
+
     public Long getId() {
         return id;
     }
@@ -60,6 +63,10 @@ public class ListStaticRoutesCmd extends BaseListTaggedResourcesCmd {
         return gatewayId;
     }
 
+    public String getState() {
+        return state;
+    }
+
     /////////////////////////////////////////////////////
     /////////////////// Accessors ///////////////////////
     /////////////////////////////////////////////////////
diff --git a/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDao.java b/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDao.java
index 07c5ee1..750b477 100644
--- a/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDao.java
+++ b/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDao.java
@@ -30,6 +30,8 @@ public interface StaticRouteDao extends GenericDao<StaticRouteVO, Long> {
 
     List<StaticRouteVO> listByVpcId(long vpcId);
 
+    List<StaticRouteVO> listByGatewayId(long gatewayId);
+
     long countRoutesByGateway(long gatewayId);
 
 }
diff --git a/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
index 596cf98..671bf45 100644
--- a/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
@@ -62,6 +62,7 @@ public class StaticRouteDaoImpl extends GenericDaoBase<StaticRouteVO, Long> impl
         RoutesByGatewayCount = createSearchBuilder(Long.class);
         RoutesByGatewayCount.select(null, Func.COUNT, RoutesByGatewayCount.entity().getId());
         RoutesByGatewayCount.and("gatewayId", RoutesByGatewayCount.entity().getVpcGatewayId(), Op.EQ);
+        RoutesByGatewayCount.and("state", RoutesByGatewayCount.entity().getState(), Op.EQ);
         RoutesByGatewayCount.done();
     }
 
@@ -92,9 +93,17 @@ public class StaticRouteDaoImpl extends GenericDaoBase<StaticRouteVO, Long> impl
     }
 
     @Override
+    public List<StaticRouteVO> listByGatewayId(long gatewayId) {
+        SearchCriteria<StaticRouteVO> sc = AllFieldsSearch.create();
+        sc.setParameters("gatewayId", gatewayId);
+        return listBy(sc);
+    }
+
+    @Override
     public long countRoutesByGateway(long gatewayId) {
         SearchCriteria<Long> sc = RoutesByGatewayCount.create();
         sc.setParameters("gatewayId", gatewayId);
+        sc.setParameters("state", "Active");
         return customSearch(sc, null).get(0);
     }
 
diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index 620e551..ccb8eea 100644
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@ -2027,7 +2027,10 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                 }
             }
 
-            // 2) Delete private gateway from the DB
+            // 2) Clean up any remaining routes
+            cleanUpRoutesByGatewayId(gatewayId);
+
+            // 3) Delete private gateway from the DB
             return deletePrivateGatewayFromTheDB(gateway);
 
         } finally {
@@ -2037,6 +2040,13 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         }
     }
 
+    private void cleanUpRoutesByGatewayId(long gatewayId){
+        List<StaticRouteVO> routes = _staticRouteDao.listByGatewayId(gatewayId);
+        for (StaticRouteVO route: routes){
+            _staticRouteDao.remove(route.getId());
+        }
+    }
+
     @DB
     protected boolean deletePrivateGatewayFromTheDB(final PrivateGateway gateway) {
         // check if there are ips allocted in the network
@@ -2329,6 +2339,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         final List<Long> permittedAccounts = new ArrayList<Long>();
         final Map<String, String> tags = cmd.getTags();
         final Long projectId = cmd.getProjectId();
+        final String state = cmd.getState();
 
         final Ternary<Long, Boolean, ListProjectResourcesCriteria> domainIdRecursiveListProject = new Ternary<Long, Boolean, ListProjectResourcesCriteria>(domainId, isRecursive,
                 null);
@@ -2344,6 +2355,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
         sb.and("vpcId", sb.entity().getVpcId(), SearchCriteria.Op.EQ);
         sb.and("vpcGatewayId", sb.entity().getVpcGatewayId(), SearchCriteria.Op.EQ);
+        sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
 
         if (tags != null && !tags.isEmpty()) {
             final SearchBuilder<ResourceTagVO> tagSearch = _resourceTagDao.createSearchBuilder();
@@ -2371,6 +2383,10 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
             sc.addAnd("vpcGatewayId", Op.EQ, gatewayId);
         }
 
+        if (state != null) {
+            sc.addAnd("state", Op.EQ, state);
+        }
+
         if (tags != null && !tags.isEmpty()) {
             int count = 0;
             sc.setJoinParameters("tagSearch", "resourceType", ResourceObjectType.StaticRoute.toString());
diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js
index f7fb478..2b3b494 100644
--- a/ui/scripts/vpc.js
+++ b/ui/scripts/vpc.js
@@ -2652,7 +2652,8 @@
                                                     url: createURL('listStaticRoutes'),
                                                     data: {
                                                         gatewayid: args.context.vpcGateways[0].id,
-                                                        listAll: true
+                                                        listAll: true,
+                                                        state: "Active"
                                                     },
                                                     success: function(json) {
                                                         var items = json.liststaticroutesresponse.staticroute;