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