appsAndLicenses = appsToInstall) {
+
+ if (appsAndLicenses) {
+ log.info("Installing ${appsAndLicenses.size()} app(s)")
+ appsAndLicenses.each {url, license ->
+ assert jiraRest.installApp(url, license) : "Error installing app:" + url
+ }
+ }
+
+ return true
+
+ }
+
+ /**
+ * Uploads multiple new, or updates existing script files on the JIRA server
+ * @param srcDest A map where the key is a source file or folder, and value is destination file or folder, ex:
+ * "../src/someDir/someSubPath/" : "someDir/someSubPath/"
+ *
"../src/somOtherDir/SomeScript.groovy" : "somOtherDir/SomeScript.groovy"
+ *
+ * @return true on success
+ */
+ boolean updateScriptrunnerFiles(MapsrcDest) {
+ jiraRest.updateScriptrunnerFiles(srcDest)
+ }
+
+ boolean setupDeployment() {
+ log.info("Setting up deployment:" + friendlyName)
+
+ assert jiraLicense : "Error no Jira License has been setup"
+
+ jsmContainer.createContainer()
+ log.info("\tCreated jsm container:" + jsmContainer.id)
+ assert jsmContainer.startContainer() : "Error starting JSM container:" + jsmContainer.id
+ log.info("\tStarted JSM container")
+
+ log.debug("\tCreating folders needed for running Spoc tests with ScriptRunner")
+ assert jsmContainer.runBashCommandInContainer("mkdir /opt/atlassian/jira/surefire-reports ; chown jira:jira /opt/atlassian/jira/surefire-reports").empty
+ log.debug("\tUpdating apt and installing dependencies")
+ jsmContainer.runBashCommandInContainer("apt update; apt install -y htop nano", 20)
+
+ log.info("\tSetting up local H2 database")
+ assert jiraRest.setupH2Database() : "Error setting up H2 database for JSM"
+ log.info("\t\tDatabase setup successfully")
+ log.info("\tSetting up application properties and Jira license")
+ assert jiraRest.setApplicationProperties(jiraLicense, "JIRA", jiraBaseUrl)
+ log.info("\t\tLicense and properties setup successfully")
+
+ if(appsToInstall) {
+ installApps()
+ }
+
+
+ log.info("\tJSM deployment finished, you should now be able to login")
+ log.info("\t\tUrl:" + jiraBaseUrl)
+ log.info("\t\tUsername:" + jiraRest.adminUsername)
+ log.info("\t\tPassword:" + jiraRest.adminPassword)
+
+ return true
+ }
+
+
+
+
+}
diff --git a/src/test/groovy/com/eficode/devstack/container/impl/JsmContainerTest.groovy b/src/test/groovy/com/eficode/devstack/container/impl/JsmContainerTest.groovy
index 693099a..8c8789d 100644
--- a/src/test/groovy/com/eficode/devstack/container/impl/JsmContainerTest.groovy
+++ b/src/test/groovy/com/eficode/devstack/container/impl/JsmContainerTest.groovy
@@ -2,6 +2,8 @@ package com.eficode.devstack.container.impl
import de.gesellix.docker.client.DockerClientImpl
+import de.gesellix.docker.engine.DockerClientConfig
+import de.gesellix.docker.engine.DockerEnv
import de.gesellix.docker.remote.api.ContainerInspectResponse
import de.gesellix.docker.remote.api.ContainerState
import de.gesellix.docker.remote.api.core.ClientException
@@ -26,14 +28,44 @@ class JsmContainerTest extends Specification {
@Shared
String dockerRemoteHost = "https://docker.domain.com:2376"
@Shared
- String dockerCertPath = "src/test/resources/dockerCert"
+ String dockerCertPath = "resources/dockerCert"
def setupSpec() {
dockerClient = resolveDockerClient()
- dockerClient.rm("JSM-H2")
+ dockerClient.rm("JSM")
}
+ def "test isCreated"() {
+
+ when:
+ log.info("Testing isCreated")
+ JsmContainer jsm = new JsmContainer(dockerRemoteHost, dockerCertPath)
+
+ then:
+ !jsm.isCreated()
+ log.info("\tDid not return a false positive")
+
+ when:
+ String containerId = jsm.createContainer()
+ log.info("\tCreated container:" + containerId)
+
+ then:
+ jsm.isCreated()
+ log.info("\tisCreated now returns true")
+
+ when:
+ jsm.stopAndRemoveContainer() ?: {throw new Exception("Error revoming container $containerId")}
+ log.info("\tRemoved container")
+
+ then:
+ !jsm.isCreated()
+ log.info("\tisCreated now again returns false")
+
+ cleanup:
+ containerId ? dockerClient.rm(containerId) : ""
+
+ }
def "test setupSecureRemoteConnection"() {
@@ -48,6 +80,7 @@ class JsmContainerTest extends Specification {
assert jsm.ping(): "Error pinging docker engine"
assert jsm.dockerClient.dockerClientConfig.scheme == "https"
+
}
@@ -231,7 +264,7 @@ class JsmContainerTest extends Specification {
if (!pemFiles.empty && pemFiles.every { pemFile -> ["ca.pem", "cert.pem", "key.pem"].find { it == pemFile.name } }) {
log.info("\tFound Docker certs, returning Secure remote Docker connection")
try {
- DockerClientImpl dockerClient = JsmContainer.setupSecureRemoteConnection(dockerRemoteHost, dockerCertPath)
+ DockerClientImpl dockerClient = setupSecureRemoteConnection(dockerRemoteHost, dockerCertPath)
assert dockerClient.ping().content as String == "OK": "Error pinging remote Docker engine"
return dockerClient
} catch (ex) {
@@ -247,4 +280,21 @@ class JsmContainerTest extends Specification {
return new DockerClientImpl()
}
+
+ /**
+ * Replaced the default docker connection (local) with a remote, secure one
+ * @param host ex: "https://docker.domain.se:2376"
+ * @param certPath folder containing ca.pem, cert.pem, key.pem
+ */
+ static DockerClientImpl setupSecureRemoteConnection(String host, String certPath) {
+
+ DockerClientConfig dockerConfig = new DockerClientConfig(host)
+ DockerEnv dockerEnv = new DockerEnv(host)
+ dockerEnv.setCertPath(certPath)
+ dockerEnv.setTlsVerify("1")
+ dockerConfig.apply(dockerEnv)
+
+ return new DockerClientImpl(dockerConfig)
+
+ }
}
diff --git a/src/test/groovy/com/eficode/devstack/deployment/impl/JsmH2DeploymentTest.groovy b/src/test/groovy/com/eficode/devstack/deployment/impl/JsmH2DeploymentTest.groovy
new file mode 100644
index 0000000..94885e6
--- /dev/null
+++ b/src/test/groovy/com/eficode/devstack/deployment/impl/JsmH2DeploymentTest.groovy
@@ -0,0 +1,123 @@
+package com.eficode.devstack.deployment.impl
+
+import de.gesellix.docker.client.DockerClientImpl
+import de.gesellix.docker.engine.DockerClientConfig
+import de.gesellix.docker.engine.DockerEnv
+import org.apache.commons.io.FileUtils
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import spock.lang.Shared
+import spock.lang.Specification
+
+class JsmH2DeploymentTest extends Specification {
+
+ @Shared
+ String dockerRemoteHost = "https://docker.domain.se:2376"
+ @Shared
+ String dockerCertPath = "resources/dockerCert"
+
+ @Shared
+ String jiraBaseUrl = "http://192.168.0.1:8080"
+ //String jiraBaseUrl = "http://localhost:8080"
+
+ @Shared
+ DockerClientImpl dockerClient
+
+ @Shared
+ static Logger log = LoggerFactory.getLogger(JsmH2DeploymentTest.class)
+
+ @Shared
+ File projectRoot = new File(".")
+
+ def setupSpec() {
+
+
+ dockerClient = resolveDockerClient()
+ dockerClient.stop("JSM")
+ dockerClient.rm("JSM")
+ }
+
+ def "test setupDeployment"() {
+ setup:
+ JsmH2Deployment jsmDep = new JsmH2Deployment(jiraBaseUrl)
+ jsmDep.setupSecureDockerConnection(dockerRemoteHost, dockerCertPath)
+ //jsmDep.jsmContainer.containerImageTag = "4.22.2"
+ jsmDep.setJiraLicense(new File(projectRoot.path + "/resources/jira/licenses/jsm.license"))
+ jsmDep.appsToInstall = [
+ "https://marketplace.atlassian.com/download/apps/6820/version/1005740" : new File(projectRoot.path + "/resources/jira/licenses/scriptrunnerForJira.license").text,
+ "https://marketplace.atlassian.com/download/apps/6572/version/1311472" : new File(projectRoot.path + "/resources/jira/licenses/tempoTimeSheets.license").text,
+ "https://marketplace.atlassian.com/download/apps/1211542/version/302030": ""
+ ]
+
+ when:
+ boolean setupSuccess = jsmDep.setupDeployment()
+ then:
+ setupSuccess
+
+ //cleanup:
+
+ //jsmDep.containers.each {it.stopAndRemoveContainer()}
+ }
+
+
+ DockerClientImpl resolveDockerClient() {
+
+ if (this.dockerClient) {
+ return this.dockerClient
+ }
+
+ log.info("Getting Docker client")
+
+ if (!dockerRemoteHost) {
+ log.info("\tNo remote host configured, returning local docker connection")
+ return new DockerClientImpl()
+ }
+
+ File certDir = new File(dockerCertPath)
+
+ if (!certDir.isDirectory()) {
+ log.info("\tNo valid Docker Cert Path given, returning local docker connection")
+ return new DockerClientImpl()
+ }
+ log.info("\tLooking for docker certs in:" + certDir.absolutePath)
+ ArrayList pemFiles = FileUtils.listFiles(certDir, ["pem"] as String[], false)
+ log.debug("\t\tFound pem files:" + pemFiles.name.join(","))
+
+
+ if (!pemFiles.empty && pemFiles.every { pemFile -> ["ca.pem", "cert.pem", "key.pem"].find { it == pemFile.name } }) {
+ log.info("\tFound Docker certs, returning Secure remote Docker connection")
+ try {
+ DockerClientImpl dockerClient = setupSecureRemoteConnection(dockerRemoteHost, dockerCertPath)
+ assert dockerClient.ping().content as String == "OK": "Error pinging remote Docker engine"
+ return dockerClient
+ } catch (ex) {
+ log.error("\tError setting up connection to remote Docker engine:" + ex.message)
+ log.info("\tReturning local Docker connection")
+ return new DockerClientImpl()
+ }
+
+ }
+
+ log.info("\tMissing Docker certs, returning local docker connection")
+
+ return new DockerClientImpl()
+
+ }
+
+ /**
+ * Replaced the default docker connection (local) with a remote, secure one
+ * @param host ex: "https://docker.domain.se:2376"
+ * @param certPath folder containing ca.pem, cert.pem, key.pem
+ */
+ static DockerClientImpl setupSecureRemoteConnection(String host, String certPath) {
+
+ DockerClientConfig dockerConfig = new DockerClientConfig(host)
+ DockerEnv dockerEnv = new DockerEnv(host)
+ dockerEnv.setCertPath(certPath)
+ dockerEnv.setTlsVerify("1")
+ dockerConfig.apply(dockerEnv)
+
+ return new DockerClientImpl(dockerConfig)
+
+ }
+}