aboutsummaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorOla Aunrønning <olaa@yahooinc.com>2023-10-12 12:38:16 +0200
committerGitHub <noreply@github.com>2023-10-12 12:38:16 +0200
commit724d1120e45dd09c8089c7f6b75a6be0f355e8b3 (patch)
tree1bd5754d2ebecdea07efb9e29e4bb0eb1bff3bba /controller-api
parent686dc5941b174ffab2de1ee1da90402977947e64 (diff)
parent0b76751189e3b62ffaae5cc281409bb29c90053d (diff)
Merge pull request #28837 from vespa-engine/ogronnesby/enclave-billing
Add cloudAccount as dimension to bills and resources
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java17
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java3
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java10
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java3
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java38
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java10
6 files changed, 62 insertions, 19 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java
index 763f4c89c8b..1acb4964ea6 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/Bill.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.CloudAccount;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.zone.ZoneId;
@@ -208,6 +209,7 @@ public class Bill {
private BigDecimal gpuCost;
private NodeResources.Architecture architecture;
private int majorVersion;
+ private CloudAccount cloudAccount;
private String exportedId;
public LineItem(String id, String description, BigDecimal amount, String plan, String agent, ZonedDateTime addedAt) {
@@ -217,11 +219,15 @@ public class Bill {
this.plan = plan;
this.agent = agent;
this.addedAt = addedAt;
+ this.cloudAccount = CloudAccount.empty;
}
- public LineItem(String id, String description, BigDecimal amount, String plan, String agent, ZonedDateTime addedAt, ZonedDateTime startedAt, ZonedDateTime endedAt, ApplicationId applicationId, ZoneId zoneId,
- BigDecimal cpuHours, BigDecimal memoryHours, BigDecimal diskHours, BigDecimal gpuHours, BigDecimal cpuCost, BigDecimal memoryCost, BigDecimal diskCost, BigDecimal gpuCost,
- NodeResources.Architecture architecture, int majorVersion, String exportedId) {
+ public LineItem(String id, String description, BigDecimal amount, String plan, String agent, ZonedDateTime addedAt,
+ ZonedDateTime startedAt, ZonedDateTime endedAt, ApplicationId applicationId, ZoneId zoneId,
+ BigDecimal cpuHours, BigDecimal memoryHours, BigDecimal diskHours, BigDecimal gpuHours, BigDecimal cpuCost,
+ BigDecimal memoryCost, BigDecimal diskCost, BigDecimal gpuCost, NodeResources.Architecture architecture,
+ int majorVersion, CloudAccount cloudAccount, String exportedId)
+ {
this(id, description, amount, plan, agent, addedAt);
this.startedAt = startedAt;
this.endedAt = endedAt;
@@ -241,6 +247,7 @@ public class Bill {
this.architecture = architecture;
this.majorVersion = majorVersion;
this.gpuCost = gpuCost;
+ this.cloudAccount = cloudAccount;
this.exportedId = exportedId;
}
@@ -334,6 +341,10 @@ public class Bill {
return majorVersion;
}
+ public CloudAccount getCloudAccount() {
+ return cloudAccount;
+ }
+
public Optional<String> getExportedId() {
return Optional.ofNullable(exportedId);
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java
index 452143da75d..3ae2b0aa495 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/billing/PlanRegistryMock.java
@@ -135,7 +135,8 @@ public class PlanRegistryMock implements PlanRegistry {
dgbCost,
gpuCost,
usage.getArchitecture(),
- usage.getMajorVersion()
+ usage.getMajorVersion(),
+ usage.getCloudAccount()
);
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java
index 0ffe3768e71..0dcfb2d9823 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/CostInfo.java
@@ -2,6 +2,7 @@
package com.yahoo.vespa.hosted.controller.api.integration.resource;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.zone.ZoneId;
@@ -24,11 +25,14 @@ public class CostInfo {
private final BigDecimal gpuCost;
private final NodeResources.Architecture architecture;
private final int majorVersion;
+ private final CloudAccount cloudAccount;
public CostInfo(ApplicationId applicationId, ZoneId zoneId,
BigDecimal cpuHours, BigDecimal memoryHours, BigDecimal diskHours, BigDecimal gpuHours,
- BigDecimal cpuCost, BigDecimal memoryCost, BigDecimal diskCost, BigDecimal gpuCost, NodeResources.Architecture architecture, int majorVersion) {
+ BigDecimal cpuCost, BigDecimal memoryCost, BigDecimal diskCost, BigDecimal gpuCost, NodeResources.Architecture architecture,
+ int majorVersion, CloudAccount cloudAccount)
+ {
this.applicationId = applicationId;
this.zoneId = zoneId;
this.cpuHours = cpuHours;
@@ -41,6 +45,7 @@ public class CostInfo {
this.gpuCost = gpuCost;
this.architecture = architecture;
this.majorVersion = majorVersion;
+ this.cloudAccount = cloudAccount;
}
public ApplicationId getApplicationId() {
@@ -95,4 +100,7 @@ public class CostInfo {
return majorVersion;
}
+ public CloudAccount getCloudAccount() {
+ return cloudAccount;
+ }
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java
index 4879e92c779..81dfdf4656c 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceDatabaseClientMock.java
@@ -80,6 +80,7 @@ public class ResourceDatabaseClientMock implements ResourceDatabaseClient {
plan,
a.resources().architecture(),
a.getMajorVersion(),
+ a.getAccount(),
BigDecimal.valueOf(a.resources().vcpu()).multiply(d),
BigDecimal.valueOf(a.resources().memoryGb()).multiply(d),
BigDecimal.valueOf(a.resources().diskGb()).multiply(d),
@@ -93,12 +94,14 @@ public class ResourceDatabaseClientMock implements ResourceDatabaseClient {
assert a.getZoneId().equals(b.getZoneId());
assert a.getPlan().equals(b.getPlan());
assert a.getArchitecture().equals(b.getArchitecture());
+ assert a.getCloudAccount().equals(b.getCloudAccount());
return new ResourceUsage(
a.getApplicationId(),
a.getZoneId(),
a.getPlan(),
a.getArchitecture(),
a.getMajorVersion(),
+ a.getCloudAccount(),
a.getCpuMillis().add(b.getCpuMillis()),
a.getMemoryMillis().add(b.getMemoryMillis()),
a.getDiskMillis().add(b.getDiskMillis()),
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java
index b433666b194..dc14a043183 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceSnapshot.java
@@ -1,16 +1,16 @@
// 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.resource;
-import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import java.time.Instant;
+import java.util.Collection;
import java.util.List;
import java.util.Objects;
-import java.util.Set;
import java.util.stream.Collectors;
/**
@@ -32,37 +32,40 @@ public class ResourceSnapshot {
private final Instant timestamp;
private final ZoneId zoneId;
private final int majorVersion;
+ private final CloudAccount account;
- public ResourceSnapshot(ApplicationId applicationId, NodeResources resources, Instant timestamp, ZoneId zoneId, int majorVersion) {
+ public ResourceSnapshot(ApplicationId applicationId, NodeResources resources, Instant timestamp, ZoneId zoneId, int majorVersion, CloudAccount account) {
this.applicationId = applicationId;
this.resources = resources;
this.timestamp = timestamp;
this.zoneId = zoneId;
this.majorVersion = majorVersion;
+ this.account = account;
}
public static ResourceSnapshot from(ApplicationId applicationId, int nodes, NodeResources resources, Instant timestamp, ZoneId zoneId) {
- return new ResourceSnapshot(applicationId, resources.multipliedBy(nodes), timestamp, zoneId, 0);
+ return new ResourceSnapshot(applicationId, resources.multipliedBy(nodes), timestamp, zoneId, 0, CloudAccount.empty);
}
public static ResourceSnapshot from(List<Node> nodes, Instant timestamp, ZoneId zoneId) {
- Set<ApplicationId> applicationIds = nodes.stream()
- .filter(node -> node.owner().isPresent())
- .map(node -> node.owner().get())
- .collect(Collectors.toSet());
+ var application = exactlyOne("application", nodes.stream()
+ .filter(node -> node.owner().isPresent())
+ .map(node -> node.owner().get())
+ .collect(Collectors.toSet()));
- Set<Integer> versions = nodes.stream()
+ var version = exactlyOne("version", nodes.stream()
.map(n -> n.wantedVersion().getMajor())
- .collect(Collectors.toSet());
+ .collect(Collectors.toSet()));
- if (applicationIds.size() != 1) throw new IllegalArgumentException("List of nodes can only represent one application");
- if (versions.size() != 1) throw new IllegalArgumentException("List of nodes can only represent one version");
+ var account = exactlyOne("account", nodes.stream()
+ .map(Node::cloudAccount)
+ .collect(Collectors.toSet()));
var resources = nodes.stream()
.map(Node::resources)
.reduce(zero, ResourceSnapshot::addResources);
- return new ResourceSnapshot(applicationIds.iterator().next(), resources, timestamp, zoneId, versions.iterator().next());
+ return new ResourceSnapshot(application, resources, timestamp, zoneId, version, account);
}
public ApplicationId getApplicationId() {
@@ -85,6 +88,10 @@ public class ResourceSnapshot {
return majorVersion;
}
+ public CloudAccount getAccount() {
+ return account;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -122,4 +129,9 @@ public class ResourceSnapshot {
a.architecture() == NodeResources.Architecture.any ? b.architecture() : a.architecture(),
a.gpuResources().plus(b.gpuResources()));
}
+
+ private static <T> T exactlyOne(String resource, Collection<T> collection) {
+ if (collection.size() != 1) throw new IllegalArgumentException("More than one '" + resource + "', was: " + collection.size());
+ return collection.iterator().next();
+ }
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java
index b3ce0fffada..3cb611af8a0 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/resource/ResourceUsage.java
@@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.controller.api.integration.resource;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
+import com.yahoo.config.provision.CloudAccount;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.api.integration.billing.Plan;
@@ -20,9 +21,11 @@ public class ResourceUsage {
private final BigDecimal gpuMillis;
private final NodeResources.Architecture architecture;
private final int majorVersion;
+ private final CloudAccount cloudAccount;
public ResourceUsage(ApplicationId applicationId, ZoneId zoneId, Plan plan, NodeResources.Architecture architecture,
- int majorVersion, BigDecimal cpuMillis, BigDecimal memoryMillis, BigDecimal diskMillis, BigDecimal gpuMillis) {
+ int majorVersion, CloudAccount cloudAccount, BigDecimal cpuMillis, BigDecimal memoryMillis, BigDecimal diskMillis, BigDecimal gpuMillis)
+ {
this.applicationId = applicationId;
this.zoneId = zoneId;
this.cpuMillis = cpuMillis;
@@ -32,6 +35,7 @@ public class ResourceUsage {
this.plan = plan;
this.architecture = architecture;
this.majorVersion = majorVersion;
+ this.cloudAccount = cloudAccount;
}
public ApplicationId getApplicationId() {
@@ -67,4 +71,8 @@ public class ResourceUsage {
public NodeResources.Architecture getArchitecture() {
return architecture;
}
+
+ public CloudAccount getCloudAccount(){
+ return cloudAccount;
+ }
}