This is an automated email from the ASF dual-hosted git repository.

ofuks pushed a commit to branch DLAB-1571
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git


The following commit(s) were added to refs/heads/DLAB-1571 by this push:
     new 1b229fb  Remote billing
     new b557d00  Merge remote-tracking branch 'origin/DLAB-1571' into DLAB-1571
1b229fb is described below

commit 1b229fb44e42badf70abeb252c0fda8a89bd286a
Author: Oleh Fuks <olegfuk...@gmail.com>
AuthorDate: Mon Mar 30 17:24:34 2020 +0300

    Remote billing
---
 services/billing-gcp/pom.xml                       |  5 ++++
 .../billing/gcp/controller/BillingController.java  |  7 ++++--
 .../com/epam/dlab/billing/gcp/dao/BillingDAO.java  |  2 +-
 .../billing/gcp/dao/impl/BigQueryBillingDAO.java   | 26 ++++++++++++++++---
 .../service/impl/BillingServiceImpl.java           | 29 ++++++++++------------
 5 files changed, 47 insertions(+), 22 deletions(-)

diff --git a/services/billing-gcp/pom.xml b/services/billing-gcp/pom.xml
index e562089..43dff3b 100644
--- a/services/billing-gcp/pom.xml
+++ b/services/billing-gcp/pom.xml
@@ -98,6 +98,11 @@
             <artifactId>dlab-model</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.7</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git 
a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/controller/BillingController.java
 
b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/controller/BillingController.java
index 525be72..2967d2a 100644
--- 
a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/controller/BillingController.java
+++ 
b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/controller/BillingController.java
@@ -44,7 +44,10 @@ public class BillingController {
     }
 
     @GetMapping("/report")
-    public ResponseEntity<List<BillingData>> getBilling() {
-        return new ResponseEntity<>(billingDAO.getBillingReport(), 
HttpStatus.OK);
+    public ResponseEntity<List<BillingData>> 
getBilling(@RequestParam("date-start") String dateStart,
+                                                        
@RequestParam("date-end") String dateEnd,
+                                                        
@RequestParam("dlab-id") String dlabId,
+                                                        
@RequestParam("product") List<String> products) {
+        return new ResponseEntity<>(billingDAO.getBillingReport(dateStart, 
dateEnd, dlabId, products), HttpStatus.OK);
     }
 }
diff --git 
a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/BillingDAO.java
 
b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/BillingDAO.java
index 7288614..430ade7 100644
--- 
a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/BillingDAO.java
+++ 
b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/BillingDAO.java
@@ -28,7 +28,7 @@ public interface BillingDAO {
 
     List<GcpBillingData> getBillingData() throws InterruptedException;
 
-    List<BillingData> getBillingReport();
+    List<BillingData> getBillingReport(String dateStart, String dateEnd, 
String dlabId, List<String> products);
 
     List<BillingData> getBillingReport(List<String> dlabIds);
 }
diff --git 
a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
 
b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
index 5b92d82..6db993a 100644
--- 
a/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
+++ 
b/services/billing-gcp/src/main/java/com/epam/dlab/billing/gcp/dao/impl/BigQueryBillingDAO.java
@@ -33,9 +33,11 @@ import com.google.cloud.bigquery.QueryParameterValue;
 import com.google.cloud.bigquery.Table;
 import com.google.cloud.bigquery.TableInfo;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.aggregation.Aggregation;
+import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
 import org.springframework.data.mongodb.core.aggregation.GroupOperation;
 import org.springframework.data.mongodb.core.aggregation.MatchOperation;
 import org.springframework.data.mongodb.core.query.Criteria;
@@ -46,8 +48,10 @@ import java.time.Instant;
 import java.time.LocalDate;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
@@ -104,10 +108,20 @@ public class BigQueryBillingDAO implements BillingDAO {
        }
 
        @Override
