Skip to content

Commit

Permalink
add backend checks for BuildInfo
Browse files Browse the repository at this point in the history
  • Loading branch information
xjusko committed Oct 17, 2024
1 parent 66fd26f commit e22ec67
Show file tree
Hide file tree
Showing 6 changed files with 341 additions and 39 deletions.
4 changes: 2 additions & 2 deletions src/main/java/org/jboss/set/BuildTriggerResource.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,14 @@ public class BuildTriggerResource {
@Path("/trigger")
public Response triggerBuild(@NotNull @Valid BuildInfo buildInfo) {
String email = idToken.claim(Claims.email).orElse("Email not provided in the token").toString();
if (buildInfo.streams == null || buildInfo.streams.isEmpty()) {
if (buildInfo.getStreams() == null || buildInfo.getStreams().isEmpty()) {
return Response.status(400, "List of streams is empty").build();
}
logger.infof("Triggering build for product %s by %s", buildInfo, email);

buildTrigger.triggerBuild(BuildJMSTriggerPayload.from(buildInfo, email));

return Response.ok("Triggered build for " + buildInfo.gitRepo + ":" + buildInfo.projectVersion).build();
return Response.ok("Triggered build for " + buildInfo.getGitRepo() + ":" + buildInfo.getProjectVersion()).build();
}

@GET
Expand Down
15 changes: 8 additions & 7 deletions src/main/java/org/jboss/set/GitBuildInfoAssembler.java
Original file line number Diff line number Diff line change
Expand Up @@ -129,13 +129,14 @@ private BuildInfo constructGitlabBuild(String[] splitUrl, URL tagUrl, boolean is
}

private BuildInfo buildBuildInfo(URL tagUrl, String codespace, String repository, String version, String commitSHA) {
BuildInfo buildInfo = new BuildInfo();
buildInfo.tag = tagUrl.toString();
buildInfo.commitSha = commitSHA;
buildInfo.gitRepo = String.format("%s://%s/%s/%s", tagUrl.getProtocol(), tagUrl.getHost(), codespace, repository);
buildInfo.projectVersion = version;

logger.infof("Build created with following parameters - sha: %s, version: %s, link: %s", buildInfo.commitSha, buildInfo.projectVersion, buildInfo.tag);
BuildInfo buildInfo = new BuildInfo.Builder()
.tag(tagUrl.toString())
.commitSha(commitSHA)
.gitRepo(String.format("%s://%s/%s/%s", tagUrl.getProtocol(), tagUrl.getHost(), codespace, repository))
.projectVersion(version)
.build();

logger.infof("Build created with following parameters - sha: %s, version: %s, link: %s", buildInfo.getCommitSha(), buildInfo.getProjectVersion(), buildInfo.getTag());
return buildInfo;
}
}
124 changes: 115 additions & 9 deletions src/main/java/org/jboss/set/model/json/BuildInfo.java
Original file line number Diff line number Diff line change
@@ -1,24 +1,130 @@
package org.jboss.set.model.json;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;

import java.util.List;

@JsonDeserialize(builder = BuildInfo.Builder.class)
public class BuildInfo {

@NotNull
public String tag;
@NotBlank
@Pattern(regexp = "^https://.+$", message = "Tag must start with https://")
private final String tag;

@NotNull
public String gitRepo;
@NotBlank
@Pattern(regexp = "^https://.+$", message = "Repository must start with https://")
private final String gitRepo;

@NotNull
public String projectVersion;
@NotBlank
private final String projectVersion;

@NotNull
public String commitSha;
@NotBlank
@Pattern(regexp = "^[a-fA-F0-9]{7,40}$", message = "Commit SHA must be a valid hexadecimal string (7 to 40 characters).")
private final String commitSha;

public List<String> streams;
// Maximum of 5 streams allowed, based on Stream.values().length.
@Size(max = 5, message = "The maximum number of streams allowed is 5.")
private final List<String> streams;

BuildInfo(Builder builder) {
this.tag = builder.tag;
this.gitRepo = builder.gitRepo;
this.projectVersion = builder.projectVersion;
this.commitSha = builder.commitSha;
this.streams = builder.streams;
}

public Builder toBuilder() {
return new Builder()
.tag(this.tag)
.gitRepo(this.gitRepo)
.projectVersion(this.projectVersion)
.commitSha(this.commitSha)
.streams(this.streams);
}

public @NotNull String getTag() {
return tag;
}

public @NotNull String getGitRepo() {
return gitRepo;
}

public @NotNull String getProjectVersion() {
return projectVersion;
}

public @NotNull String getCommitSha() {
return commitSha;
}

public List<String> getStreams() {
return streams;
}

@JsonPOJOBuilder(withPrefix = "")
public static class Builder {
private String tag;
private String gitRepo;
private String projectVersion;
private String commitSha;
private List<String> streams;

public Builder tag(String tag) {
this.tag = tag.trim();
return this;
}

public Builder gitRepo(String gitRepo) {
this.gitRepo = gitRepo.trim();
return this;
}

public Builder projectVersion(String projectVersion) {
this.projectVersion = projectVersion.trim();
return this;
}

public Builder commitSha(String commitSha) {
this.commitSha = commitSha.trim();
return this;
}

public Builder streams(List<String> streams) {
this.streams = streams;
return this;
}

// Build method
public BuildInfo build() {
validateFields();
return new BuildInfo(this);
}

private void validateFields() {
if (tag == null || !tag.startsWith("https://")) {
throw new IllegalArgumentException("Tag must start with https://");
}

if (gitRepo == null || !gitRepo.startsWith("https://")) {
throw new IllegalArgumentException("Repository must start with https://");
}

if (commitSha == null || !commitSha.matches("^[a-fA-F0-9]{7,40}$")) {
throw new IllegalArgumentException("Commit SHA must be a valid hexadecimal string (7 to 40 characters).");
}

if (streams != null && streams.size() > Stream.values().length) {
throw new IllegalArgumentException(String.format("The maximum number of streams allowed is %d.", Stream.values().length));
}
}
}

@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ public static BuildJMSTriggerPayload from(BuildInfo buildInfo, String email) {
BuildJMSTriggerPayload createBuildPayload = new BuildJMSTriggerPayload();

createBuildPayload.email = email;
createBuildPayload.tag = buildInfo.tag;
createBuildPayload.gitRepo = buildInfo.gitRepo;
createBuildPayload.projectVersion = buildInfo.projectVersion;
createBuildPayload.commitSha = buildInfo.commitSha;
createBuildPayload.streams = getStreams(buildInfo.streams);
createBuildPayload.tag = buildInfo.getTag();
createBuildPayload.gitRepo = buildInfo.getGitRepo();
createBuildPayload.projectVersion = buildInfo.getProjectVersion();
createBuildPayload.commitSha = buildInfo.getCommitSha();
createBuildPayload.streams = getStreams(buildInfo.getStreams());

return createBuildPayload;
}
Expand Down
31 changes: 15 additions & 16 deletions src/test/java/org/jboss/set/BuildTriggerResourceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
public class BuildTriggerResourceTest {

private static final String USER_EMAIL = "[email protected]";
private static final String BUILD_INFO_TAG = "git+https://github.com/non-exisitent/repo/tree/1.0.0.Final.git";
private static final String BUILD_INFO_GIT_REPO = "git+https://github.com/non-exisitent/repo.git";
private static final String BUILD_INFO_TAG = "https://github.com/non-exisitent/repo/tree/1.0.0.Final.git";
private static final String BUILD_INFO_GIT_REPO = "https://github.com/non-exisitent/repo.git";
private static final String BUILD_INFO_PROJECT_VERSION = "1.0.0.Final";
private static final String BUILD_INFO_COMMIT_SHA = "61ec86095de795f5fb817a7cc824d8d7cfb9ae51";
private static final List<String> BUILD_INFO_STREAMS = List.of(EAP_7_3_X.frontEnd);
Expand All @@ -41,8 +41,7 @@ public class BuildTriggerResourceTest {
@Claim(key = "email", value = USER_EMAIL)
})
public void testTriggerEndpoint() throws Exception {
BuildInfo buildInfo = createTestBuildInfoWithoutStream();
buildInfo.streams = BUILD_INFO_STREAMS;
BuildInfo buildInfo = createTestBuildInfo();

given()
.body(objectMapper.writeValueAsString(buildInfo))
Expand All @@ -68,8 +67,7 @@ public void testTriggerEndpoint() throws Exception {
@Disabled("Anonymous identity doesn't work in tests. (https://github.com/quarkusio/quarkus/issues/21888)")
@TestSecurity
public void testTriggerEndpointNoAuth() throws Exception {
BuildInfo buildInfo = createTestBuildInfoWithoutStream();
buildInfo.streams = BUILD_INFO_STREAMS;
BuildInfo buildInfo = createTestBuildInfo();

given()
.header("Authorization", "")
Expand All @@ -87,8 +85,9 @@ public void testTriggerEndpointNoAuth() throws Exception {
@Claim(key = "email", value = USER_EMAIL)
})
public void testTriggerEndpointInvalidStream() throws Exception {
BuildInfo buildInfo = createTestBuildInfoWithoutStream();
buildInfo.streams = List.of("Invalid");
BuildInfo buildInfo = createTestBuildInfo().toBuilder()
.streams(List.of("Invalid"))
.build();

given()
.body(objectMapper.writeValueAsString(buildInfo))
Expand All @@ -98,13 +97,13 @@ public void testTriggerEndpointInvalidStream() throws Exception {
.statusCode(422);
}

private BuildInfo createTestBuildInfoWithoutStream() {
BuildInfo buildInfo = new BuildInfo();
buildInfo.tag = BUILD_INFO_TAG;
buildInfo.gitRepo = BUILD_INFO_GIT_REPO;
buildInfo.projectVersion = BUILD_INFO_PROJECT_VERSION;
buildInfo.commitSha = BUILD_INFO_COMMIT_SHA;

return buildInfo;
private BuildInfo createTestBuildInfo() {
return new BuildInfo.Builder()
.tag(BUILD_INFO_TAG)
.gitRepo(BUILD_INFO_GIT_REPO)
.projectVersion(BUILD_INFO_PROJECT_VERSION)
.commitSha(BUILD_INFO_COMMIT_SHA)
.streams(BUILD_INFO_STREAMS)
.build();
}
}
Loading

0 comments on commit e22ec67

Please sign in to comment.