aboutsummaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorØyvind Grønnesby <oyving@verizonmedia.com>2020-11-30 09:10:27 +0100
committerGitHub <noreply@github.com>2020-11-30 09:10:27 +0100
commit8001f2c4cf42344178cc4ecb0c695ef701b2bbce (patch)
tree0474042e1d3e7d52f60040d9f8f9f4013bd656c2 /controller-api
parent3bb3b656596625e4306fc4bec59327d111cbd343 (diff)
parenta05617af4d2498460ff18ca60b471a35dd557c1a (diff)
Merge pull request #15463 from vespa-engine/ogronnesby/csv-invoice-export
Bill CSV export
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java4
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Invoice.java44
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java12
3 files changed, 56 insertions, 4 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java
index 90c4622d803..0fc20095b41 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/BillingController.java
@@ -49,7 +49,9 @@ public interface BillingController {
InstrumentList listInstruments(TenantName tenant, String userId);
- List<Invoice> getInvoices(TenantName tenant);
+ List<Invoice> getInvoicesForTenant(TenantName tenant);
+
+ List<Invoice> getInvoices();
void deleteBillingInfo(TenantName tenant, Set<User> users, boolean isPrivileged);
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Invoice.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Invoice.java
index 44f8f6e786d..39d974378b4 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Invoice.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Invoice.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.controller.api.integration.billing;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.zone.ZoneId;
import java.math.BigDecimal;
@@ -13,6 +14,7 @@ import java.util.Optional;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;
+import java.util.function.Function;
/**
@@ -31,13 +33,15 @@ public class Invoice {
private static final BigDecimal SCALED_ZERO = new BigDecimal("0.00");
private final Id id;
+ private final TenantName tenant;
private final List<LineItem> lineItems;
private final StatusHistory statusHistory;
private final ZonedDateTime startTime;
private final ZonedDateTime endTime;
- public Invoice(Id id, StatusHistory statusHistory, List<LineItem> lineItems, ZonedDateTime startTime, ZonedDateTime endTime) {
+ public Invoice(Id id, TenantName tenant, StatusHistory statusHistory, List<LineItem> lineItems, ZonedDateTime startTime, ZonedDateTime endTime) {
this.id = id;
+ this.tenant = tenant;
this.lineItems = List.copyOf(lineItems);
this.statusHistory = statusHistory;
this.startTime = startTime;
@@ -48,6 +52,10 @@ public class Invoice {
return id;
}
+ public TenantName tenant() {
+ return tenant;
+ }
+
public String status() {
return statusHistory.current();
}
@@ -72,6 +80,40 @@ public class Invoice {
return lineItems.stream().map(LineItem::amount).reduce(SCALED_ZERO, BigDecimal::add);
}
+ public BigDecimal sumCpuHours() {
+ return sumResourceValues(LineItem::getCpuHours);
+ }
+
+ public BigDecimal sumMemoryHours() {
+ return sumResourceValues(LineItem::getMemoryHours);
+ }
+
+ public BigDecimal sumDiskHours() {
+ return sumResourceValues(LineItem::getDiskHours);
+ }
+
+ public BigDecimal sumCpuCost() {
+ return sumResourceValues(LineItem::getCpuCost);
+ }
+
+ public BigDecimal sumMemoryCost() {
+ return sumResourceValues(LineItem::getMemoryCost);
+ }
+
+ public BigDecimal sumDiskCost() {
+ return sumResourceValues(LineItem::getDiskCost);
+ }
+
+ public BigDecimal sumAdditionalCost() {
+ // anything that is not covered by the cost for resources is "additional" costs
+ var resourceCosts = sumCpuCost().add(sumMemoryCost()).add(sumDiskCost());
+ return sum().subtract(resourceCosts);
+ }
+
+ private BigDecimal sumResourceValues(Function<LineItem, Optional<BigDecimal>> f) {
+ return lineItems.stream().flatMap(li -> f.apply(li).stream()).reduce(SCALED_ZERO, BigDecimal::add);
+ }
+
public static final class Id {
private final String value;
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java
index 420b964d7aa..21eada37ab1 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/MockBillingController.java
@@ -8,11 +8,13 @@ import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZonedDateTime;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.stream.Collectors;
/**
* @author olaa
@@ -53,6 +55,7 @@ public class MockBillingController implements BillingController {
committedInvoices.computeIfAbsent(tenant, l -> new ArrayList<>())
.add(new Invoice(
invoiceId,
+ tenant,
Invoice.StatusHistory.open(),
List.of(),
startTime,
@@ -134,11 +137,16 @@ public class MockBillingController implements BillingController {
}
@Override
- public List<Invoice> getInvoices(TenantName tenant) {
+ public List<Invoice> getInvoicesForTenant(TenantName tenant) {
return committedInvoices.getOrDefault(tenant, List.of());
}
@Override
+ public List<Invoice> getInvoices() {
+ return committedInvoices.values().stream().flatMap(Collection::stream).collect(Collectors.toList());
+ }
+
+ @Override
public void deleteBillingInfo(TenantName tenant, Set<User> users, boolean isPrivileged) {}
@Override
@@ -177,6 +185,6 @@ public class MockBillingController implements BillingController {
}
private Invoice emptyInvoice() {
- return new Invoice(Invoice.Id.of("empty"), Invoice.StatusHistory.open(), List.of(), ZonedDateTime.now(), ZonedDateTime.now());
+ return new Invoice(Invoice.Id.of("empty"), TenantName.defaultName(), Invoice.StatusHistory.open(), List.of(), ZonedDateTime.now(), ZonedDateTime.now());
}
}