Skip to content

Commit 5f835f5

Browse files
authored
Merge pull request #136 from mcanoy/migration-related-stuff
add migration framework for new services. add project look up by uuid
2 parents 5642b0a + a0494df commit 5f835f5

18 files changed

+480
-103
lines changed

README.md

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,12 @@ Pagination Headers Returned:
6464
- `x-next-page` number of next page (omitted if last page)
6565
- `x-last-page` number of last page
6666

67-
```
67+
6868
```
6969
GET ​ /api​/v1​/engagements​/customer​/{customer}​/{engagement}
7070
```
7171
Returns the engagement associated with the customer and engagement name combination.
72-
```
72+
7373
```
7474
GET ​/api​/v1​/engagements​/customer​/{customer}​/{engagement}​/commits
7575
```
@@ -95,6 +95,22 @@ DELETE ​/api​/v1​/engagements​/hooks
9595
```
9696
Deletes all webhooks in all configured engagement projects.
9797

98+
### Engagement / Project Mapping
99+
100+
This resource exposes APIs that relates engagement uuids to project ids
101+
102+
```
103+
GET /api/v1/engagements/projects
104+
```
105+
106+
Returns a full list of projects and associated engagement uuid. (uuid is null if not set although it should always be set)
107+
108+
```
109+
GET /api/v1/engagements/projects/{uuid}
110+
```
111+
112+
Returns project information including project id for the uuid specified.
113+
98114
### Version Resource
99115

100116
The version resource exposes an API that allows a client to determine which version of the application is deployed.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.redhat.labs.lodestar.models;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
8+
@Data
9+
@Builder
10+
@NoArgsConstructor
11+
@AllArgsConstructor
12+
/**
13+
* A class to return an uuid - project id pair
14+
*
15+
*/
16+
public class EngagementProject {
17+
private static final String descriptionPrefixFormat = "engagement UUID: ";
18+
19+
private long projectId;
20+
private String uuid;
21+
22+
public static class EngagementProjectBuilder {
23+
public EngagementProjectBuilder uuid(String uuid) {
24+
if(uuid != null && uuid.startsWith(descriptionPrefixFormat)) {
25+
this.uuid = uuid.substring(descriptionPrefixFormat.length());
26+
}
27+
return this;
28+
}
29+
}
30+
}
31+

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,15 @@ public class Project {
3636
@JsonbProperty("description")
3737
private String description;
3838
@JsonbProperty("issues_enabled")
39-
private Boolean issuesEnabled;
39+
private boolean issuesEnabled;
4040
@JsonbProperty("merge_requests_enabled")
41-
private Boolean mergeRequestsEnabled;
41+
private boolean mergeRequestsEnabled;
4242
@JsonbProperty("jobs_enabled")
43-
private Boolean jobsEnabled;
43+
private boolean jobsEnabled;
4444
@JsonbProperty("wiki_enabled")
45-
private Boolean wikiEnabled;
45+
private boolean wikiEnabled;
4646
@JsonbProperty("snippets_enabled")
47-
private Boolean snippetsEnabled;
47+
private boolean snippetsEnabled;
4848
@JsonbProperty("issues_access_level")
4949
private String issuesAccessLevel;
5050
@JsonbProperty("repository_access_level")
@@ -66,11 +66,11 @@ public class Project {
6666
@JsonbProperty("resolve_outdated_diff_discussions")
6767
private Boolean resolveOutdatedDiffDiscussions;
6868
@JsonbProperty("container_registry_enabled")
69-
private Boolean containerRegistryEnabled;
69+
private boolean containerRegistryEnabled;
7070
@JsonbProperty("container_expiration_policy_attributes")
7171
private Map<String, String> containerExpirationPolicyAttributes;
7272
@JsonbProperty("shared_runners_enabled")
73-
private Boolean sharedRunnersEnabled;
73+
private boolean sharedRunnersEnabled;
7474
@JsonbProperty("visibility")
7575
private String visibility;
7676
@JsonbProperty("import_url")
@@ -106,7 +106,7 @@ public class Project {
106106
@JsonbProperty("ci_config_path")
107107
private String ciConfigPath;
108108
@JsonbProperty("auto_devops_enabled")
109-
private Boolean autoDevopsEnabled;
109+
private boolean autoDevopsEnabled;
110110
@JsonbProperty("auto_devops_deploy_strategy")
111111
private String autoDevopsDeployStrategy;
112112
@JsonbProperty("repository_storage")

src/main/java/com/redhat/labs/lodestar/resource/EngagementResource.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import javax.ws.rs.GET;
1111
import javax.ws.rs.POST;
1212
import javax.ws.rs.Path;
13+
import javax.ws.rs.PathParam;
1314
import javax.ws.rs.Produces;
1415
import javax.ws.rs.QueryParam;
1516
import javax.ws.rs.core.Context;
@@ -22,11 +23,12 @@
2223
import org.eclipse.microprofile.metrics.MetricUnits;
2324
import org.eclipse.microprofile.metrics.annotation.Counted;
2425
import org.eclipse.microprofile.metrics.annotation.Timed;
25-
import org.jboss.resteasy.annotations.jaxrs.PathParam;
26+
import org.eclipse.microprofile.openapi.annotations.tags.Tag;
2627
import org.slf4j.Logger;
2728
import org.slf4j.LoggerFactory;
2829

2930
import com.redhat.labs.lodestar.models.Engagement;
31+
import com.redhat.labs.lodestar.models.EngagementProject;
3032
import com.redhat.labs.lodestar.models.Status;
3133
import com.redhat.labs.lodestar.models.gitlab.Commit;
3234
import com.redhat.labs.lodestar.models.gitlab.Hook;
@@ -37,6 +39,7 @@
3739
@Path("/api/v1/engagements")
3840
@Produces(MediaType.APPLICATION_JSON)
3941
@Consumes(MediaType.APPLICATION_JSON)
42+
@Tag(name = "Engagements", description = "Engagement data")
4043
public class EngagementResource {
4144

4245
public static final Logger LOGGER = LoggerFactory.getLogger(EngagementResource.class);
@@ -122,6 +125,7 @@ public Response deleteEngagement(@PathParam("customer") String customer,
122125
@Path("customer/{customer}/{engagement}/hooks")
123126
@Counted(name = "create-engagement-hook", description = "Count of create-hook requestst")
124127
@Timed(name = "performedHookCreate", description = "Time to create hook", unit = MetricUnits.MILLISECONDS)
128+
@Tag(name = "Hooks")
125129
public Response createProjectHook(Hook hook, @PathParam("customer") String customer,
126130
@PathParam("engagement") String engagement) {
127131

@@ -144,6 +148,7 @@ public Response getEngagementCommits(@PathParam("customer") String customer,
144148
@Path("customer/{customer}/{engagement}/hooks")
145149
@Counted(name = "get-hook", description = "Count of get-hook requests")
146150
@Timed(name = "performedHookGetAll", description = "Time to get all hooks", unit = MetricUnits.MILLISECONDS)
151+
@Tag(name = "Hooks")
147152
public Response findAllProjectHooks(@PathParam("customer") String customer,
148153
@PathParam("engagement") String engagement) {
149154

@@ -167,6 +172,7 @@ public Response getStatus(@PathParam("customer") String customer, @PathParam("en
167172

168173
@DELETE
169174
@Path("/hooks")
175+
@Tag(name = "Hooks")
170176
@Counted(name = "delete-hooks", description = "Count of delete-hooks requests")
171177
@Timed(name = "performedHooksDelete", description = "Time to delete hooks", unit = MetricUnits.MILLISECONDS)
172178
public Response deleteAllHooks() {
@@ -175,5 +181,31 @@ public Response deleteAllHooks() {
175181
return Response.ok().build();
176182

177183
}
184+
185+
@GET
186+
@Path("projects/{uuid}")
187+
@Counted(name = "project-by-uuid", description = "Count of project-by-uuid requests")
188+
@Timed(name = "performedProjectByUuidGet", description = "Time to get project", unit = MetricUnits.MILLISECONDS)
189+
@Tag(name = "Projects", description = "Project retrieval")
190+
public Response getProjectByUuid(@PathParam("uuid") String uuid) {
191+
Optional<Project> p = engagementService.getProjectByUuid(uuid);
192+
193+
if(p.isEmpty()) {
194+
return Response.status(404).build();
195+
}
196+
197+
return Response.ok(p.get()).build();
198+
}
199+
200+
@GET
201+
@Path("projects")
202+
@Counted(name = "engagment-uuid-project-id", description = "Count of engagment-uuid-project-id requests")
203+
@Timed(name = "performedEngagementUuidProjectPairsGet", description = "Time to get all projects engagement uuid", unit = MetricUnits.MILLISECONDS)
204+
@Tag(name = "Projects", description = "Project retrieval")
205+
public Response getEngagementUuidProjectPairs() {
206+
List<EngagementProject> projects = engagementService.getEngagementProjectIdList();
207+
208+
return Response.ok(projects).build();
209+
}
178210

179211
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ Response getSubGroups(@PathParam("id") @Encoded Integer groupId, @QueryParam("pe
7373
@Produces("application/json")
7474
Response getGroupByName(@QueryParam("search") @Encoded String name, @QueryParam("per_page") int perPage,
7575
@QueryParam("page") int page);
76+
77+
@GET
78+
@Path("/groups/{id}/search")
79+
List<Project> findProjectByEngagementId(@PathParam("id") @Encoded Integer groupId,
80+
@QueryParam("scope") String scope, @QueryParam("search") String search);
7681

7782
@GET
7883
@Logged

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.redhat.labs.lodestar.config.JsonMarshaller;
2323
import com.redhat.labs.lodestar.exception.UnexpectedGitLabResponseException;
2424
import com.redhat.labs.lodestar.models.Engagement;
25+
import com.redhat.labs.lodestar.models.EngagementProject;
2526
import com.redhat.labs.lodestar.models.EngagementUser;
2627
import com.redhat.labs.lodestar.models.Status;
2728
import com.redhat.labs.lodestar.models.events.DeleteEngagementEvent;
@@ -64,6 +65,9 @@ public class EngagementService {
6465

6566
@ConfigProperty(name = "orchestration.queue.directory", defaultValue = "queue")
6667
String orchestrationQueueDirectory;
68+
69+
@ConfigProperty(name = "seed.file.list", defaultValue = "queue")
70+
List<String> seedFileList;
6771

6872
@Inject
6973
ProjectService projectService;
@@ -117,6 +121,10 @@ public Project createEngagement(Engagement engagement, String author, String aut
117121

118122
// create user reset file(s) if required
119123
repoFiles.addAll(createUserManagementFiles(engagement));
124+
125+
if(project.isFirst()) {
126+
repoFiles.addAll(createMicroFiles(project));
127+
}
120128

121129
// create actions for multiple commit
122130
CommitMultiple commit = createCommitMultiple(repoFiles, project.getId(), DEFAULT_BRANCH, author, authorEmail,
@@ -213,6 +221,18 @@ public Optional<Project> getProject(String customerName, String engagementName)
213221
LOGGER.debug("Full path {}", fullPath);
214222
return projectService.getProjectByIdOrPath(fullPath);
215223
}
224+
225+
public Optional<Project> getProjectByUuid(String engagementUuid) {
226+
return projectService.getProjectByEngagementUuid(engagementRepositoryId, engagementUuid);
227+
}
228+
229+
public List<EngagementProject> getEngagementProjectIdList() {
230+
List<Project> projects = projectService.getProjectsByGroup(engagementRepositoryId, true);
231+
List<EngagementProject> eprojects = new ArrayList<>();
232+
projects.forEach(p -> eprojects.add(EngagementProject.builder().uuid(p.getDescription()).projectId(p.getId()).build()));
233+
234+
return eprojects;
235+
}
216236

217237
/**
218238
* Gets all engagements from the base group Structure is BaseGroup - customer
@@ -312,6 +332,19 @@ private File createEngagmentFile(Engagement engagement) {
312332
String fileContent = json.toJson(engagement);
313333
return File.builder().content(fileContent).filePath(ENGAGEMENT_FILE).build();
314334
}
335+
336+
/**
337+
* Creates seed files for other services. Never updates.
338+
* @return
339+
*/
340+
private List<File> createMicroFiles(Project project) {
341+
List<File> files = new ArrayList<>();
342+
if(project.isFirst()) {
343+
seedFileList.forEach(f -> files.add(File.builder().content("[]").filePath(f).build()));
344+
}
345+
346+
return files;
347+
}
315348

316349
private List<File> createUserManagementFiles(Engagement engagement) {
317350

src/main/java/com/redhat/labs/lodestar/service/FileService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public Optional<File> deleteFile(Integer projectId, String filePath, String ref)
105105
// set branch
106106
file.setBranch(ref);
107107
// add commit message
108-
file.setCommitMessage("git api deleted file.");
108+
file.setCommitMessage(String.format("git api deleted file. {}", filePath));
109109

110110
gitLabService.deleteFile(projectId, filePath, file);
111111
}
@@ -147,11 +147,10 @@ public Optional<File> getFile(String projectIdOrPath, String filePath, String re
147147
optional = Optional.of(file);
148148
}
149149
} catch(WebApplicationException wae) {
150+
150151
if(wae.getResponse().getStatus() != 404) {
151152
LOGGER.error("Get file {} for project {} failed with code {}", filePath, projectIdOrPath, wae.getResponse().getStatus());
152153
throw wae;
153-
} else if(LOGGER.isDebugEnabled()) {
154-
LOGGER.debug("Get file {} for project {} failed with code {}", filePath, projectIdOrPath, wae.getResponse().getStatus());
155154
}
156155
}
157156

src/main/java/com/redhat/labs/lodestar/service/GroupService.java

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
import org.slf4j.Logger;
1414
import org.slf4j.LoggerFactory;
1515

16-
import com.redhat.labs.lodestar.exception.UnexpectedGitLabResponseException;
1716
import com.redhat.labs.lodestar.models.gitlab.Group;
1817
import com.redhat.labs.lodestar.models.pagination.PagedResults;
1918
import com.redhat.labs.lodestar.rest.client.GitLabService;
@@ -29,30 +28,6 @@ public class GroupService {
2928
@ConfigProperty(name = "commit.page.size")
3029
int commitPageSize;
3130

32-
// get a group
33-
public Optional<Group> getGitLabGroupByName(String name, Integer parentId)
34-
throws UnexpectedGitLabResponseException {
35-
36-
Optional<Group> optional = Optional.empty();
37-
38-
PagedResults<Group> page = new PagedResults<>();
39-
40-
while(page.hasMore()) {
41-
Response response = gitLabService.getGroupByName(name, commitPageSize, page.getNumber());
42-
page.update(response, new GenericType<List<Group>>() {});
43-
}
44-
45-
// look for a match between returned name and provided path
46-
for (Group group : page.getResults()) {
47-
if (name.equals(group.getName()) && parentId.equals(group.getParentId())) {
48-
return Optional.of(group);
49-
}
50-
}
51-
52-
return optional;
53-
54-
}
55-
5631
public List<Group> getSubgroups(Integer groupId) {
5732

5833
PagedResults<Group> page = new PagedResults<>();

0 commit comments

Comments
 (0)