Skip to content
Snippets Groups Projects
Verified Commit cc4d95f7 authored by Jan-Niclas Strüwer's avatar Jan-Niclas Strüwer
Browse files

Integrated usage of dummy API. Careful hardcoded paths in code !

parent c76f775d
No related branches found
No related tags found
1 merge request!8Dev
...@@ -22,7 +22,6 @@ allOpen { ...@@ -22,7 +22,6 @@ allOpen {
group = "de.fraunhofer.iem" group = "de.fraunhofer.iem"
version = "0.0.2-SNAPSHOT" version = "0.0.2-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17 java.sourceCompatibility = JavaVersion.VERSION_17
configurations { configurations {
compileOnly { compileOnly {
extendsFrom(configurations.annotationProcessor.get()) extendsFrom(configurations.annotationProcessor.get())
...@@ -47,6 +46,10 @@ dependencies { ...@@ -47,6 +46,10 @@ dependencies {
implementation("org.eclipse.jgit:org.eclipse.jgit:6.6.0.202305301015-r") implementation("org.eclipse.jgit:org.eclipse.jgit:6.6.0.202305301015-r")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1") implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1")
implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("io.ktor:ktor-client-core:2.3.3")
implementation("io.ktor:ktor-client-cio:2.3.3")
implementation("io.ktor:ktor-client-content-negotiation:2.3.3")
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.3")
developmentOnly("org.springframework.boot:spring-boot-devtools") developmentOnly("org.springframework.boot:spring-boot-devtools")
runtimeOnly("org.postgresql:postgresql") runtimeOnly("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-test") { testImplementation("org.springframework.boot:spring-boot-starter-test") {
......
rootProject.name = "data-provider" rootProject.name = "data-provider"
\ No newline at end of file
...@@ -12,8 +12,7 @@ import de.fraunhofer.iem.dataprovider.taskManager.tasks.dataQuery.GetGitlabProje ...@@ -12,8 +12,7 @@ import de.fraunhofer.iem.dataprovider.taskManager.tasks.dataQuery.GetGitlabProje
import de.fraunhofer.iem.dataprovider.taskManager.tasks.dataQuery.GetRepositoryDetailsTask import de.fraunhofer.iem.dataprovider.taskManager.tasks.dataQuery.GetRepositoryDetailsTask
import de.fraunhofer.iem.dataprovider.taskManager.tasks.kpiCalculation.MetricsTask import de.fraunhofer.iem.dataprovider.taskManager.tasks.kpiCalculation.MetricsTask
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.occmd.OccmdTask import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.occmd.OccmdTask
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.OrtAdvisorTask import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.OrtApiTask
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.OrtAnalyzerTask
import de.fraunhofer.iem.dataprovider.tool.service.ToolService import de.fraunhofer.iem.dataprovider.tool.service.ToolService
import de.fraunhofer.iem.dataprovider.toolRun.service.ToolRunService import de.fraunhofer.iem.dataprovider.toolRun.service.ToolRunService
import jakarta.annotation.PreDestroy import jakarta.annotation.PreDestroy
...@@ -35,10 +34,10 @@ class TaskManager( ...@@ -35,10 +34,10 @@ class TaskManager(
private val config: Config, private val config: Config,
private val openCodeGitlabConfiguration: OpenCodeGitlabApiConfiguration, private val openCodeGitlabConfiguration: OpenCodeGitlabApiConfiguration,
private val toolRunService: ToolRunService, private val toolRunService: ToolRunService,
private val toolService: ToolService,
private val repositoryService: RepositoryService, private val repositoryService: RepositoryService,
private val kpiService: KPIService, private val kpiService: KPIService,
private val dependencyService: DependencyService, private val dependencyService: DependencyService
private val toolService: ToolService
) { ) {
// The used default dispatcher is ok for CPU-bound workloads. However, // The used default dispatcher is ok for CPU-bound workloads. However,
...@@ -127,39 +126,21 @@ class TaskManager( ...@@ -127,39 +126,21 @@ class TaskManager(
groupId, groupId,
toolRunService toolRunService
) )
ioWorker.addTask(
val ortAnalyzerTask = OrtAnalyzerTask( OrtApiTask(
event.outputDirectory, ::addEvent,
config.toolResultsTargetDirectory, event.repoId,
::addEvent, dependencyService,
event.repoId, toolService,
groupId repositoryService
)
) )
groupTaskManager.addTaskToGroup(groupId, ortAnalyzerTask.taskID)
groupTaskManager.addTaskToGroup(groupId, occmdTask.taskID) groupTaskManager.addTaskToGroup(groupId, occmdTask.taskID)
worker.addTask(ortAnalyzerTask)
worker.addTask(occmdTask) worker.addTask(occmdTask)
} }
is OrtAnalyzerDoneEvent -> {
logger.info("Ort analyzer done event received")
val ortAdvisorTask = OrtAdvisorTask(
event.resultFileOutputDirectoryPath,
config.toolResultsTargetDirectory,
::addEvent,
event.repoId,
event.groupID,
dependencyService,
event.taskId,
toolService,
repositoryService
)
worker.addTask(ortAdvisorTask)
}
is GroupTaskDoneEvent -> { is GroupTaskDoneEvent -> {
logger.info("GroupTaskDoneEvent received") logger.info("GroupTaskDoneEvent received")
groupTaskManager.taskInGroupFinished(event.groupId, event.taskId) groupTaskManager.taskInGroupFinished(event.groupId, event.taskId)
......
package de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort
import de.fraunhofer.iem.dataprovider.dependency.dto.DependencyCreateDto
import de.fraunhofer.iem.dataprovider.taskManager.events.Event
import de.fraunhofer.iem.dataprovider.taskManager.events.OrtAnalyzerDoneEvent
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ToolProcessTask
import org.springframework.core.io.ClassPathResource
import org.springframework.core.io.Resource
import java.io.File
import java.nio.file.Path
import java.nio.file.Paths
import java.util.*
class OrtAnalyzerTask(
repositoryDirectoryPath: String,
outputDirectoryPath: String,
override val responseChannel: suspend (event: Event) -> Unit,
override val repoId: UUID,
override val groupID: UUID? = null
) : ToolProcessTask<List<DependencyCreateDto>>() {
private val resource: Resource = ClassPathResource("scripts/ort/ort_analyzer.sh")
override val outputDirectory = Paths.get(outputDirectoryPath, "ort-analyzer", taskID.toString()).toString()
override val resultFileOutputPath: Path = Paths.get(outputDirectory, "analyzer-result.json")
private val copiedRepositoryPath = Paths.get(outputDirectory, "copiedRepo")
override val flags = arrayOf(resource.file.absolutePath, copiedRepositoryPath.toString(), outputDirectory)
override suspend fun parseProcessResults(resultPath: Path): List<DependencyCreateDto> {
return emptyList()
}
override suspend fun storeResultsInDb(result: List<DependencyCreateDto>) {
}
override suspend fun handleProcessReturn(p: Process) {
responseChannel(OrtAnalyzerDoneEvent(outputDirectory, repoId, taskID, groupID))
}
override fun cleanUp() {
File(copiedRepositoryPath.toUri()).deleteRecursively()
}
init {
val repoFile = File(repositoryDirectoryPath)
val copiedRepo = File(copiedRepositoryPath.toUri())
repoFile.copyRecursively(copiedRepo)
}
}
\ No newline at end of file
...@@ -8,49 +8,55 @@ import de.fraunhofer.iem.dataprovider.dependency.enumeration.VulnerabilityScorin ...@@ -8,49 +8,55 @@ import de.fraunhofer.iem.dataprovider.dependency.enumeration.VulnerabilityScorin
import de.fraunhofer.iem.dataprovider.dependency.service.DependencyService import de.fraunhofer.iem.dataprovider.dependency.service.DependencyService
import de.fraunhofer.iem.dataprovider.repository.service.RepositoryService import de.fraunhofer.iem.dataprovider.repository.service.RepositoryService
import de.fraunhofer.iem.dataprovider.taskManager.events.Event import de.fraunhofer.iem.dataprovider.taskManager.events.Event
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ToolProcessTask import de.fraunhofer.iem.dataprovider.taskManager.tasks.Task
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.dto.OrtResultDto import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.dto.OrtResultDto
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.json.AdvisorResultJson import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.json.AdvisorResultJson
import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.json.OrtJson import de.fraunhofer.iem.dataprovider.taskManager.tasks.tools.ort.json.OrtJson
import de.fraunhofer.iem.dataprovider.tool.dto.CreateToolDto import de.fraunhofer.iem.dataprovider.tool.dto.CreateToolDto
import de.fraunhofer.iem.dataprovider.tool.service.ToolService import de.fraunhofer.iem.dataprovider.tool.service.ToolService
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
import org.springframework.core.io.ClassPathResource
import org.springframework.core.io.Resource
import java.io.IOException
import java.nio.file.Path
import java.nio.file.Paths
import java.util.* import java.util.*
class OrtAdvisorTask( class OrtApiTask(
analyzerResultLocation: String,
outputDirectoryPath: String,
override val responseChannel: suspend (event: Event) -> Unit, override val responseChannel: suspend (event: Event) -> Unit,
override val repoId: UUID, val repoId: UUID,
override val groupID: UUID?,
private val dependencyService: DependencyService, private val dependencyService: DependencyService,
override val taskID: UUID,
private val toolService: ToolService, private val toolService: ToolService,
private val repositoryService: RepositoryService private val repositoryService: RepositoryService
) : ToolProcessTask<List<DependencyCreateDto>>() { ) : Task() {
val json = Json { ignoreUnknownKeys = true }
private val resource: Resource = ClassPathResource("scripts/ort/ort_advisor.sh") override suspend fun execute() {
override val outputDirectory = Paths.get(outputDirectoryPath, "ort-advisor", taskID.toString()).toString()
override val resultFileOutputPath: Path = Paths.get(outputDirectory, "advisor-result.json") val client = HttpClient(CIO) {
install(ContentNegotiation) {
override val flags = arrayOf(resource.file.absolutePath, analyzerResultLocation, outputDirectory) json(
json
)
}
}
override suspend fun parseProcessResults(resultPath: Path): List<DependencyCreateDto> { val response: HttpResponse = client.get("http://localhost:3000/ort")
val ortJson = response.body<OrtJson>()
println(response.status)
println(ortJson)
client.close()
val ortDto = ortJsonToDto(ortJson)
val dependencies = mutableListOf<DependencyCreateDto>() val dependencies = mutableListOf<DependencyCreateDto>()
val ortJson = getOrtResultsFromFile(resultPath)
ortJson.packages.forEach { p -> ortDto.packages.forEach { p ->
if (p.nameAndVersion != null) { if (p.nameAndVersion != null) {
dependencies.add(DependencyCreateDto(name = p.nameAndVersion)) dependencies.add(DependencyCreateDto(name = p.nameAndVersion))
} }
} }
ortJson.advisorResults.forEach { advisorResult -> ortDto.advisorResults.forEach { advisorResult ->
var dependency = dependencies.find { it.name == advisorResult.identifier } var dependency = dependencies.find { it.name == advisorResult.identifier }
...@@ -78,38 +84,11 @@ class OrtAdvisorTask( ...@@ -78,38 +84,11 @@ class OrtAdvisorTask(
} }
} }
return dependencies storeResultsInDb(dependencies)
}
// TODO: Requires a database purge / association with the tool run
override suspend fun storeResultsInDb(result: List<DependencyCreateDto>) {
val dependencies = mutableListOf<DependencyEntity>()
result.forEach { dependency ->
val dependencyEntity = dependency.toDbObject()
dependencyService.save(dependencyEntity)
dependencies.add(dependencyEntity)
}
val tool = toolService.findOrCreateTool(CreateToolDto("ORT", "ORT", "docker-snapshot"))
val repo = repositoryService.findRepoByID(repoId)
if (repo != null) {
repo.toolEntities.add(tool)
repo.dependencyEntities.addAll(dependencies)
repositoryService.save(repo)
}
} }
} private fun ortJsonToDto(rawJson: OrtJson): OrtResultDto {
fun getOrtResultsFromFile(resultPath: Path): OrtResultDto {
val resFile = resultPath.toFile()
if (resFile.exists()) {
val results = mutableListOf<AdvisorResultJson>() val results = mutableListOf<AdvisorResultJson>()
val resString = resFile.readText()
val json = Json { ignoreUnknownKeys = true }
val rawJson = json.decodeFromString<OrtJson>(resString)
rawJson.advisor?.results?.advisorResults?.forEach { (key, value) -> rawJson.advisor?.results?.advisorResults?.forEach { (key, value) ->
if (value is JsonArray) { if (value is JsonArray) {
value.forEach { res -> value.forEach { res ->
...@@ -132,5 +111,22 @@ fun getOrtResultsFromFile(resultPath: Path): OrtResultDto { ...@@ -132,5 +111,22 @@ fun getOrtResultsFromFile(resultPath: Path): OrtResultDto {
return OrtResultDto(advisorResults = results, packages = packages) return OrtResultDto(advisorResults = results, packages = packages)
} }
throw IOException("File not found / Path is no file.") // TODO: Requires a database purge / association with the tool run
private suspend fun storeResultsInDb(result: List<DependencyCreateDto>) {
val dependencies = mutableListOf<DependencyEntity>()
result.forEach { dependency ->
val dependencyEntity = dependency.toDbObject()
dependencyService.save(dependencyEntity)
dependencies.add(dependencyEntity)
}
val tool = toolService.findOrCreateTool(CreateToolDto("ORT", "ORT", "docker-snapshot"))
val repo = repositoryService.findRepoByID(repoId)
if (repo != null) {
repo.toolEntities.add(tool)
repo.dependencyEntities.addAll(dependencies)
repositoryService.save(repo)
}
}
} }
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment

Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.