aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2022-04-21 13:35:43 +0200
committerjonmv <venstad@gmail.com>2022-04-21 13:35:43 +0200
commit5ce2e40475f0ad660acc96dca93d67f6a148eb99 (patch)
treee2b4085bc26d8f818680327bcd25ea04a444e0dc /controller-server
parent07ac44f06b5045523c91a86e77076ae1303cd114 (diff)
Update badges with new mustard colour for noTests and aborted, and success a bit greener
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/Badges.java40
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java28
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/BadgeApiTest.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history.svg42
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history2.svg42
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/overview.svg16
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-done.svg10
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-running.svg8
8 files changed, 132 insertions, 62 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/Badges.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/Badges.java
index 6ebe010326c..7b4f2fec853 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/Badges.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/Badges.java
@@ -52,14 +52,18 @@ public class Badges {
return widthOf(text, 11);
}
- static String colorOf(Run run, Boolean wasOk) {
+ static String colorOf(Run run, Optional<RunStatus> previous) {
switch (run.status()) {
- case running:
- return wasOk ? "url(#run-on-success)" : "url(#run-on-failure)";
- case success:
- return success;
- default:
- return failure;
+ case running: switch (previous.orElse(RunStatus.success)) {
+ case success: return "url(#run-on-success)";
+ case aborted:
+ case noTests: return "url(#run-on-warning)";
+ default: return "url(#run-on-failure)";
+ }
+ case success: return success;
+ case aborted:
+ case noTests: return warning;
+ default: return failure;
}
}
@@ -72,9 +76,10 @@ public class Badges {
static final double xPad = 6;
static final double logoSize = 16;
static final String dark = "#404040";
- static final String success = "#00f244";
+ static final String success = "#00f844";
static final String running = "#ab83ff";
static final String failure = "#bf103c";
+ static final String warning = "#bd890b";
static void addText(List<String> texts, String text, double x, double width) {
addText(texts, text, x, width, 11);
@@ -117,13 +122,11 @@ public class Badges {
.limit(length)
.collect(toList());
- boolean isOk = status.lastCompleted().map(run -> run.status() == RunStatus.success).orElse(true);
-
text = lastTriggered.id().type().jobName();
textWidth = widthOf(text);
dx = xPad + textWidth + xPad;
addShade(sections, x, dx);
- sections.add(" <rect x='" + (x - 6) + "' rx='3' width='" + (dx + 6) + "' height='20' fill='" + colorOf(lastTriggered, isOk) + "'/>\n");
+ sections.add(" <rect x='" + (x - 6) + "' rx='3' width='" + (dx + 6) + "' height='20' fill='" + colorOf(lastTriggered, status.lastStatus()) + "'/>\n");
addShadow(sections, x + dx);
addText(texts, text, x + dx / 2, textWidth);
x += dx;
@@ -131,7 +134,7 @@ public class Badges {
dx = xPad * (192.0 / (32 + runs.size())); // Broader sections with shorter history.
for (Run run : runs) {
addShade(sections, x, dx);
- sections.add(" <rect x='" + (x - 6) + "' rx='3' width='" + (dx + 6) + "' height='20' fill='" + colorOf(run, null) + "'/>\n");
+ sections.add(" <rect x='" + (x - 6) + "' rx='3' width='" + (dx + 6) + "' height='20' fill='" + colorOf(run, Optional.empty()) + "'/>\n");
addShadow(sections, x + dx);
dx *= Math.pow(0.3, 1.0 / (runs.size() + 8)); // Gradually narrowing sections with age.
x += dx;
@@ -180,7 +183,7 @@ public class Badges {
text = nameOf(run.id().type());
textWidth = widthOf(text, isTest ? 9 : 11);
dx = xPad + textWidth + (isTest ? 0 : xPad);
- boolean wasOk = jobs.get(run.id().job()).flatMap(JobStatus::lastStatus).map(RunStatus.success::equals).orElse(true);
+ Optional<RunStatus> previous = jobs.get(run.id().job()).flatMap(JobStatus::lastStatus);
addText(texts, text, x + (dx - (isTest ? xPad : 0)) / 2, textWidth, isTest ? 9 : 11);
@@ -198,10 +201,10 @@ public class Badges {
// Add colored section for job ...
if (test == null)
- sections.add(" <rect x='" + (x - 16) + "' rx='3' width='" + (dx + 16) + "' height='20' fill='" + colorOf(run, wasOk) + "'/>\n");
+ sections.add(" <rect x='" + (x - 16) + "' rx='3' width='" + (dx + 16) + "' height='20' fill='" + colorOf(run, previous) + "'/>\n");
// ... with a slant if a test is next.
else
- sections.add(" <polygon points='" + (x - 6) + " 0 " + (x - 6) + " 20 " + (x + dx - 7) + " 20 " + (x + dx + 1) + " 0' fill='" + colorOf(run, wasOk) + "'/>\n");
+ sections.add(" <polygon points='" + (x - 6) + " 0 " + (x - 6) + " 20 " + (x + dx - 7) + " 20 " + (x + dx + 1) + " 0' fill='" + colorOf(run, previous) + "'/>\n");
// Cast a shadow onto the next zone ...
if (test == null)
@@ -256,6 +259,13 @@ public class Badges {
" <animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />\n" +
" <animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />\n" +
" </linearGradient>\n" +
+ // Running color sloshing back and forth on top of the warning color.
+ " <linearGradient id='run-on-warning' x1='40%' x2='80%' y2='0%'>\n" +
+ " <stop offset='0' stop-color='" + running + "' />\n" +
+ " <stop offset='1' stop-color='" + warning + "' />\n" +
+ " <animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />\n" +
+ " <animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />\n" +
+ " </linearGradient>\n" +
// Running color sloshing back and forth on top of the success color.
" <linearGradient id='run-on-success' x1='40%' x2='80%' y2='0%'>\n" +
" <stop offset='0' stop-color='" + running + "' />\n" +
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
index 9685decda84..3765f815e49 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
@@ -403,8 +403,34 @@ public class DeploymentContext {
return runJob(type, instanceId);
}
+ /** Runs the job, failing tests with noTests status, or with regular testFailure. */
+ public DeploymentContext failTests(JobType type, boolean noTests) {
+ if ( ! type.isTest()) throw new IllegalArgumentException(type + " does not run tests");
+ var job = new JobId(instanceId, type);
+ triggerJobs();
+ doDeploy(job);
+ if (job.type().isDeployment()) {
+ doUpgrade(job);
+ doConverge(job);
+ if (job.type().environment().isManuallyDeployed())
+ return this;
+ }
+
+ RunId id = currentRun(job).id();
+ ZoneId zone = zone(job);
+
+ assertEquals(unfinished, jobs.run(id).get().stepStatuses().get(Step.endTests));
+ tester.cloud().set(noTests ? Status.NO_TESTS : Status.FAILURE);
+ runner.advance(currentRun(job));
+ assertTrue(jobs.run(id).get().hasEnded());
+ assertEquals(noTests, jobs.run(id).get().hasSucceeded());
+ assertTrue(configServer().nodeRepository().list(zone, NodeFilter.all().applications(TesterId.of(instanceId).id())).isEmpty());
+
+ return this;
+ }
+
/** Pulls the ready job trigger, and then runs the whole of job for the given instance, successfully. */
- public DeploymentContext runJob(JobType type, ApplicationId instance) {
+ private DeploymentContext runJob(JobType type, ApplicationId instance) {
var job = new JobId(instance, type);
triggerJobs();
doDeploy(job);
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/BadgeApiTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/BadgeApiTest.java
index cf6453235d3..c195b623c11 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/BadgeApiTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/BadgeApiTest.java
@@ -44,11 +44,15 @@ public class BadgeApiTest extends ControllerContainerTest {
.runJob(JobType.productionApSoutheast1)
.failDeployment(JobType.testApSoutheast1);
application.submit(applicationPackage)
- .runJob(JobType.systemTest)
+ .failTests(JobType.systemTest, true)
.runJob(JobType.stagingTest);
for (int i = 0; i < 31; i++)
- application.failDeployment(JobType.productionUsWest1);
+ if ((i & 1) == 0)
+ application.failDeployment(JobType.productionUsWest1);
+ else
+ application.triggerJobs().abortJob(JobType.productionUsWest1);
application.triggerJobs();
+ tester.controller().applications().deploymentTrigger().reTrigger(application.instanceId(), JobType.systemTest, "reason");
tester.controller().applications().deploymentTrigger().reTrigger(application.instanceId(), JobType.testEuWest1, "reason");
tester.assertResponse(authenticatedRequest("http://localhost:8080/badge/v1/tenant/application/default"),
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history.svg b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history.svg
index 0e30796bae2..c0566ade33a 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history.svg
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history.svg
@@ -33,9 +33,15 @@
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
+ <linearGradient id='run-on-warning' x1='40%' x2='80%' y2='0%'>
+ <stop offset='0' stop-color='#ab83ff' />
+ <stop offset='1' stop-color='#bd890b' />
+ <animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
+ <animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
+ </linearGradient>
<linearGradient id='run-on-success' x1='40%' x2='80%' y2='0%'>
<stop offset='0' stop-color='#ab83ff' />
- <stop offset='1' stop-color='#00f244' />
+ <stop offset='1' stop-color='#00f844' />
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
@@ -44,100 +50,100 @@
</clipPath>
<g clip-path='url(#rounded)'>
<rect x='653.26809109179' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='646.1879570885093' rx='3' width='13.080134003280707' height='20' fill='#00f244'/>
+ <rect x='646.1879570885093' rx='3' width='13.080134003280707' height='20' fill='#00f844'/>
<rect x='646.1879570885093' rx='3' width='13.080134003280707' height='20' fill='url(#shade)'/>
<rect x='646.4043039211865' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='639.1078230852286' rx='3' width='13.296480835957981' height='20' fill='#00f244'/>
+ <rect x='639.1078230852286' rx='3' width='13.296480835957981' height='20' fill='#00f844'/>
<rect x='639.1078230852286' rx='3' width='13.296480835957981' height='20' fill='url(#shade)'/>
<rect x='639.3307808029524' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='631.8113422492706' rx='3' width='13.519438553681752' height='20' fill='#bf103c'/>
<rect x='631.8113422492706' rx='3' width='13.519438553681752' height='20' fill='url(#shade)'/>
<rect x='632.0411128600877' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='624.2919036955889' rx='3' width='13.749209164498811' height='20' fill='#bf103c'/>
+ <rect x='624.2919036955889' rx='3' width='13.749209164498811' height='20' fill='#bd890b'/>
<rect x='624.2919036955889' rx='3' width='13.749209164498811' height='20' fill='url(#shade)'/>
<rect x='624.5286953802824' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='616.5426945310901' rx='3' width='13.986000849192376' height='20' fill='#bf103c'/>
<rect x='616.5426945310901' rx='3' width='13.986000849192376' height='20' fill='url(#shade)'/>
<rect x='616.7867218317995' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='608.5566936818977' rx='3' width='14.230028149901685' height='20' fill='#bf103c'/>
+ <rect x='608.5566936818977' rx='3' width='14.230028149901685' height='20' fill='#bd890b'/>
<rect x='608.5566936818977' rx='3' width='14.230028149901685' height='20' fill='url(#shade)'/>
<rect x='608.8081776965013' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='600.326665531996' rx='3' width='14.48151216450522' height='20' fill='#bf103c'/>
<rect x='600.326665531996' rx='3' width='14.48151216450522' height='20' fill='url(#shade)'/>
<rect x='600.5858341144344' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='591.8451533674908' rx='3' width='14.740680746943664' height='20' fill='#bf103c'/>
+ <rect x='591.8451533674908' rx='3' width='14.740680746943664' height='20' fill='#bd890b'/>
<rect x='591.8451533674908' rx='3' width='14.740680746943664' height='20' fill='url(#shade)'/>
<rect x='592.1122413342111' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='583.1044726205471' rx='3' width='15.007768713664104' height='20' fill='#bf103c'/>
<rect x='583.1044726205471' rx='3' width='15.007768713664104' height='20' fill='url(#shade)'/>
<rect x='583.3797219632555' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='574.096703906883' rx='3' width='15.283018056372542' height='20' fill='#bf103c'/>
+ <rect x='574.096703906883' rx='3' width='15.283018056372542' height='20' fill='#bd890b'/>
<rect x='574.096703906883' rx='3' width='15.283018056372542' height='20' fill='url(#shade)'/>
<rect x='574.380364011798' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='564.8136858505105' rx='3' width='15.566678161287442' height='20' fill='#bf103c'/>
<rect x='564.8136858505105' rx='3' width='15.566678161287442' height='20' fill='url(#shade)'/>
<rect x='565.1060137243161' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='555.2470076892231' rx='3' width='15.859006035092985' height='20' fill='#bf103c'/>
+ <rect x='555.2470076892231' rx='3' width='15.859006035092985' height='20' fill='#bd890b'/>
<rect x='555.2470076892231' rx='3' width='15.859006035092985' height='20' fill='url(#shade)'/>
<rect x='555.5482681919269' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='545.3880016541301' rx='3' width='16.16026653779677' height='20' fill='#bf103c'/>
<rect x='545.3880016541301' rx='3' width='16.16026653779677' height='20' fill='url(#shade)'/>
<rect x='545.6984677390362' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='535.2277351163333' rx='3' width='16.470732622702883' height='20' fill='#bf103c'/>
+ <rect x='535.2277351163333' rx='3' width='16.470732622702883' height='20' fill='#bd890b'/>
<rect x='535.2277351163333' rx='3' width='16.470732622702883' height='20' fill='url(#shade)'/>
<rect x='535.5476880773482' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='524.7570024936304' rx='3' width='16.790685583717845' height='20' fill='#bf103c'/>
<rect x='524.7570024936304' rx='3' width='16.790685583717845' height='20' fill='url(#shade)'/>
<rect x='525.0867322201259' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='513.9663169099125' rx='3' width='17.12041531021341' height='20' fill='#bf103c'/>
+ <rect x='513.9663169099125' rx='3' width='17.12041531021341' height='20' fill='#bd890b'/>
<rect x='513.9663169099125' rx='3' width='17.12041531021341' height='20' fill='url(#shade)'/>
<rect x='514.3061221493763' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='502.84590159969906' rx='3' width='17.460220549677203' height='20' fill='#bf103c'/>
<rect x='502.84590159969906' rx='3' width='17.460220549677203' height='20' fill='url(#shade)'/>
<rect x='503.196090228411' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='491.38568105002184' rx='3' width='17.810409178389147' height='20' fill='#bf103c'/>
+ <rect x='491.38568105002184' rx='3' width='17.810409178389147' height='20' fill='#bd890b'/>
<rect x='491.38568105002184' rx='3' width='17.810409178389147' height='20' fill='url(#shade)'/>
<rect x='491.7465703520016' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='479.5752718716327' rx='3' width='18.171298480368904' height='20' fill='#bf103c'/>
<rect x='479.5752718716327' rx='3' width='18.171298480368904' height='20' fill='url(#shade)'/>
<rect x='479.9471888261109' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='467.40397339126383' rx='3' width='18.543215434847077' height='20' fill='#bf103c'/>
+ <rect x='467.40397339126383' rx='3' width='18.543215434847077' height='20' fill='#bd890b'/>
<rect x='467.40397339126383' rx='3' width='18.543215434847077' height='20' fill='url(#shade)'/>
<rect x='467.7872549689374' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='454.86075795641676' rx='3' width='18.92649701252067' height='20' fill='#bf103c'/>
<rect x='454.86075795641676' rx='3' width='18.92649701252067' height='20' fill='url(#shade)'/>
<rect x='455.25575142475725' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='441.9342609438961' rx='3' width='19.32149048086113' height='20' fill='#bf103c'/>
+ <rect x='441.9342609438961' rx='3' width='19.32149048086113' height='20' fill='#bd890b'/>
<rect x='441.9342609438961' rx='3' width='19.32149048086113' height='20' fill='url(#shade)'/>
<rect x='442.3413241817867' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='428.61277046303496' rx='3' width='19.728553718751726' height='20' fill='#bf103c'/>
<rect x='428.61277046303496' rx='3' width='19.728553718751726' height='20' fill='url(#shade)'/>
<rect x='429.03227228502243' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='414.8842167442832' rx='3' width='20.148055540739207' height='20' fill='#bf103c'/>
+ <rect x='414.8842167442832' rx='3' width='20.148055540739207' height='20' fill='#bd890b'/>
<rect x='414.8842167442832' rx='3' width='20.148055540739207' height='20' fill='url(#shade)'/>
<rect x='415.31653723473755' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='400.736161203544' rx='3' width='20.58037603119359' height='20' fill='#bf103c'/>
<rect x='400.736161203544' rx='3' width='20.58037603119359' height='20' fill='url(#shade)'/>
<rect x='401.1816920610293' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='386.1557851723504' rx='3' width='21.025906888678875' height='20' fill='#bf103c'/>
+ <rect x='386.1557851723504' rx='3' width='21.025906888678875' height='20' fill='#bd890b'/>
<rect x='386.1557851723504' rx='3' width='21.025906888678875' height='20' fill='url(#shade)'/>
<rect x='386.61493006451815' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='371.12987828367153' rx='3' width='21.485051780846597' height='20' fill='#bf103c'/>
<rect x='371.12987828367153' rx='3' width='21.485051780846597' height='20' fill='url(#shade)'/>
<rect x='371.60305321299876' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='355.6448265028249' rx='3' width='21.958226710173836' height='20' fill='#bf103c'/>
+ <rect x='355.6448265028249' rx='3' width='21.958226710173836' height='20' fill='#bd890b'/>
<rect x='355.6448265028249' rx='3' width='21.958226710173836' height='20' fill='url(#shade)'/>
<rect x='356.13246018352817' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='339.68659979265107' rx='3' width='22.445860390877083' height='20' fill='#bf103c'/>
<rect x='339.68659979265107' rx='3' width='22.445860390877083' height='20' fill='url(#shade)'/>
<rect x='340.18913403911733' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='323.24073940177396' rx='3' width='22.948394637343355' height='20' fill='#bf103c'/>
+ <rect x='323.24073940177396' rx='3' width='22.948394637343355' height='20' fill='#bd890b'/>
<rect x='323.24073940177396' rx='3' width='22.948394637343355' height='20' fill='url(#shade)'/>
<rect x='323.7586295288612' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='306.2923447644306' rx='3' width='23.466284764430597' height='20' fill='#bf103c'/>
<rect x='306.2923447644306' rx='3' width='23.466284764430597' height='20' fill='url(#shade)'/>
<rect x='306.82606' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='288.82606' rx='3' width='24.0' height='20' fill='#bf103c'/>
+ <rect x='288.82606' rx='3' width='24.0' height='20' fill='#bd890b'/>
<rect x='288.82606' rx='3' width='24.0' height='20' fill='url(#shade)'/>
<rect x='288.82606' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='163.18729000000002' rx='3' width='131.63876999999997' height='20' fill='url(#run-on-failure)'/>
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history2.svg b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history2.svg
index 73d65b08b69..e527fa8d80f 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history2.svg
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/history2.svg
@@ -33,9 +33,15 @@
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
+ <linearGradient id='run-on-warning' x1='40%' x2='80%' y2='0%'>
+ <stop offset='0' stop-color='#ab83ff' />
+ <stop offset='1' stop-color='#bd890b' />
+ <animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
+ <animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
+ </linearGradient>
<linearGradient id='run-on-success' x1='40%' x2='80%' y2='0%'>
<stop offset='0' stop-color='#ab83ff' />
- <stop offset='1' stop-color='#00f244' />
+ <stop offset='1' stop-color='#00f844' />
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
@@ -44,103 +50,103 @@
</clipPath>
<g clip-path='url(#rounded)'>
<rect x='653.26809109179' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='646.1879570885093' rx='3' width='13.080134003280707' height='20' fill='#00f244'/>
+ <rect x='646.1879570885093' rx='3' width='13.080134003280707' height='20' fill='#00f844'/>
<rect x='646.1879570885093' rx='3' width='13.080134003280707' height='20' fill='url(#shade)'/>
<rect x='646.4043039211865' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='639.1078230852286' rx='3' width='13.296480835957981' height='20' fill='#bf103c'/>
<rect x='639.1078230852286' rx='3' width='13.296480835957981' height='20' fill='url(#shade)'/>
<rect x='639.3307808029524' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='631.8113422492706' rx='3' width='13.519438553681752' height='20' fill='#bf103c'/>
+ <rect x='631.8113422492706' rx='3' width='13.519438553681752' height='20' fill='#bd890b'/>
<rect x='631.8113422492706' rx='3' width='13.519438553681752' height='20' fill='url(#shade)'/>
<rect x='632.0411128600877' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='624.2919036955889' rx='3' width='13.749209164498811' height='20' fill='#bf103c'/>
<rect x='624.2919036955889' rx='3' width='13.749209164498811' height='20' fill='url(#shade)'/>
<rect x='624.5286953802824' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='616.5426945310901' rx='3' width='13.986000849192376' height='20' fill='#bf103c'/>
+ <rect x='616.5426945310901' rx='3' width='13.986000849192376' height='20' fill='#bd890b'/>
<rect x='616.5426945310901' rx='3' width='13.986000849192376' height='20' fill='url(#shade)'/>
<rect x='616.7867218317995' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='608.5566936818977' rx='3' width='14.230028149901685' height='20' fill='#bf103c'/>
<rect x='608.5566936818977' rx='3' width='14.230028149901685' height='20' fill='url(#shade)'/>
<rect x='608.8081776965013' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='600.326665531996' rx='3' width='14.48151216450522' height='20' fill='#bf103c'/>
+ <rect x='600.326665531996' rx='3' width='14.48151216450522' height='20' fill='#bd890b'/>
<rect x='600.326665531996' rx='3' width='14.48151216450522' height='20' fill='url(#shade)'/>
<rect x='600.5858341144344' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='591.8451533674908' rx='3' width='14.740680746943664' height='20' fill='#bf103c'/>
<rect x='591.8451533674908' rx='3' width='14.740680746943664' height='20' fill='url(#shade)'/>
<rect x='592.1122413342111' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='583.1044726205471' rx='3' width='15.007768713664104' height='20' fill='#bf103c'/>
+ <rect x='583.1044726205471' rx='3' width='15.007768713664104' height='20' fill='#bd890b'/>
<rect x='583.1044726205471' rx='3' width='15.007768713664104' height='20' fill='url(#shade)'/>
<rect x='583.3797219632555' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='574.096703906883' rx='3' width='15.283018056372542' height='20' fill='#bf103c'/>
<rect x='574.096703906883' rx='3' width='15.283018056372542' height='20' fill='url(#shade)'/>
<rect x='574.380364011798' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='564.8136858505105' rx='3' width='15.566678161287442' height='20' fill='#bf103c'/>
+ <rect x='564.8136858505105' rx='3' width='15.566678161287442' height='20' fill='#bd890b'/>
<rect x='564.8136858505105' rx='3' width='15.566678161287442' height='20' fill='url(#shade)'/>
<rect x='565.1060137243161' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='555.2470076892231' rx='3' width='15.859006035092985' height='20' fill='#bf103c'/>
<rect x='555.2470076892231' rx='3' width='15.859006035092985' height='20' fill='url(#shade)'/>
<rect x='555.5482681919269' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='545.3880016541301' rx='3' width='16.16026653779677' height='20' fill='#bf103c'/>
+ <rect x='545.3880016541301' rx='3' width='16.16026653779677' height='20' fill='#bd890b'/>
<rect x='545.3880016541301' rx='3' width='16.16026653779677' height='20' fill='url(#shade)'/>
<rect x='545.6984677390362' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='535.2277351163333' rx='3' width='16.470732622702883' height='20' fill='#bf103c'/>
<rect x='535.2277351163333' rx='3' width='16.470732622702883' height='20' fill='url(#shade)'/>
<rect x='535.5476880773482' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='524.7570024936304' rx='3' width='16.790685583717845' height='20' fill='#bf103c'/>
+ <rect x='524.7570024936304' rx='3' width='16.790685583717845' height='20' fill='#bd890b'/>
<rect x='524.7570024936304' rx='3' width='16.790685583717845' height='20' fill='url(#shade)'/>
<rect x='525.0867322201259' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='513.9663169099125' rx='3' width='17.12041531021341' height='20' fill='#bf103c'/>
<rect x='513.9663169099125' rx='3' width='17.12041531021341' height='20' fill='url(#shade)'/>
<rect x='514.3061221493763' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='502.84590159969906' rx='3' width='17.460220549677203' height='20' fill='#bf103c'/>
+ <rect x='502.84590159969906' rx='3' width='17.460220549677203' height='20' fill='#bd890b'/>
<rect x='502.84590159969906' rx='3' width='17.460220549677203' height='20' fill='url(#shade)'/>
<rect x='503.196090228411' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='491.38568105002184' rx='3' width='17.810409178389147' height='20' fill='#bf103c'/>
<rect x='491.38568105002184' rx='3' width='17.810409178389147' height='20' fill='url(#shade)'/>
<rect x='491.7465703520016' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='479.5752718716327' rx='3' width='18.171298480368904' height='20' fill='#bf103c'/>
+ <rect x='479.5752718716327' rx='3' width='18.171298480368904' height='20' fill='#bd890b'/>
<rect x='479.5752718716327' rx='3' width='18.171298480368904' height='20' fill='url(#shade)'/>
<rect x='479.9471888261109' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='467.40397339126383' rx='3' width='18.543215434847077' height='20' fill='#bf103c'/>
<rect x='467.40397339126383' rx='3' width='18.543215434847077' height='20' fill='url(#shade)'/>
<rect x='467.7872549689374' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='454.86075795641676' rx='3' width='18.92649701252067' height='20' fill='#bf103c'/>
+ <rect x='454.86075795641676' rx='3' width='18.92649701252067' height='20' fill='#bd890b'/>
<rect x='454.86075795641676' rx='3' width='18.92649701252067' height='20' fill='url(#shade)'/>
<rect x='455.25575142475725' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='441.9342609438961' rx='3' width='19.32149048086113' height='20' fill='#bf103c'/>
<rect x='441.9342609438961' rx='3' width='19.32149048086113' height='20' fill='url(#shade)'/>
<rect x='442.3413241817867' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='428.61277046303496' rx='3' width='19.728553718751726' height='20' fill='#bf103c'/>
+ <rect x='428.61277046303496' rx='3' width='19.728553718751726' height='20' fill='#bd890b'/>
<rect x='428.61277046303496' rx='3' width='19.728553718751726' height='20' fill='url(#shade)'/>
<rect x='429.03227228502243' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='414.8842167442832' rx='3' width='20.148055540739207' height='20' fill='#bf103c'/>
<rect x='414.8842167442832' rx='3' width='20.148055540739207' height='20' fill='url(#shade)'/>
<rect x='415.31653723473755' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='400.736161203544' rx='3' width='20.58037603119359' height='20' fill='#bf103c'/>
+ <rect x='400.736161203544' rx='3' width='20.58037603119359' height='20' fill='#bd890b'/>
<rect x='400.736161203544' rx='3' width='20.58037603119359' height='20' fill='url(#shade)'/>
<rect x='401.1816920610293' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='386.1557851723504' rx='3' width='21.025906888678875' height='20' fill='#bf103c'/>
<rect x='386.1557851723504' rx='3' width='21.025906888678875' height='20' fill='url(#shade)'/>
<rect x='386.61493006451815' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='371.12987828367153' rx='3' width='21.485051780846597' height='20' fill='#bf103c'/>
+ <rect x='371.12987828367153' rx='3' width='21.485051780846597' height='20' fill='#bd890b'/>
<rect x='371.12987828367153' rx='3' width='21.485051780846597' height='20' fill='url(#shade)'/>
<rect x='371.60305321299876' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='355.6448265028249' rx='3' width='21.958226710173836' height='20' fill='#bf103c'/>
<rect x='355.6448265028249' rx='3' width='21.958226710173836' height='20' fill='url(#shade)'/>
<rect x='356.13246018352817' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='339.68659979265107' rx='3' width='22.445860390877083' height='20' fill='#bf103c'/>
+ <rect x='339.68659979265107' rx='3' width='22.445860390877083' height='20' fill='#bd890b'/>
<rect x='339.68659979265107' rx='3' width='22.445860390877083' height='20' fill='url(#shade)'/>
<rect x='340.18913403911733' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='323.24073940177396' rx='3' width='22.948394637343355' height='20' fill='#bf103c'/>
<rect x='323.24073940177396' rx='3' width='22.948394637343355' height='20' fill='url(#shade)'/>
<rect x='323.7586295288612' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='306.2923447644306' rx='3' width='23.466284764430597' height='20' fill='#bf103c'/>
+ <rect x='306.2923447644306' rx='3' width='23.466284764430597' height='20' fill='#bd890b'/>
<rect x='306.2923447644306' rx='3' width='23.466284764430597' height='20' fill='url(#shade)'/>
<rect x='306.82606' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='288.82606' rx='3' width='24.0' height='20' fill='#bf103c'/>
<rect x='288.82606' rx='3' width='24.0' height='20' fill='url(#shade)'/>
<rect x='288.82606' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='163.18729000000002' rx='3' width='131.63876999999997' height='20' fill='#00f244'/>
+ <rect x='163.18729000000002' rx='3' width='131.63876999999997' height='20' fill='#00f844'/>
<rect x='163.18729000000002' rx='3' width='131.63876999999997' height='20' fill='url(#shade)'/>
<rect width='169.18729000000002' height='20' fill='#404040'/>
<rect x='-6.0' rx='3' width='175.18729000000002' height='20' fill='url(#shade)'/>
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/overview.svg b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/overview.svg
index dde2b740e37..a0005ed6d76 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/overview.svg
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/overview.svg
@@ -33,9 +33,15 @@
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
+ <linearGradient id='run-on-warning' x1='40%' x2='80%' y2='0%'>
+ <stop offset='0' stop-color='#ab83ff' />
+ <stop offset='1' stop-color='#bd890b' />
+ <animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
+ <animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
+ </linearGradient>
<linearGradient id='run-on-success' x1='40%' x2='80%' y2='0%'>
<stop offset='0' stop-color='#ab83ff' />
- <stop offset='1' stop-color='#00f244' />
+ <stop offset='1' stop-color='#00f844' />
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
@@ -45,21 +51,21 @@
<g clip-path='url(#rounded)'>
<rect x='757.7809900000001' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='725.59036' rx='3' width='38.19063' height='20' fill='url(#run-on-success)'/>
- <polygon points='635.8470950000001 0 635.8470950000001 20 734.59036 20 742.59036 0' fill='#00f244'/>
+ <polygon points='635.8470950000001 0 635.8470950000001 20 734.59036 20 742.59036 0' fill='#00f844'/>
<rect x='635.8470950000001' rx='3' width='131.74345499999998' height='20' fill='url(#shade)'/>
<rect x='635.8470950000001' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='603.656465' rx='3' width='38.19063' height='20' fill='#bf103c'/>
- <polygon points='486.981225 0 486.981225 20 612.656465 20 620.656465 0' fill='#00f244'/>
+ <polygon points='486.981225 0 486.981225 20 612.656465 20 620.656465 0' fill='#00f844'/>
<rect x='486.981225' rx='3' width='158.67543' height='20' fill='url(#shade)'/>
<rect x='486.981225' rx='3' width='8' height='20' fill='url(#shadow)'/>
<rect x='348.865175' rx='3' width='144.11604999999997' height='20' fill='url(#run-on-success)'/>
<rect x='358.865175' rx='3' width='134.11604999999997' height='20' fill='url(#shade)'/>
<rect x='358.865175' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='326.674545' rx='3' width='38.19063' height='20' fill='#00f244'/>
+ <rect x='326.674545' rx='3' width='38.19063' height='20' fill='#00f844'/>
<polygon points='237.71563000000003 0 237.71563000000003 20 335.674545 20 343.674545 0' fill='url(#run-on-failure)'/>
<rect x='237.71563000000003' rx='3' width='130.959105' height='20' fill='url(#shade)'/>
<rect x='237.71563000000003' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='153.18729000000002' rx='3' width='90.52834000000001' height='20' fill='#00f244'/>
+ <rect x='153.18729000000002' rx='3' width='90.52834000000001' height='20' fill='url(#run-on-warning)'/>
<rect x='163.18729000000002' rx='3' width='80.52834000000001' height='20' fill='url(#shade)'/>
<rect width='169.18729000000002' height='20' fill='#404040'/>
<rect x='-6.0' rx='3' width='175.18729000000002' height='20' fill='url(#shade)'/>
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-done.svg b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-done.svg
index 3bcbed97499..0bdaa3f30ad 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-done.svg
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-done.svg
@@ -33,9 +33,15 @@
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
+ <linearGradient id='run-on-warning' x1='40%' x2='80%' y2='0%'>
+ <stop offset='0' stop-color='#ab83ff' />
+ <stop offset='1' stop-color='#bd890b' />
+ <animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
+ <animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
+ </linearGradient>
<linearGradient id='run-on-success' x1='40%' x2='80%' y2='0%'>
<stop offset='0' stop-color='#ab83ff' />
- <stop offset='1' stop-color='#00f244' />
+ <stop offset='1' stop-color='#00f844' />
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
@@ -44,7 +50,7 @@
</clipPath>
<g clip-path='url(#rounded)'>
<rect x='288.82606' rx='3' width='8' height='20' fill='url(#shadow)'/>
- <rect x='163.18729000000002' rx='3' width='131.63876999999997' height='20' fill='#00f244'/>
+ <rect x='163.18729000000002' rx='3' width='131.63876999999997' height='20' fill='#00f844'/>
<rect x='163.18729000000002' rx='3' width='131.63876999999997' height='20' fill='url(#shade)'/>
<rect width='169.18729000000002' height='20' fill='#404040'/>
<rect x='-6.0' rx='3' width='175.18729000000002' height='20' fill='url(#shade)'/>
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-running.svg b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-running.svg
index 27e967f8e46..1a38228e75d 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-running.svg
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/deployment/responses/single-running.svg
@@ -33,9 +33,15 @@
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>
+ <linearGradient id='run-on-warning' x1='40%' x2='80%' y2='0%'>
+ <stop offset='0' stop-color='#ab83ff' />
+ <stop offset='1' stop-color='#bd890b' />
+ <animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
+ <animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
+ </linearGradient>
<linearGradient id='run-on-success' x1='40%' x2='80%' y2='0%'>
<stop offset='0' stop-color='#ab83ff' />
- <stop offset='1' stop-color='#00f244' />
+ <stop offset='1' stop-color='#00f844' />
<animate attributeName='x1' values='-110%;150%;20%;-110%' dur='6s' repeatCount='indefinite' />
<animate attributeName='x2' values='-10%;250%;120%;-10%' dur='6s' repeatCount='indefinite' />
</linearGradient>