diff options
158 files changed, 2122 insertions, 1278 deletions
diff --git a/annotations/pom.xml b/annotations/pom.xml index 146eb5e9be2..3321dddaf8c 100644 --- a/annotations/pom.xml +++ b/annotations/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>annotations</artifactId> <packaging>jar</packaging> diff --git a/application-deploy-plugin/pom.xml b/application-deploy-plugin/pom.xml index 3cae7cf7831..501dee385a6 100644 --- a/application-deploy-plugin/pom.xml +++ b/application-deploy-plugin/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>application-deploy-plugin</artifactId> <version>6-SNAPSHOT</version> diff --git a/application-model/pom.xml b/application-model/pom.xml index 13a2d3ea49b..801c72e9194 100644 --- a/application-model/pom.xml +++ b/application-model/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>application-model</artifactId> <packaging>container-plugin</packaging> diff --git a/application-preprocessor/pom.xml b/application-preprocessor/pom.xml index 4fa319a881a..6ffff09e548 100644 --- a/application-preprocessor/pom.xml +++ b/application-preprocessor/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>application-preprocessor</artifactId> <packaging>jar</packaging> diff --git a/application/pom.xml b/application/pom.xml index 17e9ece3543..8103226e55d 100644 --- a/application/pom.xml +++ b/application/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>application</artifactId> <packaging>jar</packaging> diff --git a/athenz-identity-provider-service/pom.xml b/athenz-identity-provider-service/pom.xml index c87589d7be2..bfd02d54d43 100644 --- a/athenz-identity-provider-service/pom.xml +++ b/athenz-identity-provider-service/pom.xml @@ -11,6 +11,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <dependencies> <!-- COMPILE --> diff --git a/bootstrap.sh b/bootstrap.sh index 075da74b7c7..b71af73c529 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -44,8 +44,16 @@ $top/dist/getversion.pl -M $top > $top/dist/vtag.map # The 'default' mode also builds some modules needed by C++ code. # The 'full' mode also builds modules needed by C++ tests. -# must install parent pom first: +# must install parent poms first: echo "Downloading all dependencies. This may take a few minutes with an empty Maven cache." +( + cd container-dependency-versions + mvn_install +) +( + cd parent + mvn_install +) mvn_install -N # and build plugins first: diff --git a/bundle-plugin-test/pom.xml b/bundle-plugin-test/pom.xml index 8d8bf48cc07..3dd5be00add 100644 --- a/bundle-plugin-test/pom.xml +++ b/bundle-plugin-test/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <groupId>com.yahoo.vespa</groupId> <artifactId>bundle-plugin-test</artifactId> diff --git a/bundle-plugin/pom.xml b/bundle-plugin/pom.xml index 02f0ed2ccf5..47a06a1ee76 100644 --- a/bundle-plugin/pom.xml +++ b/bundle-plugin/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>bundle-plugin</artifactId> <version>6-SNAPSHOT</version> diff --git a/chain/pom.xml b/chain/pom.xml index a3096d37748..01a64a93609 100755 --- a/chain/pom.xml +++ b/chain/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>chain</artifactId> <packaging>jar</packaging> diff --git a/clustercontroller-apps/pom.xml b/clustercontroller-apps/pom.xml index 26f466eb208..bdc6059a816 100644 --- a/clustercontroller-apps/pom.xml +++ b/clustercontroller-apps/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>clustercontroller-apps</artifactId> <version>6-SNAPSHOT</version> diff --git a/clustercontroller-apputil/pom.xml b/clustercontroller-apputil/pom.xml index 68adc82596f..42c7690eab6 100644 --- a/clustercontroller-apputil/pom.xml +++ b/clustercontroller-apputil/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>clustercontroller-apputil</artifactId> <version>6-SNAPSHOT</version> diff --git a/clustercontroller-core/pom.xml b/clustercontroller-core/pom.xml index 499dee0d1de..99cf4df643b 100644 --- a/clustercontroller-core/pom.xml +++ b/clustercontroller-core/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>clustercontroller-core</artifactId> <version>6-SNAPSHOT</version> diff --git a/clustercontroller-standalone/pom.xml b/clustercontroller-standalone/pom.xml index f51555a92b6..f435cd9d7c4 100644 --- a/clustercontroller-standalone/pom.xml +++ b/clustercontroller-standalone/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>clustercontroller-standalone</artifactId> <version>6-SNAPSHOT</version> diff --git a/clustercontroller-utils/pom.xml b/clustercontroller-utils/pom.xml index f151a623ff9..287a85089ca 100644 --- a/clustercontroller-utils/pom.xml +++ b/clustercontroller-utils/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>clustercontroller-utils</artifactId> <version>6-SNAPSHOT</version> diff --git a/component/pom.xml b/component/pom.xml index 92f852e4ba0..18bfd000a84 100755 --- a/component/pom.xml +++ b/component/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>component</artifactId> <packaging>container-plugin</packaging> diff --git a/config-application-package/pom.xml b/config-application-package/pom.xml index 90d4a2d9af6..629c02de1e8 100644 --- a/config-application-package/pom.xml +++ b/config-application-package/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-application-package</artifactId> <packaging>container-plugin</packaging> diff --git a/config-bundle/pom.xml b/config-bundle/pom.xml index 7121756ce68..07262141801 100644 --- a/config-bundle/pom.xml +++ b/config-bundle/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-bundle</artifactId> <packaging>container-plugin</packaging> diff --git a/config-class-plugin/pom.xml b/config-class-plugin/pom.xml index 5b3149a13da..71a20782d85 100644 --- a/config-class-plugin/pom.xml +++ b/config-class-plugin/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-class-plugin</artifactId> <packaging>maven-plugin</packaging> diff --git a/config-lib/pom.xml b/config-lib/pom.xml index 2ed993dd052..31648958fa6 100644 --- a/config-lib/pom.xml +++ b/config-lib/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-lib</artifactId> <packaging>container-plugin</packaging> diff --git a/config-model-api/pom.xml b/config-model-api/pom.xml index 6618612df31..743164afb16 100644 --- a/config-model-api/pom.xml +++ b/config-model-api/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-model-api</artifactId> <version>6-SNAPSHOT</version> diff --git a/config-model-fat/pom.xml b/config-model-fat/pom.xml index a4bbba0e6e8..0526c2f6581 100644 --- a/config-model-fat/pom.xml +++ b/config-model-fat/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-model-fat</artifactId> <packaging>bundle</packaging> diff --git a/config-model/pom.xml b/config-model/pom.xml index 0fdc09e1a61..729d1a2ef9b 100644 --- a/config-model/pom.xml +++ b/config-model/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-model</artifactId> <packaging>container-plugin</packaging> diff --git a/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java b/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java index b4b89278c51..659d5b65a4c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/AbstractService.java @@ -510,22 +510,6 @@ public abstract class AbstractService extends AbstractConfigProducer<AbstractCon } /** - * Sets up this service to be included when generating monitoring config. - * The ymon service name used will be {@link #getServiceType()} - */ - public void monitorService() { - monitorService(getServiceType()); - } - - /** - * Sets up this service to be included when generating ymon config. - * @param ymonServiceName the ymon service name to be used - */ - public void monitorService(String ymonServiceName) { - setProp("ymonService", ymonServiceName); - } - - /** * * The service HTTP port for health status * @return portnumber diff --git a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java index d751e332ff3..c540a5f62d2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java @@ -16,6 +16,8 @@ package com.yahoo.vespa.model; */ public class ConfigProxy extends AbstractService { + public final static int BASEPORT = 19090; + /** * Creates a new ConfigProxy instance. * @@ -31,7 +33,7 @@ public class ConfigProxy extends AbstractService { /** * Returns the desired base port for this service. */ - public int getWantedPort() { return 19090; } + public int getWantedPort() { return BASEPORT; } /** * The desired base port is the only allowed base port. diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java index 2575cdb6237..d892d70e0de 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java @@ -14,6 +14,8 @@ import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.admin.monitoring.builder.Metrics; import com.yahoo.vespa.model.container.ContainerCluster; +import com.yahoo.vespa.model.filedistribution.DummyFileDistributionConfigProducer; +import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProvider; import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; import com.yahoo.vespa.model.filedistribution.FileDistributor; import com.yahoo.vespa.model.filedistribution.FileDistributorService; @@ -213,11 +215,25 @@ public class Admin extends AbstractConfigProducer implements Serializable { fileDistributor.fileSourceHost() + "'. Hostsystem=" + getHostSystem()); } - FileDistributorService fds = new FileDistributorService(fileDistribution, host.getHost().getHostName(), - fileDistribution.getFileDistributor(), fileDistribution.getOptions(), host == deployHost); - fds.setHostResource(host); - fds.initService(); - fileDistribution.addFileDistributionService(host.getHost(), fds); + FileDistributionConfigProvider configProvider = + new FileDistributionConfigProvider(fileDistributor, + fileDistribution.getOptions(), + host == deployHost, + host.getHost()); + if (fileDistribution.getOptions().disableFiledistributor()) { + DummyFileDistributionConfigProducer dummyFileDistributionConfigProducer = + new DummyFileDistributionConfigProducer(fileDistribution, + host.getHost().getHostName(), + configProvider); + fileDistribution.addFileDistributionConfigProducer(host.getHost(), dummyFileDistributionConfigProducer); + } else { + FileDistributorService fds = new FileDistributorService(fileDistribution, + host.getHost().getHostName(), + configProvider); + fds.setHostResource(host); + fds.initService(); + fileDistribution.addFileDistributionConfigProducer(host.getHost(), fds); + } } private boolean deployHostIsMissing(HostResource deployHost) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java index 942d563d850..e8f1f59310b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Configserver.java @@ -35,7 +35,6 @@ public class Configserver extends AbstractService { portsMeta.on(1).tag("http").tag("config").tag("state"); setProp("clustertype", "admin"); setProp("clustername", "admin"); - monitorService(); } /** diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java index 28cf18802cf..8b98dc9d06a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Logserver.java @@ -23,7 +23,6 @@ public class Logserver extends AbstractService { portsMeta.on(3).tag("logtp").tag("telnet").tag("replicator"); setProp("clustertype", "admin"); setProp("clustername", "admin"); - monitorService(); } /** diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java index cefc08981a4..093694f41b3 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Slobrok.java @@ -23,7 +23,6 @@ public class Slobrok extends AbstractService { setProp("index", index); setProp("clustertype", "slobrok"); setProp("clustername", "admin"); - monitorService(); } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java b/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java index 4969132ccfb..f4287cf982e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/clients/VespaSpoolerService.java @@ -19,7 +19,6 @@ public class VespaSpoolerService extends AbstractService implements SpoolerConfi public VespaSpoolerService(AbstractConfigProducer parent, int index, VespaSpooler spooler) { super(parent, "spooler." + index); this.spooler = spooler; - monitorService("spooler"); } public int getPortCount() { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java index 8991bfa6215..5925ec978bb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java @@ -165,7 +165,6 @@ public class Container extends AbstractService implements } tagServers(); - monitorService(); } private void tagServers() { @@ -331,7 +330,7 @@ public class Container extends AbstractService implements FileDistributionConfigProducer fileDistribution = getRoot().getFileDistributionConfigProducer(); if (fileDistribution != null) { - builder.configid(fileDistribution.getFileDistributorService(getHost()).getConfigId()); + builder.configid(fileDistribution.getConfigProducer(getHost()).getConfigId()); } return builder; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java index 7ef54360f00..4257e47218e 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentNode.java @@ -50,8 +50,6 @@ public abstract class ContentNode extends AbstractService portsMeta.on(0).tag("messaging"); portsMeta.on(1).tag("rpc").tag("status"); portsMeta.on(2).tag("http").tag("status").tag("state"); - - monitorService(); } @Override diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/DummyFileDistributionConfigProducer.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/DummyFileDistributionConfigProducer.java new file mode 100644 index 00000000000..1b1e66594d1 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/DummyFileDistributionConfigProducer.java @@ -0,0 +1,42 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.filedistribution; + +import com.yahoo.cloud.config.filedistribution.FiledistributorConfig; +import com.yahoo.cloud.config.filedistribution.FiledistributorrpcConfig; +import com.yahoo.cloud.config.filedistribution.FilereferencesConfig; +import com.yahoo.config.model.producer.AbstractConfigProducer; + +/** + * @author hmusum + * <p> + * Dummy file distribution config producer, needed for serving file distribution config when there is no FiledistributorService. + */ +public class DummyFileDistributionConfigProducer extends AbstractConfigProducer implements + FiledistributorConfig.Producer, + FiledistributorrpcConfig.Producer, + FilereferencesConfig.Producer { + + private final FileDistributionConfigProvider configProvider; + + public DummyFileDistributionConfigProducer(AbstractConfigProducer parent, + String hostname, + FileDistributionConfigProvider configProvider) { + super(parent, hostname); + this.configProvider = configProvider; + } + + @Override + public void getConfig(FiledistributorConfig.Builder builder) { + configProvider.getConfig(builder); + } + + @Override + public void getConfig(FiledistributorrpcConfig.Builder builder) { + configProvider.getConfig(builder); + } + + @Override + public void getConfig(FilereferencesConfig.Builder builder) { + configProvider.getConfig(builder); + } +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java index 9e5e3074c5e..c863b180b21 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java @@ -10,11 +10,13 @@ import java.util.IdentityHashMap; import java.util.Map; /** - * @author tonytv + * @author hmusum + * <p> + * File distribution config producer, delegates getting config to {@link DummyFileDistributionConfigProducer} (one per host) */ public class FileDistributionConfigProducer extends AbstractConfigProducer { - private final Map<Host, FileDistributorService> fileDistributorServices = new IdentityHashMap<>(); + private final Map<Host, AbstractConfigProducer> fileDistributionConfigProducers = new IdentityHashMap<>(); private final FileDistributor fileDistributor; private final FileDistributionOptions options; @@ -24,14 +26,6 @@ public class FileDistributionConfigProducer extends AbstractConfigProducer { this.options = options; } - public FileDistributorService getFileDistributorService(Host host) { - FileDistributorService service = fileDistributorServices.get(host); - if (service == null) { - throw new IllegalStateException("No file distribution service for host " + host); - } - return service; - } - public FileDistributor getFileDistributor() { return fileDistributor; } @@ -40,8 +34,8 @@ public class FileDistributionConfigProducer extends AbstractConfigProducer { return options; } - public void addFileDistributionService(Host host, FileDistributorService fds) { - fileDistributorServices.put(host, fds); + public void addFileDistributionConfigProducer(Host host, AbstractConfigProducer fileDistributionConfigProducer) { + fileDistributionConfigProducers.put(host, fileDistributionConfigProducer); } public static class Builder { @@ -58,4 +52,8 @@ public class FileDistributionConfigProducer extends AbstractConfigProducer { } } + public AbstractConfigProducer getConfigProducer(Host host) { + return fileDistributionConfigProducers.get(host); + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProvider.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProvider.java new file mode 100644 index 00000000000..33cc581c3a8 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProvider.java @@ -0,0 +1,59 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.filedistribution; + +import com.yahoo.cloud.config.filedistribution.FiledistributorConfig; +import com.yahoo.cloud.config.filedistribution.FiledistributorrpcConfig; +import com.yahoo.cloud.config.filedistribution.FilereferencesConfig; +import com.yahoo.config.FileReference; +import com.yahoo.config.model.api.FileDistribution; +import com.yahoo.vespa.model.ConfigProxy; +import com.yahoo.vespa.model.Host; +import com.yahoo.vespa.model.admin.FileDistributionOptions; + +import java.util.Collection; + +public class FileDistributionConfigProvider { + + private final FileDistributor fileDistributor; + private final FileDistributionOptions fileDistributionOptions; + private final boolean sendAllFiles; + private final Host host; + + public FileDistributionConfigProvider(FileDistributor fileDistributor, + FileDistributionOptions fileDistributionOptions, + boolean sendAllFiles, + Host host) { + this.fileDistributor = fileDistributor; + this.fileDistributionOptions = fileDistributionOptions; + this.sendAllFiles = sendAllFiles; + this.host = host; + } + + public void getConfig(FiledistributorConfig.Builder builder) { + fileDistributionOptions.getConfig(builder); + builder.torrentport(FileDistributorService.BASEPORT + 1); + builder.stateport(FileDistributorService.BASEPORT + 2); + builder.hostname(host.getHostName()); + builder.filedbpath(FileDistribution.getDefaultFileDBPath().toString()); + } + + public void getConfig(FiledistributorrpcConfig.Builder builder) { + // If disabled config proxy should act as file distributor, so use config proxy port + int port = (fileDistributionOptions.disableFiledistributor()) ? ConfigProxy.BASEPORT : FileDistributorService.BASEPORT; + builder.connectionspec("tcp/" + host.getHostName() + ":" + port); + } + + public void getConfig(FilereferencesConfig.Builder builder) { + for (FileReference reference : getFileReferences()) { + builder.filereferences(reference.value()); + } + } + + private Collection<FileReference> getFileReferences() { + if (sendAllFiles) { + return fileDistributor.allFilesToSend(); + } else { + return fileDistributor.filesToSendToHost(host); + } + } +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java index 7616b721be9..986334125d2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java @@ -4,60 +4,36 @@ package com.yahoo.vespa.model.filedistribution; import com.yahoo.cloud.config.filedistribution.FiledistributorConfig; import com.yahoo.cloud.config.filedistribution.FiledistributorrpcConfig; import com.yahoo.cloud.config.filedistribution.FilereferencesConfig; -import com.yahoo.config.FileReference; - -import com.yahoo.config.model.api.FileDistribution; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.AbstractService; -import com.yahoo.vespa.model.admin.FileDistributionOptions; - -import java.util.Collection; /** - * @author tonytv + * @author Tony Vaagenes + * + * Config is produced by {@link FileDistributionConfigProvider} */ public class FileDistributorService extends AbstractService implements FiledistributorConfig.Producer, FiledistributorrpcConfig.Producer, FilereferencesConfig.Producer { - private final static int BASEPORT = 19092; - private final FileDistributor fileDistributor; - private final FileDistributionOptions fileDistributionOptions; - private final boolean sendAllFiles; + final static int BASEPORT = 19092; - private Collection<FileReference> getFileReferences() { - if (sendAllFiles) { - return fileDistributor.allFilesToSend(); - } else { - return fileDistributor.filesToSendToHost(getHost()); - } - } + private final FileDistributionConfigProvider configProvider; - public FileDistributorService(AbstractConfigProducer parent, - String name, - FileDistributor fileDistributor, - FileDistributionOptions fileDistributionOptions, - boolean sendAllFiles) { - super(parent, name); + public FileDistributorService(AbstractConfigProducer parent, String hostname, FileDistributionConfigProvider configProvider) { + super(parent, hostname); + this.configProvider = configProvider; portsMeta.on(0).tag("rpc"); portsMeta.on(1).tag("torrent"); portsMeta.on(2).tag("http").tag("state"); setProp("clustertype", "filedistribution"); setProp("clustername", "admin"); - - this.fileDistributor = fileDistributor; - this.fileDistributionOptions = fileDistributionOptions; - this.sendAllFiles = sendAllFiles; - monitorService(); } @Override public String getStartupCommand() { - // If disabled config proxy should act as file distributor, so don't start this service - return (fileDistributionOptions.disableFiledistributor()) - ? null - : "exec $ROOT/sbin/vespa-filedistributor" + " --configid " + getConfigId(); + return "exec $ROOT/sbin/vespa-filedistributor" + " --configid " + getConfigId(); } @Override @@ -70,6 +46,7 @@ public class FileDistributorService extends AbstractService implements return true; } + @Override public int getPortCount() { return 3; } @@ -81,24 +58,16 @@ public class FileDistributorService extends AbstractService implements @Override public void getConfig(FiledistributorConfig.Builder builder) { - fileDistributionOptions.getConfig(builder); - builder.torrentport(getRelativePort(1)); - builder.stateport(getRelativePort(2)); - builder.hostname(getHostName()); - builder.filedbpath(FileDistribution.getDefaultFileDBPath().toString()); + configProvider.getConfig(builder); } @Override public void getConfig(FiledistributorrpcConfig.Builder builder) { - // If disabled config proxy should act as file distributor, so use config proxy port - int port = (fileDistributionOptions.disableFiledistributor()) ? 19090 : getRelativePort(0); - builder.connectionspec("tcp/" + getHostName() + ":" + port); + configProvider.getConfig(builder); } @Override public void getConfig(FilereferencesConfig.Builder builder) { - for (FileReference reference : getFileReferences()) { - builder.filereferences(reference.value()); - } + configProvider.getConfig(builder); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java b/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java index c0867d252a3..789c5562d9c 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/Dispatch.java @@ -46,7 +46,6 @@ public class Dispatch extends AbstractService implements SearchInterface, setProp("clustertype", "search") .setProp("clustername", dispatchGroup.getClusterName()) .setProp("index", nodeSpec.groupIndex()); - monitorService(); } public static Dispatch createTld(DispatchGroup dispatchGroup, AbstractConfigProducer parent, int rowId) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java index c5f7272ee80..819d5904c25 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java @@ -19,6 +19,7 @@ import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.application.validation.RestartConfigs; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import com.yahoo.vespa.model.content.ContentNode; +import com.yahoo.vespa.model.filedistribution.DummyFileDistributionConfigProducer; import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; import com.yahoo.vespa.model.filedistribution.FileDistributorService; import org.w3c.dom.Element; @@ -112,7 +113,6 @@ public class SearchNode extends AbstractService implements portsMeta.on(UNUSED_3).tag("unused"); portsMeta.on(HEALTH_PORT).tag("http").tag("json").tag("health").tag("state"); // Properties are set in DomSearchBuilder - monitorService(); this.tuning = tuning; } @@ -229,10 +229,12 @@ public class SearchNode extends AbstractService implements public void getConfig(FiledistributorrpcConfig.Builder builder) { FileDistributionConfigProducer fileDistribution = getRoot().getFileDistributionConfigProducer(); if (fileDistribution != null) { - FileDistributorService fds = fileDistribution.getFileDistributorService(getHost()); - if (fds != null) { - fds.getConfig(builder); - } + AbstractConfigProducer configProducer = fileDistribution.getConfigProducer(getHost()); + // TODO: Hack, will be fixed when FileDistributorService is gone + if (configProducer instanceof DummyFileDistributionConfigProducer) + ((DummyFileDistributionConfigProducer) configProducer).getConfig(builder); + else + ((FileDistributorService) configProducer).getConfig(builder); } } diff --git a/config-provisioning/pom.xml b/config-provisioning/pom.xml index ebe7d460989..05f94973017 100644 --- a/config-provisioning/pom.xml +++ b/config-provisioning/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <groupId>com.yahoo.vespa</groupId> <artifactId>config-provisioning</artifactId> diff --git a/config-proxy/pom.xml b/config-proxy/pom.xml index 0aadb1bbb12..a266f68efe2 100644 --- a/config-proxy/pom.xml +++ b/config-proxy/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config-proxy</artifactId> <packaging>jar</packaging> diff --git a/config/pom.xml b/config/pom.xml index f73c5b7bfd8..cfa3a692181 100755 --- a/config/pom.xml +++ b/config/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>config</artifactId> <packaging>container-plugin</packaging> diff --git a/configdefinitions/pom.xml b/configdefinitions/pom.xml index 92980a18899..487c43ed3b3 100644 --- a/configdefinitions/pom.xml +++ b/configdefinitions/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>configdefinitions</artifactId> <packaging>container-plugin</packaging> diff --git a/configgen/pom.xml b/configgen/pom.xml index 6e550ec7321..e8de114f8d5 100644 --- a/configgen/pom.xml +++ b/configgen/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>configgen</artifactId> <packaging>jar</packaging> diff --git a/configserver/pom.xml b/configserver/pom.xml index 30d92dc7650..f5aa8ea3118 100644 --- a/configserver/pom.xml +++ b/configserver/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>configserver</artifactId> <packaging>container-plugin</packaging> diff --git a/container-accesslogging/pom.xml b/container-accesslogging/pom.xml index 45d7b4a2ed2..b4c7094a50a 100644 --- a/container-accesslogging/pom.xml +++ b/container-accesslogging/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-accesslogging</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-core/pom.xml b/container-core/pom.xml index c608f35f26c..1be10215419 100644 --- a/container-core/pom.xml +++ b/container-core/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-core</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-dependencies-enforcer/pom.xml b/container-dependencies-enforcer/pom.xml index 61495384744..3384da7c1eb 100644 --- a/container-dependencies-enforcer/pom.xml +++ b/container-dependencies-enforcer/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-dependencies-enforcer</artifactId> @@ -81,36 +82,36 @@ <include>com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:[2.5.4, ${jackson2.version}]:jar:provided</include> <include>com.fasterxml.jackson.module:jackson-module-jaxb-annotations:[2.5.4, ${jackson2.version}]: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>com.google.code.findbugs:annotations:[${findbugs.version}]:jar:provided</include> + <include>com.google.code.findbugs:jsr305:[${findbugs.version}]:jar:provided</include> + <include>com.google.guava:guava:[${guava.version}]:jar:provided</include> + <include>com.google.inject.extensions:guice-assistedinject:[${guice.version}]:jar:provided</include> + <include>com.google.inject.extensions:guice-multibindings:[${guice.version}]:jar:provided</include> + <include>com.google.inject:guice:[${guice.version}]: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.annotation:javax.annotation-api:[${javax.annotation-api.version}]: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.validation:validation-api:[${javax.validation-api.version}]:jar:provided</include> <include>javax.ws.rs:javax.ws.rs-api:[${javax.ws.rs-api.version}]: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.framework:[${felix.version}]: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.felix:org.apache.felix.main:[${felix.version}]: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:[${jetty.version}]:jar:provided</include> <include>org.eclipse.jetty:jetty-io:[${jetty.version}]:jar:provided</include> <include>org.eclipse.jetty:jetty-util:[${jetty.version}]: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.hk2.external:aopalliance-repackaged:[${hk2.version}]:jar:provided</include> + <include>org.glassfish.hk2.external:javax.inject:[${hk2.version}]:jar:provided</include> + <include>org.glassfish.hk2:hk2-api:[${hk2.version}]:jar:provided</include> + <include>org.glassfish.hk2:hk2-locator:[${hk2.version}]:jar:provided</include> + <include>org.glassfish.hk2:hk2-utils:[${hk2.version}]:jar:provided</include> + <include>org.glassfish.hk2:osgi-resource-locator:[${hk2.osgi-resource-locator.version}]:jar:provided</include> <include>org.glassfish.jersey.bundles.repackaged:jersey-guava:[${jersey2.version}]:jar:provided</include> <include>org.glassfish.jersey.containers:jersey-container-servlet-core:[${jersey2.version}]:jar:provided</include> <include>org.glassfish.jersey.containers:jersey-container-servlet:[${jersey2.version}]:jar:provided</include> @@ -122,13 +123,13 @@ <include>org.glassfish.jersey.media:jersey-media-jaxb:[${jersey2.version}]:jar:provided</include> <include>org.glassfish.jersey.media:jersey-media-json-jackson:[${jersey2.version}]:jar:provided</include> <include>org.glassfish.jersey.media:jersey-media-multipart:[${jersey2.version}]:jar:provided</include> - <include>org.javassist:javassist:[3.20.0-GA]:jar:provided</include> + <include>org.javassist:javassist:[${javassist.version}]:jar:provided</include> <include>org.json:json:[20090211]:jar:provided</include> - <include>org.jvnet.mimepull:mimepull:[1.9.6]: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>org.jvnet.mimepull:mimepull:[${mimepull.version}]:jar:provided</include> + <include>org.slf4j:jcl-over-slf4j:[${slf4j.version}]:jar:provided</include> + <include>org.slf4j:log4j-over-slf4j:[${slf4j.version}]:jar:provided</include> + <include>org.slf4j:slf4j-api:[${slf4j.version}]:jar:provided</include> + <include>org.slf4j:slf4j-jdk14:[${slf4j.version}]:jar:provided</include> <include>xml-apis:xml-apis:[1.4.01]:jar:provided</include> </includes> </bannedDependencies> diff --git a/container-dependency-versions/pom.xml b/container-dependency-versions/pom.xml new file mode 100644 index 00000000000..5479cace414 --- /dev/null +++ b/container-dependency-versions/pom.xml @@ -0,0 +1,422 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>com.yahoo.vespa</groupId> + <artifactId>container-dependency-versions</artifactId> + <packaging>pom</packaging> + <version>6-SNAPSHOT</version> + <description>Dependency versions for all Vespa maven projects.</description> + <url>https://github.com/vespa-engine</url> + + <licenses> + <license> + <name>The Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> + </license> + </licenses> + +<!-- TODO: add pluginManagement for bundle-plugin and/or compiler-plugin? + <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.6.1</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + <optimize>true</optimize> + </configuration> + </plugin> + <plugin> + <groupId>com.yahoo.vespa</groupId> + <artifactId>bundle-plugin</artifactId> + <version>${project.version}</version> + <configuration> + <configGenVersion>${project.version}</configGenVersion> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> +--> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>aopalliance</groupId> + <artifactId>aopalliance</artifactId> + <version>1.0</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-core</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jdk8</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jsr310</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.jaxrs</groupId> + <artifactId>jackson-jaxrs-base</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.jaxrs</groupId> + <artifactId>jackson-jaxrs-json-provider</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.module</groupId> + <artifactId>jackson-module-jaxb-annotations</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <groupId>com.google.code.findbugs</groupId> + <artifactId>annotations</artifactId> + <version>${findbugs.version}</version> + </dependency> + <dependency> + <groupId>com.google.code.findbugs</groupId> + <artifactId>jsr305</artifactId> + <version>${findbugs.version}</version> + </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + <version>${guava.version}</version> + </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-assistedinject</artifactId> + <version>${guice.version}</version> + </dependency> + <dependency> + <groupId>com.google.inject.extensions</groupId> + <artifactId>guice-multibindings</artifactId> + <version>${guice.version}</version> + </dependency> + <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + <version>${guice.version}</version> + </dependency> + <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + <version>${guice.version}</version> + <classifier>no_aop</classifier> + </dependency> + <dependency> + <groupId>commons-codec</groupId> + <artifactId>commons-codec</artifactId> + <version>1.4</version> + </dependency> + <dependency> + <groupId>commons-daemon</groupId> + <artifactId>commons-daemon</artifactId> + <version>1.0.3</version> + </dependency> + <dependency> + <!-- This version is exported by jdisc via jcl-over-slf4j. --> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + <version>1.1.1</version> + </dependency> + <dependency> + <groupId>javax.annotation</groupId> + <artifactId>javax.annotation-api</artifactId> + <version>${javax.annotation-api.version}</version> + </dependency> + <dependency> + <groupId>javax.inject</groupId> + <artifactId>javax.inject</artifactId> + <version>1</version> + </dependency> + <dependency> + <groupId>javax.servlet</groupId> + <artifactId>javax.servlet-api</artifactId> + <version>3.1.0</version> + </dependency> + <dependency> + <groupId>javax.validation</groupId> + <artifactId>validation-api</artifactId> + <version>${javax.validation-api.version}</version> + </dependency> + <dependency> + <groupId>javax.ws.rs</groupId> + <artifactId>javax.ws.rs-api</artifactId> + <version>${javax.ws.rs-api.version}</version> + </dependency> + <dependency> + <groupId>net.jcip</groupId> + <artifactId>jcip-annotations</artifactId> + <version>1.0</version> + </dependency> + <dependency> + <groupId>net.jpountz.lz4</groupId> + <artifactId>lz4</artifactId> + <version>1.3.0</version> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.framework</artifactId> + <version>${felix.version}</version> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.log</artifactId> + <version>1.0.1</version> + </dependency> + <dependency> + <groupId>org.apache.felix</groupId> + <artifactId>org.apache.felix.main</artifactId> + <version>${felix.version}</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>4.3.6</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpcore</artifactId> + <version>4.3.3</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-http</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-io</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-util</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.hk2.external</groupId> + <artifactId>aopalliance-repackaged</artifactId> + <version>${hk2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.hk2.external</groupId> + <artifactId>javax.inject</artifactId> + <version>${hk2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.hk2</groupId> + <artifactId>hk2-api</artifactId> + <version>${hk2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.hk2</groupId> + <artifactId>hk2-locator</artifactId> + <version>${hk2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.hk2</groupId> + <artifactId>hk2-utils</artifactId> + <version>${hk2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.hk2</groupId> + <artifactId>osgi-resource-locator</artifactId> + <version>${hk2.osgi-resource-locator.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.bundles.repackaged</groupId> + <artifactId>jersey-guava</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.containers</groupId> + <artifactId>jersey-container-servlet-core</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.containers</groupId> + <artifactId>jersey-container-servlet</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.core</groupId> + <artifactId>jersey-client</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.core</groupId> + <artifactId>jersey-common</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.core</groupId> + <artifactId>jersey-server</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.ext</groupId> + <artifactId>jersey-entity-filtering</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.ext</groupId> + <artifactId>jersey-proxy-client</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.media</groupId> + <artifactId>jersey-media-jaxb</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.media</groupId> + <artifactId>jersey-media-json-jackson</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.glassfish.jersey.media</groupId> + <artifactId>jersey-media-multipart</artifactId> + <version>${jersey2.version}</version> + </dependency> + <dependency> + <groupId>org.javassist</groupId> + <artifactId>javassist</artifactId> + <version>${javassist.version}</version> + </dependency> + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + <version>20090211</version> + </dependency> + <dependency> + <groupId>org.jvnet.mimepull</groupId> + <artifactId>mimepull</artifactId> + <version>${mimepull.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <version>${slf4j.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>log4j-over-slf4j</artifactId> + <version>${slf4j.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4j.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-jdk14</artifactId> + <version>${slf4j.version}</version> + </dependency> + <dependency> + <groupId>xml-apis</groupId> + <artifactId>xml-apis</artifactId> + <version>1.4.01</version> + </dependency> + + <!-- NOTE: The dependencies below are not provided from the jdisc container runtime, but had to be moved + here from 'parent' because factorylib reads the text in parent/pom.xml and this pom file to + build a pom model used to bootstrap the maven cache on factory. Hence all deps using properties + declared in this pom also have to reside in this pom. + See factorylib:com.yahoo.vespa.dependencies.pom.list.Main.--> + <!-- TODO: move these back to parent/pom.xml when the above does not hold anymore. --> + + <dependency> + <!-- NOT provided from jdisc runtime --> + <groupId>com.fasterxml.jackson.jaxrs</groupId> + <artifactId>jackson-jaxrs-xml-provider</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <!-- NOT provided from jdisc runtime --> + <groupId>com.fasterxml.jackson.dataformat</groupId> + <artifactId>jackson-dataformat-xml</artifactId> + <version>${jackson2.version}</version> + </dependency> + <dependency> + <!-- NOT provided from jdisc runtime --> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-continuation</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <!-- NOT provided from jdisc runtime --> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-server</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <!-- NOT provided from jdisc runtime --> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <!-- NOT provided from jdisc runtime --> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlets</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> + <!-- NOT provided from jdisc runtime --> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-jmx</artifactId> + <version>${jetty.version}</version> + </dependency> + + <!-- Please don't add deps here, but instead above the NOTE. --> + + </dependencies> + </dependencyManagement> + + <properties> + <felix.version>4.2.1</felix.version> + <findbugs.version>1.3.9</findbugs.version> + <guava.version>18.0</guava.version> + <guice.version>3.0</guice.version> + <jetty.version>9.4.6.v20170531</jetty.version> + <slf4j.version>1.7.5</slf4j.version> + + <!-- These must be kept in sync with version used by current jersey2.version. --> + <!-- MUST be updated each time jersey2 is upgraded! --> + <!-- Check versions by doing: ' ls -l vespa/vespa_jersey2/target/dependency' --> + <hk2.version>2.5.0-b05</hk2.version> + <hk2.osgi-resource-locator.version>1.0.1</hk2.osgi-resource-locator.version> + <jackson2.version>2.8.3</jackson2.version> + <javassist.version>3.20.0-GA</javassist.version> + <javax.annotation-api.version>1.2</javax.annotation-api.version> + <javax.validation-api.version>1.1.0.Final</javax.validation-api.version> + <javax.ws.rs-api.version>2.0.1</javax.ws.rs-api.version> + <jersey2.version>2.23.2</jersey2.version> + <mimepull.version>1.9.6</mimepull.version> + </properties> + +</project> diff --git a/container-dev/pom.xml b/container-dev/pom.xml index d02ec233d96..f62bbd22690 100644 --- a/container-dev/pom.xml +++ b/container-dev/pom.xml @@ -10,6 +10,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-dev</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-di/pom.xml b/container-di/pom.xml index cf6a9e54daa..abc652d6e6e 100644 --- a/container-di/pom.xml +++ b/container-di/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-di</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-disc/pom.xml b/container-disc/pom.xml index ad86b3ffcff..38b4bfc2ff5 100644 --- a/container-disc/pom.xml +++ b/container-disc/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-disc</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-jersey2/pom.xml b/container-jersey2/pom.xml index 8f579e49876..26dfa762032 100644 --- a/container-jersey2/pom.xml +++ b/container-jersey2/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-jersey2</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-messagebus/pom.xml b/container-messagebus/pom.xml index 6058063daf3..1daf1df6fcb 100644 --- a/container-messagebus/pom.xml +++ b/container-messagebus/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-messagebus</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-search-and-docproc/pom.xml b/container-search-and-docproc/pom.xml index fb2794670a2..9b4419ae2b6 100644 --- a/container-search-and-docproc/pom.xml +++ b/container-search-and-docproc/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-search-and-docproc</artifactId> <version>6-SNAPSHOT</version> diff --git a/container-search/pom.xml b/container-search/pom.xml index f622567acde..0df502cf21a 100644 --- a/container-search/pom.xml +++ b/container-search/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-search</artifactId> <packaging>jar</packaging> diff --git a/container-test-jars/pom.xml b/container-test-jars/pom.xml index dcde18fc8cf..804ca5eb879 100644 --- a/container-test-jars/pom.xml +++ b/container-test-jars/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <groupId>com.yahoo.vespa.container-test-jars</groupId> <artifactId>container-test-jars</artifactId> diff --git a/container-test/pom.xml b/container-test/pom.xml index 7aaffed652e..26f02767062 100644 --- a/container-test/pom.xml +++ b/container-test/pom.xml @@ -11,6 +11,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container-test</artifactId> <version>6-SNAPSHOT</version> diff --git a/container/pom.xml b/container/pom.xml index 4726071db55..3793a3508a4 100644 --- a/container/pom.xml +++ b/container/pom.xml @@ -11,6 +11,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>container</artifactId> <version>6-SNAPSHOT</version> diff --git a/controller-api/pom.xml b/controller-api/pom.xml index 51666da0c03..5ef130a22ba 100644 --- a/controller-api/pom.xml +++ b/controller-api/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>controller-api</artifactId> <packaging>container-plugin</packaging> diff --git a/controller-server/pom.xml b/controller-server/pom.xml index 0cfcbc40601..b033286b82a 100644 --- a/controller-server/pom.xml +++ b/controller-server/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>controller-server</artifactId> <packaging>container-plugin</packaging> diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java index c7755a87510..34f3ea8f060 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java @@ -508,7 +508,7 @@ public class ApplicationController { return Optional.of(new InstanceEndpoints(endPointUrls)); } catch (RuntimeException e) { - log.log(Level.FINE, "Failed to get endpoint information for " + deploymentId, e); + log.log(Level.WARNING, "Failed to get endpoint information for " + deploymentId, e); return Optional.empty(); } } diff --git a/defaults/pom.xml b/defaults/pom.xml index 2f3f06780e7..4d1a08aacc2 100644 --- a/defaults/pom.xml +++ b/defaults/pom.xml @@ -5,9 +5,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> - <groupId>com.yahoo.vespa</groupId> - <artifactId>parent</artifactId> - <version>6-SNAPSHOT</version> + <groupId>com.yahoo.vespa</groupId> + <artifactId>parent</artifactId> + <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <groupId>com.yahoo.vespa</groupId> <artifactId>defaults</artifactId> diff --git a/docker-api/pom.xml b/docker-api/pom.xml index fc374a12dd2..449a94fb621 100644 --- a/docker-api/pom.xml +++ b/docker-api/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>docker-api</artifactId> diff --git a/docproc/pom.xml b/docproc/pom.xml index 09635201e51..1043de32128 100644 --- a/docproc/pom.xml +++ b/docproc/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>docproc</artifactId> <packaging>jar</packaging> diff --git a/docprocs/pom.xml b/docprocs/pom.xml index 1b209ec39ee..16259a861c7 100644 --- a/docprocs/pom.xml +++ b/docprocs/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>docprocs</artifactId> <packaging>container-plugin</packaging> diff --git a/document/pom.xml b/document/pom.xml index 81b21487314..10f71218422 100644 --- a/document/pom.xml +++ b/document/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>document</artifactId> <version>6-SNAPSHOT</version> diff --git a/documentapi/pom.xml b/documentapi/pom.xml index c94337e8873..3781dfd93ac 100644 --- a/documentapi/pom.xml +++ b/documentapi/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>documentapi</artifactId> <packaging>container-plugin</packaging> diff --git a/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.cpp b/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.cpp index 96408e9a204..62747309c13 100644 --- a/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.cpp +++ b/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.cpp @@ -13,6 +13,8 @@ GetBucketListMessage::GetBucketListMessage(const document::BucketId &bucketId) : { } +GetBucketListMessage::~GetBucketListMessage() = default; + DocumentReply::UP GetBucketListMessage::doCreateReply() const { diff --git a/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.h b/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.h index 8b49afd6672..e89020bcf37 100644 --- a/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.h +++ b/documentapi/src/vespa/documentapi/messagebus/messages/getbucketlistmessage.h @@ -24,6 +24,8 @@ public: */ GetBucketListMessage(const document::BucketId &bucketId); + ~GetBucketListMessage(); + /** * Returns the bucket whose list to retrieve. * diff --git a/documentgen-test/pom.xml b/documentgen-test/pom.xml index 53b49cf1473..d009ef3d592 100644 --- a/documentgen-test/pom.xml +++ b/documentgen-test/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>documentgen-test</artifactId> <packaging>jar</packaging> diff --git a/eval/CMakeLists.txt b/eval/CMakeLists.txt index 89e8a72e330..d107ebfed40 100644 --- a/eval/CMakeLists.txt +++ b/eval/CMakeLists.txt @@ -24,6 +24,7 @@ vespa_define_module( src/tests/eval/value_cache src/tests/eval/value_type src/tests/tensor/dense_dot_product_function + src/tests/tensor/dense_xw_product_function src/tests/tensor/dense_tensor_address_combiner src/tests/tensor/dense_tensor_builder src/tests/tensor/dense_tensor_function_compiler diff --git a/eval/src/apps/tensor_conformance/generate.cpp b/eval/src/apps/tensor_conformance/generate.cpp index 0aba5276ace..f70c472cbcd 100644 --- a/eval/src/apps/tensor_conformance/generate.cpp +++ b/eval/src/apps/tensor_conformance/generate.cpp @@ -169,6 +169,16 @@ void generate_dot_product(TestBuilder &dst) { //----------------------------------------------------------------------------- +void generate_xw_product(TestBuilder &dst) { + auto matrix = spec({x(2),y(3)}, Seq({ 3, 5, 7, 11, 13, 17 })); + dst.add("reduce(a*b,sum,x)", {{"a", spec(x(2), Seq({ 1, 2 }))}, {"b", matrix}}, + spec(y(3), Seq({(1*3+2*11),(1*5+2*13),(1*7+2*17)}))); + dst.add("reduce(a*b,sum,y)", {{"a", spec(y(3), Seq({ 1, 2, 3 }))}, {"b", matrix}}, + spec(x(2), Seq({(1*3+2*5+3*7),(1*11+2*13+3*17)}))); +} + +//----------------------------------------------------------------------------- + void generate_tensor_concat(TestBuilder &dst) { dst.add("concat(a,b,x)", {{"a", spec(10.0)}, {"b", spec(20.0)}}, spec(x(2), Seq({10.0, 20.0}))); dst.add("concat(a,b,x)", {{"a", spec(x(1), Seq({10.0}))}, {"b", spec(20.0)}}, spec(x(2), Seq({10.0, 20.0}))); @@ -218,6 +228,7 @@ Generator::generate(TestBuilder &dst) generate_tensor_map(dst); generate_tensor_join(dst); generate_dot_product(dst); + generate_xw_product(dst); generate_tensor_concat(dst); generate_tensor_rename(dst); generate_tensor_lambda(dst); diff --git a/eval/src/apps/tensor_conformance/test_spec.json b/eval/src/apps/tensor_conformance/test_spec.json index 24edc9a7ac7..513d5e8e902 100644 --- a/eval/src/apps/tensor_conformance/test_spec.json +++ b/eval/src/apps/tensor_conformance/test_spec.json @@ -1225,6 +1225,8 @@ {"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x0200405C000000000000"}} {"expression":"reduce(a*b,sum)","inputs":{"a":"0x020101780240000000000000004008000000000000","b":"0x0201017803401C0000000000004026000000000000402A000000000000"},"result":{"expect":"0x02004047800000000000"}} {"expression":"reduce(a*b,sum)","inputs":{"a":"0x0201017803400000000000000040080000000000004014000000000000","b":"0x0201017802401C0000000000004026000000000000"},"result":{"expect":"0x02004047800000000000"}} +{"expression":"reduce(a*b,sum,x)","inputs":{"a":"0x02010178023FF00000000000004000000000000000","b":"0x020201780201790340080000000000004014000000000000401C0000000000004026000000000000402A0000000000004031000000000000"},"result":{"expect":"0x02010179034039000000000000403F0000000000004044800000000000"}} +{"expression":"reduce(a*b,sum,y)","inputs":{"a":"0x02010179033FF000000000000040000000000000004008000000000000","b":"0x020201780201790340080000000000004014000000000000401C0000000000004026000000000000402A0000000000004031000000000000"},"result":{"expect":"0x020101780240410000000000004056000000000000"}} {"expression":"concat(a,b,x)","inputs":{"a":"0x02004024000000000000","b":"0x02004034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}} {"expression":"concat(a,b,x)","inputs":{"a":"0x02010178014024000000000000","b":"0x02004034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}} {"expression":"concat(a,b,x)","inputs":{"a":"0x02004024000000000000","b":"0x02010178014034000000000000"},"result":{"expect":"0x020101780240240000000000004034000000000000"}} @@ -1242,4 +1244,4 @@ {"expression":"tensor(x[10])(x+1)","inputs":{},"result":{"expect":"0x020101780A3FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C000000000000402000000000000040220000000000004024000000000000"}} {"expression":"tensor(x[5],y[4])(x*4+(y+1))","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000040000000000000004008000000000000401000000000000040140000000000004018000000000000401C00000000000040200000000000004022000000000000402400000000000040260000000000004028000000000000402A000000000000402C000000000000402E00000000000040300000000000004031000000000000403200000000000040330000000000004034000000000000"}} {"expression":"tensor(x[5],y[4])(x==y)","inputs":{},"result":{"expect":"0x02020178050179043FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF000000000000000000000000000000000000000000000000000000000000000000000000000003FF00000000000000000000000000000000000000000000000000000000000000000000000000000"}} -{"num_tests":1244} +{"num_tests":1246} diff --git a/eval/src/tests/tensor/dense_tensor_function_compiler/dense_tensor_function_compiler_test.cpp b/eval/src/tests/tensor/dense_tensor_function_compiler/dense_tensor_function_compiler_test.cpp index 63829650cc5..7df436d85a1 100644 --- a/eval/src/tests/tensor/dense_tensor_function_compiler/dense_tensor_function_compiler_test.cpp +++ b/eval/src/tests/tensor/dense_tensor_function_compiler/dense_tensor_function_compiler_test.cpp @@ -2,6 +2,7 @@ #include <vespa/vespalib/testkit/test_kit.h> #include <vespa/eval/tensor/dense/dense_dot_product_function.h> +#include <vespa/eval/tensor/dense/dense_xw_product_function.h> #include <vespa/eval/tensor/dense/dense_tensor_function_compiler.h> #include <vespa/eval/eval/operation.h> @@ -11,8 +12,7 @@ using namespace vespalib::eval::tensor_function; using namespace vespalib::tensor; using vespalib::Stash; -template <typename T> -const T *as(const TensorFunction &function) { return dynamic_cast<const T *>(&function); } +//----------------------------------------------------------------------------- const TensorFunction & compileDotProduct(const vespalib::string &lhsType, @@ -48,6 +48,65 @@ assertNotCompiledDotProduct(const vespalib::string &lhsType, EXPECT_TRUE(reduce); } +//----------------------------------------------------------------------------- + +const TensorFunction & +compileXWProduct(const vespalib::string &lhsType, + const vespalib::string &rhsType, + const vespalib::string &dim, + Stash &stash) +{ + const Node &reduceNode = reduce(join(inject(ValueType::from_spec(lhsType), 1, stash), + inject(ValueType::from_spec(rhsType), 3, stash), + Mul::f, stash), + Aggr::SUM, {dim}, stash); + return DenseTensorFunctionCompiler::compile(reduceNode, stash); +} + +void +assertCompiledXWProduct(const vespalib::string &vecTypeStr, + const vespalib::string &matTypeStr, + const vespalib::string &dim) +{ + Stash stash; + const TensorFunction &func = compileXWProduct(vecTypeStr, matTypeStr, dim, stash); + const TensorFunction &inv_func = compileXWProduct(matTypeStr, vecTypeStr, dim, stash); + const DenseXWProductFunction *xwProduct = as<DenseXWProductFunction>(func); + const DenseXWProductFunction *inv_xwProduct = as<DenseXWProductFunction>(inv_func); + ValueType vecType = ValueType::from_spec(vecTypeStr); + ValueType matType = ValueType::from_spec(matTypeStr); + size_t common_idx = matType.dimension_index(vecType.dimensions()[0].name); + ASSERT_TRUE(xwProduct); + ASSERT_TRUE(inv_xwProduct); + ASSERT_TRUE(common_idx != ValueType::Dimension::npos); + EXPECT_EQUAL(xwProduct->vectorId(), 1u); + EXPECT_EQUAL(inv_xwProduct->vectorId(), 3u); + EXPECT_EQUAL(xwProduct->matrixId(), 3u); + EXPECT_EQUAL(inv_xwProduct->matrixId(), 1u); + EXPECT_EQUAL(xwProduct->vectorSize(), vecType.dimensions()[0].size); + EXPECT_EQUAL(inv_xwProduct->vectorSize(), vecType.dimensions()[0].size); + EXPECT_EQUAL(xwProduct->resultSize(), matType.dimensions()[1 - common_idx].size); + EXPECT_EQUAL(inv_xwProduct->resultSize(), matType.dimensions()[1 - common_idx].size); + EXPECT_EQUAL(xwProduct->matrixHasCommonDimensionInnermost(), (common_idx == 1)); + EXPECT_EQUAL(inv_xwProduct->matrixHasCommonDimensionInnermost(), (common_idx == 1)); +} + +void +assertNotCompiledXWProduct(const vespalib::string &vecType, + const vespalib::string &matType, + const vespalib::string &dim) +{ + Stash stash; + const TensorFunction &func = compileXWProduct(vecType, matType, dim, stash); + const TensorFunction &inv_func = compileXWProduct(matType, vecType, dim, stash); + const Reduce *reduce = as<Reduce>(func); + const Reduce *inv_reduce = as<Reduce>(inv_func); + EXPECT_TRUE(reduce); + EXPECT_TRUE(inv_reduce); +} + +//----------------------------------------------------------------------------- + TEST("require that dot product with compatible dimensions is compiled") { TEST_DO(assertCompiledDotProduct("tensor(x[5])", "tensor(x[5])")); @@ -67,4 +126,28 @@ TEST("require that dot product with incompatible dimensions is NOT compiled") TEST_DO(assertNotCompiledDotProduct("tensor(x[5],y[7])", "tensor(x[5],y[7])")); } +//----------------------------------------------------------------------------- + +TEST("require that xw products with compatible dimensions are compiled") { + TEST_DO(assertCompiledXWProduct("tensor(x[3])", "tensor(x[3],y[4])", "x")); + TEST_DO(assertCompiledXWProduct("tensor(y[4])", "tensor(x[3],y[4])", "y")); +} + +TEST("require that xw products with incompatible dimensions are not compiled") { + TEST_DO(assertNotCompiledXWProduct("tensor(x[3])", "tensor(x[3],y[4])", "y")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[])", "tensor(x[3],y[4])", "x")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[3])", "tensor(x[],y[4])", "x")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[3])", "tensor(x[3],y[])", "x")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[2])", "tensor(x[3],y[4])", "x")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[4])", "tensor(x[3],y[4])", "x")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[3])", "tensor(y[3],z[4])", "x")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[3])", "tensor(y[3],z[4])", "y")); + TEST_DO(assertNotCompiledXWProduct("tensor(x[3])", "tensor(y[3],z[4])", "z")); + TEST_DO(assertNotCompiledXWProduct("tensor(y[4])", "tensor(x[3],y[4])", "x")); + TEST_DO(assertNotCompiledXWProduct("tensor(y[3])", "tensor(x[3],y[4])", "y")); + TEST_DO(assertNotCompiledXWProduct("tensor(y[5])", "tensor(x[3],y[4])", "y")); +} + +//----------------------------------------------------------------------------- + TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/eval/src/tests/tensor/dense_xw_product_function/CMakeLists.txt b/eval/src/tests/tensor/dense_xw_product_function/CMakeLists.txt new file mode 100644 index 00000000000..648c10e64bd --- /dev/null +++ b/eval/src/tests/tensor/dense_xw_product_function/CMakeLists.txt @@ -0,0 +1,8 @@ +# Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(eval_dense_xw_product_function_test_app TEST + SOURCES + dense_xw_product_function_test.cpp + DEPENDS + vespaeval +) +vespa_add_test(NAME eval_dense_xw_product_function_test_app COMMAND eval_dense_xw_product_function_test_app) diff --git a/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp b/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp new file mode 100644 index 00000000000..5c62d319dc3 --- /dev/null +++ b/eval/src/tests/tensor/dense_xw_product_function/dense_xw_product_function_test.cpp @@ -0,0 +1,102 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/log/log.h> +LOG_SETUP("dense_dot_product_function_test"); + +#include <vespa/vespalib/testkit/test_kit.h> +#include <vespa/eval/eval/tensor_function.h> +#include <vespa/eval/eval/operation.h> +#include <vespa/eval/eval/simple_tensor.h> +#include <vespa/eval/eval/simple_tensor_engine.h> +#include <vespa/eval/tensor/default_tensor_engine.h> +#include <vespa/eval/tensor/dense/dense_xw_product_function.h> +#include <vespa/eval/tensor/dense/dense_tensor.h> +#include <vespa/eval/tensor/dense/dense_tensor_builder.h> +#include <vespa/eval/tensor/dense/dense_tensor_view.h> + +#include <vespa/vespalib/util/stringfmt.h> +#include <vespa/vespalib/util/stash.h> + +using namespace vespalib; +using namespace vespalib::eval; +using namespace vespalib::tensor; + +const TensorEngine &ref_engine = SimpleTensorEngine::ref(); +const TensorEngine &prod_engine = DefaultTensorEngine::ref(); + +void verify_equal(const Value &expect, const Value &value) { + const eval::Tensor *tensor = value.as_tensor(); + ASSERT_TRUE(tensor != nullptr); + const eval::Tensor *expect_tensor = expect.as_tensor(); + ASSERT_TRUE(expect_tensor != nullptr); + auto expect_spec = expect_tensor->engine().to_spec(expect); + auto value_spec = tensor->engine().to_spec(value); + EXPECT_EQUAL(expect_spec, value_spec); +} + +std::vector<eval::Value::CREF> wrap(std::vector<eval::Value::CREF> params) { + return std::move(params); +} + +void verify_result(const TensorSpec &v, const TensorSpec &m, bool happy) { + Stash stash; + Value::UP ref_vec = ref_engine.from_spec(v); + Value::UP ref_mat = ref_engine.from_spec(m); + const Value &joined = ref_engine.join(*ref_vec, *ref_mat, operation::Mul::f, stash); + const Value &expect = ref_engine.reduce(joined, Aggr::SUM, {"x"}, stash); + + Value::UP prod_vec = prod_engine.from_spec(v); + Value::UP prod_mat = prod_engine.from_spec(m); + + DenseXWProductFunction fun1(expect.type(), 0, 1, + prod_vec->type().dimensions()[0].size, + expect.type().dimensions()[0].size, + happy); + const Value &actual1 = fun1.eval(wrap({*prod_vec, *prod_mat}), stash); + TEST_DO(verify_equal(expect, actual1)); + + DenseXWProductFunction fun2(expect.type(), 1, 0, + prod_vec->type().dimensions()[0].size, + expect.type().dimensions()[0].size, + happy); + const Value &actual2 = fun2.eval(wrap({*prod_mat, *prod_vec}), stash); + TEST_DO(verify_equal(expect, actual2)); +} + +TensorSpec make_vector(const vespalib::string &name, size_t sz) { + TensorSpec ret(make_string("tensor(%s[%zu])", name.c_str(), sz)); + for (size_t i = 0; i < sz; ++i) { + ret.add({{name, i}}, (1.0 + i) * 16.0); + } + return ret; +} + +TensorSpec make_matrix(const vespalib::string &d1name, size_t d1sz, + const vespalib::string &d2name, size_t d2sz) +{ + TensorSpec ret(make_string("tensor(%s[%zu],%s[%zu])", + d1name.c_str(), d1sz, + d2name.c_str(), d2sz)); + for (size_t i = 0; i < d1sz; ++i) { + for (size_t j = 0; j < d2sz; ++j) { + ret.add({{d1name,i},{d2name,j}}, 1.0 + i*7.0 + j*43.0); + } + } + return ret; +} + +TEST("require that xw product gives same results as reference join/reduce") { + verify_result(make_vector("x", 1), make_matrix("o", 1, "x", 1), true); + verify_result(make_vector("x", 1), make_matrix("x", 1, "y", 1), false); + + verify_result(make_vector("x", 3), make_matrix("o", 2, "x", 3), true); + verify_result(make_vector("x", 3), make_matrix("x", 3, "y", 2), false); + + verify_result(make_vector("x", 5), make_matrix("o", 8, "x", 5), true); + verify_result(make_vector("x", 5), make_matrix("x", 5, "y", 8), false); + + verify_result(make_vector("x", 16), make_matrix("o", 5, "x", 16), true); + verify_result(make_vector("x", 16), make_matrix("x", 16, "y", 5), false); +} + +TEST_MAIN() { TEST_RUN_ALL(); } diff --git a/eval/src/vespa/eval/eval/tensor_function.h b/eval/src/vespa/eval/eval/tensor_function.h index 359cabc18a0..e23dc8c6fc0 100644 --- a/eval/src/vespa/eval/eval/tensor_function.h +++ b/eval/src/vespa/eval/eval/tensor_function.h @@ -45,9 +45,13 @@ struct TensorFunction virtual ~TensorFunction() {} }; -//----------------------------------------------------------------------------- +/** + * Simple typecasting utility. + */ +template <typename T> +const T *as(const TensorFunction &node) { return dynamic_cast<const T *>(&node); } -struct TensorFunctionVisitor; +//----------------------------------------------------------------------------- namespace tensor_function { @@ -77,12 +81,6 @@ struct Node : public TensorFunction Node &operator=(Node &&) = delete; }; -/** - * Simple typecasting utility. - */ -template <typename T> -const T *as(const Node &node) { return dynamic_cast<const T *>(&node); } - struct Inject : Node { const size_t tensor_id; Inject(const ValueType &result_type_in, diff --git a/eval/src/vespa/eval/tensor/default_tensor_engine.cpp b/eval/src/vespa/eval/tensor/default_tensor_engine.cpp index 1f413925319..773d2364b7d 100644 --- a/eval/src/vespa/eval/tensor/default_tensor_engine.cpp +++ b/eval/src/vespa/eval/tensor/default_tensor_engine.cpp @@ -321,8 +321,8 @@ size_t vector_size(const ValueType &type, const vespalib::string &dimension) { } void append_vector(double *&pos, const Value &value) { - const DenseTensorView *view = dynamic_cast<const DenseTensorView *>(&value); - if (view) { + if (auto tensor = value.as_tensor()) { + const DenseTensorView *view = static_cast<const DenseTensorView *>(tensor); for (double cell: view->cellsRef()) { *pos++ = cell; } diff --git a/eval/src/vespa/eval/tensor/dense/CMakeLists.txt b/eval/src/vespa/eval/tensor/dense/CMakeLists.txt index ec715bce3d9..54698371f4e 100644 --- a/eval/src/vespa/eval/tensor/dense/CMakeLists.txt +++ b/eval/src/vespa/eval/tensor/dense/CMakeLists.txt @@ -3,6 +3,7 @@ vespa_add_library(eval_tensor_dense OBJECT SOURCES direct_dense_tensor_builder.cpp dense_dot_product_function.cpp + dense_xw_product_function.cpp dense_tensor.cpp dense_tensor_address_combiner.cpp dense_tensor_builder.cpp diff --git a/eval/src/vespa/eval/tensor/dense/dense_dot_product_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_dot_product_function.cpp index 705496714fa..992f2eae750 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_dot_product_function.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_dot_product_function.cpp @@ -23,9 +23,8 @@ namespace { CellsRef getCellsRef(const eval::Value &value) { - const Tensor *tensor = static_cast<const Tensor *>(value.as_tensor()); - const DenseTensorView *denseTensor = static_cast<const DenseTensorView *>(tensor); - return denseTensor->cellsRef(); + const DenseTensorView &denseTensor = static_cast<const DenseTensorView &>(value); + return denseTensor.cellsRef(); } } diff --git a/eval/src/vespa/eval/tensor/dense/dense_tensor_function_compiler.cpp b/eval/src/vespa/eval/tensor/dense/dense_tensor_function_compiler.cpp index e9ee7d30692..1268a46b8e5 100644 --- a/eval/src/vespa/eval/tensor/dense/dense_tensor_function_compiler.cpp +++ b/eval/src/vespa/eval/tensor/dense/dense_tensor_function_compiler.cpp @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "dense_dot_product_function.h" +#include "dense_xw_product_function.h" #include "dense_tensor_function_compiler.h" #include <vespa/eval/eval/operation.h> #include <vespa/vespalib/test/insertion_operators.h> @@ -15,39 +16,64 @@ namespace tensor { namespace { -bool -willReduceAllDimensions(const std::vector<vespalib::string> &dimensions) -{ - return (dimensions.empty() || (dimensions.size() == 1)); +bool is1dDenseTensor(const ValueType &type) { + return (type.is_dense() && (type.dimensions().size() == 1)); } -bool -is1dDenseTensor(const ValueType &type) -{ - return (type.is_dense() && (type.dimensions().size() == 1)); +bool isConcreteDenseTensor(const ValueType &type, size_t d) { + return (type.is_dense() && (type.dimensions().size() == d) && !type.is_abstract()); } -bool -isCompatibleTensorsForDotProduct(const ValueType &lhsType, const ValueType &rhsType) -{ - return (is1dDenseTensor(lhsType) && +bool isDenseDotProduct(const ValueType &res, const ValueType &lhsType, const ValueType &rhsType) { + return (res.is_double() && + is1dDenseTensor(lhsType) && is1dDenseTensor(rhsType) && (lhsType.dimensions()[0].name == rhsType.dimensions()[0].name)); } -struct DotProductFunctionCompiler +bool isDenseXWProduct(const ValueType &res, const ValueType &vec, const ValueType &mat) { + if (isConcreteDenseTensor(res, 1) && + isConcreteDenseTensor(vec, 1) && + isConcreteDenseTensor(mat, 2)) + { + size_t res_idx = mat.dimension_index(res.dimensions()[0].name); + size_t vec_idx = mat.dimension_index(vec.dimensions()[0].name); + size_t npos = ValueType::Dimension::npos; + if ((res_idx != npos) && (vec_idx != npos) && (res_idx != vec_idx)) { + return ((mat.dimensions()[res_idx].size == res.dimensions()[0].size) && + (mat.dimensions()[vec_idx].size == vec.dimensions()[0].size)); + } + } + return false; +} + +const TensorFunction &createDenseXWProduct(const ValueType &res, const Inject &vec, const Inject &mat, Stash &stash) { + bool common_is_inner = (mat.result_type.dimension_index(vec.result_type.dimensions()[0].name) == 1); + return stash.create<DenseXWProductFunction>(res, vec.tensor_id, mat.tensor_id, + vec.result_type.dimensions()[0].size, + res.dimensions()[0].size, + common_is_inner); +} + +struct InnerProductFunctionCompiler { static const TensorFunction &compile(const Node &expr, Stash &stash) { const Reduce *reduce = as<Reduce>(expr); - if (reduce && (reduce->aggr == Aggr::SUM) && willReduceAllDimensions(reduce->dimensions)) { + if (reduce && (reduce->aggr == Aggr::SUM)) { const Join *join = as<Join>(reduce->tensor); if (join && (join->function == Mul::f)) { - const Inject *lhsTensor = as<Inject>(join->lhs_tensor); - const Inject *rhsTensor = as<Inject>(join->rhs_tensor); - if (lhsTensor && rhsTensor && - isCompatibleTensorsForDotProduct(lhsTensor->result_type, rhsTensor->result_type)) - { - return stash.create<DenseDotProductFunction>(lhsTensor->tensor_id, rhsTensor->tensor_id); + const Inject *lhs = as<Inject>(join->lhs_tensor); + const Inject *rhs = as<Inject>(join->rhs_tensor); + if (lhs && rhs) { + if (isDenseDotProduct(expr.result_type, lhs->result_type, rhs->result_type)) { + return stash.create<DenseDotProductFunction>(lhs->tensor_id, rhs->tensor_id); + } + if (isDenseXWProduct(expr.result_type, lhs->result_type, rhs->result_type)) { + return createDenseXWProduct(expr.result_type, *lhs, *rhs, stash); + } + if (isDenseXWProduct(expr.result_type, rhs->result_type, lhs->result_type)) { + return createDenseXWProduct(expr.result_type, *rhs, *lhs, stash); + } } } } @@ -60,7 +86,7 @@ struct DotProductFunctionCompiler const TensorFunction & DenseTensorFunctionCompiler::compile(const eval::tensor_function::Node &expr, Stash &stash) { - return DotProductFunctionCompiler::compile(expr, stash); + return InnerProductFunctionCompiler::compile(expr, stash); } } // namespace tensor diff --git a/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp new file mode 100644 index 00000000000..45de00dc7fe --- /dev/null +++ b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.cpp @@ -0,0 +1,91 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "dense_xw_product_function.h" +#include "dense_tensor.h" +#include "dense_tensor_view.h" +#include <vespa/eval/eval/value.h> +#include <vespa/eval/tensor/tensor.h> +#include <vespa/vespalib/util/exceptions.h> +#include <assert.h> + +namespace vespalib { +namespace tensor { + +DenseXWProductFunction::DenseXWProductFunction(const eval::ValueType &resultType, + size_t vectorId, + size_t matrixId, + size_t vectorSize, + size_t resultSize, + bool matrixHasCommonDimensionInnermost) + : _resultType(resultType), + _vectorId(vectorId), + _matrixId(matrixId), + _vectorSize(vectorSize), + _resultSize(resultSize), + _commonDimensionInnermost(matrixHasCommonDimensionInnermost), + _hwAccelerator(hwaccelrated::IAccelrated::getAccelrator()) +{} + +void +DenseXWProductFunction::multiDotProduct(const XWInput &vectorCells, + const XWInput &matrixCells, + XWOutput &result) const +{ + double *out = result.begin(); + const double *matrixP = matrixCells.cbegin(); + const double * const vectorP = vectorCells.cbegin(); + for (size_t row = 0; row < _resultSize; ++row) { + double cell = _hwAccelerator->dotProduct(vectorP, matrixP, _vectorSize); + *out++ = cell; + matrixP += _vectorSize; + } + assert(out == result.end()); + assert(matrixP == matrixCells.cend()); +} + +void +DenseXWProductFunction::transposedProduct(const XWInput &vectorCells, + const XWInput &matrixCells, + XWOutput &result) const +{ + double *out = result.begin(); + const double * const matrixP = matrixCells.cbegin(); + const double * const vectorP = vectorCells.cbegin(); + for (size_t row = 0; row < _resultSize; ++row) { + double cell = 0; + for (size_t col = 0; col < _vectorSize; ++col) { + cell += matrixP[col*_resultSize + row] * vectorP[col]; + } + *out++ = cell; + } + assert(out == result.end()); +} + +namespace { + +DenseTensorView::CellsRef +getCellsRef(const eval::Value &value) +{ + const DenseTensorView &denseTensor = static_cast<const DenseTensorView &>(value); + return denseTensor.cellsRef(); +} + +} // namespace <unnamed> + +const eval::Value & +DenseXWProductFunction::eval(ConstArrayRef<eval::Value::CREF> params, Stash &stash) const +{ + DenseTensorView::CellsRef vectorCells = getCellsRef(params[_vectorId]); + DenseTensorView::CellsRef matrixCells = getCellsRef(params[_matrixId]); + + ArrayRef<double> outputCells = stash.create_array<double>(_resultSize); + if (_commonDimensionInnermost) { + multiDotProduct(vectorCells, matrixCells, outputCells); + } else { + transposedProduct(vectorCells, matrixCells, outputCells); + } + return stash.create<DenseTensorView>(_resultType, outputCells); +} + +} // namespace tensor +} // namespace vespalib diff --git a/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.h b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.h new file mode 100644 index 00000000000..db006100e5a --- /dev/null +++ b/eval/src/vespa/eval/tensor/dense/dense_xw_product_function.h @@ -0,0 +1,53 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include <vespa/eval/eval/tensor_function.h> +#include "dense_tensor_view.h" +#include <vespa/vespalib/hwaccelrated/iaccelrated.h> + +namespace vespalib { +namespace tensor { + +using XWInput = DenseTensorView::CellsRef; +using XWOutput = ArrayRef<double>; + +/** + * Tensor function for product of one 1-dimensional and one 2-dimensional dense tensor. + */ +class DenseXWProductFunction : public eval::TensorFunction +{ +private: + const eval::ValueType _resultType; + const size_t _vectorId; + const size_t _matrixId; + const size_t _vectorSize; + const size_t _resultSize; + bool _commonDimensionInnermost; + hwaccelrated::IAccelrated::UP _hwAccelerator; + + void multiDotProduct(const XWInput &v, const XWInput &m, XWOutput &r) const; + void transposedProduct(const XWInput &v, const XWInput &m, XWOutput &r) const; +public: + DenseXWProductFunction(const eval::ValueType &resultType, + size_t vectorId, + size_t matrixId, + size_t vectorSize, + size_t resultSize, + bool matrixHasCommonDimensionInnermost); + + ~DenseXWProductFunction() {} + + size_t vectorId() const { return _vectorId; } + size_t matrixId() const { return _matrixId; } + + size_t vectorSize() const { return _vectorSize; } + size_t resultSize() const { return _resultSize; } + + bool matrixHasCommonDimensionInnermost() const { return _commonDimensionInnermost; } + + const eval::Value &eval(ConstArrayRef<eval::Value::CREF> params, Stash &stash) const override; +}; + +} // namespace tensor +} // namespace vespalib diff --git a/fileacquirer/pom.xml b/fileacquirer/pom.xml index eb040eddffb..6449b8c620f 100644 --- a/fileacquirer/pom.xml +++ b/fileacquirer/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>fileacquirer</artifactId> <version>6-SNAPSHOT</version> diff --git a/filedistribution/pom.xml b/filedistribution/pom.xml index 10b77b540e7..b0bdaff518f 100644 --- a/filedistribution/pom.xml +++ b/filedistribution/pom.xml @@ -9,7 +9,8 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> - </parent> + <relativePath>../parent/pom.xml</relativePath> + </parent> <artifactId>filedistribution</artifactId> <version>6-SNAPSHOT</version> diff --git a/filedistribution_test/pom.xml b/filedistribution_test/pom.xml index c270eabb6cf..5cc113c6453 100644 --- a/filedistribution_test/pom.xml +++ b/filedistribution_test/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>filedistribution_test</artifactId> <version>6-SNAPSHOT</version> diff --git a/filedistributionmanager/pom.xml b/filedistributionmanager/pom.xml index 9e3ecf95ecb..9f037814a12 100644 --- a/filedistributionmanager/pom.xml +++ b/filedistributionmanager/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>filedistributionmanager</artifactId> <version>6-SNAPSHOT</version> diff --git a/fsa/pom.xml b/fsa/pom.xml index a49845105cf..2a56069f82e 100644 --- a/fsa/pom.xml +++ b/fsa/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>fsa</artifactId> <packaging>container-plugin</packaging> diff --git a/indexinglanguage/pom.xml b/indexinglanguage/pom.xml index 70cb9f6d8d0..f0aba8d9476 100644 --- a/indexinglanguage/pom.xml +++ b/indexinglanguage/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>indexinglanguage</artifactId> <packaging>jar</packaging> diff --git a/jaxrs_client_utils/pom.xml b/jaxrs_client_utils/pom.xml index 1c4bdde21a8..e3de5b8163d 100644 --- a/jaxrs_client_utils/pom.xml +++ b/jaxrs_client_utils/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>jaxrs_client_utils</artifactId> <version>6-SNAPSHOT</version> diff --git a/jaxrs_utils/pom.xml b/jaxrs_utils/pom.xml index 249cbda992b..1753d016ec3 100644 --- a/jaxrs_utils/pom.xml +++ b/jaxrs_utils/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>jaxrs_utils</artifactId> <version>6-SNAPSHOT</version> diff --git a/jdisc_core/pom.xml b/jdisc_core/pom.xml index fb8200eb610..55da222994f 100644 --- a/jdisc_core/pom.xml +++ b/jdisc_core/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>jdisc_core</artifactId> <version>6-SNAPSHOT</version> diff --git a/jdisc_core_test/pom.xml b/jdisc_core_test/pom.xml index 92e7a39fee0..a1a96463ffc 100644 --- a/jdisc_core_test/pom.xml +++ b/jdisc_core_test/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <groupId>com.yahoo.vespa.jdisc_core</groupId> <artifactId>parent</artifactId> diff --git a/jdisc_http_service/pom.xml b/jdisc_http_service/pom.xml index d8c0b0bc29c..a1482669b39 100644 --- a/jdisc_http_service/pom.xml +++ b/jdisc_http_service/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>jdisc_http_service</artifactId> <version>6-SNAPSHOT</version> diff --git a/jdisc_jetty/pom.xml b/jdisc_jetty/pom.xml index 4e739aae8cc..0f8a5ba19e2 100644 --- a/jdisc_jetty/pom.xml +++ b/jdisc_jetty/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>jdisc_jetty</artifactId> <version>6-SNAPSHOT</version> diff --git a/jdisc_messagebus_service/pom.xml b/jdisc_messagebus_service/pom.xml index e9531a73861..6201f413b9a 100644 --- a/jdisc_messagebus_service/pom.xml +++ b/jdisc_messagebus_service/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>jdisc_messagebus_service</artifactId> <version>6-SNAPSHOT</version> diff --git a/jrt/pom.xml b/jrt/pom.xml index 0d6be56fdab..cf3da2ab7ce 100644 --- a/jrt/pom.xml +++ b/jrt/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>jrt</artifactId> <packaging>container-plugin</packaging> diff --git a/linguistics/pom.xml b/linguistics/pom.xml index 328742f483a..e4aa7c3049e 100644 --- a/linguistics/pom.xml +++ b/linguistics/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>linguistics</artifactId> <packaging>container-plugin</packaging> @@ -59,6 +60,7 @@ <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <scope>provided</scope> + <classifier>no_aop</classifier> </dependency> </dependencies> <build> diff --git a/logd/pom.xml b/logd/pom.xml index e21931efc5a..a1a107bc20c 100644 --- a/logd/pom.xml +++ b/logd/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>logd</artifactId> <version>6-SNAPSHOT</version> diff --git a/logserver/pom.xml b/logserver/pom.xml index 6acdd8ed1d7..55c5c443cfb 100644 --- a/logserver/pom.xml +++ b/logserver/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>logserver</artifactId> <packaging>jar</packaging> diff --git a/maven-plugins/pom.xml b/maven-plugins/pom.xml index 2f7343e753c..0aabe630a63 100644 --- a/maven-plugins/pom.xml +++ b/maven-plugins/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <groupId>com.yahoo.vespa</groupId> <artifactId>bundle-plugins</artifactId> diff --git a/messagebus-disc/pom.xml b/messagebus-disc/pom.xml index 46158b0ca60..89741dce82b 100644 --- a/messagebus-disc/pom.xml +++ b/messagebus-disc/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>messagebus-disc</artifactId> <version>6-SNAPSHOT</version> diff --git a/messagebus/pom.xml b/messagebus/pom.xml index 7fb44787cdf..7c37bccbd9a 100644 --- a/messagebus/pom.xml +++ b/messagebus/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>messagebus</artifactId> <version>6-SNAPSHOT</version> diff --git a/metrics/pom.xml b/metrics/pom.xml index ec64d0d392c..628ab66552d 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <groupId>com.yahoo.vespa</groupId> <artifactId>metrics</artifactId> diff --git a/node-admin/pom.xml b/node-admin/pom.xml index f7691cda3f7..983e4d3a832 100644 --- a/node-admin/pom.xml +++ b/node-admin/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>node-admin</artifactId> diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java index d3af55cdff5..d2863468ee7 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/docker/DockerOperationsImpl.java @@ -18,11 +18,13 @@ import com.yahoo.vespa.hosted.node.admin.util.PrefixLogger; import java.io.IOException; import java.net.Inet6Address; import java.net.InetAddress; +import java.net.URI; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import java.util.stream.Stream; import static com.yahoo.vespa.defaults.Defaults.getDefaults; @@ -99,7 +101,9 @@ public class DockerOperationsImpl implements DockerOperations { InetAddress nodeInetAddress = environment.getInetAddressForHost(nodeSpec.hostname); final boolean isIPv6 = nodeInetAddress instanceof Inet6Address; - String configServers = String.join(",", environment.getConfigServerHosts()); + String configServers = environment.getConfigServerUris().stream() + .map(URI::getHost) + .collect(Collectors.joining(",")); Docker.CreateContainerCommand command = docker.createContainerCommand( nodeSpec.wantedDockerImage.get(), ContainerResources.from(nodeSpec.minCpuCores, nodeSpec.minMainMemoryAvailableGb), diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java index 763291bf86b..f41d7deb04b 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/maintenance/StorageMaintainer.java @@ -21,6 +21,7 @@ import com.yahoo.vespa.hosted.node.admin.util.SecretAgentScheduleMaker; import java.io.IOException; import java.io.InputStreamReader; +import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -310,8 +311,8 @@ public class StorageMaintainer { * @throws RuntimeException if exit code != 0 */ public String getHardwareDivergence() { - String configServers = environment.getConfigServerHosts().stream() - .map(configServer -> "http://" + configServer + ":" + 4080) + String configServers = environment.getConfigServerUris().stream() + .map(URI::getHost) .collect(Collectors.joining(",")); return executeMaintainer("com.yahoo.vespa.hosted.node.verification.spec.SpecVerifier", configServers); } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdater.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdater.java index 906e6b55640..e380e7a2e26 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdater.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdater.java @@ -34,6 +34,7 @@ import java.util.stream.Collectors; import static com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater.State.RESUMED; import static com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater.State.SUSPENDED_NODE_ADMIN; +import static com.yahoo.vespa.hosted.node.admin.nodeadmin.NodeAdminStateUpdater.State.TRANSITIONING; /** * Pulls information from node repository and forwards containers to run to node admin. @@ -110,15 +111,15 @@ public class NodeAdminStateUpdater { return this.getClass().getSimpleName() + "@" + Integer.toString(System.identityHashCode(this)); } - public enum State { RESUMED, SUSPENDED_NODE_ADMIN, SUSPENDED} + public enum State { TRANSITIONING, RESUMED, SUSPENDED_NODE_ADMIN, SUSPENDED} public Map<String, Object> getDebugPage() { Map<String, Object> debug = new LinkedHashMap<>(); synchronized (monitor) { debug.put("dockerHostHostName", dockerHostHostName); + debug.put("wantedState", wantedState); + debug.put("currentState", currentState); debug.put("NodeAdmin", nodeAdmin.debugInfo()); - debug.put("Wanted State: ", wantedState); - debug.put("Current State: ", currentState); } return debug; } @@ -185,7 +186,7 @@ public class NodeAdminStateUpdater { log.log(LogLevel.ERROR, "Error while trying to converge to " + wantedStateCopy, e); } - if (wantedStateCopy != RESUMED && currentState == RESUMED) { + if (wantedStateCopy != RESUMED && currentState == TRANSITIONING) { Duration subsystemFreezeDuration = nodeAdmin.subsystemFreezeDuration(); if (subsystemFreezeDuration.compareTo(FREEZE_CONVERGENCE_TIMEOUT) > 0) { // We have spent too much time trying to freeze and node admin is still not frozen. @@ -203,8 +204,9 @@ public class NodeAdminStateUpdater { * with respect to: freeze, Orchestrator, and services running. */ private void convergeState(State wantedState) { - if (currentState == wantedState) { - return; + if (currentState == wantedState) return; + synchronized (monitor) { + currentState = TRANSITIONING; } boolean wantFrozen = wantedState != RESUMED; diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java index 8283c90e43d..b5c439e209a 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImpl.java @@ -31,11 +31,9 @@ public class NodeRepositoryImpl implements NodeRepository { private static final PrefixLogger NODE_ADMIN_LOGGER = PrefixLogger.getNodeAdminLogger(NodeRepositoryImpl.class); private final ConfigServerHttpRequestExecutor requestExecutor; - private final int port; - public NodeRepositoryImpl(ConfigServerHttpRequestExecutor requestExecutor, int port) { + public NodeRepositoryImpl(ConfigServerHttpRequestExecutor requestExecutor) { this.requestExecutor = requestExecutor; - this.port = port; } @Override @@ -43,7 +41,6 @@ public class NodeRepositoryImpl implements NodeRepository { try { final GetNodesResponse nodesForHost = requestExecutor.get( "/nodes/v2/node/?parentHost=" + baseHostName + "&recursive=true", - port, GetNodesResponse.class); if (nodesForHost.nodes == null) { @@ -71,7 +68,6 @@ public class NodeRepositoryImpl implements NodeRepository { public Optional<ContainerNodeSpec> getContainerNodeSpec(String hostName) { try { GetNodesResponse.Node nodeResponse = requestExecutor.get("/nodes/v2/node/" + hostName, - port, GetNodesResponse.Node.class); if (nodeResponse == null) { return Optional.empty(); @@ -86,7 +82,7 @@ public class NodeRepositoryImpl implements NodeRepository { public List<ContainerAclSpec> getContainerAclSpecs(String hostName) { try { final String path = String.format("/nodes/v2/acl/%s?children=true", hostName); - final GetAclResponse response = requestExecutor.get(path, port, GetAclResponse.class); + final GetAclResponse response = requestExecutor.get(path, GetAclResponse.class); return response.trustedNodes.stream() .map(node -> new ContainerAclSpec( node.hostname, node.ipAddress, ContainerName.fromHostname(node.trustedBy))) @@ -96,7 +92,7 @@ public class NodeRepositoryImpl implements NodeRepository { } } - public static ContainerNodeSpec createContainerNodeSpec(GetNodesResponse.Node node) + private static ContainerNodeSpec createContainerNodeSpec(GetNodesResponse.Node node) throws IllegalArgumentException, NullPointerException { Objects.requireNonNull(node.nodeState, "Unknown node state"); Node.State nodeState = Node.State.valueOf(node.nodeState); @@ -145,7 +141,6 @@ public class NodeRepositoryImpl implements NodeRepository { public void updateNodeAttributes(final String hostName, final NodeAttributes nodeAttributes) { UpdateNodeAttributesResponse response = requestExecutor.patch( "/nodes/v2/node/" + hostName, - port, new UpdateNodeAttributesRequestBody(nodeAttributes), UpdateNodeAttributesResponse.class); @@ -170,7 +165,6 @@ public class NodeRepositoryImpl implements NodeRepository { private void markNodeToState(String hostName, String state) { NodeMessageResponse response = requestExecutor.put( "/nodes/v2/state/" + state + "/" + hostName, - port, Optional.empty(), /* body */ NodeMessageResponse.class); NODE_ADMIN_LOGGER.info(response.message); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java index d1e996f8e93..7093f3f12e7 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImpl.java @@ -26,11 +26,9 @@ public class OrchestratorImpl implements Orchestrator { = ORCHESTRATOR_PATH_PREFIX + HostSuspensionApi.PATH_PREFIX; private final ConfigServerHttpRequestExecutor requestExecutor; - private final int port; - public OrchestratorImpl(ConfigServerHttpRequestExecutor requestExecutor, int port) { + public OrchestratorImpl(ConfigServerHttpRequestExecutor requestExecutor) { this.requestExecutor = requestExecutor; - this.port = port; } @Override @@ -38,7 +36,6 @@ public class OrchestratorImpl implements Orchestrator { UpdateHostResponse response; try { response = requestExecutor.put(getSuspendPath(hostName), - port, Optional.empty(), /* body */ UpdateHostResponse.class); } catch (HttpException.NotFoundException n) { @@ -61,7 +58,6 @@ public class OrchestratorImpl implements Orchestrator { try { batchOperationResult = requestExecutor.put( ORCHESTRATOR_PATH_PREFIX_HOST_SUSPENSION_API, - port, Optional.of(new BatchHostSuspendRequest(parentHostName, hostNames)), BatchOperationResult.class); } catch (HttpException e) { @@ -81,7 +77,7 @@ public class OrchestratorImpl implements Orchestrator { UpdateHostResponse response; try { String path = getSuspendPath(hostName); - response = requestExecutor.delete(path, port, UpdateHostResponse.class); + response = requestExecutor.delete(path, UpdateHostResponse.class); } catch (HttpException.NotFoundException n) { throw new OrchestratorNotFoundException("Failed to resume " + hostName + ", host not found"); } catch (HttpException e) { diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java index 109dbab924c..a343e431b5a 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/provider/NodeAdminProvider.java @@ -29,8 +29,6 @@ import java.time.Clock; import java.time.Duration; import java.util.function.Function; -import static com.yahoo.vespa.defaults.Defaults.getDefaults; - /** * Set up node admin for production. * @@ -38,7 +36,6 @@ import static com.yahoo.vespa.defaults.Defaults.getDefaults; */ public class NodeAdminProvider implements Provider<NodeAdminStateUpdater> { - private static final int WEB_SERVICE_PORT = getDefaults().vespaWebServicePort(); private static final Duration NODE_AGENT_SCAN_INTERVAL = Duration.ofSeconds(30); private static final Duration NODE_ADMIN_CONVERGE_STATE_INTERVAL = Duration.ofSeconds(30); @@ -51,9 +48,9 @@ public class NodeAdminProvider implements Provider<NodeAdminStateUpdater> { ProcessExecuter processExecuter = new ProcessExecuter(); Environment environment = new Environment(); - ConfigServerHttpRequestExecutor requestExecutor = ConfigServerHttpRequestExecutor.create(environment.getConfigServerHosts()); - NodeRepository nodeRepository = new NodeRepositoryImpl(requestExecutor, WEB_SERVICE_PORT); - Orchestrator orchestrator = new OrchestratorImpl(requestExecutor, WEB_SERVICE_PORT); + ConfigServerHttpRequestExecutor requestExecutor = ConfigServerHttpRequestExecutor.create(environment.getConfigServerUris()); + NodeRepository nodeRepository = new NodeRepositoryImpl(requestExecutor); + Orchestrator orchestrator = new OrchestratorImpl(requestExecutor); DockerOperations dockerOperations = new DockerOperationsImpl(docker, environment, processExecuter); StorageMaintainer storageMaintainer = new StorageMaintainer(docker, processExecuter, metricReceiver, environment, clock); diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutor.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutor.java index e825fa4ac8f..bdfa98a5113 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutor.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutor.java @@ -12,18 +12,27 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.ssl.SSLContextBuilder; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.security.GeneralSecurityException; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; -import java.util.Set; /** * Retries request on config server a few times before giving up. Assumes that all requests should be sent with @@ -33,11 +42,11 @@ import java.util.Set; */ public class ConfigServerHttpRequestExecutor { private static final PrefixLogger NODE_ADMIN_LOGGER = PrefixLogger.getNodeAdminLogger(ConfigServerHttpRequestExecutor.class); + private static final int MAX_LOOPS = 2; private final ObjectMapper mapper = new ObjectMapper(); private final CloseableHttpClient client; - private final List<String> configServerHosts; - private final static int MAX_LOOPS = 2; + private final List<URI> configServerHosts; @Override public void finalize() throws Throwable { @@ -50,31 +59,45 @@ public class ConfigServerHttpRequestExecutor { super.finalize(); } - public static ConfigServerHttpRequestExecutor create(Set<String> configServerHosts) { - if (configServerHosts.isEmpty()) { - throw new IllegalStateException("Environment setting for config servers missing or empty."); - } + public static ConfigServerHttpRequestExecutor create(Collection<URI> configServerUris) { + PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(getConnectionSocketFactoryRegistry()); + cm.setMaxTotal(200); // Increase max total connections to 200, which should be enough + + return new ConfigServerHttpRequestExecutor(randomizeConfigServerUris(configServerUris), + HttpClientBuilder.create() + .disableAutomaticRetries() + .setUserAgent("node-admin") + .setConnectionManager(cm).build()); + } - PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); - // Increase max total connections to 200, which should be enough - cm.setMaxTotal(200); - return new ConfigServerHttpRequestExecutor(configServerHosts, - HttpClientBuilder.create().disableAutomaticRetries().setConnectionManager(cm).build()); + private static Registry<ConnectionSocketFactory> getConnectionSocketFactoryRegistry() { + try { + SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory( + new SSLContextBuilder().loadTrustMaterial(null, (arg0, arg1) -> true).build(), + NoopHostnameVerifier.INSTANCE); + + return RegistryBuilder.<ConnectionSocketFactory>create() + .register("http", PlainConnectionSocketFactory.getSocketFactory()) + .register("https", sslSocketFactory) + .build(); + } catch (GeneralSecurityException e) { + throw new RuntimeException("Failed to create SSL context", e); + } } - ConfigServerHttpRequestExecutor(Set<String> configServerHosts, CloseableHttpClient client) { - this.configServerHosts = randomizeConfigServerHosts(configServerHosts); + ConfigServerHttpRequestExecutor(List<URI> configServerHosts, CloseableHttpClient client) { + this.configServerHosts = configServerHosts; this.client = client; } public interface CreateRequest { - HttpUriRequest createRequest(String configserver) throws JsonProcessingException, UnsupportedEncodingException; + HttpUriRequest createRequest(URI configServerUri) throws JsonProcessingException, UnsupportedEncodingException; } private <T> T tryAllConfigServers(CreateRequest requestFactory, Class<T> wantedReturnType) { Exception lastException = null; for (int loopRetry = 0; loopRetry < MAX_LOOPS; loopRetry++) { - for (String configServer : configServerHosts) { + for (URI configServer : configServerHosts) { final CloseableHttpResponse response; try { response = client.execute(requestFactory.createRequest(configServer)); @@ -118,9 +141,9 @@ public class ConfigServerHttpRequestExecutor { + configServerHosts + ") failed, last as follows:", lastException); } - public <T> T put(String path, int port, Optional<Object> bodyJsonPojo, Class<T> wantedReturnType) { + public <T> T put(String path, Optional<Object> bodyJsonPojo, Class<T> wantedReturnType) { return tryAllConfigServers(configServer -> { - HttpPut put = new HttpPut("http://" + configServer + ":" + port + path); + HttpPut put = new HttpPut(configServer.resolve(path)); setContentTypeToApplicationJson(put); if (bodyJsonPojo.isPresent()) { put.setEntity(new StringEntity(mapper.writeValueAsString(bodyJsonPojo.get()))); @@ -129,28 +152,28 @@ public class ConfigServerHttpRequestExecutor { }, wantedReturnType); } - public <T> T patch(String path, int port, Object bodyJsonPojo, Class<T> wantedReturnType) { + public <T> T patch(String path, Object bodyJsonPojo, Class<T> wantedReturnType) { return tryAllConfigServers(configServer -> { - HttpPatch patch = new HttpPatch("http://" + configServer + ":" + port + path); + HttpPatch patch = new HttpPatch(configServer.resolve(path)); setContentTypeToApplicationJson(patch); patch.setEntity(new StringEntity(mapper.writeValueAsString(bodyJsonPojo))); return patch; }, wantedReturnType); } - public <T> T delete(String path, int port, Class<T> wantedReturnType) { + public <T> T delete(String path, Class<T> wantedReturnType) { return tryAllConfigServers(configServer -> - new HttpDelete("http://" + configServer + ":" + port + path), wantedReturnType); + new HttpDelete(configServer.resolve(path)), wantedReturnType); } - public <T> T get(String path, int port, Class<T> wantedReturnType) { + public <T> T get(String path, Class<T> wantedReturnType) { return tryAllConfigServers(configServer -> - new HttpGet("http://" + configServer + ":" + port + path), wantedReturnType); + new HttpGet(configServer.resolve(path)), wantedReturnType); } - public <T> T post(String path, int port, Object bodyJsonPojo, Class<T> wantedReturnType) { + public <T> T post(String path, Object bodyJsonPojo, Class<T> wantedReturnType) { return tryAllConfigServers(configServer -> { - HttpPost post = new HttpPost("http://" + configServer + ":" + port + path); + HttpPost post = new HttpPost(configServer.resolve(path)); setContentTypeToApplicationJson(post); post.setEntity(new StringEntity(mapper.writeValueAsString(bodyJsonPojo))); return post; @@ -161,9 +184,9 @@ public class ConfigServerHttpRequestExecutor { request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); } - // Shuffle config server hosts to balance load - private List<String> randomizeConfigServerHosts(Set<String> configServerHosts) { - List<String> shuffledConfigServerHosts = new ArrayList<>(configServerHosts); + // Shuffle config server URIs to balance load + private static List<URI> randomizeConfigServerUris(Collection<URI> configServerUris) { + List<URI> shuffledConfigServerHosts = new ArrayList<>(configServerUris); Collections.shuffle(shuffledConfigServerHosts); return shuffledConfigServerHosts; } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java index 65a4d84b4c3..2b5e7990617 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/util/Environment.java @@ -6,6 +6,7 @@ import com.yahoo.net.HostName; import com.yahoo.vespa.hosted.dockerapi.ContainerName; import java.net.InetAddress; +import java.net.URI; import java.net.UnknownHostException; import java.nio.file.Path; import java.nio.file.Paths; @@ -15,9 +16,7 @@ import java.time.Instant; import java.util.Arrays; import java.util.Collections; import java.util.Date; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.TimeZone; import java.util.stream.Collectors; @@ -31,13 +30,15 @@ public class Environment { private static final DateFormat filenameFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); public static final String APPLICATION_STORAGE_CLEANUP_PATH_PREFIX = "cleanup_"; - private static final String ENV_CONFIGSERVERS = "services__addr_configserver"; + private static final String ENV_CONFIGSERVER_SCHEME = "CONFIG_SERVER_SCHEME"; + private static final String ENV_CONFIGSERVER_HOSTS = "CONFIG_SERVER_ADDRESS"; + private static final String ENV_CONFIGSERVER_PORT = "CONFIG_SERVER_PORT"; private static final String ENVIRONMENT = "ENVIRONMENT"; private static final String REGION = "REGION"; private static final String LOGSTASH_NODES = "LOGSTASH_NODES"; private static final String COREDUMP_FEED_ENDPOINT = "COREDUMP_FEED_ENDPOINT"; - private final Set<String> configServerHosts; + private final List<URI> configServerHosts; private final String environment; private final String region; private final String parentHostHostname; @@ -51,7 +52,7 @@ public class Environment { } public Environment() { - this(getConfigServerHostsFromEnvironment(), + this(getConfigServerUrlsFromEnvironment(), getEnvironmentVariable(ENVIRONMENT), getEnvironmentVariable(REGION), HostName.getLocalhost(), @@ -61,7 +62,7 @@ public class Environment { getEnvironmentVariable(COREDUMP_FEED_ENDPOINT)); } - public Environment(Set<String> configServerHosts, + public Environment(List<URI> configServerHosts, String environment, String region, String parentHostHostname, @@ -79,7 +80,7 @@ public class Environment { this.feedEndpoint = feedEndpoint; } - public Set<String> getConfigServerHosts() { return configServerHosts; } + public List<URI> getConfigServerUris() { return configServerHosts; } public String getEnvironment() { return environment; @@ -95,7 +96,9 @@ public class Environment { private static String getEnvironmentVariable(String name) { final String value = System.getenv(name); - if (value == null) throw new IllegalStateException(String.format("Environment variable %s not set", name)); + if (Strings.isNullOrEmpty(value)) { + throw new IllegalStateException(String.format("Environment variable %s not set", name)); + } return value; } @@ -103,14 +106,14 @@ public class Environment { return getEnvironment() + "." + getRegion(); } - private static Set<String> getConfigServerHostsFromEnvironment() { - String configServerHosts = System.getenv(ENV_CONFIGSERVERS); - if (configServerHosts == null) { - return Collections.emptySet(); - } + private static List<URI> getConfigServerUrlsFromEnvironment() { + String scheme = getEnvironmentVariable(ENV_CONFIGSERVER_SCHEME); + String configServerHosts = getEnvironmentVariable(ENV_CONFIGSERVER_HOSTS); + String port = getEnvironmentVariable(ENV_CONFIGSERVER_PORT); - final List<String> hostNameStrings = Arrays.asList(configServerHosts.split("[,\\s]+")); - return new HashSet<>(hostNameStrings); + return Arrays.stream(configServerHosts.split("[,\\s]+")) + .map(hostname -> URI.create(scheme + "://" + hostname + ":" + port)) + .collect(Collectors.toList()); } private static List<String> getLogstashNodesFromEnvironment() { @@ -188,7 +191,7 @@ public class Environment { } public static class Builder { - private Set<String> configServerHosts = Collections.emptySet(); + private List<URI> configServerHosts = Collections.emptyList(); private String environment; private String region; private String parentHostHostname; @@ -197,8 +200,10 @@ public class Environment { private List<String> logstashNodes = Collections.emptyList(); private String feedEndpoint; - public Builder configServerHosts(String... hosts) { - configServerHosts = Arrays.stream(hosts).collect(Collectors.toSet()); + public Builder configServerUris(String... hosts) { + configServerHosts = Arrays.stream(hosts) + .map(URI::create) + .collect(Collectors.toList()); return this; } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java index ce062702a3b..1058278a02c 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterTest.java @@ -13,8 +13,9 @@ import org.junit.Test; import java.io.IOException; import java.time.Duration; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -50,26 +51,13 @@ public class NodeAdminStateUpdaterTest { @Test public void testStateConvergence() throws IOException { - List<ContainerNodeSpec> containersToRun = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - containersToRun.add( - new ContainerNodeSpec.Builder() - .hostname("host" + i + ".test.yahoo.com") - .nodeState(i % 3 == 0 ? Node.State.active : Node.State.ready) - .nodeType("tenant") - .nodeFlavor("docker") - .minCpuCores(1) - .minMainMemoryAvailableGb(1) - .minDiskAvailableGb(1) - .build()); - } - List<String> activeHostnames = Arrays.asList( - "host0.test.yahoo.com", "host3.test.yahoo.com", "host6.test.yahoo.com", "host9.test.yahoo.com"); + mockNodeRepo(4); + List<String> activeHostnames = nodeRepository.getContainersToRun(parentHostname).stream() + .map(node -> node.hostname) + .collect(Collectors.toList()); List<String> suspendHostnames = new ArrayList<>(activeHostnames); suspendHostnames.add(parentHostname); - when(nodeRepository.getContainersToRun(eq(parentHostname))).thenReturn(containersToRun); - // Initially everything is frozen to force convergence assertFalse(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.RESUMED)); when(nodeAdmin.setFrozen(eq(false))).thenReturn(true); @@ -148,7 +136,7 @@ public class NodeAdminStateUpdaterTest { assertTrue(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.SUSPENDED)); verify(refresher, times(2)).signalWorkToBeDone(); // No change in desired state verifyNoMoreInteractions(nodeAdmin); - + // Lets try going back to resumed when(nodeAdmin.setFrozen(eq(false))).thenReturn(false).thenReturn(true); // NodeAgents not converged to yet assertFalse(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.RESUMED)); @@ -163,6 +151,50 @@ public class NodeAdminStateUpdaterTest { assertTrue(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.RESUMED)); } + @Test + public void half_transition_revert() throws IOException { + mockNodeRepo(3); + + // Initially everything is frozen to force convergence + when(nodeAdmin.setFrozen(eq(false))).thenReturn(true); + doNothing().when(orchestrator).resume(parentHostname); + tickAfter(0); // The first tick should unfreeze + assertTrue(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.RESUMED)); + verify(nodeAdmin, times(1)).setFrozen(eq(false)); + + // Let's start suspending, we are able to freeze the nodes, but orchestrator denies suspension + when(nodeAdmin.subsystemFreezeDuration()).thenReturn(Duration.ofSeconds(1)); + when(nodeAdmin.setFrozen(eq(true))).thenReturn(true); + doThrow(new RuntimeException("Cannot allow to suspend because some reason")) + .when(orchestrator).suspend(eq(parentHostname)); + + assertFalse(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.SUSPENDED_NODE_ADMIN)); + tickAfter(0); + verify(nodeAdmin, times(1)).setFrozen(eq(true)); + + // We change our mind, want to remain resumed + assertFalse(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.RESUMED)); + tickAfter(0); + assertTrue(refresher.setResumeStateAndCheckIfResumed(NodeAdminStateUpdater.State.RESUMED)); + verify(nodeAdmin, times(2)).setFrozen(eq(false)); // Make sure that we unfreeze! + } + + private void mockNodeRepo(int numberOfNodes) throws IOException { + List<ContainerNodeSpec> containersToRun = IntStream.range(0, numberOfNodes) + .mapToObj(i -> new ContainerNodeSpec.Builder() + .hostname("host" + i + ".test.yahoo.com") + .nodeState(Node.State.active) + .nodeType("tenant") + .nodeFlavor("docker") + .minCpuCores(1) + .minMainMemoryAvailableGb(1) + .minDiskAvailableGb(1) + .build()) + .collect(Collectors.toList()); + + when(nodeRepository.getContainersToRun(eq(parentHostname))).thenReturn(containersToRun); + } + private void tickAfter(int seconds) { clock.advance(Duration.ofSeconds(seconds)); refresher.tick(); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java index 7456b07d2f4..45f5de3d1a5 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/noderepository/NodeRepositoryImplTest.java @@ -17,6 +17,7 @@ import org.junit.Test; import java.io.IOException; import java.net.ServerSocket; +import java.net.URI; import java.time.Instant; import java.util.Collections; import java.util.List; @@ -35,9 +36,7 @@ import static org.junit.Assert.fail; */ public class NodeRepositoryImplTest { private JDisc container; - private int port; - private final ConfigServerHttpRequestExecutor requestExecutor = ConfigServerHttpRequestExecutor.create( - Collections.singleton("127.0.0.1")); + private ConfigServerHttpRequestExecutor requestExecutor; private int findRandomOpenPort() throws IOException { @@ -56,14 +55,15 @@ public class NodeRepositoryImplTest { */ @Before public void startContainer() throws Exception { - port = findRandomOpenPort(); - System.err.println("PORT IS " + port); + final int port = findRandomOpenPort(); + requestExecutor = ConfigServerHttpRequestExecutor.create( + Collections.singleton(URI.create("http://127.0.0.1:" + port))); container = JDisc.fromServicesXml(ContainerConfig.servicesXmlV2(port), Networking.enable); } private void waitForJdiscContainerToServe() throws InterruptedException { Instant start = Instant.now(); - NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port); + NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor); while (Instant.now().minusSeconds(120).isBefore(start)) { try { nodeRepositoryApi.getContainersToRun("foobar"); @@ -85,7 +85,7 @@ public class NodeRepositoryImplTest { @Test public void testGetContainersToRunApi() throws IOException, InterruptedException { waitForJdiscContainerToServe(); - NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port); + NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor); String dockerHostHostname = "dockerhost1.yahoo.com"; final List<ContainerNodeSpec> containersToRun = nodeRepositoryApi.getContainersToRun(dockerHostHostname); @@ -104,7 +104,7 @@ public class NodeRepositoryImplTest { @Test public void testGetContainer() throws InterruptedException, IOException { waitForJdiscContainerToServe(); - NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port); + NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor); String hostname = "host4.yahoo.com"; Optional<ContainerNodeSpec> nodeSpec = nodeRepositoryApi.getContainerNodeSpec(hostname); assertThat(nodeSpec.isPresent(), is(true)); @@ -114,7 +114,7 @@ public class NodeRepositoryImplTest { @Test public void testGetContainerForNonExistingNode() throws InterruptedException, IOException { waitForJdiscContainerToServe(); - NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port); + NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor); String hostname = "host-that-does-not-exist"; Optional<ContainerNodeSpec> nodeSpec = nodeRepositoryApi.getContainerNodeSpec(hostname); assertFalse(nodeSpec.isPresent()); @@ -123,7 +123,7 @@ public class NodeRepositoryImplTest { @Test public void testUpdateNodeAttributes() throws InterruptedException, IOException { waitForJdiscContainerToServe(); - NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port); + NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor); String hostname = "host4.yahoo.com"; nodeRepositoryApi.updateNodeAttributes( hostname, @@ -136,7 +136,7 @@ public class NodeRepositoryImplTest { @Test(expected = RuntimeException.class) public void testUpdateNodeAttributesWithBadValue() throws InterruptedException, IOException { waitForJdiscContainerToServe(); - NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port); + NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor); String hostname = "host4.yahoo.com"; nodeRepositoryApi.updateNodeAttributes( hostname, @@ -148,7 +148,7 @@ public class NodeRepositoryImplTest { @Test public void testMarkAsReady() throws InterruptedException, IOException { - NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor, port); + NodeRepository nodeRepositoryApi = new NodeRepositoryImpl(requestExecutor); waitForJdiscContainerToServe(); nodeRepositoryApi.markAsDirty("host5.yahoo.com"); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImplTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImplTest.java index 0a11ddd1e62..779a0a6a376 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImplTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/orchestrator/OrchestratorImplTest.java @@ -24,15 +24,12 @@ public class OrchestratorImplTest { private static final String hostName = "host123.yahoo.com"; private final ConfigServerHttpRequestExecutor requestExecutor = mock(ConfigServerHttpRequestExecutor.class); - private final int port = 1234; - private final OrchestratorImpl orchestrator = new OrchestratorImpl(requestExecutor, port); - + private final OrchestratorImpl orchestrator = new OrchestratorImpl(requestExecutor); @Test public void testSuspendCall() { when(requestExecutor.put( OrchestratorImpl.ORCHESTRATOR_PATH_PREFIX_HOST_API + "/" + hostName+ "/suspended", - port, Optional.empty(), UpdateHostResponse.class )).thenReturn(new UpdateHostResponse(hostName, null)); @@ -44,7 +41,6 @@ public class OrchestratorImplTest { public void testSuspendCallWithFailureReason() { when(requestExecutor.put( OrchestratorImpl.ORCHESTRATOR_PATH_PREFIX_HOST_API + "/" + hostName+ "/suspended", - port, Optional.empty(), UpdateHostResponse.class )).thenReturn(new UpdateHostResponse(hostName, new HostStateChangeDenialReason("hostname", "fail"))); @@ -56,7 +52,6 @@ public class OrchestratorImplTest { public void testSuspendCallWithNotFound() { when(requestExecutor.put( any(String.class), - any(Integer.class), any(), any() )).thenThrow(new HttpException.NotFoundException("Not Found")); @@ -68,7 +63,6 @@ public class OrchestratorImplTest { public void testSuspendCallWithSomeOtherException() { when(requestExecutor.put( any(String.class), - any(Integer.class), any(), any() )).thenThrow(new RuntimeException("Some parameter was wrong")); @@ -81,7 +75,6 @@ public class OrchestratorImplTest { public void testResumeCall() { when(requestExecutor.delete( OrchestratorImpl.ORCHESTRATOR_PATH_PREFIX_HOST_API + "/" + hostName+ "/suspended", - port, UpdateHostResponse.class )).thenReturn(new UpdateHostResponse(hostName, null)); @@ -92,7 +85,6 @@ public class OrchestratorImplTest { public void testResumeCallWithFailureReason() { when(requestExecutor.delete( OrchestratorImpl.ORCHESTRATOR_PATH_PREFIX_HOST_API + "/" + hostName+ "/suspended", - port, UpdateHostResponse.class )).thenReturn(new UpdateHostResponse(hostName, new HostStateChangeDenialReason("hostname", "fail"))); @@ -103,7 +95,6 @@ public class OrchestratorImplTest { public void testResumeCallWithNotFound() { when(requestExecutor.delete( any(String.class), - any(Integer.class), any() )).thenThrow(new HttpException.NotFoundException("Not Found")); @@ -114,7 +105,6 @@ public class OrchestratorImplTest { public void testResumeCallWithSomeOtherException() { when(requestExecutor.put( any(String.class), - any(Integer.class), any(), any() )).thenThrow(new RuntimeException("Some parameter was wrong")); @@ -130,7 +120,6 @@ public class OrchestratorImplTest { when(requestExecutor.put( OrchestratorImpl.ORCHESTRATOR_PATH_PREFIX_HOST_SUSPENSION_API, - port, Optional.of(new BatchHostSuspendRequest(parentHostName, hostNames)), BatchOperationResult.class )).thenReturn(BatchOperationResult.successResult()); @@ -146,7 +135,6 @@ public class OrchestratorImplTest { when(requestExecutor.put( OrchestratorImpl.ORCHESTRATOR_PATH_PREFIX_HOST_SUSPENSION_API, - port, Optional.of(new BatchHostSuspendRequest(parentHostName, hostNames)), BatchOperationResult.class )).thenReturn(new BatchOperationResult(failureReason)); @@ -162,7 +150,6 @@ public class OrchestratorImplTest { when(requestExecutor.put( OrchestratorImpl.ORCHESTRATOR_PATH_PREFIX_HOST_SUSPENSION_API, - port, Optional.of(new BatchHostSuspendRequest(parentHostName, hostNames)), BatchOperationResult.class )).thenThrow(new RuntimeException(exceptionMessage)); diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutorTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutorTest.java index d431f175b1c..67cd2c79034 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutorTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/util/ConfigServerHttpRequestExecutorTest.java @@ -3,19 +3,22 @@ package com.yahoo.vespa.hosted.node.admin.util; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.yahoo.collections.ArraySet; -import org.apache.http.HttpEntity; -import org.apache.http.StatusLine; +import org.apache.http.HttpVersion; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; +import org.apache.http.entity.BasicHttpEntity; import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.message.BasicStatusLine; +import org.junit.Before; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.nio.charset.StandardCharsets; -import java.util.Set; +import java.util.Arrays; +import java.util.List; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.arrayContainingInAnyOrder; @@ -38,85 +41,76 @@ public class ConfigServerHttpRequestExecutorTest { @JsonIgnoreProperties(ignoreUnknown = true) public static class TestPojo { @JsonProperty("foo") - public String foo; + String foo; @JsonProperty("error-code") - public Integer errorCode; + Integer errorCode; } + private final String uri1 = "http://host1:666"; + private final String uri2 = "http://host2:666"; + private final List<URI> configServers = Arrays.asList(URI.create(uri1), URI.create(uri2)); private final StringBuilder mockLog = new StringBuilder(); + + private ConfigServerHttpRequestExecutor executor; private int mockReturnCode = 200; - private CloseableHttpClient createClientMock() throws IOException { + @Before + public void initExecutor() throws IOException { CloseableHttpClient httpMock = mock(CloseableHttpClient.class); when(httpMock.execute(any())).thenAnswer(invocationOnMock -> { HttpGet get = (HttpGet) invocationOnMock.getArguments()[0]; mockLog.append(get.getMethod()).append(" ").append(get.getURI()).append(" "); - CloseableHttpResponse response = mock(CloseableHttpResponse.class); - StatusLine statusLine = mock(StatusLine.class); - when(statusLine.getStatusCode()).thenReturn(mockReturnCode); - when(response.getStatusLine()).thenReturn(statusLine); if (mockReturnCode == 100000) throw new RuntimeException("FAIL"); - HttpEntity entity = mock(HttpEntity.class); - when(response.getEntity()).thenReturn(entity); + + BasicStatusLine statusLine = new BasicStatusLine(HttpVersion.HTTP_1_1, mockReturnCode, null); + BasicHttpEntity entity = new BasicHttpEntity(); String returnMessage = "{\"foo\":\"bar\", \"no\":3, \"error-code\": " + mockReturnCode + "}"; InputStream stream = new ByteArrayInputStream(returnMessage.getBytes(StandardCharsets.UTF_8)); - when(entity.getContent()).thenReturn(stream); + entity.setContent(stream); + + CloseableHttpResponse response = mock(CloseableHttpResponse.class); + when(response.getEntity()).thenReturn(entity); + when(response.getStatusLine()).thenReturn(statusLine); + return response; }); doNothing().when(httpMock).close(); - return httpMock; + executor = new ConfigServerHttpRequestExecutor(configServers, httpMock); } @Test public void testBasicParsingSingleServer() throws Exception { - Set<String> configServers = new ArraySet<>(2); - configServers.add("host1"); - configServers.add("host2"); - ConfigServerHttpRequestExecutor executor = new ConfigServerHttpRequestExecutor(configServers, createClientMock()); - TestPojo answer = executor.get("/path", 666, TestPojo.class); + TestPojo answer = executor.get("/path", TestPojo.class); assertThat(answer.foo, is("bar")); assertLogStringContainsGETForAHost(); } @Test(expected = HttpException.class) public void testBasicFailure() throws Exception { - Set<String> configServers = new ArraySet<>(2); - configServers.add("host1"); - configServers.add("host2"); // Server is returning 400, no retries. mockReturnCode = 400; - ConfigServerHttpRequestExecutor executor = new ConfigServerHttpRequestExecutor(configServers, createClientMock()); - TestPojo testPojo = executor.get("/path", 666, TestPojo.class); + TestPojo testPojo = executor.get("/path", TestPojo.class); assertEquals(testPojo.errorCode.intValue(), mockReturnCode); assertLogStringContainsGETForAHost(); } @Test public void testBasicSuccessWithNoRetries() throws Exception { - Set<String> configServers = new ArraySet<>(2); - configServers.add("host1"); - configServers.add("host2"); // Server is returning 201, no retries. mockReturnCode = 201; - ConfigServerHttpRequestExecutor executor = new ConfigServerHttpRequestExecutor(configServers, createClientMock()); - TestPojo testPojo = executor.get("/path", 666, TestPojo.class); + TestPojo testPojo = executor.get("/path", TestPojo.class); assertEquals(testPojo.errorCode.intValue(), mockReturnCode); assertLogStringContainsGETForAHost(); } @Test public void testRetries() throws Exception { - Set<String> configServers = new ArraySet<>(2); - configServers.add("host1"); - configServers.add("host2"); // Client is throwing exception, should be retries. mockReturnCode = 100000; - ConfigServerHttpRequestExecutor executor = - new ConfigServerHttpRequestExecutor(configServers, createClientMock()); try { - executor.get("/path", 666, TestPojo.class); + executor.get("/path", TestPojo.class); fail("Expected failure"); } catch (Exception e) { // ignore @@ -129,15 +123,10 @@ public class ConfigServerHttpRequestExecutorTest { @Test public void testRetriesOnBadHttpResponseCode() throws Exception { - Set<String> configServers = new ArraySet<>(2); - configServers.add("host1"); - configServers.add("host2"); // Client is throwing exception, should be retries. mockReturnCode = 503; - ConfigServerHttpRequestExecutor executor = - new ConfigServerHttpRequestExecutor(configServers, createClientMock()); try { - executor.get("/path", 666, TestPojo.class); + executor.get("/path", TestPojo.class); fail("Expected failure"); } catch (Exception e) { // ignore @@ -151,14 +140,10 @@ public class ConfigServerHttpRequestExecutorTest { @Test public void testNotFound() throws Exception { - Set<String> configServers = new ArraySet<>(2); - configServers.add("host1"); - configServers.add("host2"); // Server is returning 404, special exception is thrown. mockReturnCode = 404; - ConfigServerHttpRequestExecutor executor = new ConfigServerHttpRequestExecutor(configServers, createClientMock()); try { - executor.get("/path", 666, TestPojo.class); + executor.get("/path", TestPojo.class); fail("Expected exception"); } catch (HttpException.NotFoundException e) { // ignore @@ -168,14 +153,9 @@ public class ConfigServerHttpRequestExecutorTest { @Test public void testConflict() throws Exception { - Set<String> configServers = new ArraySet<>(2); - configServers.add("host1"); - configServers.add("host2"); // Server is returning 409, no exception is thrown. mockReturnCode = 409; - ConfigServerHttpRequestExecutor executor = - new ConfigServerHttpRequestExecutor(configServers, createClientMock()); - executor.get("/path", 666, TestPojo.class); + executor.get("/path", TestPojo.class); assertLogStringContainsGETForAHost(); } diff --git a/node-maintainer/pom.xml b/node-maintainer/pom.xml index d56e12d92c6..1fe3eb23857 100644 --- a/node-maintainer/pom.xml +++ b/node-maintainer/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>node-maintainer</artifactId> diff --git a/node-repository/pom.xml b/node-repository/pom.xml index 09b0d3df3d9..6673ea487a1 100644 --- a/node-repository/pom.xml +++ b/node-repository/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>node-repository</artifactId> <version>6-SNAPSHOT</version> diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index 88daa34d8ca..9b05478eb07 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -307,11 +307,16 @@ public class NodeRepository extends AbstractComponent { /** Sets a list of nodes ready and returns the nodes in the ready state */ public List<Node> setReady(List<Node> nodes) { - for (Node node : nodes) - if (node.state() != Node.State.dirty) - throw new IllegalArgumentException("Can not set " + node + " ready. It is not dirty."); try (Mutex lock = lockUnallocated()) { - return db.writeTo(Node.State.ready, nodes, Agent.system, Optional.empty()); + List<Node> nodesWithResetFields = nodes.stream() + .map(node -> { + if (node.state() != Node.State.dirty) + throw new IllegalArgumentException("Can not set " + node + " ready. It is not dirty."); + return node.with(node.status().withWantToRetire(false).withWantToDeprovision(false)); + }) + .collect(Collectors.toList()); + + return db.writeTo(Node.State.ready, nodesWithResetFields, Agent.system, Optional.empty()); } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 7de138fa954..928d8082c6b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -95,9 +95,10 @@ public class MockNodeRepository extends NodeRepository { node10 = node10.with(node10newStatus); nodes.add(node10); - nodes.add(createNode("node55", "host55.yahoo.com", ipAddresses, Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant)); + Node node55 = createNode("node55", "host55.yahoo.com", ipAddresses, Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant); + nodes.add(node55.with(node55.status().withWantToRetire(true).withWantToDeprovision(true))); - /** Setup docker hosts (two of these will be reserved for spares */ + /* Setup docker hosts (two of these will be reserved for spares */ nodes.add(createNode("dockerhost1", "dockerhost1.yahoo.com", ipAddresses, additionalIpAddresses, Optional.empty(), flavors.getFlavorOrThrow("large"), NodeType.host)); nodes.add(createNode("dockerhost2", "dockerhost2.yahoo.com", ipAddresses, additionalIpAddresses, Optional.empty(), flavors.getFlavorOrThrow("large"), NodeType.host)); nodes.add(createNode("dockerhost3", "dockerhost3.yahoo.com", ipAddresses, additionalIpAddresses, Optional.empty(), flavors.getFlavorOrThrow("large"), NodeType.host)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index 54e0c59ff00..2739b4d1cf8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -308,6 +308,15 @@ public class RestApiTest { } @Test + public void setting_node_to_ready_will_reset_certain_fields() throws Exception { + final String hostname = "host55.yahoo.com"; + assertResponse(new Request("http://localhost:8080/nodes/v2/state/ready/" + hostname, + new byte[0], Request.Method.PUT), + "{\"message\":\"Moved " + hostname + " to ready\"}"); + assertFile(new Request("http://localhost:8080/nodes/v2/node/" + hostname), "node55-after-changes.json"); + } + + @Test public void acl_request_by_tenant_node() throws Exception { String hostname = "foo.yahoo.com"; assertResponse(new Request("http://localhost:8080/nodes/v2/node", diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55-after-changes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55-after-changes.json new file mode 100644 index 00000000000..4560e5e1be4 --- /dev/null +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55-after-changes.json @@ -0,0 +1,39 @@ +{ + "url": "http://localhost:8080/nodes/v2/node/host55.yahoo.com", + "id": "host55.yahoo.com", + "state": "ready", + "type": "tenant", + "hostname": "host55.yahoo.com", + "openStackId": "node55", + "flavor": "default", + "canonicalFlavor": "default", + "minDiskAvailableGb": 400.0, + "minMainMemoryAvailableGb": 16.0, + "description": "Flavor-name-is-default", + "minCpuCores": 2.0, + "fastDisk": true, + "environment": "BARE_METAL", + "rebootGeneration": 1, + "currentRebootGeneration": 0, + "failCount": 0, + "hardwareFailure": false, + "wantToRetire": false, + "wantToDeprovision": false, + "history": [ + { + "event": "provisioned", + "at": 123, + "agent": "system" + }, + { + "event": "readied", + "at": 123, + "agent": "system" + } + ], + "ipAddresses": [ + "::1", + "127.0.0.1" + ], + "additionalIpAddresses": [] +} diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json index 7d07037d076..4f8b988ccbf 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node55.json @@ -17,8 +17,8 @@ "currentRebootGeneration": 0, "failCount": 0, "hardwareFailure": false, - "wantToRetire": false, - "wantToDeprovision": false, + "wantToRetire": true, + "wantToDeprovision": true, "history": [ { "event": "provisioned", diff --git a/orchestrator-restapi/pom.xml b/orchestrator-restapi/pom.xml index db823f3fb15..310512812e2 100644 --- a/orchestrator-restapi/pom.xml +++ b/orchestrator-restapi/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>orchestrator-restapi</artifactId> <version>6-SNAPSHOT</version> diff --git a/orchestrator/pom.xml b/orchestrator/pom.xml index c50f9ddcb29..ae22b6718f9 100644 --- a/orchestrator/pom.xml +++ b/orchestrator/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>orchestrator</artifactId> <version>6-SNAPSHOT</version> diff --git a/parent/pom.xml b/parent/pom.xml new file mode 100644 index 00000000000..48d35410fff --- /dev/null +++ b/parent/pom.xml @@ -0,0 +1,721 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. --> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <artifactId>parent</artifactId> + <packaging>pom</packaging> + <version>6-SNAPSHOT</version> + <name>parent</name> + <description>Parent artifact for all Vespa maven projects.</description> + <url>https://github.com/vespa-engine</url> + + <parent> + <groupId>com.yahoo.vespa</groupId> + <artifactId>container-dependency-versions</artifactId> + <version>6-SNAPSHOT</version> + <relativePath>../container-dependency-versions/pom.xml</relativePath> + </parent> + + <licenses> + <license> + <name>The Apache License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> + </license> + </licenses> + + <developers> + <developer> + <name>Vespa</name> + <url>https://github.com/vespa-engine</url> + </developer> + </developers> + + <distributionManagement> + <repository> + <id>bintray-vespa-repo</id> + <url>https://api.bintray.com/maven/yahoo/maven/vespa;publish=1</url> + </repository> + </distributionManagement> + + <repositories> + <!-- Required for Athenz libraries --> + <repository> + <snapshots> + <enabled>false</enabled> + </snapshots> + <id>bintray-yahoo-maven</id> + <name>bintray</name> + <url>https://yahoo.bintray.com/maven</url> + </repository> + </repositories> + + <scm> + <connection>scm:git:git@github.com:vespa-engine/vespa.git</connection> + <developerConnection>scm:git:git@github.com:vespa-engine/vespa.git</developerConnection> + <url>git@github.com:vespa-engine/vespa.git</url> + </scm> + + <build> + <finalName>${project.artifactId}</finalName> + <extensions> + <extension> + <groupId>org.apache.maven.wagon</groupId> + <artifactId>wagon-ssh-external</artifactId> + <version>2.7</version> + </extension> + <extension> + <groupId>org.apache.maven.archetype</groupId> + <artifactId>archetype-packaging</artifactId> + <version>2.0</version> + </extension> + </extensions> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.antlr</groupId> + <artifactId>antlr3-maven-plugin</artifactId> + <version>${antlr.version}</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <version>1.7</version> + </plugin> + <plugin> + <groupId>org.apache.felix</groupId> + <artifactId>maven-bundle-plugin</artifactId> + <version>2.4.0</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-assembly-plugin</artifactId> + <version>2.4</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.6.1</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + <showWarnings>true</showWarnings> + <optimize>true</optimize> + <showDeprecation>false</showDeprecation> + <compilerArgs> + <arg>-Xlint:all</arg> + <arg>-Xlint:-serial</arg> + <arg>-Xlint:-try</arg> + <arg>-Xlint:-processing</arg> + <arg>-Xlint:-varargs</arg> + <arg>-Werror</arg> + </compilerArgs> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>2.10</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-deploy-plugin</artifactId> + <version>2.5</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-install-plugin</artifactId> + <version>2.5.2</version> + <configuration> + <updateReleaseInfo>true</updateReleaseInfo> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.0.2</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <configuration> + <additionalparam>-Xdoclint:${doclint} -Xdoclint:-missing</additionalparam> + </configuration> + <version>2.10.4</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-plugin-plugin</artifactId> + <version>3.5</version> + <configuration> + <!-- see http://jira.codehaus.org/browse/MNG-5346 --> + <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> + </configuration> + <executions> + <execution> + <id>mojo-descriptor</id> + <goals> + <goal>descriptor</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>2.7</version> + <configuration> + <escapeString>\</escapeString> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-site-plugin</artifactId> + <version>3.3</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>2.1.2</version> + <configuration> + <includePom>true</includePom> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${surefire.version}</version> + <configuration> + <redirectTestOutputToFile>${test.hide}</redirectTestOutputToFile> + <systemPropertyVariables> + <java.io.tmpdir>${project.build.directory}</java.io.tmpdir> + </systemPropertyVariables> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-report-plugin</artifactId> + <version>${surefire.version}</version> + <configuration> + <alwaysGenerateSurefireReport>false</alwaysGenerateSurefireReport> + <showSuccess>false</showSuccess> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <version>1.9.1</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.6.0</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>javacc-maven-plugin</artifactId> + <version>2.6</version> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>properties-maven-plugin</artifactId> + <version>1.0.0</version> + </plugin> + <plugin> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <version>3.2.2</version> + <configuration> + <args> + <arg>-unchecked</arg> + <arg>-deprecation</arg> + <arg>-feature</arg> + <arg>-Xfatal-warnings</arg> + </args> + </configuration> + </plugin> + <plugin> + <groupId>com.yahoo.vespa</groupId> + <artifactId>bundle-plugin</artifactId> + <version>${project.version}</version> + <configuration> + <configGenVersion>${project.version}</configGenVersion> + <useCommonAssemblyIds>true</useCommonAssemblyIds> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + <profiles> + <profile> + <id>attach-sources</id> + <activation> + <property> + <name>!skipSources</name> + </property> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar-no-fork</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>generate-javadoc</id> + <activation> + <property> + <name>!skipJavadoc</name> + </property> + </activation> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <executions> + <execution> + <id>generate-javadoc</id> + <phase>package</phase> + <goals> + <goal>javadoc</goal> + </goals> + </execution> + </executions> + <configuration> + <additionalparam>-Xdoclint:${doclint} -Xdoclint:-missing</additionalparam> + <failOnError>${javadoc.failOnError}</failOnError> + <quiet>true</quiet> + <show>private</show> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>coverage</id> + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <configuration> + <includePluginDependencies>true</includePluginDependencies> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <phase>generate-sources</phase> + <goals> + <goal>add-source</goal> + </goals> + <configuration> + <sources> + <source>src/main/scala</source> + </sources> + </configuration> + </execution> + <execution> + <id>add-test-source</id> + <phase>generate-test-sources</phase> + <goals> + <goal>add-test-source</goal> + </goals> + <configuration> + <sources> + <source>src/test/scala</source> + </sources> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>sign-artifacts</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-gpg-plugin</artifactId> + <version>1.6</version> + <executions> + <execution> + <id>sign-artifacts</id> + <phase>verify</phase> + <goals> + <goal>sign</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + </profiles> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>org.apache.maven.wagon</groupId> + <artifactId>wagon-ssh-external</artifactId> + <version>2.7</version> + </dependency> + <dependency> + <groupId>com.github.cverges.expect4j</groupId> + <artifactId>expect4j</artifactId> + <version>1.6</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-compress</artifactId> + <version>1.11</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-exec</artifactId> + <version>1.3</version> + </dependency> + <dependency> + <groupId>io.airlift</groupId> + <artifactId>airline</artifactId> + <version>0.7</version> + </dependency> + <dependency> + <groupId>org.ow2.asm</groupId> + <artifactId>asm</artifactId> + <version>5.2</version> + </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava-testlib</artifactId> + <version>18.0</version> + </dependency> + <dependency> + <groupId>com.google.protobuf</groupId> + <artifactId>protobuf-java</artifactId> + <version>2.4.1</version> + </dependency> + <dependency> + <groupId>com.googlecode.jmockit</groupId> + <artifactId>jmockit</artifactId> + <version>1.2</version> + </dependency> + <dependency> + <groupId>com.goldmansachs</groupId> + <artifactId>gs-collections</artifactId> + <version>6.1.0</version> + </dependency> + <dependency> + <groupId>com.infradna.tool</groupId> + <artifactId>bridge-method-annotation</artifactId> + <version>1.4</version> + </dependency> + <dependency> + <groupId>commons-cli</groupId> + <artifactId>commons-cli</artifactId> + <version>1.3.1</version> + </dependency> + <dependency> + <groupId>commons-collections</groupId> + <artifactId>commons-collections</artifactId> + <version>3.2.1</version> + </dependency> + <dependency> + <groupId>commons-configuration</groupId> + <artifactId>commons-configuration</artifactId> + <version>1.6</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.4</version> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>${commons-lang.version}</version> + </dependency> + <dependency> + <groupId>commons-net</groupId> + <artifactId>commons-net</artifactId> + <version>2.0</version> + </dependency> + <dependency> + <groupId>commons-pool</groupId> + <artifactId>commons-pool</artifactId> + <version>1.5.6</version> + </dependency> + <!-- Explicitly included to get Zookeeper version 3.4.10, + can be excluded if you want the Zookeeper version + used by curator by default + --> + <dependency> + <groupId>org.apache.zookeeper</groupId> + <artifactId>zookeeper</artifactId> + <version>3.4.10</version> + </dependency> + <dependency> + <groupId>org.apache.curator</groupId> + <artifactId>curator-recipes</artifactId> + <version>${curator.version}</version> + </dependency> + <dependency> + <groupId>org.apache.curator</groupId> + <artifactId>curator-test</artifactId> + <version>${curator.version}</version> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + </dependency> + <dependency> + <groupId>org.antlr</groupId> + <artifactId>antlr-runtime</artifactId> + <version>${antlr.version}</version> + </dependency> + <dependency> + <groupId>org.antlr</groupId> + <artifactId>antlr4-runtime</artifactId> + <version>${antlr4.version}</version> + </dependency> + <dependency> + <groupId>org.apache.aries.spifly</groupId> + <artifactId>org.apache.aries.spifly.dynamic.bundle</artifactId> + <version>${aries.spifly.version}</version> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-lang3</artifactId> + <version>3.1</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>fluent-hc</artifactId> + <version>4.3.6</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpmime</artifactId> + <version>4.3.6</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact</artifactId> + <version>3.5.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + <version>3.5.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-model</artifactId> + <version>3.5.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugin-tools</groupId> + <artifactId>maven-plugin-annotations</artifactId> + <version>3.5</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-api</artifactId> + <version>3.5.0</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-project</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.0.2</version> + </dependency> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-junit4</artifactId> + <version>${surefire.version}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-providers</artifactId> + <version>${surefire.version}</version> + <type>pom</type> + </dependency> + <dependency> + <groupId>org.codehaus.jettison</groupId> + <artifactId>jettison</artifactId> + <version>1.3.1</version> + </dependency> + <dependency> + <groupId>org.cthul</groupId> + <artifactId>cthul-matchers</artifactId> + <version>1.0</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-all</artifactId> + <version>1.3</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-core</artifactId> + <version>1.3</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>hamcrest-library</artifactId> + <version>1.3</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>uk.co.datumedge</groupId> + <artifactId>hamcrest-json</artifactId> + <version>0.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.hdrhistogram</groupId> + <artifactId>HdrHistogram</artifactId> + <version>2.1.8</version> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-all</artifactId> + <version>1.9.5</version> + </dependency> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + <version>1.9.5</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.compendium</artifactId> + <version>4.3.0</version> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <version>4.3.0</version> + </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-library</artifactId> + <version>${scala.version}</version> + </dependency> + <dependency> + <groupId>org.scala-lang.modules</groupId> + <artifactId>scala-parser-combinators_${scala.major-version}</artifactId> + <version>1.0.1</version> + </dependency> + <dependency> + <groupId>org.scala-lang.modules</groupId> + <artifactId>scala-xml_${scala.major-version}</artifactId> + <version>1.0.2</version> + </dependency> + <dependency> + <groupId>org.scalatest</groupId> + <artifactId>scalatest_${scala.major-version}</artifactId> + <version>2.2.2</version> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <version>4.0.6.RELEASE</version> + </dependency> + <dependency> + <groupId>org.testng</groupId> + <artifactId>testng</artifactId> + <version>6.10</version> + </dependency> + <dependency> + <groupId>org.twdata.maven</groupId> + <artifactId>mojo-executor</artifactId> + <version>2.3.0</version> + </dependency> + <dependency> + <groupId>net.spy</groupId> + <artifactId>spymemcached</artifactId> + <version>2.10.1</version> + </dependency> + <dependency> + <groupId>xerces</groupId> + <artifactId>xercesImpl</artifactId> + <version>2.11.0</version> + </dependency> + <dependency> + <groupId>org.bouncycastle</groupId> + <artifactId>bcpkix-jdk15on</artifactId> + <version>${bouncycastle.version}</version> + </dependency> + <dependency> + <groupId>org.bouncycastle</groupId> + <artifactId>bcprov-jdk15on</artifactId> + <version>${bouncycastle.version}</version> + </dependency> + <dependency> + <groupId>com.ibm.icu</groupId> + <artifactId>icu4j</artifactId> + <version>57.1</version> + </dependency> + <dependency> + <groupId>com.yahoo.athenz</groupId> + <artifactId>athenz-zms-java-client</artifactId> + <version>${athenz.version}</version> + </dependency> + <dependency> + <groupId>com.yahoo.athenz</groupId> + <artifactId>athenz-zts-java-client</artifactId> + <version>${athenz.version}</version> + </dependency> + </dependencies> + </dependencyManagement> + + <properties> + <antlr.version>3.5.2</antlr.version> + <antlr4.version>4.5</antlr4.version> + <aries.spifly.version>1.0.8</aries.spifly.version> + <aries.util.version>1.0.0</aries.util.version> + <asm-debug-all.version>5.0.3</asm-debug-all.version> + <!-- Athenz dependencies. Make sure these dependencies matches those in Vespa's internal repositories --> + <athenz.version>1.7.28</athenz.version> + <bouncycastle.version>1.58</bouncycastle.version> + <commons-lang.version>2.6</commons-lang.version> + <!-- WARNING: If you change curator version, you also need to update + zkfacade/src/main/java/org/apache/curator/**/package-info.java + using something like + find zkfacade/src/main/java/org/apache/curator -name package-info.java | \ + xargs perl -pi -e 's/major = [0-9]+, minor = [0-9]+, micro = [0-9]+/major = 2, minor = 9, micro = 1/g' + --> + <curator.version>2.9.1</curator.version> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <test.hide>true</test.hide> + <doclint>all</doclint> + <scala.major-version>2.11</scala.major-version> + <scala.version>${scala.major-version}.4</scala.version> + <surefire.version>2.19.1</surefire.version> <!-- NOTE bjorncs 15.06.2017: Version 2.20 has OoM issues --> + </properties> + +</project> @@ -3,11 +3,10 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yahoo.vespa</groupId> - <artifactId>parent</artifactId> + <artifactId>vespa</artifactId> <packaging>pom</packaging> <version>6-SNAPSHOT</version> - <name>parent</name> - <description>Parent artifact for all Vespa maven projects.</description> + <description>Aggregator pom for vespa.</description> <url>https://github.com/vespa-engine</url> <licenses> @@ -24,941 +23,6 @@ </developer> </developers> - <distributionManagement> - <repository> - <id>bintray-vespa-repo</id> - <url>https://api.bintray.com/maven/yahoo/maven/vespa;publish=1</url> - </repository> - </distributionManagement> - - <repositories> - <!-- Required for Athenz libraries --> - <repository> - <snapshots> - <enabled>false</enabled> - </snapshots> - <id>bintray-yahoo-maven</id> - <name>bintray</name> - <url>https://yahoo.bintray.com/maven</url> - </repository> - </repositories> - - <scm> - <connection>scm:git:git@github.com:vespa-engine/vespa.git</connection> - <developerConnection>scm:git:git@github.com:vespa-engine/vespa.git</developerConnection> - <url>git@github.com:vespa-engine/vespa.git</url> - </scm> - - <build> - <finalName>${project.artifactId}</finalName> - <extensions> - <extension> - <groupId>org.apache.maven.wagon</groupId> - <artifactId>wagon-ssh-external</artifactId> - <version>2.7</version> - </extension> - <extension> - <groupId>org.apache.maven.archetype</groupId> - <artifactId>archetype-packaging</artifactId> - <version>2.0</version> - </extension> - </extensions> - <pluginManagement> - <plugins> - <plugin> - <groupId>org.antlr</groupId> - <artifactId>antlr3-maven-plugin</artifactId> - <version>${antlr.version}</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-antrun-plugin</artifactId> - <version>1.7</version> - </plugin> - <plugin> - <groupId>org.apache.felix</groupId> - <artifactId>maven-bundle-plugin</artifactId> - <version>2.4.0</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-assembly-plugin</artifactId> - <version>2.4</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>3.6.1</version> - <configuration> - <source>1.8</source> - <target>1.8</target> - <showWarnings>true</showWarnings> - <optimize>true</optimize> - <showDeprecation>false</showDeprecation> - <compilerArgs> - <arg>-Xlint:all</arg> - <arg>-Xlint:-serial</arg> - <arg>-Xlint:-try</arg> - <arg>-Xlint:-processing</arg> - <arg>-Xlint:-varargs</arg> - <arg>-Werror</arg> - </compilerArgs> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <version>2.10</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-deploy-plugin</artifactId> - <version>2.5</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-install-plugin</artifactId> - <version>2.5.2</version> - <configuration> - <updateReleaseInfo>true</updateReleaseInfo> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <version>3.0.2</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <configuration> - <additionalparam>-Xdoclint:${doclint} -Xdoclint:-missing</additionalparam> - </configuration> - <version>2.10.4</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-plugin-plugin</artifactId> - <version>3.5</version> - <configuration> - <!-- see http://jira.codehaus.org/browse/MNG-5346 --> - <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound> - </configuration> - <executions> - <execution> - <id>mojo-descriptor</id> - <goals> - <goal>descriptor</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-resources-plugin</artifactId> - <version>2.7</version> - <configuration> - <escapeString>\</escapeString> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-site-plugin</artifactId> - <version>3.3</version> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <configuration> - <includePom>true</includePom> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>${surefire.version}</version> - <configuration> - <redirectTestOutputToFile>${test.hide}</redirectTestOutputToFile> - <systemPropertyVariables> - <java.io.tmpdir>${project.build.directory}</java.io.tmpdir> - </systemPropertyVariables> - </configuration> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-report-plugin</artifactId> - <version>${surefire.version}</version> - <configuration> - <alwaysGenerateSurefireReport>false</alwaysGenerateSurefireReport> - <showSuccess>false</showSuccess> - </configuration> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>build-helper-maven-plugin</artifactId> - <version>1.9.1</version> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <version>1.6.0</version> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>javacc-maven-plugin</artifactId> - <version>2.6</version> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>properties-maven-plugin</artifactId> - <version>1.0.0</version> - </plugin> - <plugin> - <groupId>net.alchim31.maven</groupId> - <artifactId>scala-maven-plugin</artifactId> - <version>3.2.2</version> - <configuration> - <args> - <arg>-unchecked</arg> - <arg>-deprecation</arg> - <arg>-feature</arg> - <arg>-Xfatal-warnings</arg> - </args> - </configuration> - </plugin> - <plugin> - <groupId>com.yahoo.vespa</groupId> - <artifactId>bundle-plugin</artifactId> - <version>${project.version}</version> - <configuration> - <configGenVersion>${project.version}</configGenVersion> - <useCommonAssemblyIds>true</useCommonAssemblyIds> - </configuration> - </plugin> - </plugins> - </pluginManagement> - </build> - <profiles> - <profile> - <id>attach-sources</id> - <activation> - <property> - <name>!skipSources</name> - </property> - </activation> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar-no-fork</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - <profile> - <id>generate-javadoc</id> - <activation> - <property> - <name>!skipJavadoc</name> - </property> - </activation> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <executions> - <execution> - <id>generate-javadoc</id> - <phase>package</phase> - <goals> - <goal>javadoc</goal> - </goals> - </execution> - </executions> - <configuration> - <additionalparam>-Xdoclint:${doclint} -Xdoclint:-missing</additionalparam> - <failOnError>${javadoc.failOnError}</failOnError> - <quiet>true</quiet> - <show>private</show> - </configuration> - </plugin> - </plugins> - </build> - </profile> - <profile> - <id>coverage</id> - <build> - <plugins> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <configuration> - <includePluginDependencies>true</includePluginDependencies> - </configuration> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>build-helper-maven-plugin</artifactId> - <executions> - <execution> - <phase>generate-sources</phase> - <goals> - <goal>add-source</goal> - </goals> - <configuration> - <sources> - <source>src/main/scala</source> - </sources> - </configuration> - </execution> - <execution> - <id>add-test-source</id> - <phase>generate-test-sources</phase> - <goals> - <goal>add-test-source</goal> - </goals> - <configuration> - <sources> - <source>src/test/scala</source> - </sources> - </configuration> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - <profile> - <id>sign-artifacts</id> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-gpg-plugin</artifactId> - <version>1.6</version> - <executions> - <execution> - <id>sign-artifacts</id> - <phase>verify</phase> - <goals> - <goal>sign</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - </profile> - </profiles> - <dependencyManagement> - <dependencies> - <dependency> - <groupId>org.apache.maven.wagon</groupId> - <artifactId>wagon-ssh-external</artifactId> - <version>2.7</version> - </dependency> - <dependency> - <groupId>com.github.cverges.expect4j</groupId> - <artifactId>expect4j</artifactId> - <version>1.6</version> - </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-compress</artifactId> - <version>1.11</version> - </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-exec</artifactId> - <version>1.3</version> - </dependency> - <dependency> - <groupId>io.airlift</groupId> - <artifactId>airline</artifactId> - <version>0.7</version> - </dependency> - <dependency> - <groupId>aopalliance</groupId> - <artifactId>aopalliance</artifactId> - <version>1.0</version> - </dependency> - <dependency> - <groupId>org.ow2.asm</groupId> - <artifactId>asm</artifactId> - <version>5.2</version> - </dependency> - <dependency> - <groupId>com.google.code.findbugs</groupId> - <artifactId>annotations</artifactId> - <version>1.3.9</version> - </dependency> - <dependency> - <groupId>com.google.code.findbugs</groupId> - <artifactId>jsr305</artifactId> - <version>1.3.9</version> - </dependency> - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava</artifactId> - <version>18.0</version> - </dependency> - <dependency> - <groupId>com.google.guava</groupId> - <artifactId>guava-testlib</artifactId> - <version>18.0</version> - </dependency> - <dependency> - <groupId>com.google.inject</groupId> - <artifactId>guice</artifactId> - <version>3.0</version> - </dependency> - <dependency> - <groupId>com.google.inject</groupId> - <artifactId>guice</artifactId> - <version>3.0</version> - <classifier>no_aop</classifier> - </dependency> - <dependency> - <groupId>com.google.inject.extensions</groupId> - <artifactId>guice-assistedinject</artifactId> - <version>3.0</version> - </dependency> - <dependency> - <groupId>com.google.inject.extensions</groupId> - <artifactId>guice-multibindings</artifactId> - <version>3.0</version> - </dependency> - <dependency> - <groupId>com.google.protobuf</groupId> - <artifactId>protobuf-java</artifactId> - <version>2.4.1</version> - </dependency> - <dependency> - <groupId>com.googlecode.jmockit</groupId> - <artifactId>jmockit</artifactId> - <version>1.2</version> - </dependency> - <dependency> - <groupId>com.goldmansachs</groupId> - <artifactId>gs-collections</artifactId> - <version>6.1.0</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-annotations</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.jaxrs</groupId> - <artifactId>jackson-jaxrs-json-provider</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.module</groupId> - <artifactId>jackson-module-jaxb-annotations</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.jaxrs</groupId> - <artifactId>jackson-jaxrs-base</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.jaxrs</groupId> - <artifactId>jackson-jaxrs-xml-provider</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.dataformat</groupId> - <artifactId>jackson-dataformat-xml</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>jackson-datatype-jdk8</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.datatype</groupId> - <artifactId>jackson-datatype-jsr310</artifactId> - <version>${jackson2.version}</version> - </dependency> - <dependency> - <groupId>com.infradna.tool</groupId> - <artifactId>bridge-method-annotation</artifactId> - <version>1.4</version> - </dependency> - <dependency> - <groupId>commons-cli</groupId> - <artifactId>commons-cli</artifactId> - <version>1.3.1</version> - </dependency> - <dependency> - <groupId>commons-codec</groupId> - <artifactId>commons-codec</artifactId> - <version>1.4</version> - </dependency> - <dependency> - <groupId>commons-collections</groupId> - <artifactId>commons-collections</artifactId> - <version>3.2.1</version> - </dependency> - <dependency> - <groupId>commons-configuration</groupId> - <artifactId>commons-configuration</artifactId> - <version>1.6</version> - </dependency> - <dependency> - <groupId>commons-daemon</groupId> - <artifactId>commons-daemon</artifactId> - <version>1.0.3</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.4</version> - </dependency> - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>${commons-lang.version}</version> - </dependency> - <dependency> - <!-- This version is exported by jdisc via jcl-over-slf4j. --> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> - <version>1.1.1</version> - </dependency> - <dependency> - <groupId>commons-net</groupId> - <artifactId>commons-net</artifactId> - <version>2.0</version> - </dependency> - <dependency> - <groupId>commons-pool</groupId> - <artifactId>commons-pool</artifactId> - <version>1.5.6</version> - </dependency> - <!-- Explicitly included to get Zookeeper version 3.4.10, - can be excluded if you want the Zookeeper version - used by curator by default - --> - <dependency> - <groupId>org.apache.zookeeper</groupId> - <artifactId>zookeeper</artifactId> - <version>3.4.10</version> - </dependency> - <dependency> - <groupId>org.apache.curator</groupId> - <artifactId>curator-recipes</artifactId> - <version>${curator.version}</version> - </dependency> - <dependency> - <groupId>org.apache.curator</groupId> - <artifactId>curator-test</artifactId> - <version>${curator.version}</version> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <version>3.1.0</version> - </dependency> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.12</version> - </dependency> - <dependency> - <groupId>org.antlr</groupId> - <artifactId>antlr-runtime</artifactId> - <version>${antlr.version}</version> - </dependency> - <dependency> - <groupId>org.antlr</groupId> - <artifactId>antlr4-runtime</artifactId> - <version>${antlr4.version}</version> - </dependency> - <dependency> - <groupId>org.apache.aries.spifly</groupId> - <artifactId>org.apache.aries.spifly.dynamic.bundle</artifactId> - <version>${aries.spifly.version}</version> - </dependency> - <dependency> - <groupId>org.apache.commons</groupId> - <artifactId>commons-lang3</artifactId> - <version>3.1</version> - </dependency> - <dependency> - <groupId>org.apache.felix</groupId> - <artifactId>org.apache.felix.framework</artifactId> - <version>4.2.1</version> - </dependency> - <dependency> - <groupId>org.apache.felix</groupId> - <artifactId>org.apache.felix.log</artifactId> - <version>1.0.1</version> - </dependency> - <dependency> - <groupId>org.apache.felix</groupId> - <artifactId>org.apache.felix.main</artifactId> - <version>4.2.1</version> - </dependency> - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>fluent-hc</artifactId> - <version>4.3.6</version> - </dependency> - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.3.6</version> - </dependency> - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpcore</artifactId> - <version>4.3.3</version> - </dependency> - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpmime</artifactId> - <version>4.3.6</version> - </dependency> - <dependency> - <groupId>org.apache.maven</groupId> - <artifactId>maven-artifact</artifactId> - <version>3.5.0</version> - </dependency> - <dependency> - <groupId>org.apache.maven</groupId> - <artifactId>maven-core</artifactId> - <version>3.5.0</version> - </dependency> - <dependency> - <groupId>org.apache.maven</groupId> - <artifactId>maven-model</artifactId> - <version>3.5.0</version> - </dependency> - <dependency> - <groupId>org.apache.maven.plugin-tools</groupId> - <artifactId>maven-plugin-annotations</artifactId> - <version>3.5</version> - </dependency> - <dependency> - <groupId>org.apache.maven</groupId> - <artifactId>maven-plugin-api</artifactId> - <version>3.5.0</version> - </dependency> - <dependency> - <groupId>org.apache.maven</groupId> - <artifactId>maven-project</artifactId> - <version>2.2.1</version> - </dependency> - <dependency> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <version>3.0.2</version> - </dependency> - <dependency> - <groupId>org.apache.maven.surefire</groupId> - <artifactId>surefire-junit4</artifactId> - <version>${surefire.version}</version> - </dependency> - <dependency> - <groupId>org.apache.maven.surefire</groupId> - <artifactId>surefire-providers</artifactId> - <version>${surefire.version}</version> - <type>pom</type> - </dependency> - <dependency> - <groupId>org.codehaus.jettison</groupId> - <artifactId>jettison</artifactId> - <version>1.3.1</version> - </dependency> - <dependency> - <groupId>org.cthul</groupId> - <artifactId>cthul-matchers</artifactId> - <version>1.0</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-continuation</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-server</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-servlet</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-servlets</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-util</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-http</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.eclipse.jetty</groupId> - <artifactId>jetty-jmx</artifactId> - <version>${jetty.version}</version> - </dependency> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest-all</artifactId> - <version>1.3</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest-core</artifactId> - <version>1.3</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.hamcrest</groupId> - <artifactId>hamcrest-library</artifactId> - <version>1.3</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>uk.co.datumedge</groupId> - <artifactId>hamcrest-json</artifactId> - <version>0.2</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.hdrhistogram</groupId> - <artifactId>HdrHistogram</artifactId> - <version>2.1.8</version> - </dependency> - <dependency> - <groupId>org.json</groupId> - <artifactId>json</artifactId> - <version>20090211</version> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-all</artifactId> - <version>1.9.5</version> - </dependency> - <dependency> - <groupId>org.mockito</groupId> - <artifactId>mockito-core</artifactId> - <version>1.9.5</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.compendium</artifactId> - <version>4.3.0</version> - </dependency> - <dependency> - <groupId>org.osgi</groupId> - <artifactId>org.osgi.core</artifactId> - <version>4.3.0</version> - </dependency> - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>${scala.version}</version> - </dependency> - <dependency> - <groupId>org.scala-lang.modules</groupId> - <artifactId>scala-parser-combinators_${scala.major-version}</artifactId> - <version>1.0.1</version> - </dependency> - <dependency> - <groupId>org.scala-lang.modules</groupId> - <artifactId>scala-xml_${scala.major-version}</artifactId> - <version>1.0.2</version> - </dependency> - <dependency> - <groupId>org.scalatest</groupId> - <artifactId>scalatest_${scala.major-version}</artifactId> - <version>2.2.2</version> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>jcl-over-slf4j</artifactId> - <version>1.7.5</version> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>log4j-over-slf4j</artifactId> - <version>1.7.5</version> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.7.5</version> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-jdk14</artifactId> - <version>1.7.5</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-test</artifactId> - <version>4.0.6.RELEASE</version> - </dependency> - <dependency> - <groupId>org.testng</groupId> - <artifactId>testng</artifactId> - <version>6.10</version> - </dependency> - <dependency> - <groupId>org.twdata.maven</groupId> - <artifactId>mojo-executor</artifactId> - <version>2.3.0</version> - </dependency> - <dependency> - <groupId>net.jcip</groupId> - <artifactId>jcip-annotations</artifactId> - <version>1.0</version> - </dependency> - <dependency> - <groupId>net.jpountz.lz4</groupId> - <artifactId>lz4</artifactId> - <version>1.3.0</version> - </dependency> - <dependency> - <groupId>net.spy</groupId> - <artifactId>spymemcached</artifactId> - <version>2.10.1</version> - </dependency> - <dependency> - <groupId>xerces</groupId> - <artifactId>xercesImpl</artifactId> - <version>2.11.0</version> - </dependency> - <dependency> - <groupId>org.bouncycastle</groupId> - <artifactId>bcpkix-jdk15on</artifactId> - <version>${bouncycastle.version}</version> - </dependency> - <dependency> - <groupId>org.bouncycastle</groupId> - <artifactId>bcprov-jdk15on</artifactId> - <version>${bouncycastle.version}</version> - </dependency> - <!-- jersey 2 support --> - <dependency> - <groupId>javax.ws.rs</groupId> - <artifactId>javax.ws.rs-api</artifactId> - <version>${javax.ws.rs-api.version}</version> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.containers</groupId> - <artifactId>jersey-container-servlet-core</artifactId> - <version>${jersey2.version}</version> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.containers</groupId> - <artifactId>jersey-container-servlet</artifactId> - <version>${jersey2.version}</version> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.media</groupId> - <artifactId>jersey-media-json-jackson</artifactId> - <version>${jersey2.version}</version> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.media</groupId> - <artifactId>jersey-media-multipart</artifactId> - <version>${jersey2.version}</version> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.ext</groupId> - <artifactId>jersey-proxy-client</artifactId> - <version>${jersey2.version}</version> - </dependency> - <dependency> - <groupId>org.glassfish.jersey.core</groupId> - <artifactId>jersey-client</artifactId> - <version>${jersey2.version}</version> - </dependency> - <dependency> - <groupId>com.ibm.icu</groupId> - <artifactId>icu4j</artifactId> - <version>57.1</version> - </dependency> - <dependency> - <groupId>com.yahoo.athenz</groupId> - <artifactId>athenz-zms-java-client</artifactId> - <version>${athenz.version}</version> - </dependency> - <dependency> - <groupId>com.yahoo.athenz</groupId> - <artifactId>athenz-zts-java-client</artifactId> - <version>${athenz.version}</version> - </dependency> - </dependencies> - </dependencyManagement> - - <properties> - <javax.ws.rs-api.version>2.0.1</javax.ws.rs-api.version> <!-- must be kept in sync with version used by current jersey2.version --> - <antlr.version>3.5.2</antlr.version> - <antlr4.version>4.5</antlr4.version> - <aries.spifly.version>1.0.8</aries.spifly.version> - <aries.util.version>1.0.0</aries.util.version> - <asm-debug-all.version>5.0.3</asm-debug-all.version> - <!-- Athenz dependencies. Make sure these dependencies matches those in Vespa's internal repositories --> - <athenz.version>1.7.28</athenz.version> - <bouncycastle.version>1.58</bouncycastle.version> - <commons-lang.version>2.6</commons-lang.version> - <!-- WARNING: If you change curator version, you also need to update - zkfacade/src/main/java/org/apache/curator/**/package-info.java - using something like - find zkfacade/src/main/java/org/apache/curator -name package-info.java | \ - xargs perl -pi -e 's/major = [0-9]+, minor = [0-9]+, micro = [0-9]+/major = 2, minor = 9, micro = 1/g' - --> - <curator.version>2.9.1</curator.version> - <jackson2.version>2.8.3</jackson2.version> - <jersey2.version>2.23.2</jersey2.version> - <jetty.version>9.4.6.v20170531</jetty.version> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> - <test.hide>true</test.hide> - <doclint>all</doclint> - <scala.major-version>2.11</scala.major-version> - <scala.version>${scala.major-version}.4</scala.version> - <surefire.version>2.19.1</surefire.version> <!-- NOTE bjorncs 15.06.2017: Version 2.20 has OoM issues --> - </properties> - <modules> <module>application</module> <module>application-deploy-plugin</module> @@ -989,6 +53,7 @@ <module>container-core</module> <module>container-accesslogging</module> <module>container-dependencies-enforcer</module> + <module>container-dependency-versions</module> <module>container-dev</module> <module>container-di</module> <module>container-disc</module> @@ -1033,6 +98,7 @@ <module>node-maintainer</module> <module>orchestrator-restapi</module> <module>orchestrator</module> + <module>parent</module> <module>predicate-search</module> <module>predicate-search-core</module> <module>processing</module> diff --git a/predicate-search-core/pom.xml b/predicate-search-core/pom.xml index ea2995c4770..8ced58b840e 100644 --- a/predicate-search-core/pom.xml +++ b/predicate-search-core/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>predicate-search-core</artifactId> <version>6-SNAPSHOT</version> diff --git a/predicate-search/pom.xml b/predicate-search/pom.xml index ca79544c766..289250012a0 100644 --- a/predicate-search/pom.xml +++ b/predicate-search/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>predicate-search</artifactId> <version>6-SNAPSHOT</version> diff --git a/processing/pom.xml b/processing/pom.xml index 15aa984cbd2..9bb9ee77037 100644 --- a/processing/pom.xml +++ b/processing/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>processing</artifactId> <packaging>jar</packaging> diff --git a/provided-dependencies/pom.xml b/provided-dependencies/pom.xml index 18cdd294b87..33f1977c7e2 100755 --- a/provided-dependencies/pom.xml +++ b/provided-dependencies/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>provided-dependencies</artifactId> <packaging>jar</packaging> diff --git a/searchcore/pom.xml b/searchcore/pom.xml index f31617cfe53..3b43bf1205e 100644 --- a/searchcore/pom.xml +++ b/searchcore/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>searchcore</artifactId> <version>6-SNAPSHOT</version> diff --git a/searchlib/pom.xml b/searchlib/pom.xml index c669903c3da..5f6717d9516 100644 --- a/searchlib/pom.xml +++ b/searchlib/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>searchlib</artifactId> <packaging>container-plugin</packaging> diff --git a/searchsummary/pom.xml b/searchsummary/pom.xml index 97a29655ad1..417e25ff944 100644 --- a/searchsummary/pom.xml +++ b/searchsummary/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>searchsummary</artifactId> <version>6-SNAPSHOT</version> diff --git a/service-monitor/pom.xml b/service-monitor/pom.xml index c63bdf35574..70f9d4aa655 100644 --- a/service-monitor/pom.xml +++ b/service-monitor/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>service-monitor</artifactId> <packaging>container-plugin</packaging> @@ -66,6 +67,7 @@ <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <scope>provided</scope> + <classifier>no_aop</classifier> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> diff --git a/serviceview/pom.xml b/serviceview/pom.xml index c3620ecfc9d..4357cc697b8 100644 --- a/serviceview/pom.xml +++ b/serviceview/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>serviceview</artifactId> <packaging>container-plugin</packaging> diff --git a/simplemetrics/pom.xml b/simplemetrics/pom.xml index d027fda82ce..02758b182e3 100644 --- a/simplemetrics/pom.xml +++ b/simplemetrics/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>simplemetrics</artifactId> <packaging>container-plugin</packaging> diff --git a/socket_test/pom.xml b/socket_test/pom.xml index 60d8b3713e9..0c6d5cd77f4 100644 --- a/socket_test/pom.xml +++ b/socket_test/pom.xml @@ -12,6 +12,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <packaging>jar</packaging> <build> diff --git a/standalone-container/pom.xml b/standalone-container/pom.xml index 9300181e00b..0d66951f364 100644 --- a/standalone-container/pom.xml +++ b/standalone-container/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>standalone-container</artifactId> <version>6-SNAPSHOT</version> diff --git a/statistics/pom.xml b/statistics/pom.xml index 7bbef0ea3c0..521efa9a2a1 100644 --- a/statistics/pom.xml +++ b/statistics/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>statistics</artifactId> <version>6-SNAPSHOT</version> diff --git a/storage/pom.xml b/storage/pom.xml index 49b103cbe34..e0b21d5a8a9 100644 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>storage</artifactId> <version>6-SNAPSHOT</version> diff --git a/testutil/pom.xml b/testutil/pom.xml index 9f98f40c2d0..00f606860a4 100644 --- a/testutil/pom.xml +++ b/testutil/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>testutil</artifactId> <packaging>jar</packaging> @@ -23,6 +24,7 @@ <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <scope>provided</scope> + <classifier>no_aop</classifier> </dependency> <dependency> <groupId>org.hamcrest</groupId> diff --git a/vdslib/pom.xml b/vdslib/pom.xml index 48681b8ce83..5063489ed66 100644 --- a/vdslib/pom.xml +++ b/vdslib/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vdslib</artifactId> <packaging>container-plugin</packaging> diff --git a/vespa-application-maven-plugin/pom.xml b/vespa-application-maven-plugin/pom.xml index 2464c8208ad..980c8eee60f 100644 --- a/vespa-application-maven-plugin/pom.xml +++ b/vespa-application-maven-plugin/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespa-application-maven-plugin</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespa-documentgen-plugin/pom.xml b/vespa-documentgen-plugin/pom.xml index 4e96a0475f7..718b19ae994 100644 --- a/vespa-documentgen-plugin/pom.xml +++ b/vespa-documentgen-plugin/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespa-documentgen-plugin</artifactId> <packaging>maven-plugin</packaging> diff --git a/vespa-hadoop/pom.xml b/vespa-hadoop/pom.xml index b9fbd589525..62d9010b9fd 100644 --- a/vespa-hadoop/pom.xml +++ b/vespa-hadoop/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespa-hadoop</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespa-http-client/pom.xml b/vespa-http-client/pom.xml index 15d72b7c1c2..c336c641352 100644 --- a/vespa-http-client/pom.xml +++ b/vespa-http-client/pom.xml @@ -7,6 +7,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespa-http-client</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespa_feed_perf/pom.xml b/vespa_feed_perf/pom.xml index f54b2df9b8a..436dcc06f3d 100644 --- a/vespa_feed_perf/pom.xml +++ b/vespa_feed_perf/pom.xml @@ -13,6 +13,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespa_feed_perf</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespa_jersey2/pom.xml b/vespa_jersey2/pom.xml index 3250cd8a41f..781075fd041 100644 --- a/vespa_jersey2/pom.xml +++ b/vespa_jersey2/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespa_jersey2</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespaclient-container-plugin/pom.xml b/vespaclient-container-plugin/pom.xml index 59895438038..3472f3fcdc5 100644 --- a/vespaclient-container-plugin/pom.xml +++ b/vespaclient-container-plugin/pom.xml @@ -9,6 +9,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespaclient-container-plugin</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespaclient-core/pom.xml b/vespaclient-core/pom.xml index bdb15825fbb..2e427364bd6 100644 --- a/vespaclient-core/pom.xml +++ b/vespaclient-core/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespaclient-core</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespaclient-java/pom.xml b/vespaclient-java/pom.xml index 8cde41d53d7..d692a6ed57f 100644 --- a/vespaclient-java/pom.xml +++ b/vespaclient-java/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespaclient-java</artifactId> <version>6-SNAPSHOT</version> diff --git a/vespajlib/pom.xml b/vespajlib/pom.xml index 1f98a5e4c02..81c385c96ab 100644 --- a/vespajlib/pom.xml +++ b/vespajlib/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespajlib</artifactId> <packaging>container-plugin</packaging> diff --git a/vespalog/pom.xml b/vespalog/pom.xml index 6cea5ab83d9..6443769afbe 100644 --- a/vespalog/pom.xml +++ b/vespalog/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vespalog</artifactId> <version>6-SNAPSHOT</version> diff --git a/vsm/pom.xml b/vsm/pom.xml index 8c5b006aeec..3c491906060 100644 --- a/vsm/pom.xml +++ b/vsm/pom.xml @@ -8,6 +8,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>vsm</artifactId> <version>6-SNAPSHOT</version> diff --git a/yolean/pom.xml b/yolean/pom.xml index d64ea29a95c..850daae6fea 100644 --- a/yolean/pom.xml +++ b/yolean/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>yolean</artifactId> <version>6-SNAPSHOT</version> diff --git a/zkfacade/pom.xml b/zkfacade/pom.xml index 45ba8c32372..f9cb8c42688 100644 --- a/zkfacade/pom.xml +++ b/zkfacade/pom.xml @@ -6,6 +6,7 @@ <groupId>com.yahoo.vespa</groupId> <artifactId>parent</artifactId> <version>6-SNAPSHOT</version> + <relativePath>../parent/pom.xml</relativePath> </parent> <artifactId>zkfacade</artifactId> <packaging>container-plugin</packaging> |