summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md3
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java47
-rw-r--r--config-model-api/src/main/java/com/yahoo/config/application/api/TimeWindow.java141
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java28
-rw-r--r--config-model-api/src/test/java/com/yahoo/config/application/api/TimeWindowTest.java143
-rw-r--r--config-model/src/main/resources/schema/deployment.rnc7
-rw-r--r--config-model/src/test/schema-test-files/deployment.xml2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionRepo.java6
-rw-r--r--container-dependencies-enforcer/pom.xml201
9 files changed, 470 insertions, 108 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index a2690f6d127..e1cb205e5a5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -30,6 +30,9 @@ It is fine to submit issues also for feature requests and ideas, whether or not
There is also a [ToDo list](TODO.md) for larger things which nobody are working on yet.
+## Community
+If you have questions, want to share your experience or help others, please join our community on [Stack Overflow](http://stackoverflow.com/questions/tagged/vespa).
+
### Getting started
See [README](README.md) for how to build and test Vespa.
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
index 098f5620723..e75ba5871f7 100644
--- a/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/DeploymentSpec.java
@@ -13,6 +13,7 @@ import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.time.Duration;
+import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -39,25 +40,29 @@ import java.util.stream.Collectors;
public class DeploymentSpec {
/** The empty deployment spec, specifying no zones or rotation, and defaults for all settings */
- public static final DeploymentSpec empty = new DeploymentSpec(Optional.empty(),
- UpgradePolicy.defaultPolicy,
- ImmutableList.of(),
+ public static final DeploymentSpec empty = new DeploymentSpec(Optional.empty(),
+ UpgradePolicy.defaultPolicy,
+ Collections.emptyList(),
+ Collections.emptyList(),
"<deployment version='1.0'/>");
private final Optional<String> globalServiceId;
private final UpgradePolicy upgradePolicy;
+ private final List<TimeWindow> blockUpgrades;
private final List<Step> steps;
private final String xmlForm;
- public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy, List<Step> steps) {
- this(globalServiceId, upgradePolicy, steps, null);
+ public DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy,
+ List<TimeWindow> blockUpgrades, List<Step> steps) {
+ this(globalServiceId, upgradePolicy, blockUpgrades, steps, null);
}
- private DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy,
- List<Step> steps, String xmlForm) {
+ private DeploymentSpec(Optional<String> globalServiceId, UpgradePolicy upgradePolicy,
+ List<TimeWindow> blockUpgrades, List<Step> steps, String xmlForm) {
validateTotalDelay(steps);
this.globalServiceId = globalServiceId;
this.upgradePolicy = upgradePolicy;
+ this.blockUpgrades = blockUpgrades;
this.steps = ImmutableList.copyOf(completeSteps(new ArrayList<>(steps)));
this.xmlForm = xmlForm;
validateZones(this.steps);
@@ -137,6 +142,14 @@ public class DeploymentSpec {
/** Returns the upgrade policy of this, which is defaultPolicy if none is specified */
public UpgradePolicy upgradePolicy() { return upgradePolicy; }
+ /** Returns whether upgrade can occur at the given instant */
+ public boolean canUpgradeAt(Instant instant) {
+ return blockUpgrades.stream().noneMatch(timeWindow -> timeWindow.includes(instant));
+ }
+
+ /** Returns time windows where upgrade is disallowed */
+ public List<TimeWindow> blockUpgrades() { return blockUpgrades; }
+
/** Returns the deployment steps of this in the order they will be performed */
public List<Step> steps() { return steps; }
@@ -210,7 +223,8 @@ public class DeploymentSpec {
else if (readGlobalServiceId(environmentTag).isPresent())
throw new IllegalArgumentException("Attribute 'global-service-id' is only valid on 'prod' tag.");
}
- return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), steps, xmlForm);
+ return new DeploymentSpec(globalServiceId, readUpgradePolicy(root), readBlockUpgradeWindows(root), steps,
+ xmlForm);
}
/** Returns the given attribute as an integer, or 0 if it is not present */
@@ -244,6 +258,23 @@ public class DeploymentSpec {
return Optional.of(globalServiceId);
}
}
+
+ private static List<TimeWindow> readBlockUpgradeWindows(Element root) {
+ List<TimeWindow> timeWindows = new ArrayList<>();
+ for (Element tag : XML.getChildren(root)) {
+ if (!"block-upgrade".equals(tag.getTagName())) {
+ continue;
+ }
+ String daySpec = tag.getAttribute("days");
+ String hourSpec = tag.getAttribute("hours");
+ String zoneSpec = tag.getAttribute("time-zone");
+ if (zoneSpec.isEmpty()) { // Default to UTC time zone
+ zoneSpec = "UTC";
+ }
+ timeWindows.add(TimeWindow.from(daySpec, hourSpec, zoneSpec));
+ }
+ return Collections.unmodifiableList(timeWindows);
+ }
private static UpgradePolicy readUpgradePolicy(Element root) {
Element upgradeElement = XML.getChild(root, "upgrade");
diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/TimeWindow.java b/config-model-api/src/main/java/com/yahoo/config/application/api/TimeWindow.java
new file mode 100644
index 00000000000..40b5a5370e7
--- /dev/null
+++ b/config-model-api/src/main/java/com/yahoo/config/application/api/TimeWindow.java
@@ -0,0 +1,141 @@
+package com.yahoo.config.application.api;
+
+import java.time.DateTimeException;
+import java.time.DayOfWeek;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoField;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.TreeSet;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+/**
+ * This class represents a window of time for selected hours on selected days.
+ *
+ * @author mpolden
+ */
+public class TimeWindow {
+
+ private final List<DayOfWeek> days;
+ private final List<Integer> hours;
+ private final ZoneId zone;
+
+ private TimeWindow(List<DayOfWeek> days, List<Integer> hours, ZoneId zone) {
+ this.days = Collections.unmodifiableList(new ArrayList<>(new TreeSet<>(days)));
+ this.hours = Collections.unmodifiableList(new ArrayList<>(new TreeSet<>(hours)));
+ this.zone = zone;
+ }
+
+ /** Returns days in this time window */
+ public List<DayOfWeek> days() {
+ return days;
+ }
+
+ /** Returns hours in this time window */
+ public List<Integer> hours() {
+ return hours;
+ }
+
+ /** Returns the time zone of this time window */
+ public ZoneId zone() { return zone; }
+
+ /** Returns whether the given instant is in this time window */
+ public boolean includes(Instant instant) {
+ LocalDateTime dt = LocalDateTime.ofInstant(instant, zone);
+ return days.contains(dt.getDayOfWeek()) && hours.contains(dt.getHour());
+ }
+
+ @Override
+ public String toString() {
+ return "time window for hour(s) " +
+ hours.toString() +
+ " on " + days.stream().map(DayOfWeek::name)
+ .map(String::toLowerCase)
+ .collect(Collectors.toList()).toString() +
+ " in " + zone;
+ }
+
+ /** Parse a time window from the given day, hour and time zone specification */
+ public static TimeWindow from(String daySpec, String hourSpec, String zoneSpec) {
+ List<DayOfWeek> days = parse(daySpec, TimeWindow::parseDays);
+ List<Integer> hours = parse(hourSpec, TimeWindow::parseHours);
+ ZoneId zone = zoneFrom(zoneSpec);
+ return new TimeWindow(days, hours, zone);
+ }
+
+ /** Parse a specification, e.g. "1,4-5", using the given value parser */
+ private static <T> List<T> parse(String spec, BiFunction<String, String, List<T>> valueParser) {
+ List<T> values = new ArrayList<>();
+ String[] parts = spec.split(",");
+ for (String part : parts) {
+ if (part.contains("-")) {
+ String[] startAndEnd = part.split("-");
+ if (startAndEnd.length != 2) {
+ throw new IllegalArgumentException("Invalid range '" + part + "'");
+ }
+ values.addAll(valueParser.apply(startAndEnd[0], startAndEnd[1]));
+ } else {
+ values.addAll(valueParser.apply(part, part));
+ }
+ }
+ return Collections.unmodifiableList(values);
+ }
+
+ /** Returns a list of all hours occurring between startInclusive and endInclusive */
+ private static List<Integer> parseHours(String startInclusive, String endInclusive) {
+ int start = hourFrom(startInclusive);
+ int end = hourFrom(endInclusive);
+ if (end < start) {
+ throw new IllegalArgumentException(String.format("Invalid hour range '%s-%s'", startInclusive,
+ endInclusive));
+ }
+ return IntStream.rangeClosed(start, end).boxed()
+ .collect(Collectors.toList());
+ }
+
+ /** Returns a list of all days occurring between startInclusive and endInclusive */
+ private static List<DayOfWeek> parseDays(String startInclusive, String endInclusive) {
+ DayOfWeek start = dayFrom(startInclusive);
+ DayOfWeek end = dayFrom(endInclusive);
+ if (end.getValue() < start.getValue()) {
+ throw new IllegalArgumentException(String.format("Invalid day range '%s-%s'", startInclusive,
+ endInclusive));
+ }
+ return IntStream.rangeClosed(start.getValue(), end.getValue()).boxed()
+ .map(DayOfWeek::of)
+ .collect(Collectors.toList());
+ }
+
+ /** Parse day of week from string */
+ private static DayOfWeek dayFrom(String day) {
+ return Arrays.stream(DayOfWeek.values())
+ .filter(dayOfWeek -> day.length() >= 3 && dayOfWeek.name().toLowerCase().startsWith(day))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("Invalid day '" + day + "'"));
+ }
+
+ /** Parse hour from string */
+ private static int hourFrom(String hour) {
+ try {
+ return ChronoField.HOUR_OF_DAY.checkValidIntValue(Integer.parseInt(hour));
+ } catch (DateTimeException|NumberFormatException e) {
+ throw new IllegalArgumentException("Invalid hour '" + hour + "'", e);
+ }
+ }
+
+ /** Parse time zone from string */
+ private static ZoneId zoneFrom(String zone) {
+ try {
+ return ZoneId.of(zone);
+ } catch (DateTimeException e) {
+ throw new IllegalArgumentException("Invalid time zone '" + zone + "'", e);
+ }
+ }
+
+}
diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java
index 95f9963d6f4..3540a5d785f 100644
--- a/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java
+++ b/config-model-api/src/test/java/com/yahoo/config/application/api/DeploymentSpecTest.java
@@ -6,6 +6,8 @@ import com.yahoo.config.provision.RegionName;
import org.junit.Test;
import java.io.StringReader;
+import java.time.Instant;
+import java.time.ZoneId;
import java.util.Optional;
import static org.junit.Assert.assertEquals;
@@ -276,4 +278,30 @@ public class DeploymentSpecTest {
}
}
+ @Test
+ public void deploymentSpecWithBlockUpgrade() {
+ StringReader r = new StringReader(
+ "<deployment>\n" +
+ " <block-upgrade days='mon,tue' hours='15-16'/>\n" +
+ " <block-upgrade days='sat' hours='10' time-zone='CET'/>\n" +
+ " <prod>\n" +
+ " <region active='true'>us-west-1</region>\n" +
+ " </prod>\n" +
+ "</deployment>"
+ );
+ DeploymentSpec spec = DeploymentSpec.fromXml(r);
+ assertEquals(2, spec.blockUpgrades().size());
+ assertEquals(ZoneId.of("UTC"), spec.blockUpgrades().get(0).zone());
+ assertEquals(ZoneId.of("CET"), spec.blockUpgrades().get(1).zone());
+
+ assertTrue(spec.canUpgradeAt(Instant.parse("2017-09-18T14:15:30.00Z")));
+ assertFalse(spec.canUpgradeAt(Instant.parse("2017-09-18T15:15:30.00Z")));
+ assertFalse(spec.canUpgradeAt(Instant.parse("2017-09-18T16:15:30.00Z")));
+ assertTrue(spec.canUpgradeAt(Instant.parse("2017-09-18T17:15:30.00Z")));
+
+ assertTrue(spec.canUpgradeAt(Instant.parse("2017-09-23T09:15:30.00Z")));
+ assertFalse(spec.canUpgradeAt(Instant.parse("2017-09-23T08:15:30.00Z"))); // 10 in CET
+ assertTrue(spec.canUpgradeAt(Instant.parse("2017-09-23T10:15:30.00Z")));
+ }
+
}
diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/TimeWindowTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/TimeWindowTest.java
new file mode 100644
index 00000000000..86ce0466213
--- /dev/null
+++ b/config-model-api/src/test/java/com/yahoo/config/application/api/TimeWindowTest.java
@@ -0,0 +1,143 @@
+package com.yahoo.config.application.api;
+
+import org.junit.Test;
+
+import java.time.Instant;
+
+import static java.time.DayOfWeek.FRIDAY;
+import static java.time.DayOfWeek.MONDAY;
+import static java.time.DayOfWeek.SATURDAY;
+import static java.time.DayOfWeek.THURSDAY;
+import static java.time.DayOfWeek.TUESDAY;
+import static java.time.DayOfWeek.WEDNESDAY;
+import static java.util.Arrays.asList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @author mpolden
+ */
+public class TimeWindowTest {
+
+ @Test
+ public void includesInstant() {
+ {
+ TimeWindow tw = TimeWindow.from("mon", "10,11", "UTC");
+ Instant i0 = Instant.parse("2017-09-17T11:15:30.00Z"); // Wrong day
+ Instant i1 = Instant.parse("2017-09-18T09:15:30.00Z"); // Wrong hour
+ Instant i2 = Instant.parse("2017-09-18T10:15:30.00Z");
+ Instant i3 = Instant.parse("2017-09-18T11:15:30.00Z");
+ Instant i4 = Instant.parse("2017-09-18T12:15:30.00Z"); // Wrong hour
+ Instant i5 = Instant.parse("2017-09-19T11:15:30.00Z"); // Wrong day
+
+ assertFalse("Instant " + i0 + " is not in window", tw.includes(i0));
+ assertFalse("Instant " + i1 + " is not in window", tw.includes(i1));
+ assertTrue("Instant " + i2 + " is in window", tw.includes(i2));
+ assertTrue("Instant " + i3 + " is in window", tw.includes(i3));
+ assertFalse("Instant " + i4 + " is not in window", tw.includes(i4));
+ assertFalse("Instant " + i5 + " is not in window", tw.includes(i5));
+ }
+ {
+ TimeWindow tw = TimeWindow.from("mon", "12,13", "CET");
+ Instant i0 = Instant.parse("2017-09-17T11:15:30.00Z");
+ Instant i1 = Instant.parse("2017-09-18T09:15:30.00Z");
+ Instant i2 = Instant.parse("2017-09-18T10:15:30.00Z"); // Including offset this matches hour 12
+ Instant i3 = Instant.parse("2017-09-18T11:15:30.00Z"); // Including offset this matches hour 13
+ Instant i4 = Instant.parse("2017-09-18T12:15:30.00Z");
+ Instant i5 = Instant.parse("2017-09-19T11:15:30.00Z");
+ assertFalse("Instant " + i0 + " is not in window", tw.includes(i0));
+ assertFalse("Instant " + i1 + " is not in window", tw.includes(i1));
+ assertTrue("Instant " + i2 + " is in window", tw.includes(i2));
+ assertTrue("Instant " + i3 + " is in window", tw.includes(i3));
+ assertFalse("Instant " + i4 + " is not in window", tw.includes(i4));
+ assertFalse("Instant " + i5 + " is not in window", tw.includes(i5));
+ }
+ }
+
+ @Test
+ public void validWindows() {
+ {
+ TimeWindow fz = TimeWindow.from("fri", "8,17-19", "UTC");
+ assertEquals(asList(FRIDAY), fz.days());
+ assertEquals(asList(8, 17, 18, 19), fz.hours());
+ }
+ {
+ TimeWindow fz = TimeWindow.from("sat,", "8,17-19", "UTC");
+ assertEquals(asList(SATURDAY), fz.days());
+ assertEquals(asList(8, 17, 18, 19), fz.hours());
+ }
+ {
+ TimeWindow fz = TimeWindow.from("tue,sat", "0,3,7,10", "UTC");
+ assertEquals(asList(TUESDAY, SATURDAY), fz.days());
+ assertEquals(asList(0, 3, 7, 10), fz.hours());
+ }
+ {
+ TimeWindow fz = TimeWindow.from("mon,wed-thu", "0,17-19", "UTC");
+ assertEquals(asList(MONDAY, WEDNESDAY, THURSDAY), fz.days());
+ assertEquals(asList(0, 17, 18, 19), fz.hours());
+ }
+ {
+ // Full day names is allowed
+ TimeWindow fz = TimeWindow.from("monday,wednesday-thursday", "0,17-19", "UTC");
+ assertEquals(asList(MONDAY, WEDNESDAY, THURSDAY), fz.days());
+ assertEquals(asList(0, 17, 18, 19), fz.hours());
+ }
+ {
+ // Duplicate day and overlapping range is allowed
+ TimeWindow fz = TimeWindow.from("mon,wed-thu,mon", "3,1-4", "UTC");
+ assertEquals(asList(MONDAY, WEDNESDAY, THURSDAY), fz.days());
+ assertEquals(asList(1, 2, 3, 4), fz.hours());
+ }
+ }
+
+ @Test
+ public void invalidWindows() {
+ // Invalid time zone
+ assertInvalidZone("foo", "Invalid time zone 'foo'");
+
+ // Malformed day input
+ assertInvalidDays("", "Invalid day ''");
+ assertInvalidDays("foo-", "Invalid range 'foo-'");
+ assertInvalidDays("foo", "Invalid day 'foo'");
+ assertInvalidDays("f", "Invalid day 'f'");
+ // Window crossing week boundary is disallowed
+ assertInvalidDays("fri-tue", "Invalid day range 'fri-tue'");
+
+ // Malformed hour input
+ assertInvalidHours("", "Invalid hour ''");
+ assertInvalidHours("24", "Invalid hour '24'");
+ assertInvalidHours("-1-9", "Invalid range '-1-9'");
+ // Window crossing day boundary is disallowed
+ assertInvalidHours("23-1", "Invalid hour range '23-1'");
+ }
+
+ private static void assertInvalidZone(String zoneSpec, String exceptionMessage) {
+ try {
+ TimeWindow.from("mon", "1", zoneSpec);
+ fail("Expected exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals(exceptionMessage, e.getMessage());
+ }
+ }
+
+ private static void assertInvalidDays(String daySpec, String exceptionMessage) {
+ try {
+ TimeWindow.from(daySpec, "1", "UTC");
+ fail("Expected exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals(exceptionMessage, e.getMessage());
+ }
+ }
+
+ private static void assertInvalidHours(String hourSpec, String exceptionMessage) {
+ try {
+ TimeWindow.from("mon", hourSpec, "UTC");
+ fail("Expected exception");
+ } catch (IllegalArgumentException e) {
+ assertEquals(exceptionMessage, e.getMessage());
+ }
+ }
+
+}
diff --git a/config-model/src/main/resources/schema/deployment.rnc b/config-model/src/main/resources/schema/deployment.rnc
index 36897643964..31212b7f69d 100644
--- a/config-model/src/main/resources/schema/deployment.rnc
+++ b/config-model/src/main/resources/schema/deployment.rnc
@@ -5,6 +5,7 @@
start = element deployment {
attribute version { "1.0" } &
Upgrade? &
+ BlockUpgrade* &
Test? &
Staging? &
Prod*
@@ -14,6 +15,12 @@ Upgrade = element upgrade {
attribute policy { xsd:string }
}
+BlockUpgrade = element block-upgrade {
+ attribute days { xsd:string } &
+ attribute hours { xsd:string } &
+ attribute time-zone { xsd:string }?
+}
+
Test = element test {
text
}
diff --git a/config-model/src/test/schema-test-files/deployment.xml b/config-model/src/test/schema-test-files/deployment.xml
index 99b1dc1be69..6f16817e627 100644
--- a/config-model/src/test/schema-test-files/deployment.xml
+++ b/config-model/src/test/schema-test-files/deployment.xml
@@ -1,6 +1,8 @@
<!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -->
<deployment version='1.0'>
<upgrade policy='canary'/>
+ <block-upgrade days="mon,tue" hours="14,15"/>
+ <block-upgrade days="mon,tue" hours="14,15" time-zone="CET"/>
<test/>
<staging/>
<prod global-service-id='qrs'>
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionRepo.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionRepo.java
index d7c973617c2..659a44bb339 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionRepo.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionRepo.java
@@ -139,7 +139,7 @@ public class RemoteSessionRepo extends SessionRepo<RemoteSession> implements Nod
return sessions;
}
- synchronized void sessionsChanged() throws NumberFormatException {
+ private synchronized void sessionsChanged() throws NumberFormatException {
List<Long> sessions = getSessionList(directoryCache.getCurrentData());
checkForRemovedSessions(sessions);
checkForAddedSessions(sessions);
@@ -236,6 +236,9 @@ public class RemoteSessionRepo extends SessionRepo<RemoteSession> implements Nod
case CHILD_REMOVED:
sessionsChanged();
break;
+ case CONNECTION_RECONNECTED:
+ sessionsChanged();
+ break;
}
}
@@ -245,7 +248,6 @@ public class RemoteSessionRepo extends SessionRepo<RemoteSession> implements Nod
if (session == null) continue; // session might have been deleted after getting session list
log.log(LogLevel.DEBUG, session.logPre() + "Confirming upload for session " + sessionId);
session.confirmUpload();
-
}
}
}
diff --git a/container-dependencies-enforcer/pom.xml b/container-dependencies-enforcer/pom.xml
index 6aff62248d0..4720135b609 100644
--- a/container-dependencies-enforcer/pom.xml
+++ b/container-dependencies-enforcer/pom.xml
@@ -24,103 +24,108 @@
<scope>provided</scope>
</dependency>
</dependencies>
+ <profiles>
+ <profile>
+ <id>enforce-container-deps</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <property>
+ <!-- Dependency resolution is broken for old maven used in our CentOS docker containers -->
+ <name>maven.version</name>
+ <value>!3.0.5</value>
+ </property>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-enforcer-plugin</artifactId>
+ <version>3.0.0-M1</version>
+ <executions>
+ <execution>
+ <!-- To allow running 'mvn enforcer:enforce' from the command line -->
+ <id>default-cli</id>
+ <goals>
+ <goal>enforce</goal>
+ </goals>
+ <configuration>
+ <rules>
+ <bannedDependencies>
+ <excludes>
+ <!-- Only allow explicitly listed deps in provided scope -->
+ <exclude>*:*:*:jar:provided:*</exclude>
+ </excludes>
+ <includes>
+ <include>com.yahoo.vespa</include>
+ <include>aopalliance:aopalliance:1.0:jar:provided</include>
+ <include>com.fasterxml.jackson.core:jackson-annotations:2.8.3:jar:provided</include>
+ <include>com.fasterxml.jackson.core:jackson-core:2.8.3:jar:provided</include>
+ <include>com.fasterxml.jackson.core:jackson-databind:2.8.3:jar:provided</include>
+ <include>com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.3:jar:provided</include>
+ <include>com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:2.5.4:jar:provided</include>
+ <include>com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.5.4:jar:provided</include>
+ <include>com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.5.4:jar:provided</include>
+ <include>com.google.code.findbugs:annotations:1.3.9:jar:provided</include>
+ <include>com.google.code.findbugs:jsr305:1.3.9:jar:provided</include>
+ <include>com.google.guava:guava:18.0:jar:provided</include>
+ <include>com.google.inject.extensions:guice-assistedinject:3.0:jar:provided</include>
+ <include>com.google.inject.extensions:guice-multibindings:3.0:jar:provided</include>
+ <include>com.google.inject:guice:3.0:jar:provided:no_aop</include>
+ <include>commons-codec:commons-codec:1.4:jar:provided</include>
+ <include>commons-daemon:commons-daemon:1.0.3:jar:provided</include>
+ <include>commons-logging:commons-logging:1.1.1:jar:provided</include>
+ <include>javax.annotation:javax.annotation-api:1.2:jar:provided</include>
+ <include>javax.inject:javax.inject:1:jar:provided</include>
+ <include>javax.servlet:javax.servlet-api:3.1.0:jar:provided</include>
+ <include>javax.validation:validation-api:1.1.0.Final:jar:provided</include>
+ <include>javax.ws.rs:javax.ws.rs-api:2.0.1:jar:provided</include>
+ <include>net.jcip:jcip-annotations:1.0:jar:provided</include>
+ <include>net.jpountz.lz4:lz4:1.3.0:jar:provided</include>
+ <include>org.apache.felix:org.apache.felix.framework:4.2.1:jar:provided</include>
+ <include>org.apache.felix:org.apache.felix.log:1.0.1:jar:provided</include>
+ <include>org.apache.felix:org.apache.felix.main:4.2.1:jar:provided</include>
+ <include>org.apache.httpcomponents:httpclient:4.3.6:jar:provided</include>
+ <include>org.apache.httpcomponents:httpcore:4.3.3:jar:provided</include>
+ <include>org.eclipse.jetty:jetty-http:9.4.6.v20170531:jar:provided</include>
+ <include>org.eclipse.jetty:jetty-io:9.4.6.v20170531:jar:provided</include>
+ <include>org.eclipse.jetty:jetty-util:9.4.6.v20170531:jar:provided</include>
+ <include>org.glassfish.hk2.external:aopalliance-repackaged:2.5.0-b05:jar:provided</include>
+ <include>org.glassfish.hk2.external:javax.inject:2.5.0-b05:jar:provided</include>
+ <include>org.glassfish.hk2:hk2-api:2.5.0-b05:jar:provided</include>
+ <include>org.glassfish.hk2:hk2-locator:2.5.0-b05:jar:provided</include>
+ <include>org.glassfish.hk2:hk2-utils:2.5.0-b05:jar:provided</include>
+ <include>org.glassfish.hk2:osgi-resource-locator:1.0.1:jar:provided</include>
+ <include>org.glassfish.jersey.bundles.repackaged:jersey-guava:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.containers:jersey-container-servlet-core:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.containers:jersey-container-servlet:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.core:jersey-client:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.core:jersey-common:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.core:jersey-server:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.ext:jersey-entity-filtering:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.ext:jersey-proxy-client:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.media:jersey-media-jaxb:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.media:jersey-media-json-jackson:2.23.2:jar:provided</include>
+ <include>org.glassfish.jersey.media:jersey-media-multipart:2.23.2:jar:provided</include>
+ <include>org.javassist:javassist:3.20.0-GA:jar:provided</include>
+ <include>org.json:json:20090211:jar:provided</include>
+ <include>org.jvnet.mimepull:mimepull:1.9.6:jar:provided</include>
+ <include>org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1:jar:provided</include>
+ <include>org.slf4j:jcl-over-slf4j:1.7.5:jar:provided</include>
+ <include>org.slf4j:log4j-over-slf4j:1.7.5:jar:provided</include>
+ <include>org.slf4j:slf4j-api:1.7.5:jar:provided</include>
+ <include>org.slf4j:slf4j-jdk14:1.7.5:jar:provided</include>
+ <include>xml-apis:xml-apis:1.4.01:jar:provided</include>
+ </includes>
+ </bannedDependencies>
+ </rules>
+ <fail>true</fail>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-enforcer-plugin</artifactId>
- <version>3.0.0-M1</version>
- <executions>
- <execution>
- <!-- To allow running 'mvn enforcer:enforce' from the command line -->
- <id>default-cli</id>
- <goals>
- <goal>enforce</goal>
- </goals>
- <configuration>
- <rules>
- <bannedDependencies>
- <excludes>
- <!-- Only allow explicitly listed deps in provided scope -->
- <exclude>*:*:*:jar:provided:*</exclude>
- </excludes>
- <includes>
- <include>com.yahoo.vespa</include>
- <include>aopalliance:aopalliance:1.0:jar:provided</include>
- <include>com.fasterxml.jackson.core:jackson-annotations:2.8.3:jar:provided</include>
- <include>com.fasterxml.jackson.core:jackson-core:2.8.3:jar:provided</include>
- <include>com.fasterxml.jackson.core:jackson-databind:2.8.3:jar:provided</include>
- <include>com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.8.3:jar:provided</include>
- <include>com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:2.5.4:jar:provided</include>
- <include>com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.5.4:jar:provided</include>
- <include>com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.5.4:jar:provided</include>
- <include>com.google.code.findbugs:annotations:1.3.9:jar:provided</include>
- <include>com.google.code.findbugs:jsr305:1.3.9:jar:provided</include>
- <include>com.google.guava:guava:18.0:jar:provided</include>
- <include>com.google.inject.extensions:guice-assistedinject:3.0:jar:provided</include>
- <include>com.google.inject.extensions:guice-multibindings:3.0:jar:provided</include>
- <include>com.google.inject:guice:3.0:jar:provided:no_aop</include>
- <include>commons-codec:commons-codec:1.4:jar:provided</include>
- <include>commons-daemon:commons-daemon:1.0.3:jar:provided</include>
- <include>commons-logging:commons-logging:1.1.1:jar:provided</include>
- <include>javax.annotation:javax.annotation-api:1.2:jar:provided</include>
- <include>javax.inject:javax.inject:1:jar:provided</include>
- <include>javax.servlet:javax.servlet-api:3.1.0:jar:provided</include>
- <include>javax.validation:validation-api:1.1.0.Final:jar:provided</include>
- <include>javax.ws.rs:javax.ws.rs-api:2.0.1:jar:provided</include>
- <include>net.jcip:jcip-annotations:1.0:jar:provided</include>
- <include>net.jpountz.lz4:lz4:1.3.0:jar:provided</include>
- <include>org.apache.felix:org.apache.felix.framework:4.2.1:jar:provided</include>
- <include>org.apache.felix:org.apache.felix.log:1.0.1:jar:provided</include>
- <include>org.apache.felix:org.apache.felix.main:4.2.1:jar:provided</include>
- <include>org.apache.httpcomponents:httpclient:4.3.6:jar:provided</include>
- <include>org.apache.httpcomponents:httpcore:4.3.3:jar:provided</include>
- <include>org.eclipse.jetty:jetty-http:9.4.6.v20170531:jar:provided</include>
- <include>org.eclipse.jetty:jetty-io:9.4.6.v20170531:jar:provided</include>
- <include>org.eclipse.jetty:jetty-util:9.4.6.v20170531:jar:provided</include>
- <include>org.glassfish.hk2.external:aopalliance-repackaged:2.5.0-b05:jar:provided</include>
- <include>org.glassfish.hk2.external:javax.inject:2.5.0-b05:jar:provided</include>
- <include>org.glassfish.hk2:hk2-api:2.5.0-b05:jar:provided</include>
- <include>org.glassfish.hk2:hk2-locator:2.5.0-b05:jar:provided</include>
- <include>org.glassfish.hk2:hk2-utils:2.5.0-b05:jar:provided</include>
- <include>org.glassfish.hk2:osgi-resource-locator:1.0.1:jar:provided</include>
- <include>org.glassfish.jersey.bundles.repackaged:jersey-guava:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.containers:jersey-container-servlet-core:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.containers:jersey-container-servlet:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.core:jersey-client:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.core:jersey-common:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.core:jersey-server:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.ext:jersey-entity-filtering:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.ext:jersey-proxy-client:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.media:jersey-media-jaxb:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.media:jersey-media-json-jackson:2.23.2:jar:provided</include>
- <include>org.glassfish.jersey.media:jersey-media-multipart:2.23.2:jar:provided</include>
- <include>org.javassist:javassist:3.20.0-GA:jar:provided</include>
- <include>org.json:json:20090211:jar:provided</include>
- <include>org.jvnet.mimepull:mimepull:1.9.6:jar:provided</include>
- <include>org.scala-lang.modules:scala-parser-combinators_2.11:1.0.1:jar:provided</include>
- <include>org.slf4j:jcl-over-slf4j:1.7.5:jar:provided</include>
- <include>org.slf4j:log4j-over-slf4j:1.7.5:jar:provided</include>
- <include>org.slf4j:slf4j-api:1.7.5:jar:provided</include>
- <include>org.slf4j:slf4j-jdk14:1.7.5:jar:provided</include>
- <include>xml-apis:xml-apis:1.4.01:jar:provided</include>
-
- <!-- TODO: Remove the deps below when all environments use maven >= 3.3 -->
- <include>org.scala-lang:scala-library:2.11.4:jar:provided</include>
- <include>commons-lang:commons-lang:2.6:jar:provided</include>
- <include>org.apache.commons:commons-exec:1.3:jar:provided</include>
- <include>org.antlr:antlr-runtime:3.5.2:jar:provided</include>
- <include>log4j:log4j:1.2.16:jar:provided</include>
- <include>commons-collections:commons-collections:3.2.1:jar:provided</include>
- </includes>
- </bannedDependencies>
- </rules>
- <fail>true</fail>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
</project>