From 5e9f649da988f171e34952f6626096dbd4c2093b Mon Sep 17 00:00:00 2001 From: Øyvind Grønnesby Date: Mon, 11 Oct 2021 09:13:12 +0200 Subject: Revert "Revert "Billing refactoring and cleanup"" --- .../restapi/billing/BillingApiHandler.java | 94 +++++++++++----------- .../restapi/billing/BillingApiHandlerV2.java | 80 +++++++++--------- .../integration/ServiceRegistryMock.java | 24 ++++++ .../restapi/billing/BillingApiHandlerTest.java | 57 +++++++------ .../restapi/billing/BillingApiHandlerV2Test.java | 2 +- 5 files changed, 140 insertions(+), 117 deletions(-) (limited to 'controller-server') 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 items) { + private void renderAdditionalItems(Cursor cursor, List 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 getInvoicesForTenant(TenantName tenant) { - return billingController.getInvoicesForTenant(tenant); + private List getBillsForTenant(TenantName tenant) { + return billingController.getBillsForTenant(tenant); } - private void renderInvoices(Cursor cursor, List invoices) { - invoices.forEach(invoice -> { - var invoiceCursor = cursor.addObject(); - renderInvoiceToCursor(invoiceCursor, invoice); + private void renderBills(Cursor cursor, List 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 inv.id().value().equals(invoiceId)) .findAny() .orElseThrow(RestApiException.NotFound::new); @@ -178,7 +178,7 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler invoices) { - invoices.forEach(invoice -> invoiceSummaryToSlime(slime.addObject(), invoice)); + private void invoicesSummaryToSlime(Cursor slime, List 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 items) { + private void toSlime(Cursor slime, List 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 slime.setString("cost", c.toString())); } - private List toCsv(Invoice invoice) { + private List toCsv(Bill bill) { return List.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 -- cgit v1.2.3