diff options
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> |