This is an automated email from the ASF dual-hosted git repository.
nvazquez pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new 00e014c Add sent and received bytes to listNetworks and
listVirtualMachines. (#4776)
00e014c is described below
commit 00e014ca58248d6d9c5b7f04aaeef739d261f2e5
Author: Rakesh <[email protected]>
AuthorDate: Mon Aug 16 19:29:34 2021 +0200
Add sent and received bytes to listNetworks and listVirtualMachines. (#4776)
* Add sent and receivedbytes to listNetworks and listVirtualMachines.
Display the traffic data in networks and vm api response
* follow code convention
* remove final keyword
Co-authored-by: Rakesh Venkatesh <[email protected]>
---
.../cloudstack/api/response/NetworkResponse.java | 16 ++++++++++++++++
.../cloudstack/api/response/UserVmResponse.java | 16 ++++++++++++++++
.../main/java/com/cloud/api/ApiResponseHelper.java | 19 +++++++++++++++++++
.../com/cloud/api/query/dao/UserVmJoinDaoImpl.java | 22 ++++++++++++++++++++++
4 files changed, 73 insertions(+)
diff --git
a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java
b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java
index 9464317..445321b 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/NetworkResponse.java
@@ -251,6 +251,14 @@ public class NetworkResponse extends BaseResponse
implements ControlledEntityRes
@Param(description = "the date this network was created", since = "4.16.0")
private Date created;
+ @SerializedName(ApiConstants.RECEIVED_BYTES)
+ @Param(description = "the total number of network traffic bytes received")
+ private Long bytesReceived;
+
+ @SerializedName(ApiConstants.SENT_BYTES)
+ @Param(description = "the total number of network traffic bytes sent")
+ private Long bytesSent;
+
public Boolean getDisplayNetwork() {
return displayNetwork;
}
@@ -495,4 +503,12 @@ public class NetworkResponse extends BaseResponse
implements ControlledEntityRes
public void setCreated(Date created) {
this.created = created;
}
+
+ public void setBytesReceived(Long bytesReceived) {
+ this.bytesReceived = bytesReceived;
+ }
+
+ public void setBytesSent(final Long bytesSent) {
+ this.bytesSent = bytesSent;
+ }
}
diff --git
a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
index d2b9e23..11c1581 100644
--- a/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
+++ b/api/src/main/java/org/apache/cloudstack/api/response/UserVmResponse.java
@@ -320,6 +320,14 @@ public class UserVmResponse extends
BaseResponseWithTagInformation implements Co
@Param(description = "the pool type of the virtual machine", since =
"4.16")
private String poolType;
+ @SerializedName(ApiConstants.RECEIVED_BYTES)
+ @Param(description = "the total number of network traffic bytes received")
+ private Long bytesReceived;
+
+ @SerializedName(ApiConstants.SENT_BYTES)
+ @Param(description = "the total number of network traffic bytes sent")
+ private Long bytesSent;
+
public UserVmResponse() {
securityGroupList = new LinkedHashSet<SecurityGroupResponse>();
nics = new TreeSet<>(Comparator.comparingInt(x ->
Integer.parseInt(x.getDeviceId())));
@@ -923,4 +931,12 @@ public class UserVmResponse extends
BaseResponseWithTagInformation implements Co
public Date getLastUpdated() {
return lastUpdated;
}
+
+ public void setBytesReceived(Long bytesReceived) {
+ this.bytesReceived = bytesReceived;
+ }
+
+ public void setBytesSent(Long bytesSent) {
+ this.bytesSent = bytesSent;
+ }
}
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index d72d940..5dc6412 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -328,6 +328,8 @@ import com.cloud.user.AccountManager;
import com.cloud.user.SSHKeyPair;
import com.cloud.user.User;
import com.cloud.user.UserAccount;
+import com.cloud.user.UserStatisticsVO;
+import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair;
import com.cloud.utils.StringUtils;
@@ -335,6 +337,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Dhcp;
import com.cloud.utils.net.Ip;
@@ -401,6 +404,8 @@ public class ApiResponseHelper implements ResponseGenerator
{
private GuestOSCategoryDao _guestOsCategoryDao;
@Inject
private GuestOSDao _guestOsDao;
+ @Inject
+ private UserStatisticsDao userStatsDao;
@Override
public UserResponse createUserResponse(User user) {
@@ -2355,6 +2360,20 @@ public class ApiResponseHelper implements
ResponseGenerator {
response.setExternalId(network.getExternalId());
response.setRedundantRouter(network.isRedundant());
response.setCreated(network.getCreated());
+
+ Long bytesReceived = 0L;
+ Long bytesSent = 0L;
+ SearchBuilder<UserStatisticsVO> sb =
userStatsDao.createSearchBuilder();
+ sb.and("networkId", sb.entity().getNetworkId(), Op.EQ);
+ SearchCriteria<UserStatisticsVO> sc = sb.create();
+ sc.setParameters("networkId", network.getId());
+ for (UserStatisticsVO stat: userStatsDao.search(sc, null)) {
+ bytesReceived += stat.getNetBytesReceived() +
stat.getCurrentBytesReceived();
+ bytesSent += stat.getNetBytesSent() + stat.getCurrentBytesSent();
+ }
+ response.setBytesReceived(bytesReceived);
+ response.setBytesSent(bytesSent);
+
response.setObjectName("network");
return response;
}
diff --git
a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
index f0a29db..ff4511b 100644
--- a/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/UserVmJoinDaoImpl.java
@@ -51,10 +51,13 @@ import com.cloud.storage.GuestOS;
import com.cloud.user.Account;
import com.cloud.user.AccountManager;
import com.cloud.user.User;
+import com.cloud.user.UserStatisticsVO;
import com.cloud.user.dao.UserDao;
+import com.cloud.user.dao.UserStatisticsDao;
import com.cloud.uservm.UserVm;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.net.Dhcp;
import com.cloud.vm.UserVmDetailVO;
import com.cloud.vm.UserVmManager;
@@ -78,6 +81,8 @@ public class UserVmJoinDaoImpl extends
GenericDaoBaseWithTagInformation<UserVmJo
private UserDao _userDao;
@Inject
private NicExtraDhcpOptionDao _nicExtraDhcpOptionDao;
+ @Inject
+ UserStatisticsDao userStatsDao;
private final SearchBuilder<UserVmJoinVO> VmDetailSearch;
private final SearchBuilder<UserVmJoinVO> activeVmByIsoSearch;
@@ -366,9 +371,26 @@ public class UserVmJoinDaoImpl extends
GenericDaoBaseWithTagInformation<UserVmJo
userVmResponse.setDynamicallyScalable(userVm.isDynamicallyScalable());
}
+ addVmRxTxDataToResponse(userVm, userVmResponse);
+
return userVmResponse;
}
+ private void addVmRxTxDataToResponse(UserVmJoinVO userVm, UserVmResponse
userVmResponse) {
+ Long bytesReceived = 0L;
+ Long bytesSent = 0L;
+ SearchBuilder<UserStatisticsVO> sb =
userStatsDao.createSearchBuilder();
+ sb.and("deviceId", sb.entity().getDeviceId(), Op.EQ);
+ SearchCriteria<UserStatisticsVO> sc = sb.create();
+ sc.setParameters("deviceId", userVm.getId());
+ for (UserStatisticsVO stat: userStatsDao.search(sc, null)) {
+ bytesReceived += stat.getNetBytesReceived() +
stat.getCurrentBytesReceived();
+ bytesSent += stat.getNetBytesSent() + stat.getCurrentBytesSent();
+ }
+ userVmResponse.setBytesReceived(bytesReceived);
+ userVmResponse.setBytesSent(bytesSent);
+ }
+
/**
* The resulting Response attempts to be in line with what is returned from
* @see com.cloud.api.ApiResponseHelper#createNicResponse(Nic)