Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: integrate new enterprise start mecanism depending on deployment, closes HYB-569 #105

Merged
merged 1 commit into from
Apr 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ plugins {
id 'java-gradle-plugin'
id 'com.gradle.plugin-publish' version '0.12.0'
id 'groovy'

id 'maven-publish'
}

version '42.0.0-SNAPSHOT'
group 'io.gatling'

java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(11))
Expand All @@ -15,12 +20,13 @@ jar {
}
}
repositories {
mavenLocal()
mavenCentral()
gradlePluginPortal()
}

dependencies {
implementation "io.gatling:gatling-enterprise-plugin-commons:1.9.0-M13"
implementation "io.gatling:gatling-enterprise-plugin-commons:1.9.0-M14"
constraints {
implementation('com.fasterxml.jackson.core:jackson-databind') {
version {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@ package io.gatling.gradle
import io.gatling.plugin.BatchEnterprisePlugin
import io.gatling.plugin.deployment.DeploymentConfiguration
import io.gatling.plugin.model.BuildTool
import io.gatling.plugin.model.DeploymentInfo
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction

class GatlingEnterpriseDeployTask extends DefaultTask {

protected DeploymentInfo deploymentInfo

@TaskAction
void deploy() {
final GatlingPluginExtension gatlingPlugin = project.extensions.getByType(GatlingPluginExtension)
Expand All @@ -19,6 +22,6 @@ class GatlingEnterpriseDeployTask extends DefaultTask {
final Boolean isPrivateRepositoryEnabled = gatlingPlugin.enterprise.controlPlaneUrl != null
final String artifactId = project.name
final String implementationVersion = (getClass().getPackage().getImplementationVersion() == null) ? "undefined" : getClass().getPackage().getImplementationVersion()
enterprisePlugin.deployFromDescriptor(descriptorFile, packageFile, artifactId, isPrivateRepositoryEnabled, BuildTool.GRADLE, implementationVersion)
deploymentInfo = enterprisePlugin.deployFromDescriptor(descriptorFile, packageFile, artifactId, isPrivateRepositoryEnabled, BuildTool.GRADLE, implementationVersion)
}
}
58 changes: 14 additions & 44 deletions src/main/groovy/io/gatling/gradle/GatlingEnterpriseStartTask.groovy
Original file line number Diff line number Diff line change
@@ -1,67 +1,37 @@
package io.gatling.gradle

import io.gatling.plugin.EnterprisePlugin
import io.gatling.plugin.model.RunSummary
import io.gatling.plugin.model.SimulationEndResult
import io.gatling.plugin.model.SimulationStartResult
import io.gatling.plugin.util.PropertiesParserUtil
import org.gradle.api.DefaultTask
import org.gradle.api.GradleException
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.TaskAction

@CacheableTask
class GatlingEnterpriseStartTask extends DefaultTask {

private static Map<String, String> selectProperties(
Map<String, String> propertiesMap, String propertiesString) {
return (propertiesMap == null || propertiesMap.isEmpty()) ? PropertiesParserUtil.parseProperties(propertiesString) :propertiesMap
}
class GatlingEnterpriseStartTask extends GatlingEnterpriseDeployTask {

@TaskAction
void publish() {
super.deploy()

final GatlingPluginExtension gatling = project.extensions.getByType(GatlingPluginExtension)
final Map<String, String> systemProperties = gatling.enterprise.systemProps ?: [:]
final String systemPropertiesString = gatling.enterprise.systemPropsString
final Map<String, String> environmentVariables = gatling.enterprise.environmentVariables ?: [:]
final String environmentVariablesString = gatling.enterprise.environmentVariablesString
final String version = project.version.toString()
final UUID simulationId = gatling.enterprise.simulationId
final String simulationClass = gatling.enterprise.simulationClass
final File file = inputs.files.singleFile
final UUID teamId = gatling.enterprise.teamId
final String groupId = project.group.toString()
final String artifactId = project.name
final UUID packageId = gatling.enterprise.packageId
final boolean waitForRunEnd = gatling.enterprise.waitForRunEnd

final EnterprisePlugin enterprisePlugin =
gatling.enterprise.batchMode ?
gatling.enterprise.initBatchEnterprisePlugin(version, logger) :
gatling.enterprise.initInteractiveEnterprisePlugin(version, logger)

final Map<String, String> selectedSystemProperties = selectProperties(systemProperties, systemPropertiesString)
final Map<String, String> selectedEnvVars = selectProperties(environmentVariables, environmentVariablesString)
final SimulationStartResult simulationStartResult = RecoverEnterprisePluginException.handle(logger) {
gatling.enterprise.simulationId ?
enterprisePlugin.uploadPackageAndStartSimulation(simulationId, selectedSystemProperties, selectedEnvVars, simulationClass, file) :
enterprisePlugin.createAndStartSimulation(teamId, groupId, artifactId, simulationClass, packageId, selectedSystemProperties, selectedEnvVars, file)
}

if (simulationStartResult.createdSimulation) {
CommonLogMessage.logSimulationCreated(simulationStartResult.simulation, logger)
}

CommonLogMessage.logSimulationConfiguration(logger, simulationStartResult.simulation, simulationId, waitForRunEnd)

logger.lifecycle("""
|Simulation ${simulationStartResult.simulation.name} successfully started.
|Once running, reports will be available at: ${gatling.enterprise.url.toExternalForm() + simulationStartResult.runSummary.reportsPath}
RecoverEnterprisePluginException.handle(logger) {
RunSummary runSummary = enterprisePlugin.startSimulation(gatling.enterprise.simulationName, deploymentInfo)
logger.lifecycle("""
|Simulation successfully started.
|Reports are available at: ${gatling.enterprise.url.toExternalForm() + runSummary.reportsPath}
|""".stripMargin())

if (waitForRunEnd) {
SimulationEndResult finishedRun = enterprisePlugin.waitForRunEnd(simulationStartResult.runSummary)
if (!finishedRun.status.successful) {
throw new GradleException("Simulation failed.")
if (waitForRunEnd) {
SimulationEndResult finishedRun = enterprisePlugin.waitForRunEnd(runSummary)
if (!finishedRun.status.successful) {
throw new GradleException("Simulation failed.")
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package io.gatling.gradle

import io.gatling.plugin.EnterprisePlugin
import io.gatling.plugin.configuration.PackageConfiguration
import org.gradle.api.DefaultTask
import org.gradle.api.InvalidUserDataException
import org.gradle.api.tasks.CacheableTask
Expand Down
13 changes: 6 additions & 7 deletions src/main/groovy/io/gatling/gradle/GatlingPlugin.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ final class GatlingPlugin implements Plugin<Project> {

def gatlingEnterprisePackageTask = registerEnterprisePackageTask(project)
registerEnterpriseUploadTask(project, gatlingEnterprisePackageTask)
registerEnterpriseStartTask(project, gatlingEnterprisePackageTask)
registerEnterpriseDeployTask(project, gatlingEnterprisePackageTask)
registerEnterpriseStartTask(project, gatlingEnterprisePackageTask)
}

private void validateGradleVersion() {
Expand All @@ -57,27 +57,26 @@ final class GatlingPlugin implements Plugin<Project> {
}
}

private void registerEnterpriseStartTask(Project project, TaskProvider<GatlingEnterprisePackageTask> gatlingEnterprisePackageTask) {
project.tasks.register(ENTERPRISE_START_TASK_NAME, GatlingEnterpriseStartTask.class) {
private TaskProvider<GatlingEnterpriseDeployTask> registerEnterpriseDeployTask(Project project, TaskProvider<GatlingEnterprisePackageTask> gatlingEnterprisePackageTask) {
project.tasks.register(ENTERPRISE_DEPLOY_TASK_NAME, GatlingEnterpriseDeployTask.class) {
inputs.files gatlingEnterprisePackageTask
dependsOn(gatlingEnterprisePackageTask)
}
}

private void registerEnterpriseDeployTask(Project project, TaskProvider<GatlingEnterprisePackageTask> gatlingEnterprisePackageTask) {
project.tasks.register(ENTERPRISE_DEPLOY_TASK_NAME, GatlingEnterpriseDeployTask.class) {
private void registerEnterpriseStartTask(Project project, TaskProvider<GatlingEnterprisePackageTask> gatlingEnterprisePackageTask) {
project.tasks.register(ENTERPRISE_START_TASK_NAME, GatlingEnterpriseStartTask.class) {
inputs.files gatlingEnterprisePackageTask
dependsOn(gatlingEnterprisePackageTask)
}
}

private TaskProvider<GatlingEnterprisePackageTask> registerEnterprisePackageTask(Project project) {
TaskProvider<GatlingEnterprisePackageTask> gatlingEnterprisePackage = project.tasks.register(ENTERPRISE_PACKAGE_TASK_NAME, GatlingEnterprisePackageTask.class) {packageTask ->
project.tasks.register(ENTERPRISE_PACKAGE_TASK_NAME, GatlingEnterprisePackageTask.class) {packageTask ->
packageTask.configurations = [
project.configurations.gatlingRuntimeClasspath
]
}
gatlingEnterprisePackage
}

private void createConfiguration(Project project) {
Expand Down
106 changes: 14 additions & 92 deletions src/main/groovy/io/gatling/gradle/GatlingPluginExtension.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import io.gatling.plugin.GatlingConstants
import io.gatling.plugin.InteractiveEnterprisePlugin
import io.gatling.plugin.InteractiveEnterprisePluginClient
import io.gatling.plugin.client.EnterpriseClient
import io.gatling.plugin.client.http.HttpEnterpriseClient
import io.gatling.plugin.client.HttpEnterpriseClient
import io.gatling.plugin.exceptions.UnsupportedClientException
import io.gatling.plugin.io.PluginIO
import org.gradle.api.InvalidUserDataException
Expand All @@ -20,27 +20,19 @@ class GatlingPluginExtension {
private static final String API_TOKEN_PROPERTY = "gatling.enterprise.apiToken"
private static final String API_TOKEN_ENV = "GATLING_ENTERPRISE_API_TOKEN"
private static final String SIMULATION_ID_PROPERTY = "gatling.enterprise.simulationId"
private static final String TEAM_ID_PROPERTY = "gatling.enterprise.teamId"
private static final String SIMULATION_NAME_PROPERTY = "gatling.enterprise.simulationName"
private static final String PACKAGE_ID_PROPERTY = "gatling.enterprise.packageId"
private static final String SIMULATION_CLASS_PROPERTY = "gatling.enterprise.simulationClass"
private static final String BATCH_MODE_PROPERTY = "gatling.enterprise.batchMode"
private static final String SYSTEM_PROPS_PROPERTY = "gatling.enterprise.systemProps"
private static final String ENVIRONMENT_VARIABLES_PROPERTY = "gatling.enterprise.environmentVariables"
private static final String WAIT_FOR_RUN_END_PROPERTY = "gatling.enterprise.waitForRunEnd"
private static final String CONTROL_PLANE_URL = "gatling.enterprise.controlPlaneUrl"
private static final String PLUGIN_NAME = "gatling-gradle-plugin"

final static class Enterprise {
private String apiToken
private UUID simulationId
private UUID teamId
private String simulationName
private UUID packageId
private Map<String, String> systemProps
private String systemPropsString
private Map<String, String> environmentVariables
private String environmentVariablesString
private URL url = URI.create("https://cloud.gatling.io").toURL()
private String simulationClass
private boolean batchMode
private boolean waitForRunEnd
private URL controlPlaneUrl
Expand Down Expand Up @@ -69,44 +61,12 @@ class GatlingPluginExtension {
setSimulationId(simulationId)
}

def setTeamId(String teamId) {
this.teamId = UUID.fromString(teamId)
def setSimulationName(String simulationName) {
this.simulationId = UUID.fromString(simulationName)
}

def teamId(String teamId) {
setTeamId(teamId)
}

def setSystemProps(Map<String, String> systemProps) {
this.systemProps = systemProps
}

def systemProps(Map<String, String> systemProps) {
setSystemProps(systemProps)
}

def setSystemPropsString(String systemPropsString) {
this.systemPropsString = systemPropsString
}

def systemPropsString(String systemPropsString) {
setSystemPropsString(systemPropsString)
}

def setEnvironmentVariables(Map<String, String> environmentVariables) {
this.environmentVariables = environmentVariables
}

def environmentVariables(Map<String, String> environmentVariables) {
setEnvironmentVariables(environmentVariables)
}

def setEnvironmentVariablesString(String environmentVariablesString) {
this.environmentVariablesString = environmentVariablesString
}

def environmentVariablesString(String environmentVariablesString) {
setEnvironmentVariablesString(environmentVariablesString)
def simulationName(String simulationName) {
setSimulationName(simulationName)
}

def setPackageId(String packageId) {
Expand All @@ -125,14 +85,6 @@ class GatlingPluginExtension {
setApiToken(apiToken)
}

def setSimulationClass(String simulationClass) {
this.simulationClass = simulationClass
}

def simulationClass(String simulationClass) {
setSimulationClass(simulationClass)
}

def setWaitForRunEnd(boolean waitForRunEnd) {
this.waitForRunEnd = waitForRunEnd
}
Expand Down Expand Up @@ -162,26 +114,13 @@ class GatlingPluginExtension {

@Input
@Optional
Map<String, String> getSystemProps() {
return systemProps
}

@Input
@Optional
String getSystemPropsString() {
return systemPropsString ?: System.getProperty(SYSTEM_PROPS_PROPERTY)
}

@Input
@Optional
Map<String, String> getEnvironmentVariables() {
return environmentVariables
}

@Input
@Optional
String getEnvironmentVariablesString() {
return environmentVariablesString ?: System.getProperty(ENVIRONMENT_VARIABLES_PROPERTY)
String getSimulationName() {
if (simulationName == null) {
def systemSimulationName = System.getProperty(SIMULATION_NAME_PROPERTY)
return systemSimulationName ? systemSimulationName : null
} else {
return simulationName
}
}

@Input
Expand All @@ -201,29 +140,12 @@ class GatlingPluginExtension {
}
}

@Input
@Optional
UUID getTeamId() {
if (teamId == null) {
def systemTeamId = System.getProperty(TEAM_ID_PROPERTY)
return systemTeamId ? UUID.fromString(systemTeamId) : null
} else {
return teamId
}
}

@Input
@Optional
URL getUrl() {
return url
}

@Input
@Optional
String getSimulationClass() {
return simulationClass ?: System.getProperty(SIMULATION_CLASS_PROPERTY)
}

@Input
@Optional
boolean getBatchMode() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,32 +30,6 @@ final class RecoverEnterprisePluginException {
|Another solution is to configure a Java toolchain to use Java ${e.supportedVersion}; see https://docs.gradle.org/current/userguide/toolchains.html
|Alternatively, the reported class may come from your project's dependencies, published targeting Java ${e.version}. In this case you need to use dependencies which target Java ${e.supportedVersion} or lower."
""".stripMargin())
} catch (SeveralTeamsFoundException e) {
final String teams = e.getAvailableTeams().collect { String.format("- %s (%s)\n", it.id, it.name) }.join()
final String teamExample = e.getAvailableTeams().head().id.toString()
throwTaskExecutionException(f.getThisObject(), """
|More than 1 team were found while creating a simulation.
|Available teams:
|${teams}
|Specify the team you want to use by adding this configuration to your build.gradle, e.g.:
|gatling.enterprise.teamId "${teamExample}"
|Or specify -Dgatling.enterprise.teamId= on the command
|
|See https://gatling.io/docs/gatling/reference/current/extensions/gradle_plugin/#working-with-gatling-enterprise-cloud for more information.
""".stripMargin())
} catch (SeveralSimulationClassNamesFoundException e) {
throwTaskExecutionException(f.getThisObject(), """Several simulation classes were found
|${e.availableSimulationClassNames.map { name -> "- " + name }.mkString("\n")}
|Specify the simulation you want to use by adding this configuration to your build.gradle, e.g.:
|gatling.enterprise.teamId ${e.availableSimulationClassNames.head()}
|Or specify -Dgatling.enterprise.simulationClass=<className> on the command
|""".stripMargin())
} catch (SimulationStartException e) {
if (e.created) {
CommonLogMessage.logSimulationCreated(e.simulation, logger)
}
CommonLogMessage.logSimulationConfiguration(e.simulation, logger)
throw e.getCause()
}
}

Expand Down