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
This commit is contained in:
Spaceman1984 2020-08-12 09:59:12 +02:00 committed by GitHub
parent f843c537f0
commit 86939e7f9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 38 additions and 3 deletions

View File

@ -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");
}
}

View File

@ -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 ///////////////////////
/////////////////////////////////////////////////////

View File

@ -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);
}

View File

@ -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();
}
@ -91,10 +92,18 @@ public class StaticRouteDaoImpl extends GenericDaoBase<StaticRouteVO, Long> impl
return listBy(sc);
}
@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);
}

View File

@ -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());

View File

@ -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;