Skip to content

Commit

Permalink
BuildController, LegacyRelengClient, tests (#2)
Browse files Browse the repository at this point in the history
* BuildController, LegacyRelengClient, tests

* Fix FT

* releng.host -> releng.url

* Replace hardcoded status codes with HttpStatusCode.*
  • Loading branch information
aryabokon committed Mar 14, 2024
1 parent d7a198c commit 3e49df2
Show file tree
Hide file tree
Showing 43 changed files with 617 additions and 109 deletions.
2 changes: 1 addition & 1 deletion .run/FT.run.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="-Pversion=2.0-SNAPSHOT --stacktrace --info" />
<option name="scriptParameters" value="-Pversion=2.0-SNAPSHOT --stacktrace" />
<option name="taskDescriptions">
<list />
</option>
Expand Down
13 changes: 7 additions & 6 deletions .run/ReleaseManagementServiceApplication.run.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,18 @@
<module name="octopus-release-management-service.release-management-service.main" />
<option name="SPRING_BOOT_MAIN_CLASS" value="org.octopusden.octopus.releasemanagementservice.ReleaseManagementServiceApplication" />
<extension name="net.ashald.envfile">
<option name="IS_ENABLED" value="false" />
<option name="IS_SUBST" value="false" />
<option name="IS_PATH_MACRO_SUPPORTED" value="false" />
<option name="IS_IGNORE_MISSING_FILES" value="false" />
<option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="false" />
<option name="IS_ENABLED" value="true" />
<option name="IS_SUBST" value="true" />
<option name="IS_PATH_MACRO_SUPPORTED" value="true" />
<option name="IS_IGNORE_MISSING_FILES" value="true" />
<option name="IS_ENABLE_EXPERIMENTAL_INTEGRATIONS" value="true" />
<ENTRIES>
<ENTRY IS_ENABLED="true" PARSER="runconfig" IS_EXECUTABLE="false" />
<ENTRY IS_ENABLED="true" PARSER="env" IS_EXECUTABLE="false" PATH="$USER_HOME$/dev.env" />
</ENTRIES>
</extension>
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
</component>
2 changes: 1 addition & 1 deletion .run/UT.run.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="--stacktrace --info" />
<option name="scriptParameters" value="--stacktrace" />
<option name="taskDescriptions">
<list />
</option>
Expand Down
5 changes: 5 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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"]}")
Expand Down
13 changes: 13 additions & 0 deletions buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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")
}
69 changes: 69 additions & 0 deletions buildSrc/src/main/kotlin/org/octopusden/task/MigrateMockData.kt
Original file line number Diff line number Diff line change
@@ -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<String, String>, 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<String, String>() to "releng/builds.json",
"/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.1/build" to emptyMap<String, String>() to "releng/build_1.0.1.json",
"/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.2/build" to emptyMap<String, String>() to "releng/build_1.0.2.json",
)
private val endpointNotFoundToResponseFileName = mapOf(
"/rest/release-engineering/3/component/ReleaseManagementService/version/1.0.3/build" to emptyMap<String, String>() to "releng/build-not-exist-error.json"
)
}
}
2 changes: 2 additions & 0 deletions client/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
Original file line number Diff line number Diff line change
@@ -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<ShortBuildDTO>

@RequestLine("GET /builds/component/{component}/version/{version}")
fun getBuild(@Param("component") component: String, @Param("version") version: String): BuildDTO
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Int, (ErrorResponse) -> Exception> = mapOf(
400 to errorResponseFunction,
404 to errorResponseFunction,
500 to errorResponseFunction
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand All @@ -28,17 +30,19 @@ class ClassicReleaseManagementServiceClient(
getMapper()
)

override fun getBuilds(component: String): Collection<ShortBuildDTO> = 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)
}

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(
Expand Down
11 changes: 11 additions & 0 deletions common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,17 @@ tasks.withType<KotlinCompile>().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")
}
Original file line number Diff line number Diff line change
@@ -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<ShortBuildDTO>, val commits: Collection<CommitDTO>)
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.octopusden.octopus.releasemanagementservice.client.common.dto

enum class BuildStatus {
BUILD,
RC,
RELEASE
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package org.octopusden.octopus.releasemanagementservice.client.common.dto

data class CommitDTO(val repository: String, val sha: String)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package org.octopusden.octopus.releasemanagementservice.client.common.dto

data class ShortBuildDTO(val component: String, val version: String, val status: BuildStatus)
8 changes: 8 additions & 0 deletions ft/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"])
}
Expand Down
3 changes: 3 additions & 0 deletions ft/docker/application-ft.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
releng:
url: http://mockserver:1080

management:
endpoints:
web:
Expand Down
5 changes: 5 additions & 0 deletions ft/docker/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Original file line number Diff line number Diff line change
@@ -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
})
}
}
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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<ShortBuildDTO> {
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
})
}
}
4 changes: 4 additions & 0 deletions server/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ tasks.getByName("dockerBuildImage").doFirst {
}

tasks.withType<Test> {
dependsOn("migrateMockData")
}

tasks.named("migrateMockData") {
dependsOn("composeUp")
}

Expand Down
5 changes: 4 additions & 1 deletion server/dev/application-dev.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
releng:
url: # set via EnvFile

management:
endpoints:
web:
Expand All @@ -6,4 +9,4 @@ management:

logging:
level:
org.octopusden.octopus.releasemanagement.controller: trace
org.octopusden.octopus.releasemanagementservice.controller: trace
Loading

0 comments on commit 3e49df2

Please sign in to comment.