Skip to content

Commit 41d4c07

Browse files
committed
use paged results from gitlab to consolidate
1 parent d0da86b commit 41d4c07

File tree

8 files changed

+113
-39
lines changed

8 files changed

+113
-39
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.redhat.labs.omp.models;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import javax.ws.rs.core.GenericType;
7+
import javax.ws.rs.core.Response;
8+
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
import lombok.AllArgsConstructor;
13+
import lombok.Builder;
14+
import lombok.Data;
15+
import lombok.NoArgsConstructor;
16+
17+
/**
18+
* A simple class holding a results from a number of paged queries to gitlab
19+
* @author mcanoy
20+
*
21+
* @param <T>
22+
*/
23+
@Data
24+
@Builder
25+
@NoArgsConstructor
26+
@AllArgsConstructor
27+
public class PagedResults<T> {
28+
public static final Logger LOGGER = LoggerFactory.getLogger(PagedResults.class);
29+
30+
@Builder.Default private int number = 0;
31+
@Builder.Default private int total = 1;
32+
@Builder.Default private List<T> results = new ArrayList<>();
33+
34+
35+
public boolean hasMore() {
36+
return total > number;
37+
}
38+
39+
public void update(Response response, GenericType<List<T>> type) {
40+
41+
if(number == 0) {
42+
String totalPageString = response.getHeaderString("X-Total-Pages");
43+
total = Integer.valueOf(totalPageString);
44+
LOGGER.trace("TOTAL PAGES {}", total);
45+
}
46+
List<T> p = response.readEntity(type);
47+
results.addAll(p);
48+
number++;
49+
}
50+
51+
public int size() {
52+
return results.size();
53+
}
54+
}

