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)

Reply via email to