Skip to content

Commit

Permalink
Adapter code for initial implementation of Dingrogu build process usi…
Browse files Browse the repository at this point in the history
…ng PNC build backend.
  • Loading branch information
tecarter94 authored and thescouser89 committed Mar 10, 2025
1 parent d679a1a commit 72f13d0
Show file tree
Hide file tree
Showing 10 changed files with 587 additions and 260 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.jboss.pnc.dingrogu.api.dto.adapter;

import lombok.Builder;
import lombok.Data;
import lombok.extern.jackson.Jacksonized;

@Jacksonized
@Data
@Builder
public class BuildDriverDTO {
String buildDriverUrl;
String buildCommand;
boolean debugEnabled;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.jboss.pnc.dingrogu.api.dto.adapter;

import lombok.Builder;
import lombok.Data;
import lombok.extern.jackson.Jacksonized;

@Jacksonized
@Data
@Builder
public class EnvironmentDriverCompleteDTO {
String environmentDriverUrl;
boolean debugEnabled;
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,12 @@
@Jacksonized
@Data
@Builder
public class KonfluxBuildDriverDTO {

String konfluxBuildDriverUrl;

public class EnvironmentDriverCreateDTO {
String environmentDriverUrl;
String environmentLabel;
String environmentImage;
String buildContentId;

String buildScript;
String buildTool;

String recipeImage;
String podMemoryOverride;

String namespace;
String buildToolVersion;
String javaVersion;
boolean debugEnabled;
String buildConfigId;
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
package org.jboss.pnc.dingrogu.api.dto.workflow;

import java.util.Map;

import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Data;
import lombok.extern.jackson.Jacksonized;

import org.jboss.pnc.api.enums.AlignmentPreference;
import org.jboss.pnc.api.enums.BuildCategory;
import org.jboss.pnc.api.enums.BuildType;
import org.jboss.pnc.dingrogu.api.dto.adapter.KonfluxBuildDriverDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.BuildDriverDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.EnvironmentDriverCompleteDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.EnvironmentDriverCreateDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.RepositoryDriverPromoteDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.RepositoryDriverSealDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.RepositoryDriverSetupDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.RepourAdjustDTO;
import org.jboss.pnc.dingrogu.api.dto.adapter.ReqourAdjustDTO;

import java.util.Map;
import lombok.Builder;
import lombok.Data;
import lombok.extern.jackson.Jacksonized;

@Jacksonized
@Data
Expand All @@ -25,7 +29,8 @@ public class BuildWorkDTO {
String repourUrl;
String reqourUrl;
String repositoryDriverUrl;
String konfluxBuildDriverUrl;
String buildDriverUrl;
String environmentDriverUrl;

String scmRepoURL;
String scmRevision;
Expand All @@ -44,14 +49,12 @@ public class BuildWorkDTO {
Map<String, String> genericParameters;
String buildConfigurationId;
String correlationId;
boolean debugEnabled;
String environmentLabel;
String environmentImage;

String buildScript;
String buildTool;
String recipeImage;
String podMemoryOverride;
String namespace;
String buildToolVersion;
String javaVersion;

public RepourAdjustDTO toRepourAdjustDTO() {
String alignmentPreferenceName = null;
Expand Down Expand Up @@ -109,17 +112,30 @@ public RepositoryDriverSetupDTO toRepositoryDriverSetupDTO() {
.build();
}

public KonfluxBuildDriverDTO toKonfluxBuildDriverDTO() {
return KonfluxBuildDriverDTO.builder()
.konfluxBuildDriverUrl(konfluxBuildDriverUrl)
public EnvironmentDriverCreateDTO toEnvironmentDriverCreateDTO() {
return EnvironmentDriverCreateDTO.builder()
.environmentDriverUrl(environmentDriverUrl)
.environmentLabel(environmentLabel)
.environmentImage(environmentImage)
.buildContentId(buildContentId)
.buildScript(buildScript)
.buildTool(buildTool)
.recipeImage(recipeImage)
.podMemoryOverride(podMemoryOverride)
.namespace(namespace)
.buildToolVersion(buildToolVersion)
.javaVersion(javaVersion)
.debugEnabled(debugEnabled)
.buildConfigId(buildConfigurationId)
.build();
}

public BuildDriverDTO toBuildDriverDTO() {
return BuildDriverDTO.builder()
.buildDriverUrl(buildDriverUrl)
.buildCommand(buildScript)
.debugEnabled(debugEnabled)
.build();
}

public EnvironmentDriverCompleteDTO toEnvironmentDriverCompleteDTO() {
return EnvironmentDriverCompleteDTO.builder()
.environmentDriverUrl(environmentDriverUrl)
.debugEnabled(debugEnabled)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
package org.jboss.pnc.dingrogu.restadapter.adapter;

import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Map;
import java.util.Optional;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.jboss.pnc.api.builddriver.dto.BuildCancelRequest;
import org.jboss.pnc.api.builddriver.dto.BuildCompleted;
import org.jboss.pnc.api.builddriver.dto.BuildRequest;
import org.jboss.pnc.api.builddriver.dto.BuildResponse;
import org.jboss.pnc.api.dto.Request;
import org.jboss.pnc.api.environmentdriver.dto.EnvironmentCreateResult;
import org.jboss.pnc.api.reqour.dto.AdjustResponse;
import org.jboss.pnc.dingrogu.api.client.BuildDriver;
import org.jboss.pnc.dingrogu.api.client.BuildDriverProducer;
import org.jboss.pnc.dingrogu.api.dto.adapter.BuildDriverDTO;
import org.jboss.pnc.dingrogu.api.endpoint.AdapterEndpoint;
import org.jboss.pnc.dingrogu.api.endpoint.WorkflowEndpoint;
import org.jboss.pnc.dingrogu.common.TaskHelper;
import org.jboss.pnc.rex.api.CallbackEndpoint;
import org.jboss.pnc.rex.api.TaskEndpoint;
import org.jboss.pnc.rex.dto.ServerResponseDTO;
import org.jboss.pnc.rex.dto.TaskDTO;
import org.jboss.pnc.rex.model.requests.StartRequest;
import org.jboss.pnc.rex.model.requests.StopRequest;

import com.fasterxml.jackson.databind.ObjectMapper;

import io.quarkus.logging.Log;

@ApplicationScoped
public class BuildDriverAdapter implements Adapter<BuildDriverDTO> {

@ConfigProperty(name = "dingrogu.url")
String dingroguUrl;

@Inject
ObjectMapper objectMapper;

@Inject
CallbackEndpoint callbackEndpoint;

@Inject
BuildDriverProducer buildDriverProducer;

@Inject
ReqourAdjustAdapter reqourAdjustAdapter;

@Inject
EnvironmentDriverCreateAdapter environmentDriverCreateAdapter;

@Inject
TaskEndpoint taskEndpoint;

@Override
public String getAdapterName() {
return "build-driver";
}

@Override
public Optional<Object> start(String correlationId, StartRequest startRequest) {

Request callback;
try {
callback = new Request(
Request.Method.POST,
new URI(AdapterEndpoint.getCallbackAdapterEndpoint(dingroguUrl, getAdapterName(), correlationId)),
TaskHelper.getHTTPHeaders(),
null);
} catch (URISyntaxException e) {
Log.error(e);
throw new RuntimeException(e);
}
BuildDriverDTO dto = objectMapper.convertValue(startRequest.getPayload(), BuildDriverDTO.class);

Map<String, Object> pastResults = startRequest.getTaskResults();
Object envDriverCreate = pastResults.get(environmentDriverCreateAdapter.getRexTaskName(correlationId));
EnvironmentCreateResult environmentCreateResponse = objectMapper
.convertValue(envDriverCreate, EnvironmentCreateResult.class);

Object reqourAdjust = pastResults.get(reqourAdjustAdapter.getRexTaskName(correlationId));
AdjustResponse adjustResponse = objectMapper.convertValue(reqourAdjust, AdjustResponse.class);

BuildDriver buildDriver = buildDriverProducer.getBuildDriver(dto.getBuildDriverUrl());

BuildRequest buildRequest = BuildRequest.builder()
.scmUrl(adjustResponse.getInternalUrl().getReadonlyUrl())
.scmRevision(adjustResponse.getDownstreamCommit())
.scmTag(adjustResponse.getTag())
.command(dto.getBuildCommand())
.workingDirectory(environmentCreateResponse.getWorkingDirectory())
.environmentBaseUrl(environmentCreateResponse.getEnvironmentBaseUri().toString())
.debugEnabled(dto.isDebugEnabled())
.completionCallback(callback)
.heartbeatConfig(null) // TODO
.build();
Log.infof("Build request: %s", buildRequest);

BuildResponse buildResponse = buildDriver.build(buildRequest).toCompletableFuture().join();
Log.infof("Initial build response: %s", buildResponse);
return Optional.ofNullable(buildResponse);
}

@Override
public void callback(String correlationId, Object object) {
try {
BuildCompleted response = objectMapper.convertValue(object, BuildCompleted.class);
Log.infof("Build response: %s", response);
try {
if (response == null || !response.getBuildStatus().isSuccess()) {
callbackEndpoint.fail(getRexTaskName(correlationId), response, null);
} else {
callbackEndpoint.succeed(getRexTaskName(correlationId), response, null);
}
} catch (Exception e) {
Log.error("Error happened in callback adapter", e);
}
} catch (IllegalArgumentException e) {
try {
callbackEndpoint.fail(getRexTaskName(correlationId), object, null);
} catch (Exception ex) {
Log.error("Error happened in callback adapter", ex);
}
}
}

@Override
public String getNotificationEndpoint(String adapterUrl) {
return adapterUrl + WorkflowEndpoint.BUILD_REX_NOTIFY;
}

@Override
public void cancel(String correlationId, StopRequest stopRequest) {

// get own unique id created by build-driver sent back to rex in the start method
TaskDTO ownTask = taskEndpoint.getSpecific(getRexTaskName(correlationId));
List<ServerResponseDTO> serverResponses = ownTask.getServerResponses();

if (serverResponses.isEmpty()) {
throw new RuntimeException(
"We didn't get any server response from " + getAdapterName() + ": " + correlationId);
}

ServerResponseDTO last = serverResponses.get(serverResponses.size() - 1);
BuildResponse buildResponse = objectMapper.convertValue(last.getBody(), BuildResponse.class);

BuildDriverDTO dto = objectMapper.convertValue(stopRequest.getPayload(), BuildDriverDTO.class);
BuildDriver buildDriver = buildDriverProducer.getBuildDriver(dto.getBuildDriverUrl());

Map<String, Object> pastResults = stopRequest.getTaskResults();
Object envDriverCreate = pastResults.get(environmentDriverCreateAdapter.getRexTaskName(correlationId));
EnvironmentCreateResult environmentCreateResponse = objectMapper
.convertValue(envDriverCreate, EnvironmentCreateResult.class);

BuildCancelRequest buildCancelRequest = BuildCancelRequest.builder()
.buildEnvironmentBaseUrl(environmentCreateResponse.getEnvironmentBaseUri().toString())
.buildExecutionId(buildResponse.getBuildExecutionId())
.build();
buildDriver.cancel(buildCancelRequest);
}

@Override
public boolean shouldGetResultsFromDependencies() {
return true;
}
}
Loading

0 comments on commit 72f13d0

Please sign in to comment.