src/main/java/com/redhat/labs/omp/models/gitlab/Project.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,9 @@ public class Project {
131131
private Integer groupWithProjectTemplatesId;
132132
@JsonbProperty("packages_enabled")
133133
private Boolean packagesEnabled;
134+
@JsonbProperty("path_with_namespace")
135+
private String pathWithNamespace;
136+
134137

135138
@JsonbTransient
136139
private boolean first;

src/main/java/com/redhat/labs/omp/rest/client/GitLabService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public interface GitLabService {
3636
// reference: https://docs.gitlab.com/ee/api/groups.html#list-a-groups-projects
3737
@GET
3838
@Path("/groups/{id}/projects")
39-
List<Project> getProjectsbyGroup(@PathParam("id") @Encoded Integer groupId, @QueryParam("include_subgroups") @Encoded Boolean includeSubgroups);
39+
Response getProjectsbyGroup(@PathParam("id") @Encoded Integer groupId, @QueryParam("include_subgroups") @Encoded Boolean includeSubgroups, @QueryParam("per_page") int perPage, @QueryParam("page") int page);
4040

4141
//reference: https://docs.gitlab.com/ee/api/groups.html#list-a-groups-subgroups
4242
@GET

src/main/java/com/redhat/labs/omp/service/EngagementService.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ public Status getProjectStatus(String customerName, String engagementName) {
161161
public Optional<Project> getProject(String customerName, String engagementName) {
162162
String fullPath = this.getPath(customerName, engagementName);
163163

164-
LOGGER.debug("Full path {}", fullPath.toString());
164+
LOGGER.debug("Full path {}", fullPath);
165165
return projectService.getProjectByIdOrPath(fullPath);
166166
}
167167

@@ -242,9 +242,7 @@ private File createEngagmentFile(Engagement engagement) {
242242
engagement.setStatus(null);
243243

244244
String fileContent = json.toJson(engagement);
245-
File file = File.builder().content(fileContent).filePath(ENGAGEMENT_FILE).build();
246-
247-
return file;
245+
return File.builder().content(fileContent).filePath(ENGAGEMENT_FILE).build();
248246
}
249247

250248
private Project createProjectStucture(Engagement engagement) {
@@ -319,8 +317,10 @@ private CommitMultiple createCommitMultiple(List<File> filesToCommit, Integer pr
319317
// convert each file to action - parallelStream was bringing inconsistent
320318
// results
321319
filesToCommit.stream().forEach(file -> actions.add(createAction(file, isNew)));
320+
321+
String commitMessage = isNew ? commitMessage("Engagement created") : commitMessage("Engagement updated");
322322

323-
return CommitMultiple.builder().id(projectId).branch(branch).commitMessage(commitMessage()).actions(actions)
323+
return CommitMultiple.builder().id(projectId).branch(branch).commitMessage(commitMessage).actions(actions)
324324
.authorName(authorName).authorEmail(authorEmail).build();
325325

326326
}
@@ -338,10 +338,9 @@ private String stripPrefix(String in) {
338338
}
339339
return in;
340340
}
341-
342-
private String commitMessage() {
343-
String COMMIT_MSG = "%s engagement update by git-api %s ";
344-
return String.format(COMMIT_MSG, getEmoji(), getEmoji());
341+
342+
private String commitMessage(String message) {
343+
return String.format("%s %s %s", message, getEmoji(), getEmoji());
345344
}
346345

347346
private String getEmoji() {

src/main/java/com/redhat/labs/omp/service/ProjectService.java

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.redhat.labs.omp.service;
22

3-
import java.util.ArrayList;
43
import java.util.List;
54
import java.util.Optional;
65

@@ -14,6 +13,7 @@
1413
import org.slf4j.Logger;
1514
import org.slf4j.LoggerFactory;
1615

16+
import com.redhat.labs.omp.models.PagedResults;
1717
import com.redhat.labs.omp.models.gitlab.Commit;
1818
import com.redhat.labs.omp.models.gitlab.DeployKey;
1919
import com.redhat.labs.omp.models.gitlab.Project;
@@ -60,16 +60,21 @@ public Optional<Project> getProjectByName(Integer namespaceId, String name) {
6060
public List<ProjectSearchResults> getAllProjectsByName(String name) {
6161
return gitLabService.getProjectByName(name);
6262
}
63-
63+
6464
public List<Project> getProjectsByGroup(int groupId, Boolean includeSubgroups) {
65-
List<Project> projects = gitLabService.getProjectsbyGroup(groupId, includeSubgroups);
66-
65+
66+
PagedResults<Project> page = new PagedResults<>();
67+
while(page.hasMore()) {
68+
Response response = gitLabService.getProjectsbyGroup(groupId, includeSubgroups, commitPageSize, page.getNumber());
69+
page.update(response, new GenericType<List<Project>>() {});
70+
}
71+
6772
if(LOGGER.isDebugEnabled()) {
68-
LOGGER.trace("project count group id({}) {}", groupId, projects.size());
69-
projects.stream().forEach(project -> LOGGER.debug("Group {} Project {}", groupId, project.getName()));
73+
LOGGER.debug("project count group id ({}) {}", groupId, page.size());
74+
page.getResults().stream().forEach(project -> LOGGER.debug("Project {}", project.getPathWithNamespace()));
7075
}
71-
72-
return projects;
76+
77+
return page.getResults();
7378
}
7479

7580
public Optional<Project> getProjectById(Integer projectId) {
@@ -130,27 +135,16 @@ public void enableDeploymentKeyOnProject(Integer projectId, Integer deployKey) {
130135
}
131136

132137
public List<Commit> getCommitLog(String projectId) {
133-
List<Commit> totalCommits = new ArrayList<>();
134-
int totalPages = 1;
135-
int page = 0;
138+
PagedResults<Commit> page = new PagedResults<>();
136139

137-
while(totalPages > page++) {
138-
LOGGER.trace("page {}", page);
139-
Response response = gitLabService.getCommitLog(projectId, commitPageSize, page);
140-
141-
totalCommits.addAll(response.readEntity(new GenericType<List<Commit>>() {}));
142-
143-
if(page == 1) {
144-
String totalPageString = response.getHeaderString("X-Total-Pages");
145-
totalPages = Integer.valueOf(totalPageString);
146-
LOGGER.trace("TOTAL PAGES {}", totalPages);
147-
}
148-
140+
while(page.hasMore()) {
141+
Response response = gitLabService.getCommitLog(projectId, commitPageSize, page.getNumber());
142+
page.update(response, new GenericType<List<Commit>>() {});
149143
}
150144

151-
LOGGER.debug("total commits for project {} {}", projectId, totalCommits.size());
145+
LOGGER.debug("total commits for project {} {}", projectId, page.size());
152146

153-
return totalCommits;
147+
return page.getResults();
154148
}
155149

156150
}

src/test/java/com/redhat/labs/omp/mocks/MockGitLabService.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ public List<Group> getGroupByName(String name) {
6868
} else if ("customer".equalsIgnoreCase(name) || "customer A".equalsIgnoreCase(name)) {
6969
groupList.add(Group.builder().id(11).name("customer A").path("customer-a").parentId(2).build());
7070
groupList.add(Group.builder().id(12).name("customer").path("customer").parentId(10).build());
71+
} else if ("updated".equals(name)) {
72+
groupList.add(Group.builder().id(3).name("updated").path("updated").parentId(2).build());
73+
} else if ("updated2".equals(name)) {
74+
groupList.add(Group.builder().id(5).name("updated2").path("updated").parentId(3).build());
7175
}
7276

7377
return groupList;
@@ -88,6 +92,9 @@ public List<ProjectSearchResults> getProjectByName(String name) {
8892
ProjectSearchResults project = ProjectSearchResults.builder().id(45).name("iac").description("bla").path("iac")
8993
.namespace(Namespace.builder().id(45).build()).build();
9094
results.add(project);
95+
project = ProjectSearchResults.builder().id(5).name("iac").description("bla5").path("iac")
96+
.namespace(Namespace.builder().id(5).build()).build();
97+
results.add(project);
9198
}
9299

93100
return results;
@@ -188,7 +195,7 @@ public File getFile(String projectId, String filePath, String ref) {
188195
return File.builder().filePath(filePath).content(content).build();
189196
}
190197

191-
if("status.json".equals(filePath)) {
198+
if("status.json".equals(filePath) && ! projectId.equals("top/dog/nope/nada/iac")) {
192199
String content = ResourceLoader.load("status.json");
193200
content = new String(EncodingUtils.base64Encode(content.getBytes()), StandardCharsets.UTF_8);
194201
return File.builder().filePath(filePath).content(content).build();
@@ -236,10 +243,10 @@ public Response enableDeployKey(Integer projectId, Integer deployKey) {
236243
}
237244

238245
@Override
239-
public List<Project> getProjectsbyGroup(Integer groupId, Boolean includeSubgroups) {
246+
public Response getProjectsbyGroup(Integer groupId, Boolean includeSubgroups, int page, int pageSize) {
240247
List<Project> projects = new ArrayList<>();
241248
projects.add(Project.builder().id(groupId * 10).name("Project " + (groupId*10)).build());
242-
return projects;
249+
return Response.ok(projects).header("X-Total-Pages", 1).build();
243250
}
244251

245252
@Override

src/test/java/com/redhat/labs/omp/service/EngagementServiceTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.redhat.labs.omp.service;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
45
import static org.junit.jupiter.api.Assertions.assertNotNull;
56
import static org.junit.jupiter.api.Assertions.assertNull;
67
import static org.junit.jupiter.api.Assertions.assertThrows;
8+
import static org.junit.jupiter.api.Assertions.assertTrue;
79

810
import java.util.List;
911

@@ -13,7 +15,9 @@
1315

1416
import com.redhat.labs.exception.UnexpectedGitLabResponseException;
1517
import com.redhat.labs.omp.models.Engagement;
18+
import com.redhat.labs.omp.models.Status;
1619
import com.redhat.labs.omp.models.gitlab.Hook;
20+
import com.redhat.labs.omp.models.gitlab.Project;
1721

1822
import io.quarkus.test.junit.QuarkusTest;
1923

@@ -23,6 +27,14 @@ class EngagementServiceTest {
2327
@Inject
2428
EngagementService engagementService;
2529

30+
@Test void testCreateEngagementUpdateProject() {
31+
32+
Engagement e = Engagement.builder().customerName("updated").projectName("updated2").build();
33+
Project project = engagementService.createEngagement(e, "Test Banana", "[email protected]");
34+
assertFalse(project.isFirst());
35+
36+
}
37+
2638
@Test void testCreateEngagementGroupFail() {
2739

2840
Engagement e = Engagement.builder().customerName("customer").projectName("project").build();
@@ -56,4 +68,9 @@ class EngagementServiceTest {
5668
assertEquals(0, hooks.size());
5769

5870
}
71+
72+
@Test void tesetNoStatus() {
73+
Status status = engagementService.getProjectStatus("nope", "nada");
74+
assertNull(status);
75+
}
5976
}

src/test/java/com/redhat/labs/omp/service/ProjectServiceTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class ProjectServiceTest {
8181
@Test void getProjectAllByName() {
8282
List<ProjectSearchResults> found = projectService.getAllProjectsByName("iac");
8383
assertNotNull(found);
84-
assertEquals(1, found.size());
84+
assertEquals(2, found.size());
8585

8686
}
8787

0 commit comments

Comments
 (0)