diff --git a/build.gradle b/build.gradle index 142b6a12..0f713d92 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ sourceCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_1_7 group = 'com.google.cloud.tools' -version = '0.1.2-SNAPSHOT' +version = '0.2.0-SNAPSHOT' repositories { mavenCentral() @@ -30,21 +30,13 @@ repositories { dependencies { compile localGroovy() compile gradleApi() - compile ('com.google.cloud.tools:appengine-plugins-core:0.1.6') { - changing = true; - } + compile 'com.google.cloud.tools:appengine-plugins-core:0.1.9' testCompile 'commons-io:commons-io:2.4' testCompile 'org.hamcrest:hamcrest-library:1.3' testCompile 'org.mockito:mockito-core:2.0.54-beta' } -configurations.all { - resolutionStrategy { - cacheChangingModulesFor 0, 'seconds' - } -} - jar { manifest { attributes 'Implementation-Title': project.name, diff --git a/scripts/publishing.gradle b/scripts/publishing.gradle index ae428d82..d15bd850 100644 --- a/scripts/publishing.gradle +++ b/scripts/publishing.gradle @@ -38,19 +38,11 @@ extraArchive { } gradle.taskGraph.whenReady { taskGraph -> - if (taskGraph.allTasks.any { it instanceof Sign } && - taskGraph.allTasks.any { it.name.equals(project.nexus.getUploadTaskName()) }) { - Console console = System.console() - console.printf "\n\nPGP credentials required to sign artifacts.\n\n" - - def id = readPropCmdLine(console, "signing.keyId", "", "PGP Key Id") - def file = readPropCmdLine(console, "signing.secretKeyRingFile", "${System.getProperty("user.home")}/.gnupg/secring.gpg", "PGP Secret Key Ring File (absolute path)") - def password = console.readPassword("PGP Private Key Password: ") - - project.ext."signing.keyId" = id - project.ext."signing.secretKeyRingFile" = file - project.ext."signing.password" = password - console.printf "\n\nOSS Sonatype Credential required to upload.\n\n" + if (taskGraph.allTasks.any { it.name.equals(project.nexus.getUploadTaskName()) }) { + java.io.Console console = System.console() + // something about the gradle cmdline output messed with the output ordering + // so sleep a little so we appear after [building x%] + sleep(200) def nexusUsername = readPropCmdLine(console, "nexus.username", "", "Sonatype Username") def nexusPassword = console.readPassword("Sonatype Password: ") @@ -60,6 +52,8 @@ gradle.taskGraph.whenReady { taskGraph -> } } +// if you see a weird error pointing here, make sure you run upload with --no-daemon +// so stdin is good to go def readPropCmdLine(console, property, defaultValue, msg) { def value = System.getProperty(property) ?: defaultValue value = console.readLine("$msg [${value}]:") ?: value diff --git a/src/integTest/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginIntegrationTest.java b/src/integTest/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginIntegrationTest.java index 7fe1034a..29a7820d 100644 --- a/src/integTest/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginIntegrationTest.java +++ b/src/integTest/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginIntegrationTest.java @@ -43,11 +43,6 @@ */ public class AppEngineStandardPluginIntegrationTest { - @BeforeClass - public static void assertEnvironment() { - Assert.assertThat(System.getProperty("java.version"), CoreMatchers.startsWith("1.7")); - } - @Rule public Timeout globalTimeout = Timeout.seconds(180); diff --git a/src/integTest/resources/projects/standard-project/build.gradle b/src/integTest/resources/projects/standard-project/build.gradle index c15cd073..201e784e 100644 --- a/src/integTest/resources/projects/standard-project/build.gradle +++ b/src/integTest/resources/projects/standard-project/build.gradle @@ -28,3 +28,6 @@ repositories { dependencies { compile "javax.servlet:servlet-api:2.5" } + +sourceCompatibility = JavaVersion.VERSION_1_7 +targetCompatibility = JavaVersion.VERSION_1_7 \ No newline at end of file diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePlugin.java b/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePlugin.java index 8b6e670b..bf966406 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePlugin.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePlugin.java @@ -17,8 +17,8 @@ package com.google.cloud.tools.gradle.appengine; -import com.google.cloud.tools.gradle.appengine.model.hidden.CloudSdkBuilderFactory; -import com.google.cloud.tools.gradle.appengine.model.AppEngineFlexibleModel; +import com.google.cloud.tools.gradle.appengine.model.AppEngineFlexibleExtension; +import com.google.cloud.tools.gradle.appengine.task.CloudSdkBuilderFactory; import com.google.cloud.tools.gradle.appengine.task.DeployTask; import com.google.cloud.tools.gradle.appengine.task.StageFlexibleTask; @@ -26,26 +26,14 @@ import org.gradle.api.GradleException; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.Task; -import org.gradle.api.internal.project.ProjectIdentifier; import org.gradle.api.plugins.BasePlugin; -import org.gradle.api.plugins.ExtensionContainer; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.WarPlugin; import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.bundling.War; -import org.gradle.model.Defaults; -import org.gradle.model.Finalize; -import org.gradle.model.Model; -import org.gradle.model.ModelMap; -import org.gradle.model.Mutate; -import org.gradle.model.Path; -import org.gradle.model.RuleSource; -import org.gradle.model.internal.core.Hidden; import java.io.File; import java.util.Collections; -import java.util.List; /** * Plugin definition for App Engine flexible environments @@ -57,99 +45,92 @@ public class AppEngineFlexiblePlugin implements Plugin { private static final String APP_ENGINE_FLEXIBLE_TASK_GROUP = "App Engine flexible environment"; private static final String STAGED_APP_DIR_NAME = "staged-app"; + private Project project; + private AppEngineFlexibleExtension extension; + private CloudSdkBuilderFactory cloudSdkBuilderFactory; + @Override public void apply(Project project) { - // Create an extension to share data from project space to model space - final FlexibleDataExtension projectData = project.getExtensions() - .create("_internalProjectData", FlexibleDataExtension.class); + this.project = project; + createPluginExtension(); - configureProjectArchive(project, projectData); + createStageTask(); + createDeployTask(); } - private void configureProjectArchive(Project project, final FlexibleDataExtension projectData) { + private void createPluginExtension() { + extension = project.getExtensions().create("appengine", AppEngineFlexibleExtension.class); + + extension.getStage().setStagingDirectory(new File(project.getBuildDir(), STAGED_APP_DIR_NAME)); + extension.getDeploy().setDeployables(Collections + .singletonList(new File(extension.getStage().getStagingDirectory(), "app.yaml"))); + extension.getStage() + .setAppEngineDirectory(new File(project.getProjectDir(), "src/main/appengine")); + File dockerDirectory = new File(project.getProjectDir(), "src/main/docker"); + if (dockerDirectory.exists()) { + extension.getStage().setDockerDirectory(dockerDirectory); + } + project.afterEvaluate(new Action() { @Override public void execute(Project project) { - if (project.getPlugins().hasPlugin(WarPlugin.class)) { - War war = (War) project.getProperties().get("war"); - projectData.setArchive(war.getArchivePath()); - } - else if (project.getPlugins().hasPlugin(JavaPlugin.class)){ - Jar jar = (Jar) project.getProperties().get("jar"); - projectData.setArchive(jar.getArchivePath()); - } - else { - throw new GradleException("Could not find JAR or WAR configuration"); + // we can only set the default location of "archive" after project evaluation (callback) + if (extension.getStage().getArtifact() == null) { + if (project.getPlugins().hasPlugin(WarPlugin.class)) { + War war = (War) project.getProperties().get("war"); + extension.getStage().setArtifact(war.getArchivePath()); + } else if (project.getPlugins().hasPlugin(JavaPlugin.class)) { + Jar jar = (Jar) project.getProperties().get("jar"); + extension.getStage().setArtifact(jar.getArchivePath()); + } else { + throw new GradleException("Could not find JAR or WAR configuration"); + } + + // also create the sdk builder factory after we know the location of the sdk + cloudSdkBuilderFactory = new CloudSdkBuilderFactory( + extension.getTools().getCloudSdkHome()); } } }); } - /** - * RuleSource configuration for the plugin - */ - public static class PluginRules extends RuleSource { - - @Model - public void appengine(AppEngineFlexibleModel app) { - } - - @Model - @Hidden - public void cloudSdkBuilderFactory(CloudSdkBuilderFactory factory) { - } + private void createStageTask() { + project.getTasks() + .create(STAGE_TASK_NAME, StageFlexibleTask.class, new Action() { + @Override + public void execute(final StageFlexibleTask stageTask) { + stageTask.setGroup(APP_ENGINE_FLEXIBLE_TASK_GROUP); + stageTask.setDescription( + "Stage an App Engine flexible environment application for deployment"); + stageTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + stageTask.setStagingConfig(extension.getStage()); + } + }); + } + }); + } - @Defaults - public void setDefaults(AppEngineFlexibleModel app, @Path("buildDir") File buildDir, - ProjectIdentifier project, ExtensionContainer extensions) { - app.getStage().setArtifact(extensions.getByType(FlexibleDataExtension.class).getArchive()); - app.getStage().setStagingDirectory(new File(buildDir, STAGED_APP_DIR_NAME)); - List deployables = Collections - .singletonList(new File(app.getStage().getStagingDirectory(), "app.yaml")); - app.getDeploy().setDeployables(deployables); - - // TODO : look up using the convention for sourcesets here? - File dockerDirectory = new File(project.getProjectDir(), "src/main/docker"); - if (dockerDirectory.exists()) { - app.getStage().setDockerDirectory(dockerDirectory); + private void createDeployTask() { + project.getTasks().create(DEPLOY_TASK_NAME, DeployTask.class, new Action() { + @Override + public void execute(final DeployTask deployTask) { + deployTask.setGroup(APP_ENGINE_FLEXIBLE_TASK_GROUP); + deployTask.setDescription("Deploy an App Engine flexible environment application"); + deployTask.dependsOn(STAGE_TASK_NAME); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + deployTask.setDeployConfig(extension.getDeploy()); + deployTask.setCloudSdkBuilderFactory(cloudSdkBuilderFactory); + } + }); } - app.getStage().setAppEngineDirectory(new File(project.getProjectDir(), "src/main/appengine")); - } - - @Mutate - public void createCloudSdkBuilderFactory(final CloudSdkBuilderFactory factory, - final AppEngineFlexibleModel app) { - factory.setCloudSdkHome(app.getTools().getCloudSdkHome()); - } - - @Mutate - public void createStageTask(final ModelMap tasks, final AppEngineFlexibleModel app) { - tasks.create(STAGE_TASK_NAME, StageFlexibleTask.class, new Action() { - @Override - public void execute(StageFlexibleTask stageTask) { - stageTask.setStagingConfig(app.getStage()); - stageTask.setGroup(APP_ENGINE_FLEXIBLE_TASK_GROUP); - stageTask.setDescription("Stage an App Engine flexible environment application for deployment"); - stageTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); - } - }); - } - - @Finalize - public void createDeployTask(ModelMap tasks, final AppEngineFlexibleModel app, - final CloudSdkBuilderFactory factory) { - - tasks.create(DEPLOY_TASK_NAME, DeployTask.class, new Action() { - @Override - public void execute(DeployTask deployTask) { - deployTask.setDeployConfig(app.getDeploy()); - deployTask.setCloudSdkBuilderFactory(factory); - deployTask.setGroup(APP_ENGINE_FLEXIBLE_TASK_GROUP); - deployTask.setDescription("Deploy an App Engine flexible environment application"); - deployTask.dependsOn(STAGE_TASK_NAME); - } - }); - } + }); } } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPlugin.java b/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPlugin.java index 30e31c4d..3b538a6f 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPlugin.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPlugin.java @@ -17,8 +17,8 @@ package com.google.cloud.tools.gradle.appengine; -import com.google.cloud.tools.gradle.appengine.model.AppEngineStandardModel; -import com.google.cloud.tools.gradle.appengine.model.hidden.CloudSdkBuilderFactory; +import com.google.cloud.tools.gradle.appengine.model.AppEngineStandardExtension; +import com.google.cloud.tools.gradle.appengine.task.CloudSdkBuilderFactory; import com.google.cloud.tools.gradle.appengine.task.DeployTask; import com.google.cloud.tools.gradle.appengine.task.DevAppServerRunTask; import com.google.cloud.tools.gradle.appengine.task.DevAppServerStartTask; @@ -32,21 +32,11 @@ import org.gradle.api.JavaVersion; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.Task; import org.gradle.api.plugins.BasePlugin; -import org.gradle.api.plugins.ExtensionContainer; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.plugins.WarPlugin; import org.gradle.api.plugins.WarPluginConvention; import org.gradle.api.tasks.bundling.War; -import org.gradle.model.Defaults; -import org.gradle.model.Finalize; -import org.gradle.model.Model; -import org.gradle.model.ModelMap; -import org.gradle.model.Mutate; -import org.gradle.model.Path; -import org.gradle.model.RuleSource; -import org.gradle.model.internal.core.Hidden; import java.io.File; import java.util.Collections; @@ -70,174 +60,178 @@ public class AppEngineStandardPlugin implements Plugin { private static final String STAGED_APP_DIR_NAME = "staged-app"; + private Project project; + private AppEngineStandardExtension extension; + private CloudSdkBuilderFactory cloudSdkBuilderFactory; + + @Override public void apply(Project project) { - project.getPluginManager().apply(WarPlugin.class); - // Create an extension to share data from project space to model space - final StandardDataExtension projectData = project.getExtensions() - .create("_internalProjectData", StandardDataExtension.class); + this.project = project; + createPluginExtension(); - configureJavaRuntimeCompatibility(project, projectData); + createExplodedWarTask(); + createStageTask(); + createRunTasks(); + createDeployTask(); } - private void configureJavaRuntimeCompatibility(final Project project, - final StandardDataExtension projectData) { - project.afterEvaluate(new Action(){ - @Override - public void execute(Project project){ - JavaPluginConvention javaConvention = project.getConvention() - .getPlugin(JavaPluginConvention.class); - JavaVersion javaVersion = javaConvention.getTargetCompatibility(); - projectData.setJavaVersion(javaVersion); - } - }); + private void createPluginExtension() { + extension = project.getExtensions().create("appengine", AppEngineStandardExtension.class); + + extension.getStage().setSourceDirectory(new File(project.getBuildDir(), EXPLODED_APP_DIR_NAME)); + extension.getStage().setStagingDirectory(new File(project.getBuildDir(), STAGED_APP_DIR_NAME)); + extension.getRun().setAppYamls( + Collections.singletonList(new File(project.getBuildDir(), EXPLODED_APP_DIR_NAME))); + extension.getDeploy().setDeployables(Collections + .singletonList(new File(extension.getStage().getStagingDirectory(), "app.yaml"))); project.afterEvaluate(new Action() { @Override public void execute(Project project) { - WarPluginConvention warConfig = project.getConvention() - .getPlugin(WarPluginConvention.class); - File appengineWebXml = new File(warConfig.getWebAppDir(), "WEB-INF/appengine-web.xml"); - projectData.setAppengineWebXml(appengineWebXml); + // special handing for java8 + if (extension.getStage().getRuntime() == null) { + WarPluginConvention war = project.getConvention().getPlugin(WarPluginConvention.class); + File appengineWebXml = new File(war.getWebAppDir(), "WEB-INF/appengine-web.xml"); + JavaVersion javaVersion = project.getConvention().getPlugin(JavaPluginConvention.class) + .getTargetCompatibility(); + if (javaVersion.compareTo(JavaVersion.VERSION_1_8) >= 0 && + AppEngineWebXml.parse(appengineWebXml).isVm()) { + extension.getStage().setRuntime("java"); + } + } + // create the sdk builder factory after we know the location of the sdk + cloudSdkBuilderFactory = new CloudSdkBuilderFactory(extension.getTools().getCloudSdkHome()); + + // add special flag for devappserver on java8 + if (JavaVersion.current().compareTo(JavaVersion.VERSION_1_8) >= 0) { + List jvmFlags = extension.getRun().getJvmFlags(); + jvmFlags = (jvmFlags == null) ? Lists.newArrayList() : jvmFlags; + jvmFlags.add("-Dappengine.user.timezone=UTC"); + extension.getRun().setJvmFlags(jvmFlags); + } } }); } - /** - * RuleSource configuration for the plugin - */ - public static class PluginRules extends RuleSource { - - @Model - public void appengine(AppEngineStandardModel app) { - } - - @Model - @Hidden - public void cloudSdkBuilderFactory(CloudSdkBuilderFactory factory) { - } - - @Defaults - public void setDefaults(AppEngineStandardModel app, @Path("buildDir") File buildDir, - ExtensionContainer extension) { - app.getStage().setSourceDirectory(new File(buildDir, EXPLODED_APP_DIR_NAME)); - app.getStage().setStagingDirectory(new File(buildDir, STAGED_APP_DIR_NAME)); - - List runnables = Collections.singletonList(new File(buildDir, EXPLODED_APP_DIR_NAME)); - app.getRun().setAppYamls(runnables); - List deployables = Collections - .singletonList(new File(app.getStage().getStagingDirectory(), "app.yaml")); - app.getDeploy().setDeployables(deployables); - - StandardDataExtension projectData = extension.getByType(StandardDataExtension.class); - if (projectData.getJavaVersion().compareTo(JavaVersion.VERSION_1_8) >= 0 && - AppEngineWebXml.parse(projectData.getAppengineWebXml()).isVm()) { - app.getStage().setRuntime("java"); - } + private void createExplodedWarTask() { + project.getTasks() + .create(EXPLODE_WAR_TASK_NAME, ExplodeWarTask.class, new Action() { + @Override + public void execute(final ExplodeWarTask explodeWar) { + explodeWar + .setExplodedAppDirectory(new File(project.getBuildDir(), EXPLODED_APP_DIR_NAME)); + explodeWar.dependsOn(WarPlugin.WAR_TASK_NAME); + explodeWar.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); + explodeWar.setDescription("Explode a war into a directory"); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + explodeWar.setWarFile( + ((War) project.getTasks().getByPath(WarPlugin.WAR_TASK_NAME)).getArchivePath()); + } + }); + } + }); + project.getTasks().getByName(BasePlugin.ASSEMBLE_TASK_NAME).dependsOn(EXPLODE_WAR_TASK_NAME); + } - } - - @Mutate - public void createCloudSdkBuilderFactory(final CloudSdkBuilderFactory factory, - final AppEngineStandardModel app) { - factory.setCloudSdkHome(app.getTools().getCloudSdkHome()); - } - - @Mutate - public void createExplodedWarTask(final ModelMap tasks, - @Path("tasks.war") final War warTask, @Path("buildDir") final File buildDir) { - - tasks.create(EXPLODE_WAR_TASK_NAME, ExplodeWarTask.class, new Action() { - @Override - public void execute(ExplodeWarTask explodeWarTask) { - explodeWarTask.setExplodedAppDirectory(new File(buildDir, EXPLODED_APP_DIR_NAME)); - explodeWarTask.dependsOn(warTask); - explodeWarTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); - explodeWarTask.setDescription("Explode a war into a directory"); - explodeWarTask.setWarFile(warTask.getArchivePath()); - } - }); - tasks.get(BasePlugin.ASSEMBLE_TASK_NAME).dependsOn(EXPLODE_WAR_TASK_NAME); - - } - - @Finalize - public void configureDevAppServerJava8RunFlag(final AppEngineStandardModel app) { - if (JavaVersion.current().compareTo(JavaVersion.VERSION_1_8) >= 0) { - List jvmFlags = app.getRun().getJvmFlags(); - jvmFlags = (jvmFlags == null) ? Lists.newArrayList() : jvmFlags; - jvmFlags.add("-Dappengine.user.timezone=UTC"); - app.getRun().setJvmFlags(jvmFlags); + private void createStageTask() { + + project.getTasks() + .create(STAGE_TASK_NAME, StageStandardTask.class, new Action() { + @Override + public void execute(final StageStandardTask stageTask) { + stageTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); + stageTask.setDescription( + "Stage an App Engine standard environment application for deployment"); + stageTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + stageTask.setStagingConfig(extension.getStage()); + stageTask.setCloudSdkBuilderFactory(cloudSdkBuilderFactory); + } + }); + } + }); + } + + private void createRunTasks() { + project.getTasks() + .create(RUN_TASK_NAME, DevAppServerRunTask.class, new Action() { + @Override + public void execute(final DevAppServerRunTask runTask) { + runTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); + runTask.setDescription("Run an App Engine standard environment application locally"); + runTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + runTask.setRunConfig(extension.getRun()); + runTask.setCloudSdkBuilderFactory(cloudSdkBuilderFactory); + } + }); + } + }); + + project.getTasks() + .create(START_TASK_NAME, DevAppServerStartTask.class, new Action() { + @Override + public void execute(final DevAppServerStartTask startTask) { + startTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); + startTask.setDescription( + "Run an App Engine standard environment application locally in the background"); + startTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + startTask.setRunConfig(extension.getRun()); + startTask.setCloudSdkBuilderFactory(cloudSdkBuilderFactory); + } + }); + } + }); + + project.getTasks() + .create(STOP_TASK_NAME, DevAppServerStopTask.class, new Action() { + @Override + public void execute(final DevAppServerStopTask stopTask) { + stopTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); + stopTask.setDescription( + "Stop a locally running App Engine standard environment application"); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + stopTask.setRunConfig(extension.getRun()); + } + }); + } + }); + } + + private void createDeployTask() { + project.getTasks().create(DEPLOY_TASK_NAME, DeployTask.class, new Action() { + @Override + public void execute(final DeployTask deployTask) { + deployTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); + deployTask.setDescription("Deploy an App Engine standard environment application"); + deployTask.dependsOn(STAGE_TASK_NAME); + + project.afterEvaluate(new Action() { + @Override + public void execute(Project project) { + deployTask.setDeployConfig(extension.getDeploy()); + deployTask.setCloudSdkBuilderFactory(cloudSdkBuilderFactory); + } + }); } - } - - @Finalize - public void createStageTask(final ModelMap tasks, final AppEngineStandardModel app, - final CloudSdkBuilderFactory factory) { - - tasks.create(STAGE_TASK_NAME, StageStandardTask.class, new Action() { - @Override - public void execute(StageStandardTask stageTask) { - stageTask.setStagingConfig(app.getStage()); - stageTask.setCloudSdkBuilderFactory(factory); - stageTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); - stageTask.setDescription("Stage an App Engine standard environment application for deployment"); - stageTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); - } - }); - } - - @Finalize - public void createRunTasks(final ModelMap tasks, final AppEngineStandardModel app, - final CloudSdkBuilderFactory factory) { - - tasks.create(RUN_TASK_NAME, DevAppServerRunTask.class, new Action() { - @Override - public void execute(DevAppServerRunTask runTask) { - runTask.setRunConfig(app.getRun()); - runTask.setCloudSdkBuilderFactory(factory); - runTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); - runTask.setDescription("Run an App Engine standard environment application locally"); - runTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); - } - }); - - tasks.create(START_TASK_NAME, DevAppServerStartTask.class, new Action() { - @Override - public void execute(DevAppServerStartTask startTask) { - startTask.setRunConfig(app.getRun()); - startTask.setCloudSdkBuilderFactory(factory); - startTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); - startTask.setDescription("Run an App Engine standard environment application locally in the background"); - startTask.dependsOn(BasePlugin.ASSEMBLE_TASK_NAME); - } - }); - - tasks.create(STOP_TASK_NAME, DevAppServerStopTask.class, new Action() { - @Override - public void execute(DevAppServerStopTask stopTask) { - stopTask.setRunConfig(app.getRun()); - stopTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); - stopTask.setDescription("Stop a locally running App Engine standard environment application"); - } - }); - } - - @Finalize - public void createDeployTask(final ModelMap tasks, final AppEngineStandardModel app, - final CloudSdkBuilderFactory factory) { - - tasks.create(DEPLOY_TASK_NAME, DeployTask.class, new Action() { - @Override - public void execute(DeployTask deployTask) { - deployTask.setDeployConfig(app.getDeploy()); - deployTask.setCloudSdkBuilderFactory(factory); - deployTask.setGroup(APP_ENGINE_STANDARD_TASK_GROUP); - deployTask.setDescription("Deploy an App Engine standard environment application"); - deployTask.dependsOn(STAGE_TASK_NAME); - } - }); - } + }); } } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/FlexibleDataExtension.java b/src/main/java/com/google/cloud/tools/gradle/appengine/FlexibleDataExtension.java deleted file mode 100644 index ec64cb10..00000000 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/FlexibleDataExtension.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine; - -import java.io.File; - -/** - * Extension to share data from project space to model space for the {@link AppEngineFlexiblePlugin} - */ -public class FlexibleDataExtension { - - private File archive; - - public File getArchive() { - return archive; - } - - public void setArchive(File archive) { - this.archive = archive; - } -} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/StandardDataExtension.java b/src/main/java/com/google/cloud/tools/gradle/appengine/StandardDataExtension.java deleted file mode 100644 index 522ae239..00000000 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/StandardDataExtension.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine; - -import org.gradle.api.JavaVersion; - -import java.io.File; - -/** - * Extension to share data from project space to model space for the {@link AppEngineStandardPlugin} - */ -public class StandardDataExtension { - - private JavaVersion javaVersion; - private File appengineWebXml; - - public JavaVersion getJavaVersion() { - return javaVersion; - } - - public void setJavaVersion(JavaVersion javaVersion) { - this.javaVersion = javaVersion; - } - - public File getAppengineWebXml() { - return appengineWebXml; - } - - public void setAppengineWebXml(File appengineWebXml) { - this.appengineWebXml = appengineWebXml; - } -} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineFlexibleExtension.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineFlexibleExtension.java new file mode 100644 index 00000000..c49746b5 --- /dev/null +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineFlexibleExtension.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016 Google Inc. All Right Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.google.cloud.tools.gradle.appengine.model; + +import groovy.lang.Closure; + +/** + * Root App Engine Flexible Environment model element + */ +public class AppEngineFlexibleExtension { + private Tools tools = new Tools(); + private Deploy deploy = new Deploy(); + private StageFlexible stage = new StageFlexible(); + + public void cloudSdk(Closure c) { + c.setResolveStrategy(Closure.DELEGATE_FIRST); + c.setDelegate(tools); + c.call(); + } + + public void deploy(Closure c) { + c.setResolveStrategy(Closure.DELEGATE_FIRST); + c.setDelegate(deploy); + c.call(); + } + + public void stage(Closure c) { + c.setResolveStrategy(Closure.DELEGATE_FIRST); + c.setDelegate(stage); + c.call(); + } + + public Tools getTools() { + return tools; + } + + public Deploy getDeploy() { + return deploy; + } + + public StageFlexible getStage() { + return stage; + } +} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineFlexibleModel.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineFlexibleModel.java deleted file mode 100644 index 4143af75..00000000 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineFlexibleModel.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import org.gradle.model.Managed; - -/** - * Root App Engine Flexible Environment model element - */ -@Managed -public interface AppEngineFlexibleModel { - Tools getTools(); - StageFlexibleModel getStage(); - DeployModel getDeploy(); -} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineStandardExtension.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineStandardExtension.java new file mode 100644 index 00000000..588079cc --- /dev/null +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineStandardExtension.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2016 Google Inc. All Right Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.google.cloud.tools.gradle.appengine.model; + +import groovy.lang.Closure; + +/** + * Root App Engine Flexible Environment model element + */ +public class AppEngineStandardExtension { + private Tools tools = new Tools(); + private Deploy deploy = new Deploy(); + private Run run = new Run(); + private StageStandard stage = new StageStandard(); + + public void cloudSdk(Closure c) { + c.setResolveStrategy(Closure.DELEGATE_FIRST); + c.setDelegate(tools); + c.call(); + } + + public void deploy(Closure c) { + c.setResolveStrategy(Closure.DELEGATE_FIRST); + c.setDelegate(deploy); + c.call(); + } + + public void stage(Closure c) { + c.setResolveStrategy(Closure.DELEGATE_FIRST); + c.setDelegate(stage); + c.call(); + } + + public void run(Closure c) { + c.setResolveStrategy(Closure.DELEGATE_FIRST); + c.setDelegate(run); + c.call(); + } + + public Tools getTools() { + return tools; + } + + public Deploy getDeploy() { + return deploy; + } + + public Run getRun() { + return run; + } + + public StageStandard getStage() { + return stage; + } +} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineStandardModel.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineStandardModel.java deleted file mode 100644 index 852182e0..00000000 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/AppEngineStandardModel.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import org.gradle.model.Managed; - -/** - * Root App Engine Flexible Environment model element - */ -@Managed -public interface AppEngineStandardModel { - Tools getTools(); - StageStandardModel getStage(); - RunModel getRun(); - DeployModel getDeploy(); -} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/Deploy.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/Deploy.java new file mode 100644 index 00000000..0f8d0f8c --- /dev/null +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/model/Deploy.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2016 Google Inc. All Right Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.google.cloud.tools.gradle.appengine.model; + +import com.google.cloud.tools.appengine.api.deploy.DeployConfiguration; + +import java.io.File; +import java.util.List; + +/** + * Extension element to define Deployable configurations for App Engine + */ +public class Deploy implements DeployConfiguration { + private String bucket; + private List deployables; + private String imageUrl; + private String project; + private Boolean promote; + private String server; + private Boolean stopPreviousVersion; + private String version; + + @Override + public String getBucket() { + return bucket; + } + + public void setBucket(String bucket) { + this.bucket = bucket; + } + + @Override + public List getDeployables() { + return deployables; + } + + public void setDeployables(List deployables) { + this.deployables = deployables; + } + + @Override + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + @Override + public String getProject() { + return project; + } + + public void setProject(String project) { + this.project = project; + } + + @Override + public Boolean getPromote() { + return promote; + } + + public void setPromote(Boolean promote) { + this.promote = promote; + } + + @Override + public String getServer() { + return server; + } + + public void setServer(String server) { + this.server = server; + } + + @Override + public Boolean getStopPreviousVersion() { + return stopPreviousVersion; + } + + public void setStopPreviousVersion(Boolean stopPreviousVersion) { + this.stopPreviousVersion = stopPreviousVersion; + } + + @Override + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/DeployModel.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/DeployModel.java deleted file mode 100644 index 07b18958..00000000 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/DeployModel.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import com.google.cloud.tools.appengine.api.deploy.DeployConfiguration; - -import org.gradle.model.Managed; - -import java.io.File; -import java.util.List; - -/** - * Model element to define Deployable configurations for App Engine - */ -@Managed -public interface DeployModel extends DeployConfiguration { - - @Override - String getDockerBuild(); - void setDockerBuild(String dockerBuild); - - @Override - String getImageUrl(); - - void setImageUrl(String imageUrl); - - @Override - String getVersion(); - void setVersion(String version); - - @Override - List getDeployables(); - void setDeployables(List deployables); - - @Override - String getBucket(); - void setBucket(String bucket); - - @Override - Boolean getForce(); - void setForce(Boolean force); - - @Override - String getProject(); - void setProject(String project); - - @Override - Boolean getPromote(); - void setPromote(Boolean promote); - - @Override - String getServer(); - void setServer(String server); - - @Override - Boolean getStopPreviousVersion(); - void setStopPreviousVersion(Boolean stopPreviousVersion); -} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/Run.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/Run.java new file mode 100644 index 00000000..71d74151 --- /dev/null +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/model/Run.java @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2016 Google Inc. All Right Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.google.cloud.tools.gradle.appengine.model; + +import com.google.cloud.tools.appengine.api.devserver.RunConfiguration; +import com.google.cloud.tools.appengine.api.devserver.StopConfiguration; + +import java.io.File; +import java.util.List; + +/** + * Extension element to define Run configurations for App Engine Standard Environments + */ +public class Run implements RunConfiguration, StopConfiguration { + + private List appYamls; + private String host; + private Integer port; + private String adminHost; + private Integer adminPort; + private String authDomain; + private String storagePath; + private String logLevel; + private Integer maxModuleInstances; + private Boolean useMtimeFileWatcher; + private String threadsafeOverride; + private String pythonStartupScript; + private String pythonStartupArgs; + private List jvmFlags; + private String customEntrypoint; + private String runtime; + private Boolean allowSkippedFiles; + private Integer apiPort; + private Boolean automaticRestart; + private String devAppserverLogLevel; + private Boolean skipSdkUpdateCheck; + private String defaultGcsBucketName; + + @Override + public List getAppYamls() { + return appYamls; + } + + public void setAppYamls(List appYamls) { + this.appYamls = appYamls; + } + + @Override + public String getHost() { + return host; + } + + public void setHost(String host) { + this.host = host; + } + + @Override + public Integer getPort() { + return port; + } + + public void setPort(Integer port) { + this.port = port; + } + + @Override + public String getAdminHost() { + return adminHost; + } + + public void setAdminHost(String adminHost) { + this.adminHost = adminHost; + } + + @Override + public Integer getAdminPort() { + return adminPort; + } + + public void setAdminPort(Integer adminPort) { + this.adminPort = adminPort; + } + + @Override + public String getAuthDomain() { + return authDomain; + } + + public void setAuthDomain(String authDomain) { + this.authDomain = authDomain; + } + + @Override + public String getStoragePath() { + return storagePath; + } + + public void setStoragePath(String storagePath) { + this.storagePath = storagePath; + } + + @Override + public String getLogLevel() { + return logLevel; + } + + public void setLogLevel(String logLevel) { + this.logLevel = logLevel; + } + + @Override + public Integer getMaxModuleInstances() { + return maxModuleInstances; + } + + public void setMaxModuleInstances(Integer maxModuleInstances) { + this.maxModuleInstances = maxModuleInstances; + } + + @Override + public Boolean getUseMtimeFileWatcher() { + return useMtimeFileWatcher; + } + + public void setUseMtimeFileWatcher(Boolean useMtimeFileWatcher) { + this.useMtimeFileWatcher = useMtimeFileWatcher; + } + + @Override + public String getThreadsafeOverride() { + return threadsafeOverride; + } + + public void setThreadsafeOverride(String threadsafeOverride) { + this.threadsafeOverride = threadsafeOverride; + } + + @Override + public String getPythonStartupScript() { + return pythonStartupScript; + } + + public void setPythonStartupScript(String pythonStartupScript) { + this.pythonStartupScript = pythonStartupScript; + } + + @Override + public String getPythonStartupArgs() { + return pythonStartupArgs; + } + + public void setPythonStartupArgs(String pythonStartupArgs) { + this.pythonStartupArgs = pythonStartupArgs; + } + + @Override + public List getJvmFlags() { + return jvmFlags; + } + + public void setJvmFlags(List jvmFlags) { + this.jvmFlags = jvmFlags; + } + + @Override + public String getCustomEntrypoint() { + return customEntrypoint; + } + + public void setCustomEntrypoint(String customEntrypoint) { + this.customEntrypoint = customEntrypoint; + } + + @Override + public String getRuntime() { + return runtime; + } + + public void setRuntime(String runtime) { + this.runtime = runtime; + } + + @Override + public Boolean getAllowSkippedFiles() { + return allowSkippedFiles; + } + + public void setAllowSkippedFiles(Boolean allowSkippedFiles) { + this.allowSkippedFiles = allowSkippedFiles; + } + + @Override + public Integer getApiPort() { + return apiPort; + } + + public void setApiPort(Integer apiPort) { + this.apiPort = apiPort; + } + + @Override + public Boolean getAutomaticRestart() { + return automaticRestart; + } + + public void setAutomaticRestart(Boolean automaticRestart) { + this.automaticRestart = automaticRestart; + } + + @Override + public String getDevAppserverLogLevel() { + return devAppserverLogLevel; + } + + public void setDevAppserverLogLevel(String devAppserverLogLevel) { + this.devAppserverLogLevel = devAppserverLogLevel; + } + + @Override + public Boolean getSkipSdkUpdateCheck() { + return skipSdkUpdateCheck; + } + + public void setSkipSdkUpdateCheck(Boolean skipSdkUpdateCheck) { + this.skipSdkUpdateCheck = skipSdkUpdateCheck; + } + + @Override + public String getDefaultGcsBucketName() { + return defaultGcsBucketName; + } + + public void setDefaultGcsBucketName(String defaultGcsBucketName) { + this.defaultGcsBucketName = defaultGcsBucketName; + } +} + diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/RunModel.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/RunModel.java deleted file mode 100644 index b98f7986..00000000 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/RunModel.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import com.google.cloud.tools.appengine.api.devserver.RunConfiguration; -import com.google.cloud.tools.appengine.api.devserver.StopConfiguration; - -import org.gradle.model.Managed; - -import java.io.File; -import java.util.List; - -/** - * Model element to define Run configurations for App Engine Standard Environments - */ -@Managed -public interface RunModel extends RunConfiguration, StopConfiguration { - - @Override - List getAppYamls(); - void setAppYamls(List appYamls); - - @Override - String getHost(); - void setHost(String host); - - @Override - Integer getPort(); - void setPort(Integer port); - - @Override - String getAdminHost(); - void setAdminHost(String adminHost); - - @Override - Integer getAdminPort(); - void setAdminPort(Integer adminPort); - - @Override - String getAuthDomain(); - void setAuthDomain(String authDomain); - - @Override - String getStoragePath(); - void setStoragePath(String storagePath); - - @Override - String getLogLevel(); - void setLogLevel(String logLevel); - - @Override - Integer getMaxModuleInstances(); - void setMaxModuleInstances(Integer maxModuleInstances); - - @Override - Boolean getUseMtimeFileWatcher(); - void setUseMtimeFileWatcher(Boolean useMtimeFileWatcher); - - @Override - String getThreadsafeOverride(); - void setThreadsafeOverride(String threadsafeOverride); - - @Override - String getPythonStartupScript(); - void setPythonStartupScript(String pythonStartupScript); - - @Override - String getPythonStartupArgs(); - void setPythonStartupArgs(String pythonStartupArgs); - - @Override - List getJvmFlags(); - void setJvmFlags(List jvmFlags); - - @Override - String getCustomEntrypoint(); - void setCustomEntrypoint(String customEntrypoint); - - @Override - String getRuntime(); - void setRuntime(String runtime); - - @Override - Boolean getAllowSkippedFiles(); - void setAllowSkippedFiles(Boolean allowSkippedFiles); - - @Override - Integer getApiPort(); - void setApiPort(Integer apiPort); - - @Override - Boolean getAutomaticRestart(); - void setAutomaticRestart(Boolean automaticRestart); - - @Override - String getDevAppserverLogLevel(); - void setDevAppserverLogLevel(String devAppserverLogLevel); - - @Override - Boolean getSkipSdkUpdateCheck(); - void setSkipSdkUpdateCheck(Boolean skipSdkUpdateCheck); - - @Override - String getDefaultGcsBucketName(); - void setDefaultGcsBucketName(String defaultGcsBucketName); -} - diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageFlexibleModel.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageFlexible.java similarity index 53% rename from src/main/java/com/google/cloud/tools/gradle/appengine/model/StageFlexibleModel.java rename to src/main/java/com/google/cloud/tools/gradle/appengine/model/StageFlexible.java index 6faa9924..fb4d123a 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageFlexibleModel.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageFlexible.java @@ -19,39 +19,61 @@ import com.google.cloud.tools.appengine.api.deploy.StageFlexibleConfiguration; -import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.Optional; import org.gradle.api.tasks.OutputDirectory; -import org.gradle.model.Managed; import java.io.File; /** - * Model element to define Stage configurations for App Engine Flexible Environments + * Extension element to define Stage configurations for App Engine Flexible Environments */ -@Managed -public interface StageFlexibleModel extends StageFlexibleConfiguration { +public class StageFlexible implements StageFlexibleConfiguration { + + private File appEngineDirectory; + private File dockerDirectory; + private File artifact; + private File stagingDirectory; @Override @InputDirectory + public File getAppEngineDirectory() { + return appEngineDirectory; + } + + public void setAppEngineDirectory(File appEngineDirectory) { + this.appEngineDirectory = appEngineDirectory; + } + + @Override @Optional - File getDockerDirectory(); - void setDockerDirectory(File dockerDirectory); + @InputDirectory + public File getDockerDirectory() { + return dockerDirectory; + } + + public void setDockerDirectory(File dockerDirectory) { + this.dockerDirectory = dockerDirectory; + } @Override @InputFile - File getArtifact(); - void setArtifact(File artifact); + public File getArtifact() { + return artifact; + } + + public void setArtifact(File artifact) { + this.artifact = artifact; + } @Override @OutputDirectory - File getStagingDirectory(); - void setStagingDirectory(File stagingDirectory); + public File getStagingDirectory() { + return stagingDirectory; + } - @Override - @InputDirectory - File getAppEngineDirectory(); - void setAppEngineDirectory(File appEngineDirectory); + public void setStagingDirectory(File stagingDirectory) { + this.stagingDirectory = stagingDirectory; + } } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageStandard.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageStandard.java new file mode 100644 index 00000000..60f6a8fb --- /dev/null +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageStandard.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2016 Google Inc. All Right Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.google.cloud.tools.gradle.appengine.model; + +import com.google.cloud.tools.appengine.api.deploy.StageStandardConfiguration; + +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputDirectory; +import org.gradle.api.tasks.Optional; +import org.gradle.api.tasks.OutputDirectory; + +import java.io.File; + +/** + * Extension element to define Stage configurations for App Engine Standard Environments + */ +public class StageStandard implements StageStandardConfiguration { + + private File sourceDirectory; + private File stagingDirectory; + private File dockerfile; + private Boolean enableQuickstart; + private Boolean disableUpdateCheck; + private Boolean enableJarSplitting; + private String jarSplittingExcludes; + private String compileEncoding; + private Boolean deleteJsps; + private Boolean enableJarClasses; + private Boolean disableJarJsps; + private String runtime; + + @Override + @InputDirectory + public File getSourceDirectory() { + return sourceDirectory; + } + public void setSourceDirectory(File sourceDirectory) { + this.sourceDirectory = sourceDirectory; + } + + @Override + @OutputDirectory + public File getStagingDirectory() { + return stagingDirectory; + } + public void setStagingDirectory(File stagingDirectory) { + this.stagingDirectory = stagingDirectory; + } + + @Override + @Input + @Optional + public File getDockerfile() { + return dockerfile; + } + + public void setDockerfile(File dockerfile) { + this.dockerfile = dockerfile; + } + + @Override + @Input + @Optional + public Boolean getEnableQuickstart() { + return enableQuickstart; + } + + public void setEnableQuickstart(Boolean enableQuickstart) { + this.enableQuickstart = enableQuickstart; + } + + @Override + @Input + @Optional + public Boolean getDisableUpdateCheck() { + return disableUpdateCheck; + } + + public void setDisableUpdateCheck(Boolean disableUpdateCheck) { + this.disableUpdateCheck = disableUpdateCheck; + } + + @Override + @Input + @Optional + public Boolean getEnableJarSplitting() { + return enableJarSplitting; + } + + public void setEnableJarSplitting(Boolean enableJarSplitting) { + this.enableJarSplitting = enableJarSplitting; + } + + @Override + @Input + @Optional + public String getJarSplittingExcludes() { + return jarSplittingExcludes; + } + + public void setJarSplittingExcludes(String jarSplittingExcludes) { + this.jarSplittingExcludes = jarSplittingExcludes; + } + + @Override + @Input + @Optional + public String getCompileEncoding() { + return compileEncoding; + } + + public void setCompileEncoding(String compileEncoding) { + this.compileEncoding = compileEncoding; + } + + @Override + @Input + @Optional + public Boolean getDeleteJsps() { + return deleteJsps; + } + + public void setDeleteJsps(Boolean deleteJsps) { + this.deleteJsps = deleteJsps; + } + + @Override + @Input + @Optional + public Boolean getEnableJarClasses() { + return enableJarClasses; + } + + public void setEnableJarClasses(Boolean enableJarClasses) { + this.enableJarClasses = enableJarClasses; + } + + @Override + @Input + @Optional + public Boolean getDisableJarJsps() { + return disableJarJsps; + } + + public void setDisableJarJsps(Boolean disableJarJsps) { + this.disableJarJsps = disableJarJsps; + } + + @Override + @Input + @Optional + public String getRuntime() { + return runtime; + } + + public void setRuntime(String runtime) { + this.runtime = runtime; + } +} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageStandardModel.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageStandardModel.java deleted file mode 100644 index 44eeccf5..00000000 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/StageStandardModel.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import com.google.cloud.tools.appengine.api.deploy.StageStandardConfiguration; - -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.Optional; -import org.gradle.api.tasks.OutputDirectory; -import org.gradle.model.Managed; - -import java.io.File; - -/** - * Model element to define Stage configurations for App Engine Standard Environments - */ -@Managed -public interface StageStandardModel extends StageStandardConfiguration { - - @Override - @Input - @Optional - String getJarSplittingExcludes(); - void setJarSplittingExcludes(String jarSplittingExludes); - - @Override - @Input - @Optional - String getCompileEncoding(); - void setCompileEncoding(String compileEncoding); - - @Override - @InputDirectory - File getSourceDirectory(); - void setSourceDirectory(File sourceDirectory); - - @Override - @OutputDirectory - File getStagingDirectory(); - void setStagingDirectory(File stagingDirectory); - - @Override - @InputFile - @Optional - File getDockerfile(); - void setDockerfile(File dockerfile); - - @Override - @Input - @Optional - Boolean getEnableQuickstart(); - void setEnableQuickstart(Boolean enableQuickstart); - - @Override - @Input - @Optional - Boolean getDisableUpdateCheck(); - void setDisableUpdateCheck(Boolean disableUpdateCheck); - - @Override - @Input - @Optional - Boolean getEnableJarSplitting(); - void setEnableJarSplitting(Boolean enableJarSplitting); - - @Override - @Input - @Optional - Boolean getDeleteJsps(); - void setDeleteJsps(Boolean deleteJsps); - - @Override - @Input - @Optional - Boolean getEnableJarClasses(); - void setEnableJarClasses(Boolean enableJarClasses); - - @Override - @Input - @Optional - Boolean getDisableJarJsps(); - void setDisableJarJsps(Boolean disableJarJsps); - - @Override - @Input - @Optional - String getRuntime(); - void setRuntime(String runtime); -} diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/Tools.java b/src/main/java/com/google/cloud/tools/gradle/appengine/model/Tools.java index 7b197491..da65def7 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/Tools.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/model/Tools.java @@ -17,21 +17,20 @@ package com.google.cloud.tools.gradle.appengine.model; -import org.gradle.model.Managed; -import org.gradle.model.Unmanaged; -import org.gradle.model.internal.core.Hidden; - -import com.google.cloud.tools.gradle.appengine.model.hidden.CloudSdkBuilderFactory; - import java.io.File; /** - * Model interface to define the location of tooling + * Extension element to define the location of cloud sdk tooling */ -@Managed -public interface Tools { +public class Tools { + + private File cloudSdkHome; - void setCloudSdkHome(File cloudSdkHome); - File getCloudSdkHome(); + public File getCloudSdkHome() { + return cloudSdkHome; + } + public void setCloudSdkHome(File cloudSdkHome) { + this.cloudSdkHome = cloudSdkHome; + } } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/model/hidden/CloudSdkBuilderFactory.java b/src/main/java/com/google/cloud/tools/gradle/appengine/task/CloudSdkBuilderFactory.java similarity index 78% rename from src/main/java/com/google/cloud/tools/gradle/appengine/model/hidden/CloudSdkBuilderFactory.java rename to src/main/java/com/google/cloud/tools/gradle/appengine/task/CloudSdkBuilderFactory.java index 14f6ea23..3b27451d 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/model/hidden/CloudSdkBuilderFactory.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/task/CloudSdkBuilderFactory.java @@ -15,27 +15,27 @@ * */ -package com.google.cloud.tools.gradle.appengine.model.hidden; +package com.google.cloud.tools.gradle.appengine.task; import com.google.cloud.tools.appengine.cloudsdk.CloudSdk; import com.google.cloud.tools.appengine.cloudsdk.process.NonZeroExceptionExitListener; -import org.gradle.model.Managed; - import java.io.File; /** * Factory for generating Cloud Sdk Builder with all common configuration */ -@Managed -public abstract class CloudSdkBuilderFactory { +public class CloudSdkBuilderFactory { + + private final File cloudSdkHome; - public abstract void setCloudSdkHome(File cloudSdkHome); - public abstract File getCloudSdkHome(); + public CloudSdkBuilderFactory(File cloudSdkHome) { + this.cloudSdkHome = cloudSdkHome; + } public CloudSdk.Builder newBuilder() { return new CloudSdk.Builder() - .sdkPath(getCloudSdkHome() != null ? getCloudSdkHome().toPath() : null) + .sdkPath(cloudSdkHome != null ? cloudSdkHome.toPath() : null) .exitListener(new NonZeroExceptionExitListener()) .appCommandMetricsEnvironment(getClass().getPackage().getImplementationTitle()) .appCommandMetricsEnvironmentVersion(getClass().getPackage().getImplementationVersion()); diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DeployTask.java b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DeployTask.java index 84d8a365..93de0b91 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DeployTask.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DeployTask.java @@ -22,8 +22,7 @@ import com.google.cloud.tools.appengine.cloudsdk.CloudSdk; import com.google.cloud.tools.appengine.cloudsdk.CloudSdkAppEngineDeployment; import com.google.cloud.tools.appengine.cloudsdk.process.ProcessOutputLineListener; -import com.google.cloud.tools.gradle.appengine.model.hidden.CloudSdkBuilderFactory; -import com.google.cloud.tools.gradle.appengine.model.DeployModel; +import com.google.cloud.tools.gradle.appengine.model.Deploy; import com.google.cloud.tools.gradle.appengine.task.io.GradleLoggerOutputListener; import org.gradle.api.DefaultTask; @@ -35,10 +34,10 @@ */ public class DeployTask extends DefaultTask { - private DeployModel deployConfig; + private Deploy deployConfig; private CloudSdkBuilderFactory cloudSdkBuilderFactory; - public void setDeployConfig(DeployModel deployConfig) { + public void setDeployConfig(Deploy deployConfig) { this.deployConfig = deployConfig; } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerRunTask.java b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerRunTask.java index 602171e4..27610919 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerRunTask.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerRunTask.java @@ -21,8 +21,7 @@ import com.google.cloud.tools.appengine.cloudsdk.CloudSdk; import com.google.cloud.tools.appengine.cloudsdk.CloudSdkAppEngineDevServer; import com.google.cloud.tools.appengine.cloudsdk.process.ProcessOutputLineListener; -import com.google.cloud.tools.gradle.appengine.model.hidden.CloudSdkBuilderFactory; -import com.google.cloud.tools.gradle.appengine.model.RunModel; +import com.google.cloud.tools.gradle.appengine.model.Run; import com.google.cloud.tools.gradle.appengine.task.io.GradleLoggerOutputListener; import org.gradle.api.DefaultTask; @@ -34,10 +33,10 @@ */ public class DevAppServerRunTask extends DefaultTask { - private RunModel runConfig; + private Run runConfig; private CloudSdkBuilderFactory cloudSdkBuilderFactory; - public void setRunConfig(RunModel runConfig) { + public void setRunConfig(Run runConfig) { this.runConfig = runConfig; } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStartTask.java b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStartTask.java index 9dcf6464..09ce8530 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStartTask.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStartTask.java @@ -21,28 +21,24 @@ import com.google.cloud.tools.appengine.cloudsdk.CloudSdk; import com.google.cloud.tools.appengine.cloudsdk.CloudSdkAppEngineDevServer; import com.google.cloud.tools.appengine.cloudsdk.process.ProcessOutputLineListener; -import com.google.cloud.tools.gradle.appengine.model.hidden.CloudSdkBuilderFactory; -import com.google.cloud.tools.gradle.appengine.model.RunModel; -import com.google.cloud.tools.gradle.appengine.task.io.FileOutputLineListener; +import com.google.cloud.tools.gradle.appengine.model.Run; import com.google.cloud.tools.gradle.appengine.task.io.GradleLoggerOutputListener; import org.gradle.api.DefaultTask; import org.gradle.api.logging.LogLevel; import org.gradle.api.tasks.TaskAction; -import java.io.File; import java.io.IOException; -import java.io.PrintStream; /** * Start the App Engine development server asynchronously */ public class DevAppServerStartTask extends DefaultTask { - private RunModel runConfig; + private Run runConfig; private CloudSdkBuilderFactory cloudSdkBuilderFactory; - public void setRunConfig(RunModel runConfig) { + public void setRunConfig(Run runConfig) { this.runConfig = runConfig; } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStopTask.java b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStopTask.java index 237cb3a2..47bc104f 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStopTask.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/task/DevAppServerStopTask.java @@ -19,7 +19,7 @@ import com.google.cloud.tools.appengine.api.AppEngineException; import com.google.cloud.tools.appengine.cloudsdk.CloudSdkAppEngineDevServer; -import com.google.cloud.tools.gradle.appengine.model.RunModel; +import com.google.cloud.tools.gradle.appengine.model.Run; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.TaskAction; @@ -29,9 +29,9 @@ */ public class DevAppServerStopTask extends DefaultTask { - private RunModel runConfig; + private Run runConfig; - public void setRunConfig(RunModel runConfig) { + public void setRunConfig(Run runConfig) { this.runConfig = runConfig; } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageFlexibleTask.java b/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageFlexibleTask.java index 6c21eeef..4f8ab495 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageFlexibleTask.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageFlexibleTask.java @@ -20,7 +20,7 @@ import com.google.cloud.tools.appengine.api.AppEngineException; import com.google.cloud.tools.appengine.api.deploy.AppEngineFlexibleStaging; import com.google.cloud.tools.appengine.cloudsdk.CloudSdkAppEngineFlexibleStaging; -import com.google.cloud.tools.gradle.appengine.model.StageFlexibleModel; +import com.google.cloud.tools.gradle.appengine.model.StageFlexible; import org.gradle.api.DefaultTask; import org.gradle.api.tasks.Nested; @@ -31,14 +31,14 @@ */ public class StageFlexibleTask extends DefaultTask { - private StageFlexibleModel stagingConfig; + private StageFlexible stagingConfig; @Nested - public StageFlexibleModel getStagingConfig() { + public StageFlexible getStagingConfig() { return stagingConfig; } - public void setStagingConfig(StageFlexibleModel stagingConfig) { + public void setStagingConfig(StageFlexible stagingConfig) { this.stagingConfig = stagingConfig; } diff --git a/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageStandardTask.java b/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageStandardTask.java index b8bac65d..aab8fa9b 100644 --- a/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageStandardTask.java +++ b/src/main/java/com/google/cloud/tools/gradle/appengine/task/StageStandardTask.java @@ -21,8 +21,7 @@ import com.google.cloud.tools.appengine.cloudsdk.CloudSdk; import com.google.cloud.tools.appengine.cloudsdk.CloudSdkAppEngineStandardStaging; import com.google.cloud.tools.appengine.cloudsdk.process.ProcessOutputLineListener; -import com.google.cloud.tools.gradle.appengine.model.hidden.CloudSdkBuilderFactory; -import com.google.cloud.tools.gradle.appengine.model.StageStandardModel; +import com.google.cloud.tools.gradle.appengine.model.StageStandard; import com.google.cloud.tools.gradle.appengine.task.io.GradleLoggerOutputListener; import org.gradle.api.DefaultTask; @@ -35,15 +34,15 @@ */ public class StageStandardTask extends DefaultTask { - private StageStandardModel stagingConfig; + private StageStandard stagingConfig; private CloudSdkBuilderFactory cloudSdkBuilderFactory; @Nested - public StageStandardModel getStagingConfig() { + public StageStandard getStagingConfig() { return stagingConfig; } - public void setStagingConfig(StageStandardModel stagingConfig) { + public void setStagingConfig(StageStandard stagingConfig) { this.stagingConfig = stagingConfig; } diff --git a/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePluginTest.java b/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePluginTest.java index 7f29f504..cde223b9 100644 --- a/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePluginTest.java +++ b/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineFlexiblePluginTest.java @@ -17,21 +17,34 @@ package com.google.cloud.tools.gradle.appengine; +import com.google.cloud.tools.gradle.appengine.model.AppEngineFlexibleExtension; + +import org.gradle.api.Project; +import org.gradle.api.internal.project.ProjectInternal; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.WarPlugin; +import org.gradle.api.tasks.bundling.Jar; +import org.gradle.api.tasks.bundling.War; +import org.gradle.testfixtures.ProjectBuilder; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; +import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Test App Engine Flexible Plugin configuration @@ -41,20 +54,17 @@ public class AppEngineFlexiblePluginTest { @Rule public final TemporaryFolder testProjectDir = new TemporaryFolder(); - @Before - public void setUp() throws IOException { + @Test + public void testDeploy_taskTree() throws IOException { Path buildFile = testProjectDir.getRoot().toPath().resolve("build.gradle"); InputStream buildFileContent = getClass().getClassLoader() .getResourceAsStream("projects/AppEnginePluginTest/build.gradle"); Files.copy(buildFileContent, buildFile); - } - @Test - public void testDeploy_taskTree() { BuildResult buildResult = GradleRunner.create() .withProjectDir(testProjectDir.getRoot()) .withPluginClasspath() - .withArguments("appengineDeploy", "--dry-run") + .withArguments("appengineDeploy", "--dry-run", "--stacktrace") .build(); final List expected = Arrays @@ -62,4 +72,45 @@ public void testDeploy_taskTree() { ":appengineStage", ":appengineDeploy"); Assert.assertEquals(expected, BuildResultFilter.extractTasks(buildResult)); } + + @Test + public void testDefaultConfiguration() { + Project p = ProjectBuilder.builder().withProjectDir(testProjectDir.getRoot()).build(); + + p.getPluginManager().apply(JavaPlugin.class); + p.getPluginManager().apply(WarPlugin.class); + p.getPluginManager().apply(AppEngineFlexiblePlugin.class); + ((ProjectInternal) p).evaluate(); + + Object ext = p.getExtensions().getByName("appengine"); + Assert.assertThat(ext, Matchers.instanceOf(AppEngineFlexibleExtension.class)); + + AppEngineFlexibleExtension extension = (AppEngineFlexibleExtension) ext; + Assert.assertEquals(new File(p.getBuildDir(), "staged-app"), + extension.getStage().getStagingDirectory()); + Assert.assertEquals(Collections.singletonList(new File(p.getBuildDir(), "staged-app/app.yaml")), + extension.getDeploy().getDeployables()); + Assert.assertEquals(new File(testProjectDir.getRoot(), "src/main/appengine").toPath(), + extension.getStage().getAppEngineDirectory().toPath()); + Assert.assertFalse(new File(testProjectDir.getRoot(), "src/main/docker").exists()); + Assert.assertEquals((((War) p.getProperties().get("war")).getArchivePath()), + extension.getStage().getArtifact()); + } + + @Test + public void testDefaultConfigurationAlternative() { + File dockerDir = new File(testProjectDir.getRoot(), "src/main/docker"); + dockerDir.mkdirs(); + + Project p = ProjectBuilder.builder().withProjectDir(testProjectDir.getRoot()).build(); + p.getPluginManager().apply(JavaPlugin.class); + p.getPluginManager().apply(AppEngineFlexiblePlugin.class); + ((ProjectInternal) p).evaluate(); + Object ext = p.getExtensions().getByType(AppEngineFlexibleExtension.class); + + AppEngineFlexibleExtension extension = (AppEngineFlexibleExtension) ext; + Assert.assertTrue(new File(testProjectDir.getRoot(), "src/main/docker").exists()); + Assert.assertEquals((((Jar) p.getProperties().get("jar")).getArchivePath()), + extension.getStage().getArtifact()); + } } \ No newline at end of file diff --git a/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginTest.java b/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginTest.java index 8f449c8b..4bb8011c 100644 --- a/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginTest.java +++ b/src/test/java/com/google/cloud/tools/gradle/appengine/AppEngineStandardPluginTest.java @@ -17,10 +17,17 @@ package com.google.cloud.tools.gradle.appengine; +import com.google.cloud.tools.gradle.appengine.model.AppEngineStandardExtension; import com.google.common.base.Charsets; +import org.gradle.api.Project; +import org.gradle.api.internal.project.ProjectInternal; +import org.gradle.api.plugins.JavaPlugin; +import org.gradle.api.plugins.WarPlugin; +import org.gradle.testfixtures.ProjectBuilder; import org.gradle.testkit.runner.BuildResult; import org.gradle.testkit.runner.GradleRunner; +import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -34,7 +41,9 @@ import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Test App Engine Standard Plugin configuration @@ -44,8 +53,7 @@ public class AppEngineStandardPluginTest { @Rule public final TemporaryFolder testProjectDir = new TemporaryFolder(); - @Before - public void setUp() throws IOException { + public void setUpTestProject() throws IOException { Path buildFile = testProjectDir.getRoot().toPath().resolve("build.gradle"); InputStream buildFileContent = getClass().getClassLoader() .getResourceAsStream("projects/AppEnginePluginTest/build.gradle"); @@ -58,7 +66,8 @@ public void setUp() throws IOException { } @Test - public void testDeploy_taskTree() { + public void testDeploy_taskTree() throws IOException { + setUpTestProject(); BuildResult buildResult = GradleRunner.create() .withProjectDir(testProjectDir.getRoot()) .withPluginClasspath() @@ -73,7 +82,8 @@ public void testDeploy_taskTree() { } @Test - public void testRun_taskTree() { + public void testRun_taskTree() throws IOException { + setUpTestProject(); BuildResult buildResult = GradleRunner.create() .withProjectDir(testProjectDir.getRoot()) .withPluginClasspath() @@ -88,7 +98,8 @@ public void testRun_taskTree() { } @Test - public void testStart_taskTree() { + public void testStart_taskTree() throws IOException { + setUpTestProject(); BuildResult buildResult = GradleRunner.create() .withProjectDir(testProjectDir.getRoot()) .withPluginClasspath() @@ -104,7 +115,8 @@ public void testStart_taskTree() { } @Test - public void testStop_taskTree() { + public void testStop_taskTree() throws IOException { + setUpTestProject(); BuildResult buildResult = GradleRunner.create() .withProjectDir(testProjectDir.getRoot()) .withPluginClasspath() @@ -116,4 +128,28 @@ public void testStop_taskTree() { Assert.assertEquals(expected, BuildResultFilter.extractTasks(buildResult)); } + + @Test + public void testDefaultConfiguration() throws IOException { + Project p = ProjectBuilder.builder().withProjectDir(testProjectDir.getRoot()).build(); + + File appengineWebXml = new File(testProjectDir.getRoot(), "src/main/webapp/WEB-INF/appengine-web.xml"); + appengineWebXml.getParentFile().mkdirs(); + appengineWebXml.createNewFile(); + Files.write(appengineWebXml.toPath(), "".getBytes()); + + p.getPluginManager().apply(JavaPlugin.class); + p.getPluginManager().apply(WarPlugin.class); + p.getPluginManager().apply(AppEngineStandardPlugin.class); + ((ProjectInternal) p).evaluate(); + + Object ext = p.getExtensions().getByName("appengine"); + Assert.assertThat(ext, Matchers.instanceOf(AppEngineStandardExtension.class)); + + AppEngineStandardExtension extension = (AppEngineStandardExtension) ext; + Assert.assertEquals(new File(p.getBuildDir(), "staged-app"), extension.getStage().getStagingDirectory()); + Assert.assertEquals(Collections.singletonList(new File(p.getBuildDir(), "staged-app/app.yaml")), extension.getDeploy().getDeployables()); + Assert.assertEquals(Collections.singletonList(new File(p.getBuildDir(), "exploded-app")), extension.getRun().getAppYamls()); + Assert.assertFalse(new File(testProjectDir.getRoot(), "src/main/docker").exists()); + } } \ No newline at end of file diff --git a/src/test/java/com/google/cloud/tools/gradle/appengine/model/DeployModelTest.java b/src/test/java/com/google/cloud/tools/gradle/appengine/model/DeployModelTest.java deleted file mode 100644 index 448a64a3..00000000 --- a/src/test/java/com/google/cloud/tools/gradle/appengine/model/DeployModelTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import com.google.cloud.tools.appengine.api.deploy.DeployConfiguration; - -import org.junit.Test; - -public class DeployModelTest { - - @Test - public void testGetterSetter() { - ReflectiveConfigTester.checkConfiguration(DeployModel.class, DeployConfiguration.class); - } - -} diff --git a/src/test/java/com/google/cloud/tools/gradle/appengine/model/ReflectiveConfigTester.java b/src/test/java/com/google/cloud/tools/gradle/appengine/model/ReflectiveConfigTester.java deleted file mode 100644 index 1b420281..00000000 --- a/src/test/java/com/google/cloud/tools/gradle/appengine/model/ReflectiveConfigTester.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import org.junit.Assert; - -import java.lang.reflect.Method; -import java.util.Arrays; - -public class ReflectiveConfigTester { - - public static void checkConfiguration(Class configuration, Class parent) { - Assert.assertTrue(parent.isAssignableFrom(configuration)); - - for (Method method : parent.getMethods()) { - assertOverridden(method, configuration); - assertSetterPresent(method, configuration); - } - } - - public static void assertOverridden(Method method, Class configuration) { - for (Method m : configuration.getDeclaredMethods()) { - if (method.getGenericReturnType().equals(m.getGenericReturnType()) && - Arrays.equals(method.getGenericParameterTypes(),m.getGenericParameterTypes()) && - method.getName().equals(m.getName())) { - return; - } - } - Assert.fail("Did not find override on " + method); - } - - public static void assertSetterPresent(Method method, Class configuration) { - for (Method m : configuration.getDeclaredMethods()) { - String setterName = method.getName().replaceAll("^(is|get)", "set"); - if (m.getName().equals(setterName) && - // TODO : use m.getParameterCount() after moving to java 8 - m.getParameterTypes().length == 1 && - m.getGenericParameterTypes()[0].equals(method.getGenericReturnType()) && - m.getReturnType().equals(Void.TYPE)) { - return; - } - } - Assert.fail("Did not find setter for " + method); - } - -} diff --git a/src/test/java/com/google/cloud/tools/gradle/appengine/model/RunModelTest.java b/src/test/java/com/google/cloud/tools/gradle/appengine/model/RunModelTest.java deleted file mode 100644 index 5afe74c2..00000000 --- a/src/test/java/com/google/cloud/tools/gradle/appengine/model/RunModelTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import com.google.cloud.tools.appengine.api.devserver.RunConfiguration; - -import org.junit.Test; - -public class RunModelTest { - - @Test - public void testGetterSetter() { - ReflectiveConfigTester.checkConfiguration(RunModel.class, RunConfiguration.class); - } - -} diff --git a/src/test/java/com/google/cloud/tools/gradle/appengine/model/StageFlexibleModelTest.java b/src/test/java/com/google/cloud/tools/gradle/appengine/model/StageFlexibleModelTest.java deleted file mode 100644 index dd409ebc..00000000 --- a/src/test/java/com/google/cloud/tools/gradle/appengine/model/StageFlexibleModelTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import com.google.cloud.tools.appengine.api.deploy.StageFlexibleConfiguration; - -import org.junit.Test; - -public class StageFlexibleModelTest { - - @Test - public void testGetterSetter() { - ReflectiveConfigTester.checkConfiguration(StageFlexibleModel.class, StageFlexibleConfiguration.class); - } - -} diff --git a/src/test/java/com/google/cloud/tools/gradle/appengine/model/StageStandardModelTest.java b/src/test/java/com/google/cloud/tools/gradle/appengine/model/StageStandardModelTest.java deleted file mode 100644 index 93d70835..00000000 --- a/src/test/java/com/google/cloud/tools/gradle/appengine/model/StageStandardModelTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 Google Inc. All Right Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package com.google.cloud.tools.gradle.appengine.model; - -import com.google.cloud.tools.appengine.api.deploy.StageStandardConfiguration; - -import org.junit.Test; - -public class StageStandardModelTest { - - @Test - public void testGetterSetter() { - ReflectiveConfigTester.checkConfiguration(StageStandardModel.class, StageStandardConfiguration.class); - } - -}