@DB
 @Override
 public boolean removeVpnUser(long vpnOwnerId, String username, Account caller) {
   VpnUserVO user = _vpnUsersDao.findByAccountAndUsername(vpnOwnerId, username);
   if (user == null) {
     throw new InvalidParameterValueException("Could not find vpn user " + username);
   }
   _accountMgr.checkAccess(caller, null, true, user);
   Transaction txn = Transaction.currentTxn();
   txn.start();
   user.setState(State.Revoke);
   _vpnUsersDao.update(user.getId(), user);
   UsageEventUtils.publishUsageEvent(
       EventTypes.EVENT_VPN_USER_REMOVE,
       user.getAccountId(),
       0,
       user.getId(),
       user.getUsername(),
       user.getClass().getName(),
       user.getUuid());
   txn.commit();
   return true;
 }
  @DB
  @Override
  public boolean applyVpnUsers(long vpnOwnerId, String userName) {
    Account caller = UserContext.current().getCaller();
    Account owner = _accountDao.findById(vpnOwnerId);
    _accountMgr.checkAccess(caller, null, true, owner);

    s_logger.debug("Applying vpn users for " + owner);
    List<RemoteAccessVpnVO> vpns = _remoteAccessVpnDao.findByAccount(vpnOwnerId);

    List<VpnUserVO> users = _vpnUsersDao.listByAccount(vpnOwnerId);

    // If user is in Active state, we still have to resend them therefore their status has to be Add
    for (VpnUserVO user : users) {
      if (user.getState() == State.Active) {
        user.setState(State.Add);
        _vpnUsersDao.update(user.getId(), user);
      }
    }

    boolean success = true;

    boolean[] finals = new boolean[users.size()];
    for (RemoteAccessVPNServiceProvider element : _vpnServiceProviders) {
      s_logger.debug("Applying vpn access to " + element.getName());
      for (RemoteAccessVpnVO vpn : vpns) {
        try {
          String[] results = element.applyVpnUsers(vpn, users);
          if (results != null) {
            for (int i = 0; i < results.length; i++) {
              s_logger.debug(
                  "VPN User "
                      + users.get(i)
                      + (results[i] == null
                          ? " is set on "
                          : (" couldn't be set due to " + results[i]) + " on ")
                      + vpn);
              if (results[i] == null) {
                if (!finals[i]) {
                  finals[i] = true;
                }
              } else {
                finals[i] = false;
                success = false;
              }
            }
          }
        } catch (ResourceUnavailableException e) {
          s_logger.warn("Unable to apply vpn users ", e);
          success = false;

          for (int i = 0; i < finals.length; i++) {
            finals[i] = false;
          }
        }
      }
    }

    for (int i = 0; i < finals.length; i++) {
      VpnUserVO user = users.get(i);
      if (finals[i]) {
        if (user.getState() == State.Add) {
          user.setState(State.Active);
          _vpnUsersDao.update(user.getId(), user);
        } else if (user.getState() == State.Revoke) {
          _vpnUsersDao.remove(user.getId());
        }
      } else {
        if (user.getState() == State.Add && (user.getUsername()).equals(userName)) {
          Transaction txn = Transaction.currentTxn();
          txn.start();
          _vpnUsersDao.remove(user.getId());
          UsageEventUtils.publishUsageEvent(
              EventTypes.EVENT_VPN_USER_REMOVE,
              user.getAccountId(),
              0,
              user.getId(),
              user.getUsername(),
              user.getClass().getName(),
              user.getUuid());
          txn.commit();
        }
        s_logger.warn(
            "Failed to apply vpn for user "
                + user.getUsername()
                + ", accountId="
                + user.getAccountId());
      }
    }

    return success;
  }