aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server/src
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server/src')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java9
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java14
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java22
4 files changed, 35 insertions, 12 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
index e28273870d7..0d56bc286eb 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
@@ -737,6 +737,9 @@ public class InternalStepRunner implements StepRunner {
/** Sends a mail with a notification of a failed run, if one should be sent. */
private void sendEmailNotification(Run run, DualLogger logger) {
+ if ( ! isNewFailure(run))
+ return;
+
Application application = controller.applications().requireApplication(TenantAndApplicationId.from(run.id().application()));
Notifications notifications = application.deploymentSpec().requireInstance(run.id().application().instance()).notifications();
boolean newCommit = application.require(run.id().application().instance()).change().application()
@@ -760,6 +763,12 @@ public class InternalStepRunner implements StepRunner {
}
}
+ private boolean isNewFailure(Run run) {
+ return controller.jobController().lastCompleted(run.id().job())
+ .map(previous -> ! previous.hasFailed() || ! previous.versions().targetsMatch(run.versions()))
+ .orElse(true);
+ }
+
private void updateConsoleNotification(Run run) {
NotificationSource source = NotificationSource.from(run.id());
Consumer<String> updater = msg -> controller.notificationsDb().setNotification(source, Notification.Type.deployment, Notification.Level.error, msg);
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java
index a1c25c1fb53..021b27456a4 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporter.java
@@ -195,7 +195,7 @@ public class MetricsReporter extends ControllerMaintainer {
Optional<Instant> lastOpened = Optional.empty(); // When the upgrade window most recently opened
Instant oneWeekAgo = upgradingAt.minus(Duration.ofDays(7));
Duration step = Duration.ofHours(1);
- for (Instant instant = upgradingAt; !instanceSpec.canUpgradeAt(instant); instant = instant.minus(step).truncatedTo(ChronoUnit.HOURS)) {
+ for (Instant instant = upgradingAt.truncatedTo(ChronoUnit.HOURS); !instanceSpec.canUpgradeAt(instant); instant = instant.minus(step)) {
if (!instant.isAfter(oneWeekAgo)) { // Wrapped around, the entire week is being blocked
lastOpened = Optional.empty();
break;
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java
index ae92fd46f26..061cc69fc26 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java
@@ -368,9 +368,7 @@ public class InternalStepRunnerTest {
@Test
public void notificationIsSent() {
- app.startSystemTestTests();
- tester.cloud().set(TesterCloud.Status.NOT_STARTED);
- tester.runner().run();
+ app.submit().failDeployment(JobType.systemTest);
MockMailer mailer = tester.controllerTester().serviceRegistry().mailer();
assertEquals(1, mailer.inbox("a@b").size());
assertEquals("Vespa application tenant.application: System test failing due to system error",
@@ -378,6 +376,16 @@ public class InternalStepRunnerTest {
assertEquals(1, mailer.inbox("b@a").size());
assertEquals("Vespa application tenant.application: System test failing due to system error",
mailer.inbox("b@a").get(0).subject());
+
+ // Re-run failing causes no additional email to be sent.
+ app.failDeployment(JobType.systemTest);
+ assertEquals(1, mailer.inbox("a@b").size());
+ assertEquals(1, mailer.inbox("b@a").size());
+
+ // Failure with new package causes new email to be sent.
+ app.submit().failDeployment(JobType.systemTest);
+ assertEquals(2, mailer.inbox("a@b").size());
+ assertEquals(2, mailer.inbox("b@a").size());
}
@Test
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java
index 3c91fb66894..71a3ce262ad 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/MetricsReporterTest.java
@@ -510,7 +510,7 @@ public class MetricsReporterTest {
.blockChange(true, false, "mon-sun", "0-7", "CET")
.build();
- Instant mondayNight = Instant.parse("2021-12-13T23:00:00.00Z");
+ Instant mondayNight = Instant.parse("2021-12-13T23:30:00.00Z");
DeploymentTester tester = new DeploymentTester().at(mondayNight);
MetricsReporter reporter = createReporter(tester.controller());
DeploymentContext context = tester.newDeploymentContext();
@@ -535,17 +535,23 @@ public class MetricsReporterTest {
assertEquals("Upgrade is not overdue yet", Duration.ZERO, metric.get());
// Upgrade continues into block window
- tester.clock().advance(Duration.ofHours(3)); // Tuesday at 02:00 (03:00 CET)
- assertEquals("Upgrade is overdue measured relative to window 2", Duration.ofHours(2), metric.get());
+ tester.clock().advance(Duration.ofHours(1)); // Tuesday at 00:30 (01:30 CET)
+ assertEquals("Upgrade is overdue measured relative to window 2", Duration.ofHours(0).plusMinutes(30), metric.get());
+
+ tester.clock().advance(Duration.ofHours(1)); // Tuesday at 01:30 (02:30 CET)
+ assertEquals("Upgrade is overdue measured relative to window 2", Duration.ofHours(1).plusMinutes(30), metric.get());
+
+ tester.clock().advance(Duration.ofHours(1)); // Tuesday at 02:30 (03:30 CET)
+ assertEquals("Upgrade is overdue measured relative to window 2", Duration.ofHours(2).plusMinutes(30), metric.get());
- tester.clock().advance(Duration.ofHours(6)); // Tuesday at 08:00 (09:00 CET)
- assertEquals("Upgrade is overdue measured relative to window 1", Duration.ofHours(8), metric.get());
+ tester.clock().advance(Duration.ofHours(6)); // Tuesday at 08:30 (09:30 CET)
+ assertEquals("Upgrade is overdue measured relative to window 1", Duration.ofHours(8).plusMinutes(30), metric.get());
- tester.clock().advance(Duration.ofHours(1)); // Tuesday at 09:00 (10:00 CET)
+ tester.clock().advance(Duration.ofHours(1)); // Tuesday at 09:30 (10:30 CET)
assertEquals("Upgrade is no longer overdue", Duration.ZERO, metric.get());
- tester.clock().advance(Duration.ofDays(2)); // Thursday at 10:00 (11:00 CET)
- assertEquals("Upgrade is overdue measure relative to window 3", Duration.ofHours(34), metric.get());
+ tester.clock().advance(Duration.ofDays(2)); // Thursday at 10:30 (11:30 CET)
+ assertEquals("Upgrade is overdue measure relative to window 3", Duration.ofHours(34).plusMinutes(30), metric.get());
}
@Test