diff --git a/.run/FT.run.xml b/.run/FT.run.xml
index fc34c1b..fe05ff0 100644
--- a/.run/FT.run.xml
+++ b/.run/FT.run.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/.run/ReleaseManagementServiceApplication.run.xml b/.run/ReleaseManagementServiceApplication.run.xml
index 9957c04..e1f4fbb 100644
--- a/.run/ReleaseManagementServiceApplication.run.xml
+++ b/.run/ReleaseManagementServiceApplication.run.xml
@@ -11,17 +11,18 @@
-
-
-
-
-
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/.run/UT.run.xml b/.run/UT.run.xml
index 6b46ce1..bc02b77 100644
--- a/.run/UT.run.xml
+++ b/.run/UT.run.xml
@@ -4,7 +4,7 @@
-
+
diff --git a/build.gradle.kts b/build.gradle.kts
index a68be8b..eae8d66 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,5 +1,6 @@
import org.gradle.api.tasks.testing.logging.TestLogEvent
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+import org.octopusden.task.MigrateMockData
plugins {
java
@@ -65,6 +66,10 @@ subprojects {
}
}
+ val migrateMockData by tasks.creating(MigrateMockData::class) {
+ this.testDataDir = rootDir.toString() + File.separator + "test-data"
+ }
+
dependencyManagement {
imports {
mavenBom("org.springframework.boot:spring-boot-dependencies:${project.properties["spring-boot.version"]}")
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
new file mode 100644
index 0000000..d50805f
--- /dev/null
+++ b/buildSrc/build.gradle.kts
@@ -0,0 +1,13 @@
+plugins {
+ kotlin("jvm") version "1.9.23"
+ groovy
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ implementation(gradleApi())
+ implementation("org.mock-server:mockserver-client-java:5.15.0")
+}
diff --git a/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt
new file mode 100644
index 0000000..4b4ec85
--- /dev/null
+++ b/buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt
@@ -0,0 +1,69 @@
+package org.octopusden.task
+
+import com.google.common.io.Files
+import com.google.common.net.HttpHeaders
+import org.apache.http.entity.ContentType
+import org.gradle.api.DefaultTask
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.TaskAction
+import org.mockserver.client.MockServerClient
+import org.mockserver.model.HttpRequest
+import org.mockserver.model.HttpResponse
+import org.mockserver.model.HttpStatusCode
+import java.io.File
+import java.nio.charset.Charset
+
+
+open class MigrateMockData : DefaultTask() {
+
+ private val mockServerClient = MockServerClient("localhost", 1080)
+
+ @get:Input
+ lateinit var testDataDir: String
+
+ @TaskAction
+ fun startMockServer() {
+ mockServerClient.reset()
+ endpointToResponseFileName.forEach {
+ generateMockserverData(it.key.first, it.key.second, testDataDir + File.separator + it.value, HttpStatusCode.OK_200.code())
+ }
+ endpointNotFoundToResponseFileName.forEach {
+ generateMockserverData(it.key.first, it.key.second, testDataDir + File.separator + it.value, HttpStatusCode.NOT_FOUND_404.code())
+ }
+ }
+
+ private fun generateMockserverData(endpoint: String, params: Map, filename: String, status: Int) {
+ val body = Files.asCharSource(File(filename), Charset.defaultCharset()).read()
+ val request = HttpRequest.request()
+ .withMethod("GET")
+ .withPath(endpoint)
+ params.forEach {
+ request.withQueryStringParameter(it.key, it.value)
+ }
+ mockServerClient.`when`(request)
+ .respond {
+ logger.debug(
+ "MockServer request: ${it.method} ${it.path} ${it.queryStringParameterList.joinToString(",")} ${
+ it.pathParameterList.joinToString(
+ ","
+ )
+ }"
+ )
+ HttpResponse.response()
+ .withHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.mimeType)
+ .withBody(body)
+ .withStatusCode(status)
+ }
+ }
+
+ companion object {
+ private val endpointToResponseFileName = mapOf(
+ "/rest/release-engineering/3/component/ReleaseManagementService/builds" to emptyMap() to "releng/builds.json",
+ "/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.1/build" to emptyMap() to "releng/build_1.0.1.json",
+ "/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.2/build" to emptyMap() to "releng/build_1.0.2.json",
+ )
+ private val endpointNotFoundToResponseFileName = mapOf(
+ "/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.3/build" to emptyMap() to "releng/build-not-exist-error.json"
+ )
+ }
+}
diff --git a/client/build.gradle.kts b/client/build.gradle.kts
index 9d9e40c..ffc6007 100644
--- a/client/build.gradle.kts
+++ b/client/build.gradle.kts
@@ -59,9 +59,11 @@ dependencyManagement {
dependencies {
api(project(":common"))
+ /* These dependencies are added to :common due to there are usages at server side
api("io.github.openfeign:feign-httpclient")
api("io.github.openfeign:feign-jackson")
api("io.github.openfeign:feign-slf4j")
+ */
api("com.fasterxml.jackson.module:jackson-module-kotlin")
api("com.fasterxml.jackson.core:jackson-databind")
}
diff --git a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt
index b133e46..820216f 100644
--- a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt
+++ b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceClient.kt
@@ -1,9 +1,19 @@
package org.octopusden.octopus.releasemanagementservice.client
+import feign.Param
import feign.RequestLine
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
interface ReleaseManagementServiceClient {
+
@RequestLine("GET /actuator/info")
fun getServiceInfo(): ServiceInfoDTO
+
+ @RequestLine("GET /builds/component/{component}")
+ fun getBuilds(@Param("component") component: String): Collection
+
+ @RequestLine("GET /builds/component/{component}/version/{version}")
+ fun getBuild(@Param("component") component: String, @Param("version") version: String): BuildDTO
}
diff --git a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt
index 7dc6d4c..2be7f69 100644
--- a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt
+++ b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/ReleaseManagementServiceErrorDecoder.kt
@@ -36,7 +36,7 @@ class ReleaseManagementServiceErrorDecoder(private val objectMapper: ObjectMappe
private val errorResponseFunction =
{ errorResponse: ErrorResponse -> errorResponse.errorCode.getException(errorResponse.errorMessage) }
private val ERROR_RESPONSE_CODES: Map Exception> = mapOf(
- 400 to errorResponseFunction,
+ 404 to errorResponseFunction,
500 to errorResponseFunction
)
}
diff --git a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt
index 0ded4fd..afb6914 100644
--- a/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt
+++ b/client/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/impl/ClassicReleaseManagementServiceClient.kt
@@ -13,7 +13,9 @@ import feign.slf4j.Slf4jLogger
import org.octopusden.octopus.releasemanagementservice.client.ReleaseManagementServiceClient
import org.octopusden.octopus.releasemanagementservice.client.ReleaseManagementServiceErrorDecoder
import org.octopusden.octopus.releasemanagementservice.client.ReleaseManagementServiceRetry
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
import java.util.concurrent.TimeUnit
class ClassicReleaseManagementServiceClient(
@@ -28,6 +30,10 @@ class ClassicReleaseManagementServiceClient(
getMapper()
)
+ override fun getBuilds(component: String): Collection = client.getBuilds(component)
+
+ override fun getBuild(component: String, version: String): BuildDTO = client.getBuild(component, version)
+
fun setUrl(apiUrl: String, timeRetryInMillis: Int) {
client = createClient(apiUrl, mapper, timeRetryInMillis)
}
@@ -35,10 +41,8 @@ class ClassicReleaseManagementServiceClient(
override fun getServiceInfo(): ServiceInfoDTO = client.getServiceInfo()
companion object {
- private fun getMapper(): ObjectMapper {
- val objectMapper = jacksonObjectMapper()
- objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
- return objectMapper
+ private fun getMapper(): ObjectMapper = with(jacksonObjectMapper()) {
+ configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
}
private fun createClient(
diff --git a/common/build.gradle.kts b/common/build.gradle.kts
index 7268102..7e5f13c 100644
--- a/common/build.gradle.kts
+++ b/common/build.gradle.kts
@@ -51,6 +51,17 @@ tasks.withType().configureEach {
}
}
+dependencyManagement {
+ imports {
+ mavenBom("io.github.openfeign:feign-bom:${project.properties["openfeign.version"]}")
+ }
+}
+
dependencies {
implementation("com.fasterxml.jackson.core:jackson-annotations")
+
+ api("io.github.openfeign:feign-httpclient")
+ api("io.github.openfeign:feign-jackson")
+ api("io.github.openfeign:feign-slf4j")
+ api("org.apache.httpcomponents:httpclient:4.5.13")
}
diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildDTO.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildDTO.kt
new file mode 100644
index 0000000..5b62ce8
--- /dev/null
+++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildDTO.kt
@@ -0,0 +1,3 @@
+package org.octopusden.octopus.releasemanagementservice.client.common.dto
+
+data class BuildDTO(val component: String, val version: String, val status: BuildStatus, val dependencies: Collection, val commits: Collection)
diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildStatus.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildStatus.kt
new file mode 100644
index 0000000..426ce3f
--- /dev/null
+++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/BuildStatus.kt
@@ -0,0 +1,7 @@
+package org.octopusden.octopus.releasemanagementservice.client.common.dto
+
+enum class BuildStatus {
+ BUILD,
+ RC,
+ RELEASE
+}
diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/CommitDTO.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/CommitDTO.kt
new file mode 100644
index 0000000..34a7b59
--- /dev/null
+++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/CommitDTO.kt
@@ -0,0 +1,3 @@
+package org.octopusden.octopus.releasemanagementservice.client.common.dto
+
+data class CommitDTO(val repository: String, val sha: String)
diff --git a/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/ShortBuildDTO.kt b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/ShortBuildDTO.kt
new file mode 100644
index 0000000..306989b
--- /dev/null
+++ b/common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/client/common/dto/ShortBuildDTO.kt
@@ -0,0 +1,3 @@
+package org.octopusden.octopus.releasemanagementservice.client.common.dto
+
+data class ShortBuildDTO(val component: String, val version: String, val status: BuildStatus)
diff --git a/ft/build.gradle.kts b/ft/build.gradle.kts
index 5201dec..7aa60fa 100644
--- a/ft/build.gradle.kts
+++ b/ft/build.gradle.kts
@@ -53,6 +53,14 @@ tasks.named("composeUp") {
dependsOn(":release-management-service:dockerBuildImage")
}
+tasks.named("migrateMockData") {
+ dependsOn("composeUp")
+}
+
+tasks.named("ft") {
+ dependsOn("migrateMockData")
+}
+
idea.module {
scopes["PROVIDED"]?.get("plus")?.add(configurations["ftImplementation"])
}
diff --git a/ft/docker/application-ft.yml b/ft/docker/application-ft.yml
index 75fe6e0..75b993c 100644
--- a/ft/docker/application-ft.yml
+++ b/ft/docker/application-ft.yml
@@ -1,3 +1,6 @@
+releng:
+ url: http://mockserver:1080
+
management:
endpoints:
web:
diff --git a/ft/docker/docker-compose.yml b/ft/docker/docker-compose.yml
index 717460e..5b5d3fe 100644
--- a/ft/docker/docker-compose.yml
+++ b/ft/docker/docker-compose.yml
@@ -13,3 +13,8 @@ services:
- SPRING_CONFIG_ADDITIONAL_LOCATION=/
- SPRING_PROFILES_ACTIVE=ft
+ mockserver:
+ container_name: release-management-service-ft-mockserver
+ image: ${DOCKER_REGISTRY}/mockserver/mockserver:mockserver-5.15.0
+ ports:
+ - "1080:1080"
diff --git a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt
index 76b22de..e5b3589 100644
--- a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt
+++ b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/ActuatorTest.kt
@@ -1,8 +1,25 @@
package org.octopusden.octopus.releasemanagementservice
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO
+import org.octopusden.octopus.releasemanagementservice.client.impl.ClassicReleaseManagementServiceClient
+import org.octopusden.octopus.releasemanagementservice.client.impl.ReleaseManagementServiceClientParametersProvider
-class ActuatorTest : BaseReleaseManagementServiceFuncTest() {
+class ActuatorTest : BaseActuatorTest(), BaseReleaseManagementServiceFuncTest {
+
+ override fun getObjectMapper(): ObjectMapper = mapper
override fun getServiceInfo(): ServiceInfoDTO = client.getServiceInfo()
+
+ companion object {
+ @JvmStatic
+ private val mapper = jacksonObjectMapper()
+ @JvmStatic
+ private val client =
+ ClassicReleaseManagementServiceClient(object : ReleaseManagementServiceClientParametersProvider {
+ override fun getApiUrl() = "http://localhost:8080"
+ override fun getTimeRetryInMillis() = 180000
+ })
+ }
}
diff --git a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt
index 93c7282..224e696 100644
--- a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt
+++ b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceFuncTest.kt
@@ -1,15 +1,3 @@
package org.octopusden.octopus.releasemanagementservice
-import org.octopusden.octopus.releasemanagementservice.client.impl.ClassicReleaseManagementServiceClient
-import org.octopusden.octopus.releasemanagementservice.client.impl.ReleaseManagementServiceClientParametersProvider
-
-abstract class BaseReleaseManagementServiceFuncTest : BaseReleaseManagementServiceTest() {
- companion object {
- @JvmStatic
- protected val client =
- ClassicReleaseManagementServiceClient(object : ReleaseManagementServiceClientParametersProvider {
- override fun getApiUrl() = "http://localhost:8080"
- override fun getTimeRetryInMillis() = 180000
- })
- }
-}
+interface BaseReleaseManagementServiceFuncTest : BaseReleaseManagementServiceTest
diff --git a/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt
new file mode 100644
index 0000000..a769d12
--- /dev/null
+++ b/ft/src/ft/kotlin/org/octopusden/octopus/releasemanagementservice/BuildControllerTest.kt
@@ -0,0 +1,41 @@
+package org.octopusden.octopus.releasemanagementservice
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.*
+import org.octopusden.octopus.releasemanagementservice.client.common.exception.NotFoundException
+import org.octopusden.octopus.releasemanagementservice.client.impl.ClassicReleaseManagementServiceClient
+import org.octopusden.octopus.releasemanagementservice.client.impl.ReleaseManagementServiceClientParametersProvider
+
+class BuildControllerTest : BaseBuildControllerTest(), BaseReleaseManagementServiceFuncTest {
+
+ override fun getObjectMapper(): ObjectMapper = mapper
+
+ override fun getBuilds(component: String): Collection {
+ return client.getBuilds(component)
+ }
+
+ override fun getBuild(component: String, version: String): BuildDTO {
+ return client.getBuild(component, version)
+ }
+
+ override fun getNotExistedBuildErrorResponse(component: String, version: String): ErrorResponse {
+ try {
+ client.getBuild(component, version)
+ return ErrorResponse(ReleaseManagementServiceErrorCode.OTHER, "Failure expected")
+ } catch (e: NotFoundException) {
+ return ErrorResponse(ReleaseManagementServiceErrorCode.NOT_FOUND, e.message!!)
+ }
+ }
+
+ companion object {
+ @JvmStatic
+ private val mapper = jacksonObjectMapper()
+ @JvmStatic
+ private val client =
+ ClassicReleaseManagementServiceClient(object : ReleaseManagementServiceClientParametersProvider {
+ override fun getApiUrl() = "http://localhost:8080"
+ override fun getTimeRetryInMillis() = 180000
+ })
+ }
+}
diff --git a/server/build.gradle.kts b/server/build.gradle.kts
index 26de65a..0ea38e1 100644
--- a/server/build.gradle.kts
+++ b/server/build.gradle.kts
@@ -76,6 +76,10 @@ tasks.getByName("dockerBuildImage").doFirst {
}
tasks.withType {
+ dependsOn("migrateMockData")
+}
+
+tasks.named("migrateMockData") {
dependsOn("composeUp")
}
diff --git a/server/dev/application-dev.yml b/server/dev/application-dev.yml
index 75fe6e0..3ec5d4a 100644
--- a/server/dev/application-dev.yml
+++ b/server/dev/application-dev.yml
@@ -1,3 +1,6 @@
+releng:
+ url: # set via EnvFile
+
management:
endpoints:
web:
@@ -6,4 +9,4 @@ management:
logging:
level:
- org.octopusden.octopus.releasemanagement.controller: trace
+ org.octopusden.octopus.releasemanagementservice.controller: trace
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildController.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildController.kt
new file mode 100644
index 0000000..42fa35e
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildController.kt
@@ -0,0 +1,33 @@
+package org.octopusden.octopus.releasemanagementservice.controller
+
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
+import org.octopusden.octopus.releasemanagementservice.service.BuildService
+import org.slf4j.LoggerFactory
+import org.springframework.http.MediaType
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.PathVariable
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+
+@RestController
+@RequestMapping("builds")
+class BuildController(private val buildService: BuildService) {
+
+ @GetMapping("component/{component}", produces = [MediaType.APPLICATION_JSON_VALUE])
+ fun getComponentBuilds(@PathVariable("component") component: String): Collection {
+ log.debug("Get all Builds of '{}'", component)
+ return buildService.getBuilds(component)
+ }
+
+ @GetMapping("component/{component}/version/{version}", produces = [MediaType.APPLICATION_JSON_VALUE])
+ fun getBuild(@PathVariable("component") component: String, @PathVariable("version") version: String): BuildDTO {
+ log.debug("Get Build '{}:{}'", component, version)
+ return buildService.getBuild(component, version)
+ }
+
+ companion object {
+ private val log = LoggerFactory.getLogger(BuildController::class.java)
+ }
+}
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt
index 8c4d8b7..e244eb9 100644
--- a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ExceptionInfoHandler.kt
@@ -21,6 +21,9 @@ class ExceptionInfoHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ResponseBody
fun handleNotFound(exception: ReleaseManagementServiceException) = getErrorResponse(exception)
+ .also {
+ log.error(exception.message)
+ }
@ExceptionHandler(ArgumentsNotCompatibleException::class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengBuildService.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengBuildService.kt
new file mode 100644
index 0000000..1a45b89
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengBuildService.kt
@@ -0,0 +1,39 @@
+package org.octopusden.octopus.releasemanagementservice.legacy
+
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.exception.NotFoundException
+import org.octopusden.octopus.releasemanagementservice.client.common.exception.ReleaseManagementServiceException
+import org.octopusden.octopus.releasemanagementservice.service.BuildService
+import org.slf4j.LoggerFactory
+import org.springframework.stereotype.Service
+
+@Service
+class LegacyRelengBuildService(private val client: LegacyRelengClient) : BuildService {
+
+ private val codeMapping = mapOf
+ ReleaseManagementServiceException>(404 to { e: LegacyRelengClientException -> NotFoundException(e.message!!) })
+
+ override fun getBuilds(component: String): Collection {
+ return execute { client.getBuilds(component) }
+ }
+
+ override fun getBuild(component: String, version: String): BuildDTO {
+ return execute { client.getBuild(component, version) }
+ }
+
+ private fun execute(func: () -> T): T {
+ return try {
+ func()
+ } catch (e: LegacyRelengClientException) {
+ log.error(e.message)
+ throw codeMapping[e.code]
+ ?.invoke(e)
+ ?: IllegalStateException(e)
+ }
+ }
+
+ companion object {
+ private val log = LoggerFactory.getLogger(LegacyRelengBuildService::class.java)
+ }
+}
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClient.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClient.kt
new file mode 100644
index 0000000..c7958f6
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClient.kt
@@ -0,0 +1,15 @@
+package org.octopusden.octopus.releasemanagementservice.legacy
+
+import feign.Param
+import feign.RequestLine
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
+
+interface LegacyRelengClient {
+
+ @RequestLine("GET rest/release-engineering/3/component/{component}/builds")
+ fun getBuilds(@Param("component") component: String): Collection
+
+ @RequestLine("GET rest/release-engineering/3/component/{component}/version/{version}/build")
+ fun getBuild(@Param("component") component: String, @Param("version") version: String): BuildDTO
+}
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClientException.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClientException.kt
new file mode 100644
index 0000000..d47fd70
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengClientException.kt
@@ -0,0 +1,3 @@
+package org.octopusden.octopus.releasemanagementservice.legacy
+
+class LegacyRelengClientException(val code: Int, message: String): RuntimeException(message)
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt
new file mode 100644
index 0000000..6d7f36e
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengConfig.kt
@@ -0,0 +1,29 @@
+package org.octopusden.octopus.releasemanagementservice.legacy
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import feign.Feign.Builder
+import feign.Logger
+import feign.Request
+import feign.httpclient.ApacheHttpClient
+import feign.jackson.JacksonDecoder
+import feign.jackson.JacksonEncoder
+import feign.slf4j.Slf4jLogger
+import org.springframework.context.annotation.Bean
+import org.springframework.context.annotation.Configuration
+import java.util.concurrent.TimeUnit
+
+
+@Configuration
+class LegacyRelengConfig(private val relengProperties: LegacyRelengProperties, private val objectMapper: ObjectMapper) {
+
+ @Bean
+ fun legacyRelengClient(): LegacyRelengClient = Builder()
+ .client(ApacheHttpClient())
+ .options(Request.Options(5, TimeUnit.MINUTES, 5, TimeUnit.MINUTES, true))
+ .encoder(JacksonEncoder(objectMapper))
+ .decoder(JacksonDecoder(objectMapper))
+ .errorDecoder(LegacyRelengErrorDecoder(objectMapper))
+ .logger(Slf4jLogger(LegacyRelengClient::class.java))
+ .logLevel(Logger.Level.BASIC)
+ .target(LegacyRelengClient::class.java, relengProperties.url)
+}
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengErrorDecoder.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengErrorDecoder.kt
new file mode 100644
index 0000000..cbe0a55
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengErrorDecoder.kt
@@ -0,0 +1,24 @@
+package org.octopusden.octopus.releasemanagementservice.legacy
+
+import com.fasterxml.jackson.databind.ObjectMapper
+import feign.Response
+import feign.codec.ErrorDecoder
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse
+import org.slf4j.LoggerFactory
+
+class LegacyRelengErrorDecoder(private val objectMapper: ObjectMapper) : ErrorDecoder {
+ override fun decode(methodKey: String, response: Response): Exception {
+ val responseBody = response.body().asInputStream().readAllBytes()
+ return try {
+ val errorResponse = objectMapper.readValue(responseBody, ErrorResponse::class.java)
+ errorResponse.errorCode.getException(errorResponse.errorMessage)
+ } catch (e: Exception) {
+ log.error("ErrorResponse decode error", e)
+ LegacyRelengClientException(response.status(), String(responseBody))
+ }
+ }
+
+ companion object {
+ private val log = LoggerFactory.getLogger(LegacyRelengErrorDecoder::class.java)
+ }
+}
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengProperties.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengProperties.kt
new file mode 100644
index 0000000..57bbbbf
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/legacy/LegacyRelengProperties.kt
@@ -0,0 +1,6 @@
+package org.octopusden.octopus.releasemanagementservice.legacy
+
+import org.springframework.boot.context.properties.ConfigurationProperties
+
+@ConfigurationProperties("releng")
+data class LegacyRelengProperties(val url: String)
diff --git a/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/service/BuildService.kt b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/service/BuildService.kt
new file mode 100644
index 0000000..7da8a97
--- /dev/null
+++ b/server/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/service/BuildService.kt
@@ -0,0 +1,9 @@
+package org.octopusden.octopus.releasemanagementservice.service
+
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
+
+interface BuildService {
+ fun getBuilds(component: String): Collection
+ fun getBuild(component: String, version: String): BuildDTO
+}
diff --git a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt
index 9a31a31..a9dac0a 100644
--- a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt
+++ b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/ActuatorTest.kt
@@ -1,20 +1,40 @@
package org.octopusden.octopus.releasemanagementservice.controller
import com.fasterxml.jackson.core.type.TypeReference
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.junit.jupiter.api.TestInstance
+import org.junit.jupiter.api.extension.ExtendWith
+import org.octopusden.octopus.releasemanagementservice.BaseActuatorTest
+import org.octopusden.octopus.releasemanagementservice.ReleaseManagementServiceApplication
import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO
-import org.springframework.http.MediaType
-import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
-import org.springframework.test.web.servlet.result.MockMvcResultMatchers
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.ActiveProfiles
+import org.springframework.test.context.junit.jupiter.SpringExtension
+import org.springframework.test.web.servlet.MockMvc
-class ActuatorTest : BaseControllerTest() {
+@AutoConfigureMockMvc
+@ExtendWith(SpringExtension::class)
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+@SpringBootTest(
+ classes = [ReleaseManagementServiceApplication::class],
+ webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+@ActiveProfiles("test")
+class ActuatorTest : BaseControllerTest, BaseActuatorTest() {
- override fun getServiceInfo(): ServiceInfoDTO =
- mvc.perform(
- MockMvcRequestBuilders.get("/actuator/info")
- .contentType(MediaType.APPLICATION_JSON)
- .accept(MediaType.APPLICATION_JSON)
- )
- .andExpect(MockMvcResultMatchers.status().`is`(200))
- .andReturn()
- .response.toObject(object : TypeReference() {})
+ @Autowired
+ protected lateinit var mvc: MockMvc
+
+ @Autowired
+ protected lateinit var mapper: ObjectMapper
+
+ override fun getServiceInfo(): ServiceInfoDTO {
+ return get(200, object : TypeReference() {}, "/actuator/info")
+ }
+
+ override fun getMockMvc(): MockMvc = mvc
+
+ override fun getObjectMapper(): ObjectMapper = mapper
}
diff --git a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt
index d676818..4868504 100644
--- a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt
+++ b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BaseControllerTest.kt
@@ -1,71 +1,32 @@
package org.octopusden.octopus.releasemanagementservice.controller
import com.fasterxml.jackson.core.type.TypeReference
-import com.fasterxml.jackson.databind.ObjectMapper
-import org.junit.jupiter.api.BeforeAll
-import org.junit.jupiter.api.TestInstance
-import org.junit.jupiter.api.extension.ExtendWith
import org.octopusden.octopus.releasemanagementservice.BaseReleaseManagementServiceTest
-import org.octopusden.octopus.releasemanagementservice.ReleaseManagementServiceApplication
-import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
-import org.springframework.boot.test.context.SpringBootTest
-import org.springframework.http.HttpStatus
+import org.springframework.http.MediaType
import org.springframework.mock.web.MockHttpServletResponse
-import org.springframework.test.context.ActiveProfiles
-import org.springframework.test.context.junit.jupiter.SpringExtension
import org.springframework.test.web.servlet.MockMvc
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders
+import org.springframework.test.web.servlet.result.MockMvcResultMatchers
import java.time.ZoneId
import java.time.format.DateTimeFormatter
-import java.util.Date
-import java.util.Locale
private const val ISO_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
-typealias CheckError = (Pair) -> Unit
-@AutoConfigureMockMvc
-@ExtendWith(SpringExtension::class)
-@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-@SpringBootTest(
- classes = [ReleaseManagementServiceApplication::class],
- webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
-)
-@ActiveProfiles("test")
-abstract class BaseControllerTest : BaseReleaseManagementServiceTest() {
-
- @Autowired
- protected lateinit var mvc: MockMvc
-
- @Autowired
- protected lateinit var mapper: ObjectMapper
-
- @BeforeAll
- fun beforeAllRepositoryControllerTests() {
- mapper.setLocale(Locale.ENGLISH)
- }
-
- protected fun checkResponse(
- response: MockHttpServletResponse,
- status: Int,
- typeReference: TypeReference,
- checkSuccess: (T) -> Unit,
- checkError: CheckError
- ) {
- if (HttpStatus.OK == HttpStatus.valueOf(status)) {
- checkSuccess(response.toObject(typeReference))
- } else {
- val err = response.toObject(object : TypeReference() {})
- checkError(Pair(response.status, err.errorMessage))
- }
- }
-
- protected fun MockHttpServletResponse.toObject(typeReference: TypeReference): T =
- mapper.readValue(this.contentAsByteArray, typeReference)
-
- protected fun Date.toReleaseManagementServiceFormat(): String {
- return FORMATTER.format(toInstant())
- }
+interface BaseControllerTest : BaseReleaseManagementServiceTest {
+
+ fun getMockMvc(): MockMvc
+ fun get(code: Int, typeReference: TypeReference, path: String, vararg uriVars: String) =
+ getMockMvc().perform(
+ MockMvcRequestBuilders.get(path, *uriVars)
+ .contentType(MediaType.APPLICATION_JSON)
+ .accept(MediaType.APPLICATION_JSON)
+ )
+ .andExpect(MockMvcResultMatchers.status().`is`(code))
+ .andReturn()
+ .response.toObject(typeReference)
+
+ fun MockHttpServletResponse.toObject(typeReference: TypeReference): T =
+ getObjectMapper().readValue(this.contentAsByteArray, typeReference)
companion object {
private val FORMATTER = DateTimeFormatter.ofPattern(ISO_PATTERN)
diff --git a/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt
new file mode 100644
index 0000000..62a5fd0
--- /dev/null
+++ b/server/src/test/kotlin/org/octopusden/octopus/releasemanagementservice/controller/BuildControllerTest.kt
@@ -0,0 +1,65 @@
+package org.octopusden.octopus.releasemanagementservice.controller
+
+import com.fasterxml.jackson.core.type.TypeReference
+import com.fasterxml.jackson.databind.ObjectMapper
+import org.junit.jupiter.api.TestInstance
+import org.junit.jupiter.api.extension.ExtendWith
+import org.octopusden.octopus.releasemanagementservice.BaseBuildControllerTest
+import org.octopusden.octopus.releasemanagementservice.ReleaseManagementServiceApplication
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
+import org.springframework.boot.test.context.SpringBootTest
+import org.springframework.test.context.ActiveProfiles
+import org.springframework.test.context.junit.jupiter.SpringExtension
+import org.springframework.test.web.servlet.MockMvc
+
+@AutoConfigureMockMvc
+@ExtendWith(SpringExtension::class)
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+@SpringBootTest(
+ classes = [ReleaseManagementServiceApplication::class],
+ webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
+)
+@ActiveProfiles("test")
+class BuildControllerTest : BaseBuildControllerTest(), BaseControllerTest {
+
+ @Autowired
+ protected lateinit var mvc: MockMvc
+
+ @Autowired
+ protected lateinit var mapper: ObjectMapper
+ override fun getMockMvc(): MockMvc = mvc
+ override fun getObjectMapper(): ObjectMapper = mapper
+
+ override fun getBuilds(component: String): Collection {
+ return get(
+ 200,
+ object : TypeReference>() {},
+ "/builds/component/{component}",
+ component
+ )
+ }
+
+ override fun getBuild(component: String, version: String): BuildDTO {
+ return get(
+ 200,
+ object : TypeReference() {},
+ "/builds/component/{component}/version/{version}",
+ component,
+ version
+ )
+ }
+
+ override fun getNotExistedBuildErrorResponse(component: String, version: String): ErrorResponse {
+ return get(
+ 404,
+ object : TypeReference() {},
+ "/builds/component/{component}/version/{version}",
+ component,
+ version
+ )
+ }
+}
\ No newline at end of file
diff --git a/server/src/test/resources/application-test.yml b/server/src/test/resources/application-test.yml
index 81ccf82..79668bd 100644
--- a/server/src/test/resources/application-test.yml
+++ b/server/src/test/resources/application-test.yml
@@ -1,3 +1,6 @@
+releng:
+ url: http://localhost:1080
+
management:
endpoints:
web:
diff --git a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseActuatorTest.kt b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseActuatorTest.kt
new file mode 100644
index 0000000..82a157f
--- /dev/null
+++ b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseActuatorTest.kt
@@ -0,0 +1,19 @@
+package org.octopusden.octopus.releasemanagementservice
+
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Test
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO
+
+abstract class BaseActuatorTest : BaseReleaseManagementServiceTest {
+
+ private val releaseManagementServiceVersion: String = System.getenv("release-management-service.version")
+ ?: throw IllegalStateException("Environment variable 'release-management-service.version' must be provided")
+
+ abstract fun getServiceInfo(): ServiceInfoDTO
+
+ @Test
+ fun serviceInfoTest() {
+ val expected = ServiceInfoDTO(ServiceInfoDTO.Build(releaseManagementServiceVersion))
+ Assertions.assertEquals(expected, getServiceInfo())
+ }
+}
\ No newline at end of file
diff --git a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt
new file mode 100644
index 0000000..b570b79
--- /dev/null
+++ b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseBuildControllerTest.kt
@@ -0,0 +1,50 @@
+package org.octopusden.octopus.releasemanagementservice
+
+import com.fasterxml.jackson.core.type.TypeReference
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Test
+import org.junit.jupiter.params.ParameterizedTest
+import org.junit.jupiter.params.provider.Arguments
+import org.junit.jupiter.params.provider.MethodSource
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.BuildDTO
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ErrorResponse
+import org.octopusden.octopus.releasemanagementservice.client.common.dto.ShortBuildDTO
+import java.util.stream.Stream
+
+abstract class BaseBuildControllerTest : BaseReleaseManagementServiceTest {
+
+ abstract fun getBuilds(component: String): Collection
+ abstract fun getBuild(component: String, version: String): BuildDTO
+ abstract fun getNotExistedBuildErrorResponse(component: String, version: String): ErrorResponse
+
+ @Test
+ fun getBuildsTest() {
+ val builds = getBuilds("ReleaseManagementService")
+ Assertions.assertEquals(
+ loadObject("../test-data/releng/builds.json",
+ object : TypeReference>() {}), builds
+ )
+ }
+
+ @ParameterizedTest
+ @MethodSource("builds")
+ fun getBuildTest(version: String, expected: BuildDTO) {
+ Assertions.assertEquals(expected, getBuild("ReleaseManagementService", version))
+ }
+
+ @Test
+ fun getNotExistedBuildTest() {
+ val errorResponse = getNotExistedBuildErrorResponse("ReleaseManagementService", "1.0.3")
+ val expected = loadObject(
+ "../test-data/releng/build-not-exist-error.json",
+ object : TypeReference() {})
+ Assertions.assertEquals(expected, errorResponse)
+ }
+
+ private fun builds(): Stream = Stream.of(
+ Arguments.of(
+ "1.0.1", loadObject("../test-data/releng/build_1.0.1.json", object : TypeReference() {}),
+ "1.0.2", loadObject("../test-data/releng/build_1.0.2.json", object : TypeReference() {})
+ )
+ )
+}
\ No newline at end of file
diff --git a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt
index 53b5c42..915a7a2 100644
--- a/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt
+++ b/test-common/src/main/kotlin/org/octopusden/octopus/releasemanagementservice/BaseReleaseManagementServiceTest.kt
@@ -1,18 +1,15 @@
package org.octopusden.octopus.releasemanagementservice
-import org.junit.jupiter.api.Assertions
-import org.junit.jupiter.api.Test
+import com.fasterxml.jackson.core.type.TypeReference
+import com.fasterxml.jackson.databind.ObjectMapper
import org.junit.jupiter.api.TestInstance
-import org.octopusden.octopus.releasemanagementservice.client.common.dto.ServiceInfoDTO
+import java.io.File
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
-abstract class BaseReleaseManagementServiceTest {
+interface BaseReleaseManagementServiceTest {
- private val releaseManagementServiceVersion = System.getenv("release-management-service.version")
- abstract fun getServiceInfo(): ServiceInfoDTO
- @Test
- fun serviceInfoTest() {
- val expected = ServiceInfoDTO(ServiceInfoDTO.Build(releaseManagementServiceVersion))
- Assertions.assertEquals(expected, getServiceInfo())
- }
+ fun getObjectMapper(): ObjectMapper
+
+ fun loadObject(file: String, typeReference: TypeReference): T =
+ getObjectMapper().readValue(File(file), typeReference)
}
diff --git a/test-data/releng/build-not-exist-error.json b/test-data/releng/build-not-exist-error.json
new file mode 100644
index 0000000..8ebb44a
--- /dev/null
+++ b/test-data/releng/build-not-exist-error.json
@@ -0,0 +1,4 @@
+{
+ "errorCode": "NOT_FOUND",
+ "errorMessage": "Build ReleaseManagementService:1.0.3 is not found"
+}
\ No newline at end of file
diff --git a/test-data/releng/build_1.0.1.json b/test-data/releng/build_1.0.1.json
new file mode 100644
index 0000000..d9d5f45
--- /dev/null
+++ b/test-data/releng/build_1.0.1.json
@@ -0,0 +1,12 @@
+{
+ "component": "ReleaseManagementService",
+ "version": "1.0.1",
+ "status": "BUILD",
+ "dependencies": [],
+ "commits": [
+ {
+ "repository": "ssh://git@github.com:octopusden/octopus-release-management-service.git",
+ "sha": "0da242ad739a01e7c50aeb522fd17e1eece77bb3"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-data/releng/build_1.0.2.json b/test-data/releng/build_1.0.2.json
new file mode 100644
index 0000000..50870b3
--- /dev/null
+++ b/test-data/releng/build_1.0.2.json
@@ -0,0 +1,12 @@
+{
+ "component": "ReleaseManagementService",
+ "version": "1.0.2",
+ "status": "RELEASE",
+ "dependencies": [],
+ "commits": [
+ {
+ "repository": "ssh://git@github.com:octopusden/octopus-release-management-service.git",
+ "sha": "0da242ad739a01e7c50aeb522fd17e1eece77bb3"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/test-data/releng/builds.json b/test-data/releng/builds.json
new file mode 100644
index 0000000..3950bf5
--- /dev/null
+++ b/test-data/releng/builds.json
@@ -0,0 +1,4 @@
+[
+ {"component":"ReleaseManagementService","version":"1.0.1","status":"BUILD"},
+ {"component":"ReleaseManagementService","version":"1.0.2","status":"RELEASE"}
+]
\ No newline at end of file