summaryrefslogtreecommitdiffstats
path: root/vespa-athenz
diff options
context:
space:
mode:
authorOla Aunrønning <olaa@verizonmedia.com>2022-04-21 11:23:19 +0200
committerOla Aunrønning <olaa@verizonmedia.com>2022-04-21 11:26:48 +0200
commit2c6f9ee65bdcc2da21669f341da4103fddfe92b9 (patch)
treeef0adc7ccb73cee251319dae59da9983441136a5 /vespa-athenz
parentdb838bbf51864f29c20538be2c6d3c2599c4a3e7 (diff)
Monitor ZMS quota
Diffstat (limited to 'vespa-athenz')
-rw-r--r--vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/DefaultZmsClient.java12
-rw-r--r--vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/QuotaUsage.java55
-rw-r--r--vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/ZmsClient.java2
-rw-r--r--vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/bindings/StatisticsEntity.java51
4 files changed, 120 insertions, 0 deletions
diff --git a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/DefaultZmsClient.java b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/DefaultZmsClient.java
index 136ae1df8ae..8ffb9331ddb 100644
--- a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/DefaultZmsClient.java
+++ b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/DefaultZmsClient.java
@@ -23,6 +23,7 @@ import com.yahoo.vespa.athenz.client.zms.bindings.ResponseListEntity;
import com.yahoo.vespa.athenz.client.zms.bindings.RoleEntity;
import com.yahoo.vespa.athenz.client.zms.bindings.ServiceEntity;
import com.yahoo.vespa.athenz.client.zms.bindings.ServiceListResponseEntity;
+import com.yahoo.vespa.athenz.client.zms.bindings.StatisticsEntity;
import com.yahoo.vespa.athenz.client.zms.bindings.TenancyRequestEntity;
import com.yahoo.vespa.athenz.identity.ServiceIdentityProvider;
import com.yahoo.vespa.athenz.utils.AthenzIdentities;
@@ -408,6 +409,17 @@ public class DefaultZmsClient extends ClientBase implements ZmsClient {
execute(request, response -> readEntity(response, Void.class));
}
+ @Override
+ public QuotaUsage getQuotaUsage() {
+ var uri = zmsUrl.resolve(String.format("domain/%s/quota", identity.getDomainName()));
+ var quotaEntity = execute(RequestBuilder.get(uri).build(), response -> readEntity(response, StatisticsEntity.class));
+
+ uri = zmsUrl.resolve(String.format("domain/%s/stats", identity.getDomainName()));
+ var usageEntity = execute(RequestBuilder.get(uri).build(), response -> readEntity(response, StatisticsEntity.class));
+
+ return QuotaUsage.calculateUsage(usageEntity, quotaEntity);
+ }
+
public AthenzRoleInformation getFullRoleInformation(AthenzRole role) {
var uri = zmsUrl.resolve(String.format("domain/%s/role/%s?pending=true&auditLog=true", role.domain().getName(), role.roleName()));
var request = RequestBuilder.get(uri).build();
diff --git a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/QuotaUsage.java b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/QuotaUsage.java
new file mode 100644
index 00000000000..8e9c7de9272
--- /dev/null
+++ b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/QuotaUsage.java
@@ -0,0 +1,55 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.athenz.client.zms;
+
+import com.yahoo.vespa.athenz.client.zms.bindings.StatisticsEntity;
+
+/**
+ * @author olaa
+ */
+public class QuotaUsage {
+
+ private double subdomainUsage;
+ private double roleUsage;
+ private double policyUsage;
+ private double serviceUsage;
+ private double groupUsage;
+
+
+ public QuotaUsage(double subdomainUsage, double roleUsage, double policyUsage, double serviceUsage, double groupUsage) {
+ this.subdomainUsage = subdomainUsage;
+ this.roleUsage = roleUsage;
+ this.policyUsage = policyUsage;
+ this.serviceUsage = serviceUsage;
+ this.groupUsage = groupUsage;
+ }
+
+ public static QuotaUsage calculateUsage(StatisticsEntity used, StatisticsEntity quota) {
+ return new QuotaUsage(
+ (double) used.getSubdomains() / quota.getSubdomains(),
+ (double) used.getRoles() / quota.getRoles(),
+ (double) used.getPolicies() / quota.getPolicies(),
+ (double) used.getServices() / quota.getServices(),
+ (double) used.getGroups() / quota.getGroups()
+ );
+ }
+
+ public double getSubdomainUsage() {
+ return subdomainUsage;
+ }
+
+ public double getRoleUsage() {
+ return roleUsage;
+ }
+
+ public double getPolicyUsage() {
+ return policyUsage;
+ }
+
+ public double getServiceUsage() {
+ return serviceUsage;
+ }
+
+ public double getGroupUsage() {
+ return groupUsage;
+ }
+} \ No newline at end of file
diff --git a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/ZmsClient.java b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/ZmsClient.java
index 3ff2ff843a0..b07f6da1a01 100644
--- a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/ZmsClient.java
+++ b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/ZmsClient.java
@@ -83,5 +83,7 @@ public interface ZmsClient extends AutoCloseable {
AthenzRoleInformation getFullRoleInformation(AthenzRole role);
+ QuotaUsage getQuotaUsage();
+
void close();
}
diff --git a/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/bindings/StatisticsEntity.java b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/bindings/StatisticsEntity.java
new file mode 100644
index 00000000000..bba6195363c
--- /dev/null
+++ b/vespa-athenz/src/main/java/com/yahoo/vespa/athenz/client/zms/bindings/StatisticsEntity.java
@@ -0,0 +1,51 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.athenz.client.zms.bindings;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * @author olaa
+ */
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class StatisticsEntity {
+
+ private int subdomains;
+ private int roles;
+ private int policies;
+ private int services;
+ private int groups;
+
+ public StatisticsEntity(@JsonProperty("subdomain") int subdomains,
+ @JsonProperty("role") int roles,
+ @JsonProperty("policy") int policies,
+ @JsonProperty("service") int services,
+ @JsonProperty("group") int groups) {
+ this.subdomains = subdomains;
+ this.roles = roles;
+ this.policies = policies;
+ this.services = services;
+ this.groups = groups;
+ }
+
+ public int getSubdomains() {
+ return subdomains;
+ }
+
+ public int getRoles() {
+ return roles;
+ }
+
+ public int getPolicies() {
+ return policies;
+ }
+
+ public int getServices() {
+ return services;
+ }
+
+ public int getGroups() {
+ return groups;
+ }
+
+} \ No newline at end of file