summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Marius Venstad <jonmv@users.noreply.github.com>2019-05-14 15:29:43 +0200
committerGitHub <noreply@github.com>2019-05-14 15:29:43 +0200
commit7395d7e576ff8ef0efe749c87c162b8449bac93d (patch)
tree8f07592562de600a95b7164870d60a2e504bbdf7
parent77d73f74f9d8e83a9a4bee2d5add60520c25a035 (diff)
parentf43949f67157e349cef3051adf9cf0ead6e0b2fc (diff)
Merge pull request #9401 from vespa-engine/jvenstad/more-deployment/fixes
Jvenstad/more deployment/fixes
-rw-r--r--hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java14
-rw-r--r--hosted-api/src/main/java/ai/vespa/hosted/api/Deployment.java44
-rw-r--r--vespa-maven-plugin/pom.xml5
-rw-r--r--vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/AbstractVespaMojo.java16
-rw-r--r--vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/CompileVersionMojo.java19
-rw-r--r--vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/DeployMojo.java38
-rw-r--r--vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/SubmitMojo.java2
7 files changed, 44 insertions, 94 deletions
diff --git a/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java b/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java
index 63de0fd8373..5a38154b7c0 100644
--- a/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java
+++ b/hosted-api/src/main/java/ai/vespa/hosted/api/ControllerHttpClient.java
@@ -211,20 +211,8 @@ public abstract class ControllerHttpClient {
private static String metaToJson(Deployment deployment) {
Slime slime = new Slime();
Cursor rootObject = slime.setObject();
-
- if (deployment.repository().isPresent()) {
- Cursor revisionObject = rootObject.setObject("sourceRevision");
- deployment.repository().ifPresent(repository -> revisionObject.setString("repository", repository));
- deployment.branch().ifPresent(branch -> revisionObject.setString("branch", branch));
- deployment.commit().ifPresent(commit -> revisionObject.setString("commit", commit));
- deployment.build().ifPresent(build -> rootObject.setLong("buildNumber", build));
- }
-
deployment.version().ifPresent(version -> rootObject.setString("vespaVersion", version));
-
- if (deployment.ignoreValidationErrors()) rootObject.setBool("ignoreValidationErrors", true);
rootObject.setBool("deployDirectly", true);
-
return toJson(slime);
}
@@ -244,7 +232,7 @@ public abstract class ControllerHttpClient {
private static MultiPartStreamer toDataStream(Deployment deployment) {
MultiPartStreamer streamer = new MultiPartStreamer();
streamer.addJson("deployOptions", metaToJson(deployment));
- deployment.applicationZip().ifPresent(zip -> streamer.addFile("applicationZip", zip));
+ streamer.addFile("applicationZip", deployment.applicationZip());
return streamer;
}
diff --git a/hosted-api/src/main/java/ai/vespa/hosted/api/Deployment.java b/hosted-api/src/main/java/ai/vespa/hosted/api/Deployment.java
index 8f981ca5f05..e745f555847 100644
--- a/hosted-api/src/main/java/ai/vespa/hosted/api/Deployment.java
+++ b/hosted-api/src/main/java/ai/vespa/hosted/api/Deployment.java
@@ -9,59 +9,25 @@ import java.util.OptionalLong;
*/
public class Deployment {
- // Deployment options
private final Optional<String> version;
- private final boolean ignoreValidationErrors;
+ private final Path applicationZip;
- // Provide an application package ...
- private final Optional<Path> applicationZip;
-
- // ... or reference a previously submitted one.
- private final Optional<String> repository;
- private final Optional<String> branch;
- private final Optional<String> commit;
- private final OptionalLong build;
-
- private Deployment(Optional<String> version, boolean ignoreValidationErrors, Optional<Path> applicationZip,
- Optional<String> repository, Optional<String> branch, Optional<String> commit, OptionalLong build) {
+ private Deployment(Optional<String> version, Path applicationZip) {
this.version = version;
- this.ignoreValidationErrors = ignoreValidationErrors;
this.applicationZip = applicationZip;
- this.repository = repository;
- this.branch = branch;
- this.commit = commit;
- this.build = build;
}
-
/** Returns a deployment which will use the provided application package. */
public static Deployment ofPackage(Path applicationZipFile) {
- return new Deployment(Optional.empty(), false, Optional.of(applicationZipFile),
- Optional.empty(), Optional.empty(), Optional.empty(), OptionalLong.empty());
- }
-
- /** Returns a deployment which will use the previously submitted package with the given reference. */
- public static Deployment ofReference(String repository, String branch, String commit, long build) {
- return new Deployment(Optional.empty(), false, Optional.empty(),
- Optional.of(repository), Optional.of(branch), Optional.of(commit), OptionalLong.of(build));
+ return new Deployment(Optional.empty(), applicationZipFile);
}
/** Returns a copy of this which will have the specified Vespa version on its nodes. */
public Deployment atVersion(String vespaVersion) {
- return new Deployment(Optional.of(vespaVersion), ignoreValidationErrors, applicationZip, repository, branch, commit, build);
- }
-
- /** Returns a copy of this which will additionally ignore validation errors upon deployment. */
- public Deployment ignoringValidationErrors() {
- return new Deployment(version, true, applicationZip, repository, branch, commit, build);
+ return new Deployment(Optional.of(vespaVersion), applicationZip);
}
public Optional<String> version() { return version; }
- public boolean ignoreValidationErrors() { return ignoreValidationErrors; }
- public Optional<Path> applicationZip() { return applicationZip; }
- public Optional<String> repository() { return repository; }
- public Optional<String> branch() { return branch; }
- public Optional<String> commit() { return commit; }
- public OptionalLong build() { return build; }
+ public Path applicationZip() { return applicationZip; }
}
diff --git a/vespa-maven-plugin/pom.xml b/vespa-maven-plugin/pom.xml
index 321ab0074e7..57ce1ccadf8 100644
--- a/vespa-maven-plugin/pom.xml
+++ b/vespa-maven-plugin/pom.xml
@@ -41,11 +41,6 @@
</dependency>
<dependency>
- <groupId>org.fusesource.jansi</groupId>
- <artifactId>jansi</artifactId>
- <version>1.17.1</version>
- </dependency>
- <dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
</dependency>
diff --git a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/AbstractVespaMojo.java b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/AbstractVespaMojo.java
index fd3409dcfcb..e2bbbb86706 100644
--- a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/AbstractVespaMojo.java
+++ b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/AbstractVespaMojo.java
@@ -3,6 +3,7 @@ package ai.vespa.hosted.plugin;
import ai.vespa.hosted.api.ControllerHttpClient;
import com.yahoo.config.provision.ApplicationId;
import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
@@ -43,18 +44,23 @@ public abstract class AbstractVespaMojo extends AbstractMojo {
protected ControllerHttpClient controller;
@Override
- public final void execute() {
- setup();
- doExecute();
+ public final void execute() throws MojoExecutionException {
+ try {
+ setup();
+ doExecute();
+ }
+ catch (Exception e) {
+ throw new MojoExecutionException("Execution failed for application '" + id + "':", e);
+ }
}
/** Override this in subclasses, instead of {@link #execute()}. */
- protected abstract void doExecute();
+ protected abstract void doExecute() throws Exception;
protected void setup() {
tenant = firstNonBlank(tenant, project.getProperties().getProperty("tenant"));
application = firstNonBlank(application, project.getProperties().getProperty("application"));
- instance = firstNonBlank(instance, project.getProperties().getProperty("instance"), "default");
+ instance = firstNonBlank(instance, project.getProperties().getProperty("instance", "default"));
id = ApplicationId.from(tenant, application, instance);
controller = certificateFile == null
diff --git a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/CompileVersionMojo.java b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/CompileVersionMojo.java
index 24e2c42d756..715bd0e3009 100644
--- a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/CompileVersionMojo.java
+++ b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/CompileVersionMojo.java
@@ -1,6 +1,13 @@
package ai.vespa.hosted.plugin;
import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
/**
* Finds the Vespa version to compile against, for a hosted Vespa application.
@@ -10,9 +17,17 @@ import org.apache.maven.plugins.annotations.Mojo;
@Mojo(name = "compileVersion")
public class CompileVersionMojo extends AbstractVespaMojo {
+ @Parameter(property = "outputFile", defaultValue = "target/vespa.compile.version")
+ private String outputFile;
+
@Override
- protected void doExecute() {
- System.out.println(controller.compileVersion(id));
+ protected void doExecute() throws IOException {
+ Path output = Paths.get(outputFile).toAbsolutePath();
+ String compileVersion = controller.compileVersion(id);
+ getLog().info("Vespa version to compile against is '" + compileVersion + "'.");
+ getLog().info("Writing compile version to '" + output + "'.");
+ Files.createDirectories(output.getParent());
+ Files.writeString(output, compileVersion);
}
}
diff --git a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/DeployMojo.java b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/DeployMojo.java
index 28e5553131f..32ff03ae202 100644
--- a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/DeployMojo.java
+++ b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/DeployMojo.java
@@ -1,6 +1,5 @@
package ai.vespa.hosted.plugin;
-import ai.vespa.hosted.api.ControllerHttpClient;
import ai.vespa.hosted.api.Deployment;
import ai.vespa.hosted.api.DeploymentLog;
import ai.vespa.hosted.api.DeploymentResult;
@@ -8,7 +7,6 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.zone.ZoneId;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
-import org.fusesource.jansi.Ansi;
import java.nio.file.Paths;
import java.time.ZoneOffset;
@@ -28,42 +26,25 @@ public class DeployMojo extends AbstractVespaMojo {
@Parameter(property = "vespaVersion")
private String vespaVersion;
- @Parameter(property = "ignoreValidationErrors")
- private String ignoreValidationErrors;
-
@Parameter(property = "environment")
private String environment;
@Parameter(property = "region")
private String region;
- @Parameter(property = "repository")
- private String repository;
-
- @Parameter(property = "branch")
- private String branch;
-
- @Parameter(property = "commit")
- private String commit;
-
- @Parameter(property = "build")
- private Long build;
-
@Parameter(property = "follow", defaultValue = "true")
private boolean follow;
@Override
protected void doExecute() {
- Deployment deployment = build == null
- ? Deployment.ofPackage(Paths.get(firstNonBlank(applicationZip, projectPathOf("target", "application.zip"))))
- : Deployment.ofReference(repository, branch, commit, build);
- if ("true".equalsIgnoreCase(ignoreValidationErrors)) deployment = deployment.ignoringValidationErrors(); // TODO unused, GC or fix.
+ Deployment deployment = Deployment.ofPackage(Paths.get(firstNonBlank(applicationZip,
+ projectPathOf("target", "application.zip"))));
if (vespaVersion != null) deployment = deployment.atVersion(vespaVersion);
ZoneId zone = environment == null || region == null ? controller.devZone() : ZoneId.from(environment, region);
DeploymentResult result = controller.deploy(deployment, id, zone);
- System.out.println(result.message());
+ getLog().info(result.message());
if (follow) tailLogs(id, zone, result.run());
}
@@ -73,10 +54,10 @@ public class DeployMojo extends AbstractVespaMojo {
while (true) {
DeploymentLog log = controller.deploymentLog(id, zone, run, last);
for (DeploymentLog.Entry entry : log.entries())
- System.out.println(formatted(entry));
+ print(entry);
last = log.last().orElse(last);
- if (!log.isActive())
+ if ( ! log.isActive())
break;
try {
@@ -91,14 +72,13 @@ public class DeployMojo extends AbstractVespaMojo {
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss").withZone(ZoneOffset.UTC);
- private static String formatted(DeploymentLog.Entry entry) {
+ private void print(DeploymentLog.Entry entry) {
String timestamp = formatter.format(entry.at());
switch (entry.level()) {
- case "info" : timestamp = Ansi.ansi().bold().fgBlue().a(timestamp).reset().toString(); break;
- case "warning" : timestamp = Ansi.ansi().bold().fgYellow().a(timestamp).reset().toString(); break;
- case "error" : timestamp = Ansi.ansi().bold().fgRed().a(timestamp).reset().toString(); break;
+ case "warning" : getLog().warn(" [" + timestamp + "] " + entry.message()); break;
+ case "error" : getLog().error("[" + timestamp + "] " + entry.message()); break;
+ default: getLog().info(" [" + timestamp + "] " + entry.message()); break;
}
- return "[" + timestamp + "] " + entry.message();
}
}
diff --git a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/SubmitMojo.java b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/SubmitMojo.java
index eda9ea9b799..3aee3a5ce96 100644
--- a/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/SubmitMojo.java
+++ b/vespa-maven-plugin/src/main/java/ai/vespa/hosted/plugin/SubmitMojo.java
@@ -46,7 +46,7 @@ public class SubmitMojo extends AbstractVespaMojo {
Paths.get(applicationTestZip),
projectId == null ? OptionalLong.empty() : OptionalLong.of(projectId));
- System.out.println(controller.submit(submission, id.tenant(), id.application()));
+ getLog().info(controller.submit(submission, id.tenant(), id.application()));
}
}