diff options
10 files changed, 121 insertions, 51 deletions
diff --git a/client/js/app/src/app/pages/querybuilder/TransformVespaTrace.jsx b/client/js/app/src/app/pages/querybuilder/TransformVespaTrace.jsx index 5e09a5dec0f..5838d0b3f0f 100644 --- a/client/js/app/src/app/pages/querybuilder/TransformVespaTrace.jsx +++ b/client/js/app/src/app/pages/querybuilder/TransformVespaTrace.jsx @@ -18,7 +18,7 @@ export default function transform(trace) { let temp = trace['trace']['children']; let spans = findChildren(temp); traceStartTimestamp = findTraceStartTime(spans); - let topSpanFirstHalf = createNewSpan(traceStartTimestamp)[0]; + let topSpanFirstHalf = createNewSpan(traceStartTimestamp); data.push(topSpanFirstHalf); const retrieved = findLogsAndChildren(spans, topSpanFirstHalf); @@ -39,6 +39,9 @@ function traverseChildren(span, logs, children, indexes, parent) { (span['children'][span['children'].length - 1]['timestamp'] - span['children'][0]['timestamp']) * 1000; + if (isNaN(duration) || duration === 0) { + duration = 1; + } parent['duration'] = duration; logSpan = createNewSpan( traceStartTimestamp + spanTimestamp, @@ -99,16 +102,19 @@ function findLogsAndChildren(spans, topSpanFirstHalf) { traceID: traceID, spanID: topSpanFirstHalf['spanID'], }, - ])[0]; + ]); data.push(span); span['startTime'] = traceStartTimestamp + spans[i]['timestamp'] * 1000; let duration; - if (i === spans.length - 1) { + if (i >= spans.length - 1) { duration = 1; } else { duration = (spans[i + 1]['timestamp'] - spans[i]['timestamp']) * 1000; duration = duration === 0 ? 1 : duration; } + if (isNaN(duration)) { + duration = 1; + } span['duration'] = duration; } } @@ -127,17 +133,22 @@ function traverseLogs(logs, indexes) { if (logDuration === 0) { logDuration = 1; } - let temp = createNewSpan(logStartTimestamp, logDuration, 'p0', 'test', [ - { refType: 'CHILD_OF', traceID: traceID, spanID: previous['spanID'] }, - ]); - let childSpan = temp[0]; - let childSpanID = temp[1]; + let childSpan = createNewSpan( + logStartTimestamp, + logDuration, + 'p0', + 'test', + [{ refType: 'CHILD_OF', traceID: traceID, spanID: previous['spanID'] }] + ); data.push(childSpan); for (let k = 0; k < log.length - 1; k++) { - if (log[k].hasOwnProperty('message')) { + if ( + log[k].hasOwnProperty('message') && + log[k].hasOwnProperty('timestamp') + ) { let logPointStart = traceStartTimestamp + log[k]['timestamp'] * 1000; let logPointDuration; - if (k > log.length - 1) { + if (k >= log.length - 1) { logPointDuration = 1; } else { logPointDuration = @@ -149,8 +160,14 @@ function traverseLogs(logs, indexes) { logPointDuration, 'p0', log[k]['message'], - [{ refType: 'CHILD_OF', traceID: traceID, spanID: childSpanID }] - )[0]; + [ + { + refType: 'CHILD_OF', + traceID: traceID, + spanID: childSpan['spanID'], + }, + ] + ); data.push(logSpan); } } @@ -324,5 +341,5 @@ function createNewSpan( logs: [], processID: processID, }; - return [newSpan, spanID]; + return newSpan; } 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 44a8b636ae0..4532e0c2c18 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 @@ -14,6 +14,7 @@ import com.yahoo.slime.Cursor; import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; import com.yahoo.slime.Type; +import com.yahoo.vespa.hosted.controller.Application; import com.yahoo.vespa.hosted.controller.ApplicationController; import com.yahoo.vespa.hosted.controller.Controller; import com.yahoo.vespa.hosted.controller.TenantController; @@ -23,8 +24,10 @@ import com.yahoo.vespa.hosted.controller.api.integration.billing.CollectionMetho import com.yahoo.vespa.hosted.controller.api.integration.billing.Plan; import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanId; import com.yahoo.vespa.hosted.controller.api.integration.billing.PlanRegistry; +import com.yahoo.vespa.hosted.controller.api.integration.billing.Quota; import com.yahoo.vespa.hosted.controller.api.role.Role; import com.yahoo.vespa.hosted.controller.api.role.SecurityContext; +import com.yahoo.vespa.hosted.controller.application.QuotaUsage; import com.yahoo.vespa.hosted.controller.tenant.CloudTenant; import com.yahoo.vespa.hosted.controller.tenant.Tenant; @@ -200,11 +203,13 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler var response = new Slime(); var tenantsResponse = response.setObject().setArray("tenants"); + tenants.asList().stream().sorted(Comparator.comparing(Tenant::name)).forEach(tenant -> { var usage = Optional.ofNullable(usagePerTenant.get(tenant.name())); var tenantResponse = tenantsResponse.addObject(); tenantResponse.setString("tenant", tenant.name().value()); toSlime(tenantResponse.setObject("plan"), planFor(tenant.name())); + toSlime(tenantResponse.setObject("quota"), billing.getQuota(tenant.name())); tenantResponse.setString("collection", billing.getCollectionMethod(tenant.name()).name()); tenantResponse.setString("lastBill", usage.map(Bill::getStartDate).map(DateTimeFormatter.ISO_DATE::format).orElse(null)); tenantResponse.setString("unbilled", usage.map(Bill::sum).map(BigDecimal::toPlainString).orElse("0.00")); @@ -357,6 +362,10 @@ public class BillingApiHandlerV2 extends RestApiRequestHandler<BillingApiHandler cursor.setString("name", plan.displayName()); } + private void toSlime(Cursor cursor, Quota quota) { + cursor.setDouble("budget", quota.budget().map(BigDecimal::doubleValue).orElse(-1.0)); + } + private Plan planFor(TenantName tenant) { var planId = billing.getPlan(tenant); return planRegistry.plan(planId) 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 7c3f0e51b92..c62a9f1399f 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 @@ -124,7 +124,7 @@ public class BillingApiHandlerV2Test extends ControllerContainerCloudTest { var accountantRequest = request("/billing/v2/accountant").roles(Role.hostedAccountant()); tester.assertResponse(accountantRequest, """ - {"tenants":[{"tenant":"tenant1","plan":{"id":"trial","name":"Free Trial - for testing purposes"},"collection":"AUTO","lastBill":null,"unbilled":"0.00"}]}"""); + {"tenants":[{"tenant":"tenant1","plan":{"id":"trial","name":"Free Trial - for testing purposes"},"quota":{"budget":-1.0},"collection":"AUTO","lastBill":null,"unbilled":"0.00"}]}"""); } @Test diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index 74dc52f79ec..0c828b5a9b5 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -46,8 +46,8 @@ public class Flags { private static volatile TreeMap<FlagId, FlagDefinition> flags = new TreeMap<>(); public static final UnboundBooleanFlag MAIN_CHAIN_GRAPH = defineFeatureFlag( - "main-chain-graph", false, - List.of("hakonhall"), "2022-07-06", "2022-09-05", + "main-chain-graph", true, + List.of("hakonhall"), "2022-07-06", "2022-10-05", "Whether to run all tasks in the main task chain up to the one failing to converge (false), or " + "run all tasks in the main task chain whose dependencies have converged (true). And when suspending, " + "whether to run the tasks in sequence (false) or in reverse sequence (true).", diff --git a/hosted-tenant-base/pom.xml b/hosted-tenant-base/pom.xml index 58ad178794b..4b09064548f 100644 --- a/hosted-tenant-base/pom.xml +++ b/hosted-tenant-base/pom.xml @@ -99,6 +99,12 @@ </dependency> <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-api</artifactId> + <version>${vespa.junit.version}</version> + </dependency> + + <dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <version>${vespa.junit.version}</version> diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java index 62557b275c8..67c1c7359f7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java @@ -198,11 +198,6 @@ public class MetricsReporter extends NodeRepositoryMaintainer { metric.set("wantToDeprovision", node.status().wantToDeprovision() ? 1 : 0, context); metric.set("failReport", NodeFailer.reasonsToFailHost(node).isEmpty() ? 0 : 1, context); - if (node.type().isHost()) { - metric.set("wantToEncrypt", node.reports().getReport("wantToEncrypt").isPresent() ? 1 : 0, context); - metric.set("diskEncrypted", node.reports().getReport("diskEncrypted").isPresent() ? 1 : 0, context); - } - HostName hostname = new HostName(node.hostname()); serviceModel.getApplication(hostname) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index 98d3ffa92f8..03a6a11d4bd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -43,7 +43,6 @@ import java.util.TreeMap; import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -162,11 +161,6 @@ public class MetricsReporterTest { TestMetric metric = new TestMetric(); MetricsReporter metricsReporter = metricsReporter(metric, tester); metricsReporter.maintain(); - - // Only verify metrics that are set for hosts - TreeMap<String, Number> metrics = new TreeMap<>(metric.values); - assertTrue(metrics.containsKey("wantToEncrypt")); - assertTrue(metrics.containsKey("diskEncrypted")); } private void verifyAndRemoveIntegerMetricSum(TestMetric metric, String key, int expected) { diff --git a/tenant-cd-api/pom.xml b/tenant-cd-api/pom.xml index f8411cc74d1..f6c0b662c97 100644 --- a/tenant-cd-api/pom.xml +++ b/tenant-cd-api/pom.xml @@ -59,6 +59,21 @@ <scope>compile</scope> </dependency> <dependency> + <groupId>org.opentest4j</groupId> + <artifactId>opentest4j</artifactId> + <version>1.2.0</version> + </dependency> + <dependency> + <groupId>org.apiguardian</groupId> + <artifactId>apiguardian-api</artifactId> + <version>1.1.2</version> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-commons</artifactId> + <version>1.8.1</version> + </dependency> + <dependency> <groupId>com.yahoo.vespa</groupId> <artifactId>vespa-feed-client-api</artifactId> <version>${project.version}</version> diff --git a/vespa-osgi-testrunner/pom.xml b/vespa-osgi-testrunner/pom.xml index 0032fe33de0..d89fbe1cf89 100644 --- a/vespa-osgi-testrunner/pom.xml +++ b/vespa-osgi-testrunner/pom.xml @@ -27,6 +27,12 @@ <version>${project.version}</version> <scope>provided</scope> </dependency> + <dependency> + <groupId>com.yahoo.vespa</groupId> + <artifactId>tenant-cd-api</artifactId> + <version>${project.version}</version> + <scope>provided</scope> + </dependency> <dependency> <groupId>com.yahoo.vespa</groupId> @@ -37,23 +43,47 @@ <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> - <version>5.8.2</version> + <version>5.8.1</version> <exclusions> <exclusion> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </exclusion> + <exclusion> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-commons</artifactId> + </exclusion> + <exclusion> + <groupId>org.opentest4j</groupId> + <artifactId>opentest4j</artifactId> + </exclusion> + <exclusion> + <groupId>org.apiguardian</groupId> + <artifactId>apiguardian-api</artifactId> + </exclusion> </exclusions> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> - <version>1.8.2</version> + <version>1.8.1</version> <exclusions> <exclusion> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> </exclusion> + <exclusion> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-commons</artifactId> + </exclusion> + <exclusion> + <groupId>org.opentest4j</groupId> + <artifactId>opentest4j</artifactId> + </exclusion> + <exclusion> + <groupId>org.apiguardian</groupId> + <artifactId>apiguardian-api</artifactId> + </exclusion> </exclusions> </dependency> <dependency> @@ -65,12 +95,6 @@ <dependency> <groupId>com.yahoo.vespa</groupId> - <artifactId>tenant-cd-api</artifactId> - <version>${project.version}</version> - <scope>provided</scope> - </dependency> - <dependency> - <groupId>com.yahoo.vespa</groupId> <artifactId>config-provisioning</artifactId> <version>${project.version}</version> <scope>provided</scope> diff --git a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java index 54f0941208d..8575d22c384 100644 --- a/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java +++ b/vespa-osgi-testrunner/src/main/java/com/yahoo/vespa/testrunner/JunitRunner.java @@ -104,22 +104,32 @@ public class JunitRunner extends AbstractComponent implements TestRunner { private TestReport launchJunit(Suite suite, byte[] testConfig) { List<Class<?>> testClasses = classLoader.apply(suite); if (testClasses == null) - return null; - - testRuntimeProvider.initialize(testConfig); - TestReportGeneratingListener testReportListener = new TestReportGeneratingListener(suite, - record -> logRecords.put(record.getSequenceNumber(), record), - stdoutTee, - stderrTee, - clock); - LauncherDiscoveryRequest discoveryRequest = LauncherDiscoveryRequestBuilder.request() - .selectors(testClasses.stream() - .map(DiscoverySelectors::selectClass) - .collect(toList())) - .build(); - testExecutor.accept(discoveryRequest, new TestExecutionListener[] { testReportListener }); - - return testReportListener.report(); + return null; + + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + try { + testRuntimeProvider.initialize(testConfig); + TestReportGeneratingListener testReportListener = new TestReportGeneratingListener(suite, + record -> logRecords.put(record.getSequenceNumber(), record), + stdoutTee, + stderrTee, + clock); + + if ( ! testClasses.isEmpty()) + Thread.currentThread().setContextClassLoader(testClasses.get(0).getClassLoader()); + + LauncherDiscoveryRequest discoveryRequest = LauncherDiscoveryRequestBuilder.request() + .selectors(testClasses.stream() + .map(DiscoverySelectors::selectClass) + .collect(toList())) + .build(); + testExecutor.accept(discoveryRequest, new TestExecutionListener[] { testReportListener }); + + return testReportListener.report(); + } + finally { + Thread.currentThread().setContextClassLoader(contextClassLoader); + } } @Override |