mirror of
https://github.com/apache/cloudstack.git
synced 2025-12-16 10:32:34 +01:00
bug 11173: Added usage for VPN users
status 11173: resolved fixed
This commit is contained in:
parent
dd6ed6b108
commit
18ef8ca3b4
@ -33,6 +33,9 @@ import com.cloud.configuration.dao.ConfigurationDao;
|
|||||||
import com.cloud.domain.Domain;
|
import com.cloud.domain.Domain;
|
||||||
import com.cloud.domain.DomainVO;
|
import com.cloud.domain.DomainVO;
|
||||||
import com.cloud.domain.dao.DomainDao;
|
import com.cloud.domain.dao.DomainDao;
|
||||||
|
import com.cloud.event.EventTypes;
|
||||||
|
import com.cloud.event.UsageEventVO;
|
||||||
|
import com.cloud.event.dao.UsageEventDao;
|
||||||
import com.cloud.exception.AccountLimitException;
|
import com.cloud.exception.AccountLimitException;
|
||||||
import com.cloud.exception.InvalidParameterValueException;
|
import com.cloud.exception.InvalidParameterValueException;
|
||||||
import com.cloud.exception.NetworkRuleConflictException;
|
import com.cloud.exception.NetworkRuleConflictException;
|
||||||
@ -93,6 +96,7 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag
|
|||||||
@Inject DomainDao _domainDao;
|
@Inject DomainDao _domainDao;
|
||||||
@Inject FirewallRulesDao _rulesDao;
|
@Inject FirewallRulesDao _rulesDao;
|
||||||
@Inject FirewallManager _firewallMgr;
|
@Inject FirewallManager _firewallMgr;
|
||||||
|
@Inject UsageEventDao _usageEventDao;
|
||||||
|
|
||||||
int _userLimit;
|
int _userLimit;
|
||||||
int _pskLength;
|
int _pskLength;
|
||||||
@ -307,11 +311,13 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag
|
|||||||
}
|
}
|
||||||
|
|
||||||
VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
|
VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
|
||||||
|
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(), user.getUsername());
|
||||||
|
_usageEventDao.persist(usageEvent);
|
||||||
txn.commit();
|
txn.commit();
|
||||||
return user;
|
return user;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@DB @Override
|
||||||
public boolean removeVpnUser(long vpnOwnerId, String username) {
|
public boolean removeVpnUser(long vpnOwnerId, String username) {
|
||||||
Account caller = UserContext.current().getCaller();
|
Account caller = UserContext.current().getCaller();
|
||||||
|
|
||||||
@ -320,9 +326,13 @@ public class RemoteAccessVpnManagerImpl implements RemoteAccessVpnService, Manag
|
|||||||
throw new InvalidParameterValueException("Could not find vpn user " + username);
|
throw new InvalidParameterValueException("Could not find vpn user " + username);
|
||||||
}
|
}
|
||||||
_accountMgr.checkAccess(caller, null, user);
|
_accountMgr.checkAccess(caller, null, user);
|
||||||
|
Transaction txn = Transaction.currentTxn();
|
||||||
|
txn.start();
|
||||||
user.setState(State.Revoke);
|
user.setState(State.Revoke);
|
||||||
_vpnUsersDao.update(user.getId(), user);
|
_vpnUsersDao.update(user.getId(), user);
|
||||||
|
UsageEventVO usageEvent = new UsageEventVO(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(), user.getUsername());
|
||||||
|
_usageEventDao.persist(usageEvent);
|
||||||
|
txn.commit();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -38,6 +38,7 @@ public class UsageTypes {
|
|||||||
public static final int LOAD_BALANCER_POLICY = 11;
|
public static final int LOAD_BALANCER_POLICY = 11;
|
||||||
public static final int PORT_FORWARDING_RULE = 12;
|
public static final int PORT_FORWARDING_RULE = 12;
|
||||||
public static final int NETWORK_OFFERING = 13;
|
public static final int NETWORK_OFFERING = 13;
|
||||||
|
public static final int VPN_USERS = 14;
|
||||||
|
|
||||||
public static List<UsageTypeResponse> listUsageTypes(){
|
public static List<UsageTypeResponse> listUsageTypes(){
|
||||||
List<UsageTypeResponse> responseList = new ArrayList<UsageTypeResponse>();
|
List<UsageTypeResponse> responseList = new ArrayList<UsageTypeResponse>();
|
||||||
@ -54,6 +55,7 @@ public class UsageTypes {
|
|||||||
responseList.add(new UsageTypeResponse(LOAD_BALANCER_POLICY, "Load Balancer Usage"));
|
responseList.add(new UsageTypeResponse(LOAD_BALANCER_POLICY, "Load Balancer Usage"));
|
||||||
responseList.add(new UsageTypeResponse(PORT_FORWARDING_RULE, "Port Forwarding Usage"));
|
responseList.add(new UsageTypeResponse(PORT_FORWARDING_RULE, "Port Forwarding Usage"));
|
||||||
responseList.add(new UsageTypeResponse(NETWORK_OFFERING, "Network Offering Usage"));
|
responseList.add(new UsageTypeResponse(NETWORK_OFFERING, "Network Offering Usage"));
|
||||||
|
responseList.add(new UsageTypeResponse(VPN_USERS, "VPN users usage"));
|
||||||
return responseList;
|
return responseList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
108
server/src/com/cloud/usage/UsageVPNUserVO.java
Normal file
108
server/src/com/cloud/usage/UsageVPNUserVO.java
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/**
|
||||||
|
* * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This software is licensed under the GNU General Public License v3 or later.
|
||||||
|
*
|
||||||
|
* It is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cloud.usage;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
import javax.persistence.Temporal;
|
||||||
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name="usage_vpn_user")
|
||||||
|
public class UsageVPNUserVO {
|
||||||
|
|
||||||
|
@Column(name="zone_id")
|
||||||
|
private long zoneId;
|
||||||
|
|
||||||
|
@Column(name="account_id")
|
||||||
|
private long accountId;
|
||||||
|
|
||||||
|
@Column(name="domain_id")
|
||||||
|
private long domainId;
|
||||||
|
|
||||||
|
@Column(name="user_id")
|
||||||
|
private long userId;
|
||||||
|
|
||||||
|
@Column(name="user_name")
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
@Column(name="created")
|
||||||
|
@Temporal(value=TemporalType.TIMESTAMP)
|
||||||
|
private Date created = null;
|
||||||
|
|
||||||
|
@Column(name="deleted")
|
||||||
|
@Temporal(value=TemporalType.TIMESTAMP)
|
||||||
|
private Date deleted = null;
|
||||||
|
|
||||||
|
protected UsageVPNUserVO() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public UsageVPNUserVO(long zoneId, long accountId, long domainId, long userId, String username, Date created, Date deleted) {
|
||||||
|
this.zoneId = zoneId;
|
||||||
|
this.accountId = accountId;
|
||||||
|
this.domainId = domainId;
|
||||||
|
this.userId = userId;
|
||||||
|
this.username = username;
|
||||||
|
this.created = created;
|
||||||
|
this.deleted = deleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getZoneId() {
|
||||||
|
return zoneId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAccountId() {
|
||||||
|
return accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDomainId() {
|
||||||
|
return domainId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getCreated() {
|
||||||
|
return created;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getDeleted() {
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
public void setDeleted(Date deleted) {
|
||||||
|
this.deleted = deleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(long userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
}
|
||||||
31
server/src/com/cloud/usage/dao/UsageVPNUserDao.java
Normal file
31
server/src/com/cloud/usage/dao/UsageVPNUserDao.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This software is licensed under the GNU General Public License v3 or later.
|
||||||
|
*
|
||||||
|
* It is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cloud.usage.dao;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.cloud.usage.UsageVPNUserVO;
|
||||||
|
import com.cloud.utils.db.GenericDao;
|
||||||
|
|
||||||
|
public interface UsageVPNUserDao extends GenericDao<UsageVPNUserVO, Long> {
|
||||||
|
public void update(UsageVPNUserVO usage);
|
||||||
|
public List<UsageVPNUserVO> getUsageRecords(Long accountId, Long domainId, Date startDate, Date endDate, boolean limit, int page);
|
||||||
|
}
|
||||||
151
server/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
Normal file
151
server/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/**
|
||||||
|
* * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This software is licensed under the GNU General Public License v3 or later.
|
||||||
|
*
|
||||||
|
* It is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cloud.usage.dao;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
|
||||||
|
import javax.ejb.Local;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.usage.UsageVPNUserVO;
|
||||||
|
import com.cloud.utils.DateUtil;
|
||||||
|
import com.cloud.utils.db.GenericDaoBase;
|
||||||
|
import com.cloud.utils.db.Transaction;
|
||||||
|
|
||||||
|
@Local(value={UsageVPNUserDao.class})
|
||||||
|
public class UsageVPNUserDaoImpl extends GenericDaoBase<UsageVPNUserVO, Long> implements UsageVPNUserDao {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(UsageVPNUserDaoImpl.class.getName());
|
||||||
|
|
||||||
|
protected static final String UPDATE_DELETED = "UPDATE usage_vpn_user SET deleted = ? WHERE account_id = ? AND user_id = ? and deleted IS NULL";
|
||||||
|
protected static final String GET_USAGE_RECORDS_BY_ACCOUNT = "SELECT zone_id, account_id, domain_id, user_id, user_name, created, deleted " +
|
||||||
|
"FROM usage_vpn_user " +
|
||||||
|
"WHERE account_id = ? AND ((deleted IS NULL) OR (created BETWEEN ? AND ?) OR " +
|
||||||
|
" (deleted BETWEEN ? AND ?) OR ((created <= ?) AND (deleted >= ?)))";
|
||||||
|
protected static final String GET_USAGE_RECORDS_BY_DOMAIN = "SELECT zone_id, account_id, domain_id, user_id, user_name, created, deleted " +
|
||||||
|
"FROM usage_vpn_user " +
|
||||||
|
"WHERE domain_id = ? AND ((deleted IS NULL) OR (created BETWEEN ? AND ?) OR " +
|
||||||
|
" (deleted BETWEEN ? AND ?) OR ((created <= ?) AND (deleted >= ?)))";
|
||||||
|
protected static final String GET_ALL_USAGE_RECORDS = "SELECT zone_id, account_id, domain_id, user_id, user_name, created, deleted " +
|
||||||
|
"FROM usage_vpn_user " +
|
||||||
|
"WHERE (deleted IS NULL) OR (created BETWEEN ? AND ?) OR " +
|
||||||
|
" (deleted BETWEEN ? AND ?) OR ((created <= ?) AND (deleted >= ?))";
|
||||||
|
|
||||||
|
public UsageVPNUserDaoImpl() {}
|
||||||
|
|
||||||
|
public void update(UsageVPNUserVO usage) {
|
||||||
|
Transaction txn = Transaction.open(Transaction.USAGE_DB);
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
try {
|
||||||
|
txn.start();
|
||||||
|
if (usage.getDeleted() != null) {
|
||||||
|
pstmt = txn.prepareAutoCloseStatement(UPDATE_DELETED);
|
||||||
|
pstmt.setString(1, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), usage.getDeleted()));
|
||||||
|
pstmt.setLong(2, usage.getAccountId());
|
||||||
|
pstmt.setLong(3, usage.getUserId());
|
||||||
|
}
|
||||||
|
pstmt.executeUpdate();
|
||||||
|
txn.commit();
|
||||||
|
} catch (Exception e) {
|
||||||
|
txn.rollback();
|
||||||
|
s_logger.warn("Error updating UsageVPNUserVO", e);
|
||||||
|
} finally {
|
||||||
|
txn.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<UsageVPNUserVO> getUsageRecords(Long accountId, Long domainId, Date startDate, Date endDate, boolean limit, int page) {
|
||||||
|
List<UsageVPNUserVO> usageRecords = new ArrayList<UsageVPNUserVO>();
|
||||||
|
|
||||||
|
Long param1 = null;
|
||||||
|
String sql = null;
|
||||||
|
if (accountId != null) {
|
||||||
|
sql = GET_USAGE_RECORDS_BY_ACCOUNT;
|
||||||
|
param1 = accountId;
|
||||||
|
} else if (domainId != null) {
|
||||||
|
sql = GET_USAGE_RECORDS_BY_DOMAIN;
|
||||||
|
param1 = domainId;
|
||||||
|
} else {
|
||||||
|
sql = GET_ALL_USAGE_RECORDS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (limit) {
|
||||||
|
int startIndex = 0;
|
||||||
|
if (page > 0) {
|
||||||
|
startIndex = 500 * (page-1);
|
||||||
|
}
|
||||||
|
sql += " LIMIT " + startIndex + ",500";
|
||||||
|
}
|
||||||
|
|
||||||
|
Transaction txn = Transaction.open(Transaction.USAGE_DB);
|
||||||
|
PreparedStatement pstmt = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
int i = 1;
|
||||||
|
pstmt = txn.prepareAutoCloseStatement(sql);
|
||||||
|
if (param1 != null) {
|
||||||
|
pstmt.setLong(i++, param1);
|
||||||
|
}
|
||||||
|
pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), startDate));
|
||||||
|
pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), endDate));
|
||||||
|
pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), startDate));
|
||||||
|
pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), endDate));
|
||||||
|
pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), startDate));
|
||||||
|
pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), endDate));
|
||||||
|
|
||||||
|
ResultSet rs = pstmt.executeQuery();
|
||||||
|
while (rs.next()) {
|
||||||
|
//zoneId, account_id, domain_id, user_id, user_name, created, deleted
|
||||||
|
Long zoneId = Long.valueOf(rs.getLong(1));
|
||||||
|
Long acctId = Long.valueOf(rs.getLong(2));
|
||||||
|
Long dId = Long.valueOf(rs.getLong(3));
|
||||||
|
long userId = Long.valueOf(rs.getLong(4));
|
||||||
|
String userName = rs.getString(5);
|
||||||
|
Date createdDate = null;
|
||||||
|
Date deletedDate = null;
|
||||||
|
String createdTS = rs.getString(6);
|
||||||
|
String deletedTS = rs.getString(7);
|
||||||
|
|
||||||
|
|
||||||
|
if (createdTS != null) {
|
||||||
|
createdDate = DateUtil.parseDateString(s_gmtTimeZone, createdTS);
|
||||||
|
}
|
||||||
|
if (deletedTS != null) {
|
||||||
|
deletedDate = DateUtil.parseDateString(s_gmtTimeZone, deletedTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
usageRecords.add(new UsageVPNUserVO(zoneId, acctId, dId, userId, userName, createdDate, deletedDate));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
txn.rollback();
|
||||||
|
s_logger.warn("Error getting usage records", e);
|
||||||
|
} finally {
|
||||||
|
txn.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
return usageRecords;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -12,6 +12,7 @@ DROP TABLE IF EXISTS `cloud_usage`.`usage_load_balancer_policy`;
|
|||||||
DROP TABLE IF EXISTS `cloud_usage`.`usage_port_forwarding`;
|
DROP TABLE IF EXISTS `cloud_usage`.`usage_port_forwarding`;
|
||||||
DROP TABLE IF EXISTS `cloud_usage`.`usage_network_offering`;
|
DROP TABLE IF EXISTS `cloud_usage`.`usage_network_offering`;
|
||||||
DROP TABLE IF EXISTS `cloud_usage`.`usage_event`;
|
DROP TABLE IF EXISTS `cloud_usage`.`usage_event`;
|
||||||
|
DROP TABLE IF EXISTS `cloud_usage`.`usage_vpn_user`;
|
||||||
|
|
||||||
CREATE TABLE `cloud_usage`.`cloud_usage` (
|
CREATE TABLE `cloud_usage`.`cloud_usage` (
|
||||||
`id` bigint unsigned NOT NULL auto_increment,
|
`id` bigint unsigned NOT NULL auto_increment,
|
||||||
@ -232,6 +233,21 @@ ALTER TABLE `cloud_usage`.`usage_network_offering` ADD INDEX `i_usage_network_of
|
|||||||
ALTER TABLE `cloud_usage`.`usage_network_offering` ADD INDEX `i_usage_network_offering__created`(`created`);
|
ALTER TABLE `cloud_usage`.`usage_network_offering` ADD INDEX `i_usage_network_offering__created`(`created`);
|
||||||
ALTER TABLE `cloud_usage`.`usage_network_offering` ADD INDEX `i_usage_network_offering__deleted`(`deleted`);
|
ALTER TABLE `cloud_usage`.`usage_network_offering` ADD INDEX `i_usage_network_offering__deleted`(`deleted`);
|
||||||
|
|
||||||
|
CREATE TABLE `cloud_usage`.`usage_vpn_user` (
|
||||||
|
`zone_id` bigint unsigned NOT NULL,
|
||||||
|
`account_id` bigint unsigned NOT NULL,
|
||||||
|
`domain_id` bigint unsigned NOT NULL,
|
||||||
|
`user_id` bigint unsigned NOT NULL,
|
||||||
|
`user_name` varchar(32),
|
||||||
|
`created` DATETIME NOT NULL,
|
||||||
|
`deleted` DATETIME NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__account_id`(`account_id`);
|
||||||
|
ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__created`(`created`);
|
||||||
|
ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__deleted`(`deleted`);
|
||||||
|
|
||||||
|
|
||||||
CREATE TABLE `cloud`.`netapp_volume` (
|
CREATE TABLE `cloud`.`netapp_volume` (
|
||||||
`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id',
|
`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id',
|
||||||
`ip_address` varchar(255) NOT NULL COMMENT 'ip address/fqdn of the volume',
|
`ip_address` varchar(255) NOT NULL COMMENT 'ip address/fqdn of the volume',
|
||||||
|
|||||||
@ -15,3 +15,17 @@ ALTER TABLE `cloud_usage`.`usage_network` DROP COLUMN `net_bytes_sent`;
|
|||||||
ALTER TABLE `cloud_usage`.`usage_network` DROP COLUMN `current_bytes_received`;
|
ALTER TABLE `cloud_usage`.`usage_network` DROP COLUMN `current_bytes_received`;
|
||||||
ALTER TABLE `cloud_usage`.`usage_network` DROP COLUMN `current_bytes_sent`;
|
ALTER TABLE `cloud_usage`.`usage_network` DROP COLUMN `current_bytes_sent`;
|
||||||
|
|
||||||
|
CREATE TABLE `cloud_usage`.`usage_vpn_user` (
|
||||||
|
`zone_id` bigint unsigned NOT NULL,
|
||||||
|
`account_id` bigint unsigned NOT NULL,
|
||||||
|
`domain_id` bigint unsigned NOT NULL,
|
||||||
|
`user_id` bigint unsigned NOT NULL,
|
||||||
|
`user_name` varchar(32),
|
||||||
|
`created` DATETIME NOT NULL,
|
||||||
|
`deleted` DATETIME NULL
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||||
|
|
||||||
|
ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__account_id`(`account_id`);
|
||||||
|
ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__created`(`created`);
|
||||||
|
ALTER TABLE `cloud_usage`.`usage_vpn_user` ADD INDEX `i_usage_vpn_user__deleted`(`deleted`);
|
||||||
|
|
||||||
|
|||||||
@ -44,6 +44,7 @@
|
|||||||
<dao name="Usage Load Balancer Policy" class="com.cloud.usage.dao.UsageLoadBalancerPolicyDaoImpl"/>
|
<dao name="Usage Load Balancer Policy" class="com.cloud.usage.dao.UsageLoadBalancerPolicyDaoImpl"/>
|
||||||
<dao name="Usage Port Forwarding Rule" class="com.cloud.usage.dao.UsagePortForwardingRuleDaoImpl"/>
|
<dao name="Usage Port Forwarding Rule" class="com.cloud.usage.dao.UsagePortForwardingRuleDaoImpl"/>
|
||||||
<dao name="Usage Network Offering" class="com.cloud.usage.dao.UsageNetworkOfferingDaoImpl"/>
|
<dao name="Usage Network Offering" class="com.cloud.usage.dao.UsageNetworkOfferingDaoImpl"/>
|
||||||
|
<dao name="Usage VPN User" class="com.cloud.usage.dao.UsageVPNUserDaoImpl"/>
|
||||||
<dao name="Usage Job" class="com.cloud.usage.dao.UsageJobDaoImpl"/>
|
<dao name="Usage Job" class="com.cloud.usage.dao.UsageJobDaoImpl"/>
|
||||||
<dao name="Configuration" class="com.cloud.configuration.dao.ConfigurationDaoImpl"/>
|
<dao name="Configuration" class="com.cloud.configuration.dao.ConfigurationDaoImpl"/>
|
||||||
<dao name="Alert" class="com.cloud.alert.dao.AlertDaoImpl"/>
|
<dao name="Alert" class="com.cloud.alert.dao.AlertDaoImpl"/>
|
||||||
|
|||||||
@ -52,6 +52,7 @@ import com.cloud.usage.dao.UsageNetworkOfferingDao;
|
|||||||
import com.cloud.usage.dao.UsagePortForwardingRuleDao;
|
import com.cloud.usage.dao.UsagePortForwardingRuleDao;
|
||||||
import com.cloud.usage.dao.UsageStorageDao;
|
import com.cloud.usage.dao.UsageStorageDao;
|
||||||
import com.cloud.usage.dao.UsageVMInstanceDao;
|
import com.cloud.usage.dao.UsageVMInstanceDao;
|
||||||
|
import com.cloud.usage.dao.UsageVPNUserDao;
|
||||||
import com.cloud.usage.dao.UsageVolumeDao;
|
import com.cloud.usage.dao.UsageVolumeDao;
|
||||||
import com.cloud.usage.parser.IPAddressUsageParser;
|
import com.cloud.usage.parser.IPAddressUsageParser;
|
||||||
import com.cloud.usage.parser.LoadBalancerUsageParser;
|
import com.cloud.usage.parser.LoadBalancerUsageParser;
|
||||||
@ -60,6 +61,7 @@ import com.cloud.usage.parser.NetworkUsageParser;
|
|||||||
import com.cloud.usage.parser.PortForwardingUsageParser;
|
import com.cloud.usage.parser.PortForwardingUsageParser;
|
||||||
import com.cloud.usage.parser.StorageUsageParser;
|
import com.cloud.usage.parser.StorageUsageParser;
|
||||||
import com.cloud.usage.parser.VMInstanceUsageParser;
|
import com.cloud.usage.parser.VMInstanceUsageParser;
|
||||||
|
import com.cloud.usage.parser.VPNUserUsageParser;
|
||||||
import com.cloud.usage.parser.VolumeUsageParser;
|
import com.cloud.usage.parser.VolumeUsageParser;
|
||||||
import com.cloud.user.Account;
|
import com.cloud.user.Account;
|
||||||
import com.cloud.user.AccountVO;
|
import com.cloud.user.AccountVO;
|
||||||
@ -101,6 +103,7 @@ public class UsageManagerImpl implements UsageManager, Runnable {
|
|||||||
private final UsageLoadBalancerPolicyDao m_usageLoadBalancerPolicyDao = _locator.getDao(UsageLoadBalancerPolicyDao.class);
|
private final UsageLoadBalancerPolicyDao m_usageLoadBalancerPolicyDao = _locator.getDao(UsageLoadBalancerPolicyDao.class);
|
||||||
private final UsagePortForwardingRuleDao m_usagePortForwardingRuleDao = _locator.getDao(UsagePortForwardingRuleDao.class);
|
private final UsagePortForwardingRuleDao m_usagePortForwardingRuleDao = _locator.getDao(UsagePortForwardingRuleDao.class);
|
||||||
private final UsageNetworkOfferingDao m_usageNetworkOfferingDao = _locator.getDao(UsageNetworkOfferingDao.class);
|
private final UsageNetworkOfferingDao m_usageNetworkOfferingDao = _locator.getDao(UsageNetworkOfferingDao.class);
|
||||||
|
private final UsageVPNUserDao m_usageVPNUserDao = _locator.getDao(UsageVPNUserDao.class);
|
||||||
private final UsageJobDao m_usageJobDao = _locator.getDao(UsageJobDao.class);
|
private final UsageJobDao m_usageJobDao = _locator.getDao(UsageJobDao.class);
|
||||||
@Inject protected AlertManager _alertMgr;
|
@Inject protected AlertManager _alertMgr;
|
||||||
@Inject protected UsageEventDao _usageEventDao;
|
@Inject protected UsageEventDao _usageEventDao;
|
||||||
@ -743,7 +746,12 @@ public class UsageManagerImpl implements UsageManager, Runnable {
|
|||||||
s_logger.debug("IPAddress usage successfully parsed? " + parsed + " (for account: " + account.getAccountName() + ", id: " + account.getId() + ")");
|
s_logger.debug("IPAddress usage successfully parsed? " + parsed + " (for account: " + account.getAccountName() + ", id: " + account.getId() + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
parsed = VPNUserUsageParser.parse(account, currentStartDate, currentEndDate);
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
if (!parsed) {
|
||||||
|
s_logger.debug("VPN user usage successfully parsed? " + parsed + " (for account: " + account.getAccountName() + ", id: " + account.getId() + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -767,6 +775,8 @@ public class UsageManagerImpl implements UsageManager, Runnable {
|
|||||||
createPortForwardingHelperEvent(event);
|
createPortForwardingHelperEvent(event);
|
||||||
} else if (isNetworkOfferingEvent(eventType)) {
|
} else if (isNetworkOfferingEvent(eventType)) {
|
||||||
createNetworkOfferingEvent(event);
|
createNetworkOfferingEvent(event);
|
||||||
|
} else if (isVPNUserEvent(eventType)) {
|
||||||
|
createVPNUserEvent(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -824,6 +834,11 @@ public class UsageManagerImpl implements UsageManager, Runnable {
|
|||||||
eventType.equals(EventTypes.EVENT_NETWORK_OFFERING_REMOVE));
|
eventType.equals(EventTypes.EVENT_NETWORK_OFFERING_REMOVE));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isVPNUserEvent(String eventType) {
|
||||||
|
if (eventType == null) return false;
|
||||||
|
return eventType.startsWith("VPN.USER");
|
||||||
|
}
|
||||||
|
|
||||||
private void createVMHelperEvent(UsageEventVO event) {
|
private void createVMHelperEvent(UsageEventVO event) {
|
||||||
|
|
||||||
// One record for handling VM.START and VM.STOP
|
// One record for handling VM.START and VM.STOP
|
||||||
@ -1294,6 +1309,38 @@ public class UsageManagerImpl implements UsageManager, Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void createVPNUserEvent(UsageEventVO event) {
|
||||||
|
|
||||||
|
long zoneId = 0L;
|
||||||
|
|
||||||
|
long userId = event.getResourceId();
|
||||||
|
|
||||||
|
if (EventTypes.EVENT_VPN_USER_ADD.equals(event.getType())) {
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Creating VPN user: "+ userId + " for account: " + event.getAccountId());
|
||||||
|
}
|
||||||
|
Account acct = m_accountDao.findByIdIncludingRemoved(event.getAccountId());
|
||||||
|
String userName = event.getResourceName();
|
||||||
|
UsageVPNUserVO vpnUser = new UsageVPNUserVO(zoneId, event.getAccountId(), acct.getDomainId(), userId, userName, event.getCreateDate(), null);
|
||||||
|
m_usageVPNUserDao.persist(vpnUser);
|
||||||
|
} else if (EventTypes.EVENT_VPN_USER_REMOVE.equals(event.getType())) {
|
||||||
|
SearchCriteria<UsageVPNUserVO> sc = m_usageVPNUserDao.createSearchCriteria();
|
||||||
|
sc.addAnd("accountId", SearchCriteria.Op.EQ, event.getAccountId());
|
||||||
|
sc.addAnd("userId", SearchCriteria.Op.EQ, userId);
|
||||||
|
sc.addAnd("deleted", SearchCriteria.Op.NULL);
|
||||||
|
List<UsageVPNUserVO> vuVOs = m_usageVPNUserDao.search(sc, null);
|
||||||
|
if (vuVOs.size() > 1) {
|
||||||
|
s_logger.warn("More that one usage entry for vpn user: "+ userId +" assigned to account: " + event.getAccountId() + "; marking them all as deleted...");
|
||||||
|
}
|
||||||
|
for (UsageVPNUserVO vuVO : vuVOs) {
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("deleting vpn user: " + vuVO.getUserId());
|
||||||
|
}
|
||||||
|
vuVO.setDeleted(event.getCreateDate()); // there really shouldn't be more than one
|
||||||
|
m_usageVPNUserDao.update(vuVO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class Heartbeat implements Runnable {
|
private class Heartbeat implements Runnable {
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|||||||
163
usage/src/com/cloud/usage/parser/VPNUserUsageParser.java
Normal file
163
usage/src/com/cloud/usage/parser/VPNUserUsageParser.java
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
|
||||||
|
/**
|
||||||
|
* * Copyright (C) 2011 Citrix Systems, Inc. All rights reserved
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This software is licensed under the GNU General Public License v3 or later.
|
||||||
|
*
|
||||||
|
* It is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or any later version.
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.cloud.usage.parser;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
|
||||||
|
import com.cloud.usage.UsageVPNUserVO;
|
||||||
|
import com.cloud.usage.UsageServer;
|
||||||
|
import com.cloud.usage.UsageTypes;
|
||||||
|
import com.cloud.usage.UsageVO;
|
||||||
|
import com.cloud.usage.dao.UsageDao;
|
||||||
|
import com.cloud.usage.dao.UsageVPNUserDao;
|
||||||
|
import com.cloud.user.AccountVO;
|
||||||
|
import com.cloud.utils.Pair;
|
||||||
|
import com.cloud.utils.component.ComponentLocator;
|
||||||
|
|
||||||
|
public class VPNUserUsageParser {
|
||||||
|
public static final Logger s_logger = Logger.getLogger(VPNUserUsageParser.class.getName());
|
||||||
|
|
||||||
|
private static ComponentLocator _locator = ComponentLocator.getLocator(UsageServer.Name, "usage-components.xml", "log4j-cloud_usage");
|
||||||
|
private static UsageDao m_usageDao = _locator.getDao(UsageDao.class);
|
||||||
|
private static UsageVPNUserDao m_usageVPNUserDao = _locator.getDao(UsageVPNUserDao.class);
|
||||||
|
|
||||||
|
public static boolean parse(AccountVO account, Date startDate, Date endDate) {
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Parsing all VPN user usage events for account: " + account.getId());
|
||||||
|
}
|
||||||
|
if ((endDate == null) || endDate.after(new Date())) {
|
||||||
|
endDate = new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<UsageVPNUserVO> usageVUs = m_usageVPNUserDao.getUsageRecords(account.getId(), account.getDomainId(), startDate, endDate, false, 0);
|
||||||
|
|
||||||
|
if(usageVUs.isEmpty()){
|
||||||
|
s_logger.debug("No VPN user usage events for this period");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This map has both the running time *and* the usage amount.
|
||||||
|
Map<String, Pair<Long, Long>> usageMap = new HashMap<String, Pair<Long, Long>>();
|
||||||
|
Map<String, VUInfo> vuMap = new HashMap<String, VUInfo>();
|
||||||
|
|
||||||
|
// loop through all the VPN user usage, create a usage record for each
|
||||||
|
for (UsageVPNUserVO usageVU : usageVUs) {
|
||||||
|
long userId = usageVU.getUserId();
|
||||||
|
String userName = usageVU.getUsername();
|
||||||
|
String key = ""+userId+"VU"+userName;
|
||||||
|
|
||||||
|
vuMap.put(key, new VUInfo(userId, usageVU.getZoneId(), userName));
|
||||||
|
|
||||||
|
Date vuCreateDate = usageVU.getCreated();
|
||||||
|
Date vuDeleteDate = usageVU.getDeleted();
|
||||||
|
|
||||||
|
if ((vuDeleteDate == null) || vuDeleteDate.after(endDate)) {
|
||||||
|
vuDeleteDate = endDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clip the start date to the beginning of our aggregation range if the vm has been running for a while
|
||||||
|
if (vuCreateDate.before(startDate)) {
|
||||||
|
vuCreateDate = startDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
long currentDuration = (vuDeleteDate.getTime() - vuCreateDate.getTime()) + 1; // make sure this is an inclusive check for milliseconds (i.e. use n - m + 1 to find total number of millis to charge)
|
||||||
|
|
||||||
|
|
||||||
|
updateVUUsageData(usageMap, key, usageVU.getUserId(), currentDuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String vuIdKey : usageMap.keySet()) {
|
||||||
|
Pair<Long, Long> vutimeInfo = usageMap.get(vuIdKey);
|
||||||
|
long useTime = vutimeInfo.second().longValue();
|
||||||
|
|
||||||
|
// Only create a usage record if we have a runningTime of bigger than zero.
|
||||||
|
if (useTime > 0L) {
|
||||||
|
VUInfo info = vuMap.get(vuIdKey);
|
||||||
|
createUsageRecord(UsageTypes.VPN_USERS, useTime, startDate, endDate, account, info.getUserId(), info.getUserName(), info.getZoneId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void updateVUUsageData(Map<String, Pair<Long, Long>> usageDataMap, String key, long userId, long duration) {
|
||||||
|
Pair<Long, Long> vuUsageInfo = usageDataMap.get(key);
|
||||||
|
if (vuUsageInfo == null) {
|
||||||
|
vuUsageInfo = new Pair<Long, Long>(new Long(userId), new Long(duration));
|
||||||
|
} else {
|
||||||
|
Long runningTime = vuUsageInfo.second();
|
||||||
|
runningTime = new Long(runningTime.longValue() + duration);
|
||||||
|
vuUsageInfo = new Pair<Long, Long>(vuUsageInfo.first(), runningTime);
|
||||||
|
}
|
||||||
|
usageDataMap.put(key, vuUsageInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createUsageRecord(int type, long runningTime, Date startDate, Date endDate, AccountVO account, long userId, String userName, long zoneId) {
|
||||||
|
// Our smallest increment is hourly for now
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Total running time " + runningTime + "ms");
|
||||||
|
}
|
||||||
|
|
||||||
|
float usage = runningTime / 1000f / 60f / 60f;
|
||||||
|
|
||||||
|
DecimalFormat dFormat = new DecimalFormat("#.######");
|
||||||
|
String usageDisplay = dFormat.format(usage);
|
||||||
|
|
||||||
|
if (s_logger.isDebugEnabled()) {
|
||||||
|
s_logger.debug("Creating VPN user:" + userId + " usage record, usage: " + usageDisplay + ", startDate: " + startDate + ", endDate: " + endDate + ", for account: " + account.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the usage record
|
||||||
|
String usageDesc = "VPN User: " + userName + ", Id: "+ userId + " usage time";
|
||||||
|
|
||||||
|
UsageVO usageRecord = new UsageVO(zoneId, account.getId(), account.getDomainId(), usageDesc, usageDisplay + " Hrs", type,
|
||||||
|
new Double(usage), null, null, null, null, userId, null, startDate, endDate);
|
||||||
|
m_usageDao.persist(usageRecord);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class VUInfo {
|
||||||
|
private long userId;
|
||||||
|
private long zoneId;
|
||||||
|
private String userName;
|
||||||
|
|
||||||
|
public VUInfo(long userId, long zoneId, String userName) {
|
||||||
|
this.userId = userId;
|
||||||
|
this.zoneId = zoneId;
|
||||||
|
this.userName = userName;
|
||||||
|
}
|
||||||
|
public long getZoneId() {
|
||||||
|
return zoneId;
|
||||||
|
}
|
||||||
|
public long getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
public String getUserName() {
|
||||||
|
return userName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user