com.yahoo.vespa.hosted.controller.api.integration.billing.BillingController Maven / Gradle / Ivy
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.api.integration.billing;
import com.yahoo.config.provision.TenantName;
import com.yahoo.vespa.hosted.controller.tenant.CloudTenant;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
* A service that controls creation of bills based on the resource usage of a tenant, controls the quota for a
* tenant, and controls the plan the tenant is on.
*
* @author ogronnesby
* @author olaa
*/
public interface BillingController {
/**
* Get the plan ID for the given tenant.
* This method will not fail if the tenant does not exist, it will return the default plan for that tenant instead.
*/
PlanId getPlan(TenantName tenant);
/**
* Return the list of tenants with the given plan.
* @param existing All existing tenants in the system
* @param planId The ID of the plan to filter existing tenants on.
* @return The tenants that have the given plan.
*/
List tenantsWithPlan(List existing, PlanId planId);
/** The display name of the given plan */
String getPlanDisplayName(PlanId planId);
/**
* The quota for the given tenant.
* This method will return default quota for tenants that do not exist.
*/
Quota getQuota(TenantName tenant);
/**
* Set the plan for the current tenant. Checks some pre-conditions to see if the tenant is eligible for the
* given plan.
* @param tenant The name of the tenant.
* @param planId The ID of the plan to change to.
* @param hasDeployments Does the tenant have active deployments.
* @param isAccountant Is it the hosted accountant that is doing the operation
* @return String containing error message if something went wrong. Empty otherwise
*/
PlanResult setPlan(TenantName tenant, PlanId planId, boolean hasDeployments, boolean isAccountant);
/**
* Create a bill of unbilled use for the given tenant in the given time period.
* @param tenant The name of the tenant.
* @param startTime The start of the billing period
* @param endTime The end of the billing period
* @param agent The agent that creates the bill
* @return The ID of the new bill.
*/
Bill.Id createBillForPeriod(TenantName tenant, ZonedDateTime startTime, ZonedDateTime endTime, String agent);
Bill.Id createBillForPeriod(TenantName tenant, LocalDate startDate, LocalDate endDate, String agent);
/**
* Create an unpersisted bill of unbilled use for the given tenant from the end of last bill until the given date.
* This is used to show "unbilled use" in the Console.
* @param tenant The name of the tenant.
* @param until The end date of the unbilled use period.
* @return A bill with the resource use and cost.
*/
Bill createUncommittedBill(TenantName tenant, LocalDate until);
/** Run {createUncommittedBill} for all tenants with unbilled use */
Map createUncommittedBills(LocalDate until);
/** Get line items that have been manually added to a tenant, but is not yet part of a bill */
List getUnusedLineItems(TenantName tenant);
/** Get the payment instrument for the given tenant */
Optional getDefaultInstrument(TenantName tenant);
/** Get the auth token needed to talk to payment services */
String createClientToken(String tenant, String userId);
/** Delete a payment instrument from the list of the tenant's instruments */
boolean deleteInstrument(TenantName tenant, String userId, String instrumentId);
/** Change the status of the given bill */
void updateBillStatus(Bill.Id billId, String agent, BillStatus status);
/** Add a line item to the given bill */
void addLineItem(TenantName tenant, String description, BigDecimal amount, Optional billId, String agent);
/** Delete a line item - only available for unused line items */
void deleteLineItem(String lineItemId);
/** Set the given payment instrument as the active instrument for the tenant */
boolean setActivePaymentInstrument(InstrumentOwner paymentInstrument);
/** List the payment instruments from the tenant */
InstrumentList listInstruments(TenantName tenant, String userId);
/** Get all bills for the given tenant */
List getBillsForTenant(TenantName tenant);
/** Get all bills from the system */
List getBills();
/** Get the bill with the given id */
Bill getBill(Bill.Id billId);
/** Get the bill collection method for the given tenant */
default CollectionMethod getCollectionMethod(TenantName tenant) {
return CollectionMethod.NONE;
}
/** Set the bill collection method for the given tenant */
default CollectionResult setCollectionMethod(TenantName tenant, CollectionMethod method) {
return CollectionResult.error("Method not implemented");
}
/** Test if the number of tenants with the given plan is under the given limit */
default boolean tenantsWithPlanUnderLimit(Plan plan, int limit) {
return true;
}
default void updateCache(List tenants) {}
}