-       public List<BillingData> getBillingReport() {
+       public List<BillingData> getBillingReport(String dateStart, String 
dateEnd, String dlabId, List<String> products) {
                try {
-                       GroupOperation groupOperation = getGroupOperation();
-                       Aggregation aggregation = 
newAggregation(groupOperation);
+                       List<AggregationOperation> aggregationOperations = new 
ArrayList<>();
+                       
aggregationOperations.add(Aggregation.match(Criteria.where("dlabId").regex(dlabId,
 "i")));
+                       if (!products.isEmpty()) {
+                               
aggregationOperations.add(Aggregation.match(Criteria.where("product").in(products)));
+                       }
+                       getMatchCriteria(dateStart, 
Criteria.where("usage_date").gte(dateStart))
+                                       .ifPresent(aggregationOperations::add);
+                       getMatchCriteria(dateEnd, 
Criteria.where("usage_date").lte(dateEnd))
+                                       .ifPresent(aggregationOperations::add);
+                       aggregationOperations.add(getGroupOperation());
+
+                       Aggregation aggregation = 
newAggregation(aggregationOperations);
 
                        return mongoTemplate.aggregate(aggregation, "billing", 
GcpBillingData.class).getMappedResults()
                                        .stream()
@@ -143,6 +157,12 @@ public class BigQueryBillingDAO implements BillingDAO {
                                .sum("cost").as("cost");
        }
 
+       private Optional<MatchOperation> getMatchCriteria(String dateStart, 
Criteria criteria) {
+               return Optional.ofNullable(dateStart)
+                               .filter(StringUtils::isNotEmpty)
+                               .map(date -> Aggregation.match(criteria));
+       }
+
        private Stream<? extends GcpBillingData> bigQueryResultSetStream(Table 
table) {
                try {
                        final String tableName = table.getTableId().getTable();
diff --git 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
index 8e07202..3601d21 100644
--- 
a/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
+++ 
b/services/self-service/src/main/java/com/epam/dlab/backendapi/service/impl/BillingServiceImpl.java
@@ -44,7 +44,6 @@ import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.utils.URIBuilder;
 
 import javax.ws.rs.core.GenericType;
@@ -135,9 +134,8 @@ public class BillingServiceImpl implements BillingService {
 
         final Map<String, BillingReportLine> billableResources = 
getBillableResources(user, projects);
 
-        List<BillingReportLine> billingReport = getRemoteBillingData(user)
+        List<BillingReportLine> billingReport = getRemoteBillingData(user, 
filter)
                 .stream()
-                .filter(getBillingDataFilter(filter))
                 .filter(bd -> billableResources.containsKey(bd.getTag()))
                 .map(bd -> toBillingData(bd, 
billableResources.get(bd.getTag())))
                 .filter(getBillingReportFilter(filter))
@@ -208,11 +206,11 @@ public class BillingServiceImpl implements BillingService 
{
         }
     }
 
-    private List<BillingData> getRemoteBillingData(UserInfo userInfo) {
+    private List<BillingData> getRemoteBillingData(UserInfo userInfo, 
BillingFilter filter) {
         List<EndpointDTO> endpoints = endpointService.getEndpoints();
         ExecutorService executor = 
Executors.newFixedThreadPool(endpoints.size());
         List<Callable<List<BillingData>>> callableTasks = new ArrayList<>();
-        endpoints.forEach(e -> callableTasks.add(getTask(userInfo, 
getBillingUrl(e.getUrl(), BILLING_REPORT_PATH))));
+        endpoints.forEach(e -> callableTasks.add(getTask(userInfo, 
getBillingUrl(e.getUrl(), BILLING_REPORT_PATH), filter)));
 
         List<BillingData> billingData;
         try {
@@ -256,17 +254,16 @@ public class BillingServiceImpl implements BillingService 
{
                 .toString();
     }
 
-    private Callable<List<BillingData>> getTask(UserInfo userInfo, String url) 
{
-        return () -> provisioningService.get(url, userInfo.getAccessToken(), 
new GenericType<List<BillingData>>() {
-        });
-    }
-
-    private Predicate<BillingData> getBillingDataFilter(BillingFilter filter) {
-        return br ->
-                (StringUtils.isEmpty(filter.getDlabId()) || 
StringUtils.containsIgnoreCase(br.getTag(), filter.getDlabId())) &&
-                        (StringUtils.isEmpty(filter.getDateStart()) || 
LocalDate.parse(filter.getDateStart()).isEqual(br.getUsageDateFrom()) || 
LocalDate.parse(filter.getDateStart()).isBefore(br.getUsageDateFrom())) &&
-                        (StringUtils.isEmpty(filter.getDateEnd()) || 
LocalDate.parse(filter.getDateEnd()).isEqual(br.getUsageDateTo()) || 
LocalDate.parse(filter.getDateEnd()).isAfter(br.getUsageDateTo())) &&
-                        (CollectionUtils.isEmpty(filter.getProducts()) || 
filter.getProducts().contains(br.getProduct()));
+    private Callable<List<BillingData>> getTask(UserInfo userInfo, String url, 
BillingFilter filter) {
+        return () -> provisioningService.get(url, userInfo.getAccessToken(),
+                new GenericType<List<BillingData>>() {
+                },
+                Stream.of(new String[][]{
+                        {"date-start", filter.getDateStart()},
+                        {"date-end", filter.getDateEnd()},
+                        {"dlab-id", filter.getDlabId()},
+                        {"product", String.join(",", filter.getProducts())}
+                }).collect(Collectors.toMap(data -> data[0], data -> 
data[1])));
     }
 
     private Predicate<BillingReportLine> getBillingReportFilter(BillingFilter 
filter) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org
For additional commands, e-mail: commits-h...@dlab.apache.org

Reply via email to