summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorØyvind Grønnesby <oyving@verizonmedia.com>2021-10-19 15:56:22 +0200
committerØyvind Grønnesby <oyving@verizonmedia.com>2021-10-19 15:56:22 +0200
commitfa3677633b2f7a0be4a955471b739a6c1896591d (patch)
treedec8238148b8f509c22c2c60e8c0323b65206434 /controller-server
parent680a711d800af6c60d87b33388833f3a24081009 (diff)
Revert "Merge pull request #19502 from vespa-engine/revert-19496-revert-19485-revert-18572-ogronnesby/billing-service"
This reverts commit 471db5f7a1bc16bd5e8be9b80a5f06ee28967b16, reversing changes made to 11a50513dc58eeb52d290fe3dc1d826f27069d26.
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandler.java94
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2.java80
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java24
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerTest.java57
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2Test.java2
5 files changed, 140 insertions, 117 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandler.java
index b595d3fbe17..b8c8ce4e63a 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandler.java
@@ -18,9 +18,9 @@ import com.yahoo.slime.SlimeUtils;
import com.yahoo.vespa.hosted.controller.ApplicationController;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.TenantController;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.Bill;
import com.yahoo.vespa.hosted.controller.api.integration.billing.CollectionMethod;
import com.yahoo.vespa.hosted.controller.api.integration.billing.PaymentInstrument;
-import com.yahoo.vespa.hosted.controller.api.integration.billing.Invoice;
import com.yahoo.vespa.hosted.controller.api.integration.billing.InstrumentOwner;
import com.yahoo.vespa.hosted.controller.api.integration.billing.BillingController;
import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanId;
@@ -99,23 +99,23 @@ public class BillingApiHandler extends LoggingRequestHandler {
if (path.matches("/billing/v1/tenant/{tenant}/billing")) return getBilling(path.get("tenant"), request.getProperty("until"));
if (path.matches("/billing/v1/tenant/{tenant}/plan")) return getPlan(path.get("tenant"));
if (path.matches("/billing/v1/billing")) return getBillingAllTenants(request.getProperty("until"));
- if (path.matches("/billing/v1/invoice/export")) return getAllInvoices();
+ if (path.matches("/billing/v1/invoice/export")) return getAllBills();
if (path.matches("/billing/v1/invoice/tenant/{tenant}/line-item")) return getLineItems(path.get("tenant"));
return ErrorResponse.notFoundError("Nothing at " + path);
}
- private HttpResponse getAllInvoices() {
- var invoices = billingController.getInvoices();
+ private HttpResponse getAllBills() {
+ var bills = billingController.getBills();
var headers = new String[]{ "ID", "Tenant", "From", "To", "CpuHours", "MemoryHours", "DiskHours", "Cpu", "Memory", "Disk", "Additional" };
- var rows = invoices.stream()
- .map(invoice -> {
+ var rows = bills.stream()
+ .map(bill -> {
return new Object[] {
- invoice.id().value(), invoice.tenant().value(),
- invoice.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE),
- invoice.getEndTime().format(DateTimeFormatter.ISO_LOCAL_DATE),
- invoice.sumCpuHours(), invoice.sumMemoryHours(), invoice.sumDiskHours(),
- invoice.sumCpuCost(), invoice.sumMemoryCost(), invoice.sumDiskCost(),
- invoice.sumAdditionalCost()
+ bill.id().value(), bill.tenant().value(),
+ bill.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE),
+ bill.getEndTime().format(DateTimeFormatter.ISO_LOCAL_DATE),
+ bill.sumCpuHours(), bill.sumMemoryHours(), bill.sumDiskHours(),
+ bill.sumCpuCost(), bill.sumMemoryCost(), bill.sumDiskCost(),
+ bill.sumAdditionalCost()
};
})
.collect(Collectors.toList());
@@ -138,8 +138,8 @@ public class BillingApiHandler extends LoggingRequestHandler {
}
private HttpResponse handlePOST(Path path, HttpRequest request, String userId) {
- if (path.matches("/billing/v1/invoice")) return createInvoice(request, userId);
- if (path.matches("/billing/v1/invoice/{invoice-id}/status")) return setInvoiceStatus(request, path.get("invoice-id"));
+ if (path.matches("/billing/v1/invoice")) return createBill(request, userId);
+ if (path.matches("/billing/v1/invoice/{invoice-id}/status")) return setBillStatus(request, path.get("invoice-id"));
if (path.matches("/billing/v1/invoice/tenant/{tenant}/line-item")) return addLineItem(request, path.get("tenant"));
return ErrorResponse.notFoundError("Nothing at " + path);
@@ -190,7 +190,7 @@ public class BillingApiHandler extends LoggingRequestHandler {
private HttpResponse getBillingAllTenants(String until) {
try {
var untilDate = untilParameter(until);
- var uncommittedInvoices = billingController.createUncommittedInvoices(untilDate);
+ var uncommittedBills = billingController.createUncommittedBills(untilDate);
var slime = new Slime();
var root = slime.setObject();
@@ -198,12 +198,12 @@ public class BillingApiHandler extends LoggingRequestHandler {
var tenants = root.setArray("tenants");
tenantController.asList().stream().sorted(Comparator.comparing(Tenant::name)).forEach(tenant -> {
- var invoice = uncommittedInvoices.get(tenant.name());
+ var bill = uncommittedBills.get(tenant.name());
var tc = tenants.addObject();
tc.setString("tenant", tenant.name().value());
getPlanForTenant(tc, tenant.name());
getCollectionForTenant(tc, tenant.name());
- renderCurrentUsage(tc.setObject("current"), invoice);
+ renderCurrentUsage(tc.setObject("current"), bill);
renderAdditionalItems(tc.setObject("additional").setArray("items"), billingController.getUnusedLineItems(tenant.name()));
billingController.getDefaultInstrument(tenant.name()).ifPresent(card ->
@@ -232,14 +232,14 @@ public class BillingApiHandler extends LoggingRequestHandler {
return new MessageResponse("Added line item for tenant " + tenant);
}
- private HttpResponse setInvoiceStatus(HttpRequest request, String invoiceId) {
+ private HttpResponse setBillStatus(HttpRequest request, String billId) {
Inspector inspector = inspectorOrThrow(request);
String status = getInspectorFieldOrThrow(inspector, "status");
- billingController.updateInvoiceStatus(Invoice.Id.of(invoiceId), userIdOrThrow(request), status);
- return new MessageResponse("Updated status of invoice " + invoiceId);
+ billingController.updateBillStatus(Bill.Id.of(billId), userIdOrThrow(request), status);
+ return new MessageResponse("Updated status of invoice " + billId);
}
- private HttpResponse createInvoice(HttpRequest request, String userId) {
+ private HttpResponse createBill(HttpRequest request, String userId) {
Inspector inspector = inspectorOrThrow(request);
TenantName tenantName = TenantName.from(getInspectorFieldOrThrow(inspector, "tenant"));
@@ -248,12 +248,12 @@ public class BillingApiHandler extends LoggingRequestHandler {
ZonedDateTime startTime = startDate.atStartOfDay(ZoneId.of("UTC"));
ZonedDateTime endTime = endDate.atStartOfDay(ZoneId.of("UTC"));
- var invoiceId = billingController.createInvoiceForPeriod(tenantName, startTime, endTime, userId);
+ var billId = billingController.createBillForPeriod(tenantName, startTime, endTime, userId);
Slime slime = new Slime();
Cursor root = slime.setObject();
- root.setString("message", "Created invoice with ID " + invoiceId.value());
- root.setString("id", invoiceId.value());
+ root.setString("message", "Created invoice with ID " + billId.value());
+ root.setString("id", billId.value());
return new SlimeJsonResponse(slime);
}
@@ -278,7 +278,7 @@ public class BillingApiHandler extends LoggingRequestHandler {
getPlanForTenant(root, tenantId);
renderCurrentUsage(root.setObject("current"), getCurrentUsageForTenant(tenantId, untilDate));
renderAdditionalItems(root.setObject("additional").setArray("items"), billingController.getUnusedLineItems(tenantId));
- renderInvoices(root.setArray("bills"), getInvoicesForTenant(tenantId));
+ renderBills(root.setArray("bills"), getBillsForTenant(tenantId));
billingController.getDefaultInstrument(tenantId).ifPresent( card ->
renderInstrument(root.setObject("payment"), card)
@@ -328,7 +328,7 @@ public class BillingApiHandler extends LoggingRequestHandler {
}
- private void renderCurrentUsage(Cursor cursor, Invoice currentUsage) {
+ private void renderCurrentUsage(Cursor cursor, Bill currentUsage) {
if (currentUsage == null) return;
cursor.setString("amount", currentUsage.sum().toPlainString());
cursor.setString("status", "accrued");
@@ -340,46 +340,46 @@ public class BillingApiHandler extends LoggingRequestHandler {
});
}
- private void renderAdditionalItems(Cursor cursor, List<Invoice.LineItem> items) {
+ private void renderAdditionalItems(Cursor cursor, List<Bill.LineItem> items) {
items.forEach(item -> {
renderLineItemToCursor(cursor.addObject(), item);
});
}
- private Invoice getCurrentUsageForTenant(TenantName tenant, LocalDate until) {
- return billingController.createUncommittedInvoice(tenant, until);
+ private Bill getCurrentUsageForTenant(TenantName tenant, LocalDate until) {
+ return billingController.createUncommittedBill(tenant, until);
}
- private List<Invoice> getInvoicesForTenant(TenantName tenant) {
- return billingController.getInvoicesForTenant(tenant);
+ private List<Bill> getBillsForTenant(TenantName tenant) {
+ return billingController.getBillsForTenant(tenant);
}
- private void renderInvoices(Cursor cursor, List<Invoice> invoices) {
- invoices.forEach(invoice -> {
- var invoiceCursor = cursor.addObject();
- renderInvoiceToCursor(invoiceCursor, invoice);
+ private void renderBills(Cursor cursor, List<Bill> bills) {
+ bills.forEach(bill -> {
+ var billCursor = cursor.addObject();
+ renderBillToCursor(billCursor, bill);
});
}
- private void renderInvoiceToCursor(Cursor invoiceCursor, Invoice invoice) {
- invoiceCursor.setString("id", invoice.id().value());
- invoiceCursor.setString("from", invoice.getStartTime().format(DATE_TIME_FORMATTER));
- invoiceCursor.setString("to", invoice.getEndTime().format(DATE_TIME_FORMATTER));
+ private void renderBillToCursor(Cursor billCursor, Bill bill) {
+ billCursor.setString("id", bill.id().value());
+ billCursor.setString("from", bill.getStartTime().format(DATE_TIME_FORMATTER));
+ billCursor.setString("to", bill.getEndTime().format(DATE_TIME_FORMATTER));
- invoiceCursor.setString("amount", invoice.sum().toString());
- invoiceCursor.setString("status", invoice.status());
- var statusCursor = invoiceCursor.setArray("statusHistory");
- renderStatusHistory(statusCursor, invoice.statusHistory());
+ billCursor.setString("amount", bill.sum().toString());
+ billCursor.setString("status", bill.status());
+ var statusCursor = billCursor.setArray("statusHistory");
+ renderStatusHistory(statusCursor, bill.statusHistory());
- var lineItemsCursor = invoiceCursor.setArray("items");
- invoice.lineItems().forEach(lineItem -> {
+ var lineItemsCursor = billCursor.setArray("items");
+ bill.lineItems().forEach(lineItem -> {
var itemCursor = lineItemsCursor.addObject();
renderLineItemToCursor(itemCursor, lineItem);
});
}
- private void renderStatusHistory(Cursor cursor, Invoice.StatusHistory statusHistory) {
+ private void renderStatusHistory(Cursor cursor, Bill.StatusHistory statusHistory) {
statusHistory.getHistory()
.entrySet()
.stream()
@@ -390,7 +390,7 @@ public class BillingApiHandler extends LoggingRequestHandler {
});
}
- private void renderLineItemToCursor(Cursor cursor, Invoice.LineItem lineItem) {
+ private void renderLineItemToCursor(Cursor cursor, Bill.LineItem lineItem) {
cursor.setString("id", lineItem.id());
cursor.setString("description", lineItem.description());
cursor.setString("amount", lineItem.amount().toString());
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2.java
index 58afed4143f..630305b0ab4 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2.java
@@ -15,9 +15,9 @@ import com.yahoo.slime.Type;
import com.yahoo.vespa.hosted.controller.ApplicationController;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.TenantController;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.Bill;
import com.yahoo.vespa.hosted.controller.api.integration.billing.BillingController;
import com.yahoo.vespa.hosted.controller.api.integration.billing.CollectionMethod;
-import com.yahoo.vespa.hosted.controller.api.integration.billing.Invoice;
import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanId;
import com.yahoo.vespa.hosted.controller.api.role.Role;
import com.yahoo.vespa.hosted.controller.api.role.SecurityContext;
@@ -138,7 +138,7 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
var tenant = tenants.require(tenantName, CloudTenant.class);
var slime = new Slime();
- invoicesSummaryToSlime(slime.setObject().setArray("invoices"), billing.getInvoicesForTenant(tenant.name()));
+ invoicesSummaryToSlime(slime.setObject().setArray("invoices"), billing.getBillsForTenant(tenant.name()));
return slime;
}
@@ -148,7 +148,7 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
var invoiceId = requestContext.pathParameters().getStringOrThrow("invoice");
var format = requestContext.queryParameters().getString("format").orElse("json");
- var invoice = billing.getInvoicesForTenant(tenant.name()).stream()
+ var invoice = billing.getBillsForTenant(tenant.name()).stream()
.filter(inv -> inv.id().value().equals(invoiceId))
.findAny()
.orElseThrow(RestApiException.NotFound::new);
@@ -178,7 +178,7 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
var tenantName = TenantName.from(requestContext.pathParameters().getStringOrThrow("tenant"));
var tenant = tenants.require(tenantName, CloudTenant.class);
var untilAt = untilParameter(requestContext);
- var usage = billing.createUncommittedInvoice(tenant.name(), untilAt.atZone(ZoneOffset.UTC).toLocalDate());
+ var usage = billing.createUncommittedBill(tenant.name(), untilAt.atZone(ZoneOffset.UTC).toLocalDate());
var slime = new Slime();
usageToSlime(slime.setObject(), usage);
@@ -189,7 +189,7 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
private Slime accountant(RestApi.RequestContext requestContext) {
var untilAt = untilParameter(requestContext);
- var usagePerTenant = billing.createUncommittedInvoices(untilAt.atZone(ZoneOffset.UTC).toLocalDate());
+ var usagePerTenant = billing.createUncommittedBills(untilAt.atZone(ZoneOffset.UTC).toLocalDate());
var response = new Slime();
var tenantsResponse = response.setObject().setArray("tenants");
@@ -199,8 +199,8 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
tenantResponse.setString("tenant", tenant.name().value());
tenantResponse.setString("plan", billing.getPlan(tenant.name()).value());
tenantResponse.setString("collection", billing.getCollectionMethod(tenant.name()).name());
- tenantResponse.setString("lastBill", usage.map(Invoice::getStartTime).map(DateTimeFormatter.ISO_DATE::format).orElse(null));
- tenantResponse.setString("unbilled", usage.map(Invoice::sum).map(BigDecimal::toPlainString).orElse("0.00"));
+ tenantResponse.setString("lastBill", usage.map(Bill::getStartTime).map(DateTimeFormatter.ISO_DATE::format).orElse(null));
+ tenantResponse.setString("unbilled", usage.map(Bill::sum).map(BigDecimal::toPlainString).orElse("0.00"));
});
return response;
@@ -211,7 +211,7 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
var tenant = tenants.require(tenantName, CloudTenant.class);
var untilAt = untilParameter(requestContext);
- var usage = billing.createUncommittedInvoice(tenant.name(), untilAt.atZone(ZoneOffset.UTC).toLocalDate());
+ var usage = billing.createUncommittedBill(tenant.name(), untilAt.atZone(ZoneOffset.UTC).toLocalDate());
var slime = new Slime();
toSlime(slime.setObject(), usage);
@@ -230,7 +230,7 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
var startAt = LocalDate.parse(getInspectorFieldOrThrow(body, "from")).atStartOfDay(ZoneOffset.UTC);
var endAt = LocalDate.parse(getInspectorFieldOrThrow(body, "to")).atStartOfDay(ZoneOffset.UTC);
- var invoiceId = billing.createInvoiceForPeriod(tenant.name(), startAt, endAt, security.principal().getName());
+ var invoiceId = billing.createBillForPeriod(tenant.name(), startAt, endAt, security.principal().getName());
// TODO: Make a redirect to the bill itself
return new MessageResponse("Created bill " + invoiceId.value());
@@ -239,36 +239,36 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
// --------- INVOICE RENDERING ----------
- private void invoicesSummaryToSlime(Cursor slime, List<Invoice> invoices) {
- invoices.forEach(invoice -> invoiceSummaryToSlime(slime.addObject(), invoice));
+ private void invoicesSummaryToSlime(Cursor slime, List<Bill> bills) {
+ bills.forEach(invoice -> invoiceSummaryToSlime(slime.addObject(), invoice));
}
- private void invoiceSummaryToSlime(Cursor slime, Invoice invoice) {
- slime.setString("id", invoice.id().value());
- slime.setString("from", invoice.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
- slime.setString("to", invoice.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
- slime.setString("total", invoice.sum().toString());
- slime.setString("status", invoice.status());
+ private void invoiceSummaryToSlime(Cursor slime, Bill bill) {
+ slime.setString("id", bill.id().value());
+ slime.setString("from", bill.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
+ slime.setString("to", bill.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
+ slime.setString("total", bill.sum().toString());
+ slime.setString("status", bill.status());
}
- private void usageToSlime(Cursor slime, Invoice invoice) {
- slime.setString("from", invoice.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
- slime.setString("to", invoice.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
- slime.setString("total", invoice.sum().toString());
- toSlime(slime.setArray("items"), invoice.lineItems());
+ private void usageToSlime(Cursor slime, Bill bill) {
+ slime.setString("from", bill.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
+ slime.setString("to", bill.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
+ slime.setString("total", bill.sum().toString());
+ toSlime(slime.setArray("items"), bill.lineItems());
}
- private void toSlime(Cursor slime, Invoice invoice) {
- slime.setString("id", invoice.id().value());
- slime.setString("from", invoice.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
- slime.setString("to", invoice.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
- slime.setString("total", invoice.sum().toString());
- slime.setString("status", invoice.status());
- toSlime(slime.setArray("statusHistory"), invoice.statusHistory());
- toSlime(slime.setArray("items"), invoice.lineItems());
+ private void toSlime(Cursor slime, Bill bill) {
+ slime.setString("id", bill.id().value());
+ slime.setString("from", bill.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
+ slime.setString("to", bill.getStartTime().format(DateTimeFormatter.ISO_LOCAL_DATE));
+ slime.setString("total", bill.sum().toString());
+ slime.setString("status", bill.status());
+ toSlime(slime.setArray("statusHistory"), bill.statusHistory());
+ toSlime(slime.setArray("items"), bill.lineItems());
}
- private void toSlime(Cursor slime, Invoice.StatusHistory history) {
+ private void toSlime(Cursor slime, Bill.StatusHistory history) {
history.getHistory().forEach((key, value) -> {
var c = slime.addObject();
c.setString("at", key.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
@@ -276,11 +276,11 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
});
}
- private void toSlime(Cursor slime, List<Invoice.LineItem> items) {
+ private void toSlime(Cursor slime, List<Bill.LineItem> items) {
items.forEach(item -> toSlime(slime.addObject(), item));
}
- private void toSlime(Cursor slime, Invoice.LineItem item) {
+ private void toSlime(Cursor slime, Bill.LineItem item) {
slime.setString("id", item.id());
slime.setString("description", item.description());
slime.setString("amount",item.amount().toString());
@@ -304,14 +304,14 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler
cost.ifPresent(c -> slime.setString("cost", c.toString()));
}
- private List<Object[]> toCsv(Invoice invoice) {
+ private List<Object[]> toCsv(Bill bill) {
return List.<Object[]>of(new Object[]{
- invoice.id().value(), invoice.tenant().value(),
- invoice.getStartTime().format(DateTimeFormatter.ISO_DATE),
- invoice.getEndTime().format(DateTimeFormatter.ISO_DATE),
- invoice.sumCpuHours(), invoice.sumMemoryHours(), invoice.sumDiskHours(),
- invoice.sumCpuCost(), invoice.sumMemoryCost(), invoice.sumDiskCost(),
- invoice.sumAdditionalCost()
+ bill.id().value(), bill.tenant().value(),
+ bill.getStartTime().format(DateTimeFormatter.ISO_DATE),
+ bill.getEndTime().format(DateTimeFormatter.ISO_DATE),
+ bill.sumCpuHours(), bill.sumMemoryHours(), bill.sumDiskHours(),
+ bill.sumCpuCost(), bill.sumMemoryCost(), bill.sumDiskCost(),
+ bill.sumAdditionalCost()
});
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java
index 6ddf0ec76ed..f64c54ff24d 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ServiceRegistryMock.java
@@ -17,7 +17,11 @@ import com.yahoo.vespa.hosted.controller.api.integration.aws.MockCloudEventFetch
import com.yahoo.vespa.hosted.controller.api.integration.aws.MockResourceTagger;
import com.yahoo.vespa.hosted.controller.api.integration.aws.ResourceTagger;
import com.yahoo.vespa.hosted.controller.api.integration.billing.BillingController;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.BillingDatabaseClient;
import com.yahoo.vespa.hosted.controller.api.integration.billing.MockBillingController;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.BillingDatabaseClientMock;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanRegistry;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanRegistryMock;
import com.yahoo.vespa.hosted.controller.api.integration.certificates.EndpointCertificateMock;
import com.yahoo.vespa.hosted.controller.api.integration.certificates.EndpointCertificateValidator;
import com.yahoo.vespa.hosted.controller.api.integration.certificates.EndpointCertificateValidatorMock;
@@ -28,6 +32,8 @@ import com.yahoo.vespa.hosted.controller.api.integration.horizon.MockHorizonClie
import com.yahoo.vespa.hosted.controller.api.integration.organization.MockContactRetriever;
import com.yahoo.vespa.hosted.controller.api.integration.organization.MockIssueHandler;
import com.yahoo.vespa.hosted.controller.api.integration.resource.CostReportConsumerMock;
+import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceDatabaseClientMock;
+import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceDatabaseClient;
import com.yahoo.vespa.hosted.controller.api.integration.routing.GlobalRoutingService;
import com.yahoo.vespa.hosted.controller.api.integration.routing.MemoryGlobalRoutingService;
import com.yahoo.vespa.hosted.controller.api.integration.secrets.NoopTenantSecretService;
@@ -77,6 +83,9 @@ public class ServiceRegistryMock extends AbstractComponent implements ServiceReg
private final MockChangeRequestClient changeRequestClient = new MockChangeRequestClient();
private final AccessControlService accessControlService = new MockAccessControlService();
private final HorizonClient horizonClient = new MockHorizonClient();
+ private final PlanRegistry planRegistry = new PlanRegistryMock();
+ private final ResourceDatabaseClient resourceDb = new ResourceDatabaseClientMock(planRegistry);
+ private final BillingDatabaseClient billingDb = new BillingDatabaseClientMock(clock, planRegistry);
public ServiceRegistryMock(SystemName system) {
this.zoneRegistryMock = new ZoneRegistryMock(system);
@@ -243,6 +252,21 @@ public class ServiceRegistryMock extends AbstractComponent implements ServiceReg
return horizonClient;
}
+ @Override
+ public PlanRegistry planRegistry() {
+ return planRegistry;
+ }
+
+ @Override
+ public ResourceDatabaseClient resourceDatabase() {
+ return resourceDb;
+ }
+
+ @Override
+ public BillingDatabaseClient billingDatabase() {
+ return billingDb;
+ }
+
public ConfigServerMock configServerMock() {
return configServerMock;
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerTest.java
index 8bc32d262f1..3c4ed8bc8df 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerTest.java
@@ -3,8 +3,8 @@ package com.yahoo.vespa.hosted.controller.restapi.billing;
import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.TenantName;
+import com.yahoo.vespa.hosted.controller.api.integration.billing.Bill;
import com.yahoo.vespa.hosted.controller.api.integration.billing.CollectionMethod;
-import com.yahoo.vespa.hosted.controller.api.integration.billing.Invoice;
import com.yahoo.vespa.hosted.controller.api.integration.billing.MockBillingController;
import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanId;
import com.yahoo.vespa.hosted.controller.api.role.Role;
@@ -19,7 +19,6 @@ import org.junit.Test;
import java.io.File;
import java.math.BigDecimal;
import java.time.LocalDate;
-import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.List;
@@ -95,10 +94,10 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
@Test
public void response_list_bills() {
- var invoice = createInvoice();
+ var bill = createBill();
- billingController.addInvoice(tenant, invoice, true);
- billingController.addInvoice(tenant, invoice, false);
+ billingController.addBill(tenant, bill, true);
+ billingController.addBill(tenant, bill, false);
billingController.setPlan(tenant, PlanId.from("some-plan"), true);
var request = request("/billing/v1/tenant/tenant1/billing?until=2020-05-28").roles(tenantRole);
@@ -107,9 +106,9 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
}
@Test
- public void test_invoice_creation() {
- var invoices = billingController.getInvoicesForTenant(tenant);
- assertEquals(0, invoices.size());
+ public void test_bill_creation() {
+ var bills = billingController.getBillsForTenant(tenant);
+ assertEquals(0, bills.size());
String requestBody = "{\"tenant\":\"tenant1\", \"startTime\":\"2020-04-20\", \"endTime\":\"2020-05-20\"}";
var request = request("/billing/v1/invoice", POST)
@@ -120,11 +119,11 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
request.roles(financeAdmin);
tester.assertResponse(request, new File("invoice-creation-response"));
- invoices = billingController.getInvoicesForTenant(tenant);
- assertEquals(1, invoices.size());
- Invoice invoice = invoices.get(0);
- assertEquals(invoice.getStartTime().toString(), "2020-04-20T00:00Z[UTC]");
- assertEquals(invoice.getEndTime().toString(), "2020-05-20T00:00Z[UTC]");
+ bills = billingController.getBillsForTenant(tenant);
+ assertEquals(1, bills.size());
+ Bill bill = bills.get(0);
+ assertEquals(bill.getStartTime().toString(), "2020-04-20T00:00Z[UTC]");
+ assertEquals(bill.getEndTime().toString(), "2020-05-20T00:00Z[UTC]");
}
@Test
@@ -143,7 +142,7 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
var lineItems = billingController.getUnusedLineItems(tenant);
Assert.assertEquals(1, lineItems.size());
- Invoice.LineItem lineItem = lineItems.get(0);
+ Bill.LineItem lineItem = lineItems.get(0);
assertEquals("some description", lineItem.description());
assertEquals(new BigDecimal("123.45"), lineItem.amount());
@@ -155,7 +154,7 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
@Test
public void adding_new_status() {
- billingController.addInvoice(tenant, createInvoice(), true);
+ billingController.addBill(tenant, createBill(), true);
var requestBody = "{\"status\":\"DONE\"}";
var request = request("/billing/v1/invoice/id-1/status", POST)
@@ -163,21 +162,21 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
.roles(financeAdmin);
tester.assertResponse(request, "{\"message\":\"Updated status of invoice id-1\"}");
- var invoice = billingController.getInvoicesForTenant(tenant).get(0);
- assertEquals("DONE", invoice.status());
+ var bill = billingController.getBillsForTenant(tenant).get(0);
+ assertEquals("DONE", bill.status());
}
@Test
- public void list_all_uninvoiced_items() {
+ public void list_all_unbilled_items() {
tester.controller().tenants().create(new CloudTenantSpec(tenant, ""), new Auth0Credentials(() -> "foo", Set.of(Role.hostedOperator())));
tester.controller().tenants().create(new CloudTenantSpec(tenant2, ""), new Auth0Credentials(() -> "foo", Set.of(Role.hostedOperator())));
- var invoice = createInvoice();
+ var bill = createBill();
billingController.setPlan(tenant, PlanId.from("some-plan"), true);
billingController.setPlan(tenant2, PlanId.from("some-plan"), true);
- billingController.addInvoice(tenant, invoice, false);
+ billingController.addBill(tenant, bill, false);
billingController.addLineItem(tenant, "support", new BigDecimal("42"), "Smith");
- billingController.addInvoice(tenant2, invoice, false);
+ billingController.addBill(tenant2, bill, false);
var request = request("/billing/v1/billing?until=2020-05-28").roles(financeAdmin);
@@ -195,8 +194,8 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
@Test
public void csv_export() {
- var invoice = createInvoice();
- billingController.addInvoice(tenant, invoice, true);
+ var bill = createBill();
+ billingController.addBill(tenant, bill, true);
var csvRequest = request("/billing/v1/invoice/export", GET).roles(financeAdmin);
tester.assertResponse(csvRequest.get(), new File("billing-all-invoices"), 200, false);
}
@@ -222,12 +221,12 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
assertEquals(CollectionMethod.INVOICE, billingController.getCollectionMethod(tenant));
}
- static Invoice createInvoice() {
+ static Bill createBill() {
var start = LocalDate.of(2020, 5, 23).atStartOfDay(ZoneOffset.UTC);
var end = start.plusDays(5);
- var statusHistory = new Invoice.StatusHistory(new TreeMap<>(Map.of(start, "OPEN")));
- return new Invoice(
- Invoice.Id.of("id-1"),
+ var statusHistory = new Bill.StatusHistory(new TreeMap<>(Map.of(start, "OPEN")));
+ return new Bill(
+ Bill.Id.of("id-1"),
TenantName.defaultName(),
statusHistory,
List.of(createLineItem(start)),
@@ -236,8 +235,8 @@ public class BillingApiHandlerTest extends ControllerContainerCloudTest {
);
}
- static Invoice.LineItem createLineItem(ZonedDateTime addedAt) {
- return new Invoice.LineItem(
+ static Bill.LineItem createLineItem(ZonedDateTime addedAt) {
+ return new Bill.LineItem(
"some-id",
"description",
new BigDecimal("123.00"),
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2Test.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2Test.java
index e733f8e27d6..538e568804b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2Test.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/billing/BillingApiHandlerV2Test.java
@@ -43,7 +43,7 @@ public class BillingApiHandlerV2Test extends ControllerContainerCloudTest {
var clock = (ManualClock) tester.controller().serviceRegistry().clock();
clock.setInstant(Instant.parse("2021-04-13T00:00:00Z"));
billingController = (MockBillingController) tester.serviceRegistry().billingController();
- billingController.addInvoice(tenant, BillingApiHandlerTest.createInvoice(), true);
+ billingController.addBill(tenant, BillingApiHandlerTest.createBill(), true);
}
@Override