diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2019-05-14 15:29:43 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-14 15:29:43 +0200 |
commit | 7395d7e576ff8ef0efe749c87c162b8449bac93d (patch) | |
tree | 8f07592562de600a95b7164870d60a2e504bbdf7 | |
parent | 77d73f74f9d8e83a9a4bee2d5add60520c25a035 (diff) | |
parent | f43949f67157e349cef3051adf9cf0ead6e0b2fc (diff) |
Merge pull request #9401 from vespa-engine/jvenstad/more-deployment/fixes
Jvenstad/more deployment/fixes
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())); } } |