summaryrefslogtreecommitdiffstats
path: root/controller-api/src/main
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2023-10-13 11:08:12 +0200
committerHarald Musum <musum@yahooinc.com>2023-10-13 11:08:12 +0200
commit543b44ab23ec1649c4ff7794e677f29bd92d48bc (patch)
treef83fce97fee60c2b2342349972b50443b12431ca /controller-api/src/main
parente7d54515ca2a5eceea0bf17c5b96b969aea8c53a (diff)
Support calculating and presenting prices per applications and in total
Diffstat (limited to 'controller-api/src/main')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MockPricingController.java11
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformation.java17
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformationApplications.java9
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/Prices.java14
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingController.java4
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingInfo.java1
6 files changed, 37 insertions, 19 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MockPricingController.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MockPricingController.java
index c9df5a72a35..4de4ff29f1d 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MockPricingController.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/MockPricingController.java
@@ -5,6 +5,7 @@ import com.yahoo.config.provision.ClusterResources;
import com.yahoo.vespa.hosted.controller.api.integration.billing.Plan;
import com.yahoo.vespa.hosted.controller.api.integration.pricing.ApplicationResources;
import com.yahoo.vespa.hosted.controller.api.integration.pricing.PriceInformation;
+import com.yahoo.vespa.hosted.controller.api.integration.pricing.Prices;
import com.yahoo.vespa.hosted.controller.api.integration.pricing.PricingController;
import com.yahoo.vespa.hosted.controller.api.integration.pricing.PricingInfo;
@@ -33,11 +34,11 @@ public class MockPricingController implements PricingController {
BigDecimal volumeDiscount = new BigDecimal("-5.64315634");
BigDecimal committedAmountDiscount = new BigDecimal("-1.23");
BigDecimal totalAmount = listPrice.add(supportLevelCost).add(enclaveDiscount).add(volumeDiscount).add(committedAmountDiscount);
- return new PriceInformation(listPriceWithSupport, volumeDiscount, committedAmountDiscount, enclaveDiscount, totalAmount);
+ return new PriceInformation("default", listPriceWithSupport, volumeDiscount, committedAmountDiscount, enclaveDiscount, totalAmount);
}
@Override
- public PriceInformation priceForApplications(List<ApplicationResources> applicationResources, PricingInfo pricingInfo, Plan plan) {
+ public Prices priceForApplications(List<ApplicationResources> applicationResources, PricingInfo pricingInfo, Plan plan) {
ApplicationResources resources = applicationResources.get(0);
BigDecimal listPrice = resources.vcpu().multiply(valueOf(1000))
.add(resources.memoryGb().multiply(valueOf(100)))
@@ -53,8 +54,10 @@ public class MockPricingController implements PricingController {
BigDecimal committedAmountDiscount = new BigDecimal("-1.23");
BigDecimal totalAmount = listPrice.add(supportLevelCost).add(enclaveDiscount).add(volumeDiscount).add(committedAmountDiscount);
- return new PriceInformation(listPriceWithSupport, volumeDiscount, committedAmountDiscount, enclaveDiscount, totalAmount);
- }
+ var appPrice = new PriceInformation("app1", listPriceWithSupport, volumeDiscount, committedAmountDiscount, enclaveDiscount, totalAmount);
+ var totalPrice = new PriceInformation("total", ZERO, ZERO, committedAmountDiscount, enclaveDiscount, totalAmount);
+ return new Prices(List.of(appPrice), totalPrice);
+ }
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformation.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformation.java
index 7bb7818c87b..2c37b122b04 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformation.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformation.java
@@ -2,16 +2,25 @@
package com.yahoo.vespa.hosted.controller.api.integration.pricing;
import java.math.BigDecimal;
+import java.util.List;
import static java.math.BigDecimal.ZERO;
-public record PriceInformation(BigDecimal listPriceWithSupport, BigDecimal volumeDiscount, BigDecimal committedAmountDiscount,
- BigDecimal enclaveDiscount, BigDecimal totalAmount) {
+public record PriceInformation(String applicationName, BigDecimal listPriceWithSupport, BigDecimal volumeDiscount,
+ BigDecimal committedAmountDiscount, BigDecimal enclaveDiscount, BigDecimal totalAmount) {
- public static PriceInformation empty() { return new PriceInformation(ZERO, ZERO, ZERO, ZERO, ZERO); }
+ public static PriceInformation empty() { return new PriceInformation("default", ZERO, ZERO, ZERO, ZERO, ZERO); }
+
+ public static PriceInformation sum(List<PriceInformation> priceInformationList) {
+ var result = PriceInformation.empty();
+ for (var prices : priceInformationList)
+ result = result.add(prices);
+ return result;
+ }
public PriceInformation add(PriceInformation priceInformation) {
- return new PriceInformation(this.listPriceWithSupport().add(priceInformation.listPriceWithSupport()),
+ return new PriceInformation("accumulated",
+ this.listPriceWithSupport().add(priceInformation.listPriceWithSupport()),
this.volumeDiscount().add(priceInformation.volumeDiscount()),
this.committedAmountDiscount().add(priceInformation.committedAmountDiscount()),
this.enclaveDiscount().add(priceInformation.enclaveDiscount()),
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformationApplications.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformationApplications.java
deleted file mode 100644
index d7da2308a16..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PriceInformationApplications.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// 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.pricing;
-
-import java.math.BigDecimal;
-
-public record PriceInformationApplications(BigDecimal listPriceWithSupport, BigDecimal volumeDiscount, BigDecimal committedAmountDiscount,
- BigDecimal enclaveDiscount, BigDecimal totalAmount) {
-
-}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/Prices.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/Prices.java
new file mode 100644
index 00000000000..2ebd6ba5d38
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/Prices.java
@@ -0,0 +1,14 @@
+// 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.pricing;
+
+import java.util.List;
+
+public record Prices(List<PriceInformation> priceInformationApplications, PriceInformation totalPriceInformation) {
+
+ public PriceInformation get(String applicationName) {
+ return priceInformationApplications.stream()
+ .filter(priceInformation -> priceInformation.applicationName().equals(applicationName))
+ .findFirst().orElseThrow(() -> new IllegalArgumentException("Unknown application name " + applicationName));
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingController.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingController.java
index 85d83a32e4c..23d5f81dfb7 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingController.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingController.java
@@ -13,7 +13,7 @@ import java.util.List;
*/
public interface PricingController {
- // TOD: Legacy, will be removed when not in use anymore
+ // TODO: Legacy, will be removed when not in use anymore
PriceInformation price(List<ClusterResources> clusterResources, PricingInfo pricingInfo, Plan plan);
/**
@@ -23,6 +23,6 @@ public interface PricingController {
* @param plan the plan to use for this calculation
* @return a PriceInformation instance
*/
- PriceInformation priceForApplications(List<ApplicationResources> applicationResources, PricingInfo pricingInfo, Plan plan);
+ Prices priceForApplications(List<ApplicationResources> applicationResources, PricingInfo pricingInfo, Plan plan);
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingInfo.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingInfo.java
index 938991e2ed7..1ab149d083f 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingInfo.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/pricing/PricingInfo.java
@@ -1,6 +1,7 @@
// 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.pricing;
+// TODO: Use BigDecimal for committedHourlyAmount
public record PricingInfo(boolean enclave, SupportLevel supportLevel, double committedHourlyAmount) {
public enum SupportLevel { BASIC, COMMERCIAL, ENTERPRISE }