From dddc6488d45e1faca958326c252b36ece412bc84 Mon Sep 17 00:00:00 2001 From: Jayapal Date: Mon, 5 May 2014 13:56:59 +0530 Subject: [PATCH] CLOUDSTACK-6578: Fixed issue in delete remote access vpn command (cherry picked from commit 40836344de54091d795817f41a4fa136ecdb0f5d) Signed-off-by: Rohit Yadav Conflicts: api/src/com/cloud/network/vpn/RemoteAccessVpnService.java server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java --- .../cloud/network/vpn/RemoteAccessVpnService.java | 4 +++- .../user/vpn/DeleteRemoteAccessVpnCmd.java | 6 +++++- .../network/vpn/RemoteAccessVpnManagerImpl.java | 15 ++++++++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java index de7692d38af..ef5bd2b210b 100644 --- a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java +++ b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java @@ -33,7 +33,9 @@ public interface RemoteAccessVpnService { RemoteAccessVpn createRemoteAccessVpn(long vpnServerAddressId, String ipRange, boolean openFirewall) throws NetworkRuleConflictException; - void destroyRemoteAccessVpnForIp(long vpnServerAddressId, Account caller) throws ResourceUnavailableException; + + boolean destroyRemoteAccessVpnForIp(long ipId, Account caller) throws ResourceUnavailableException; + RemoteAccessVpn startRemoteAccessVpn(long vpnServerAddressId, boolean openFirewall) throws ResourceUnavailableException; VpnUser addVpnUser(long vpnOwnerId, String userName, String password); diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java index 640a89a34c3..fdd3c10de6e 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java @@ -18,6 +18,8 @@ package org.apache.cloudstack.api.command.user.vpn; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.BaseAsyncCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.AccountResponse; @@ -85,7 +87,9 @@ public class DeleteRemoteAccessVpnCmd extends BaseAsyncCmd { @Override public void execute() throws ResourceUnavailableException { - _ravService.destroyRemoteAccessVpnForIp(publicIpId, CallContext.current().getCallingAccount()); + if (! _ravService.destroyRemoteAccessVpnForIp(publicIpId, CallContext.current().getCallingAccount())) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete remote access vpn"); + } } @Override diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java index c7e67c12e0d..0acb0a29409 100755 --- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java +++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java @@ -261,16 +261,18 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc } } - @Override @DB - public void destroyRemoteAccessVpnForIp(long ipId, Account caller) throws ResourceUnavailableException { + @Override + @DB + public boolean destroyRemoteAccessVpnForIp(long ipId, Account caller) throws ResourceUnavailableException { final RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipId); if (vpn == null) { s_logger.debug("there are no Remote access vpns for public ip address id=" + ipId); - return; + return true; } _accountMgr.checkAccess(caller, null, true, vpn); + RemoteAccessVpn.State prevState = vpn.getState(); vpn.setState(RemoteAccessVpn.State.Removed); _remoteAccessVpnDao.update(vpn.getId(), vpn); @@ -282,6 +284,12 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc break; } } + }catch (ResourceUnavailableException ex) { + vpn.setState(prevState); + _remoteAccessVpnDao.update(vpn.getId(), vpn); + s_logger.debug("Failed to stop the vpn " + vpn.getId() + " , so reverted state to "+ + RemoteAccessVpn.State.Running); + success = false; } finally { if (success) { //Cleanup corresponding ports @@ -342,6 +350,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc } } } + return success; } @Override