From 5c883bef5634b79ac0d4a4ea9306bcbdb06f7def Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Mon, 6 Apr 2020 11:03:39 +0200 Subject: [PATCH 1/3] Fixed private gateway can't be deleted --- .../command/user/vpc/ListStaticRoutesCmd.java | 7 +++++++ .../cloud/network/vpc/dao/StaticRouteDao.java | 2 ++ .../network/vpc/dao/StaticRouteDaoImpl.java | 9 +++++++++ .../com/cloud/network/vpc/VpcManagerImpl.java | 18 +++++++++++++++++- ui/scripts/vpc.js | 3 ++- 5 files changed, 37 insertions(+), 2 deletions(-) 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 3dba84c8a72d..3ad2f444f69f 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 Long getGatewayId() { 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 07c5ee160bdf..927ed837b124 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 { List listByVpcId(long vpcId); + List listByGatewayId(long vpcId); + 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 596cf983b206..671bf4507580 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 @@ protected StaticRouteDaoImpl() { 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(); } @@ -91,10 +92,18 @@ public List listByVpcId(long vpcId) { return listBy(sc); } + @Override + public List listByGatewayId(long gatewayId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("gatewayId", gatewayId); + return listBy(sc); + } + @Override public long countRoutesByGateway(long gatewayId) { SearchCriteria 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 b1b1059c1236..e976644e9de0 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -2016,7 +2016,10 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { } } - // 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 { @@ -2026,6 +2029,13 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { } } + private void cleanUpRoutesByGatewayId(long gatewayId){ + List 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 @@ -2318,6 +2328,7 @@ public Pair, Integer> listStaticRoutes(final ListSta final List permittedAccounts = new ArrayList(); final Map tags = cmd.getTags(); final Long projectId = cmd.getProjectId(); + final String state = cmd.getState(); final Ternary domainIdRecursiveListProject = new Ternary(domainId, isRecursive, null); @@ -2333,6 +2344,7 @@ public Pair, Integer> listStaticRoutes(final ListSta 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 tagSearch = _resourceTagDao.createSearchBuilder(); @@ -2360,6 +2372,10 @@ public Pair, Integer> listStaticRoutes(final ListSta 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 f7fb47805cc6..2b3b494466ff 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; From 056f43e111c28d35b378cc7ab8db9e9d4d23f2ad Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Mon, 6 Apr 2020 11:39:57 +0200 Subject: [PATCH 2/3] Renamed var --- .../src/main/java/com/cloud/network/vpc/dao/StaticRouteDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 927ed837b124..750b477bdc9b 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,7 +30,7 @@ public interface StaticRouteDao extends GenericDao { List listByVpcId(long vpcId); - List listByGatewayId(long vpcId); + List listByGatewayId(long gatewayId); long countRoutesByGateway(long gatewayId); From aa7791277f2fcd8f5451d2f1c8c64f8c4c662c7a Mon Sep 17 00:00:00 2001 From: Darrin Husselmann Date: Wed, 8 Apr 2020 14:42:30 +0200 Subject: [PATCH 3/3] Using remove instead of revoke method when cleaning up --- .../cloudstack/api/command/user/vpc/CreateStaticRouteCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 622143fa38dd..849d1ecbc0b2 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 void execute() throws ResourceUnavailableException { 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"); } }