Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ADM-523 feat: add branch select in metric #645

Merged
merged 2 commits into from
Sep 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,13 @@ List<BuildKitePipelineDTO> getPipelineInfo(@RequestHeader("Authorization") Strin
ResponseEntity<List<BuildKiteBuildInfo>> getPipelineSteps(@RequestHeader("Authorization") String token,
@PathVariable String organizationId, @PathVariable String pipelineId, @RequestParam String page,
@RequestParam("per_page") String perPage, @RequestParam("created_from") String createdFrom,
@RequestParam("created_to") String createdTo);
@RequestParam("created_to") String createdTo, @RequestParam List<String> branch);

@GetMapping(path = "v2/organizations/{organizationId}/pipelines/{pipelineId}/builds")
@ResponseStatus(HttpStatus.OK)
List<BuildKiteBuildInfo> getPipelineStepsInfo(@RequestHeader("Authorization") String token,
@PathVariable String organizationId, @PathVariable String pipelineId, @RequestParam String page,
@RequestParam("per_page") String perPage, @RequestParam("created_from") String createdFrom,
@RequestParam("created_to") String createdTo);
@RequestParam("created_to") String createdTo, @RequestParam List<String> branch);

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.time.Instant;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
Expand All @@ -28,17 +29,21 @@ public class BuildKiteBuildInfo {

private int number;

private String branch;

public BuildKiteJob getBuildKiteJob(List<BuildKiteJob> jobs, List<String> steps, List<String> states,
String startTime, String endTime) {
Instant startDate = Instant.ofEpochMilli(Long.parseLong(startTime));
Instant endDate = Instant.ofEpochMilli(Long.parseLong(endTime));
return jobs.stream()
.filter(item -> steps.contains(item.getName()) && states.contains(item.getState()))
.filter(item -> {
return jobs.stream().filter(item -> steps.contains(item.getName())).filter(item -> {
if (Objects.nonNull(item.getFinishedAt()) && Objects.nonNull(item.getStartedAt())) {
Instant time = Instant.parse(item.getFinishedAt());
return TimeUtil.isAfterAndEqual(startDate, time) && TimeUtil.isBeforeAndEqual(endDate, time);
})
}
return false;
})
.max(Comparator.comparing(BuildKiteJob::getFinishedAt))
.filter(buildKiteJob -> states.contains(buildKiteJob.getState()))
.orElse(null);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@Builder
@NoArgsConstructor
Expand All @@ -25,4 +27,6 @@ public class DeploymentEnvironment {
@Nullable
private String repository;

private List<String> branches;

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,6 @@ public class PipelineStepsDTO {

private String orgName;

private List<String> branches;

}
Original file line number Diff line number Diff line change
Expand Up @@ -129,9 +129,14 @@ public PipelineStepsDTO fetchPipelineSteps(String token, String organizationId,
try {
log.info("Start to get pipeline steps, organization id: {}, pipeline id: {}", organizationId, pipelineId);

List<String> sortedSteps = getPipelineStepNames(
fetchPipelineStepsByPage(token, organizationId, pipelineId, stepsParam))
.stream()
List<BuildKiteBuildInfo> buildKiteBuildInfos = fetchPipelineStepsByPage(token,
DeploymentEnvironment.builder().id(pipelineId).orgId(organizationId).build(), stepsParam);

List<String> sortedSteps = getPipelineStepNames(buildKiteBuildInfos).stream().sorted().toList();

List<String> sortedBranches = buildKiteBuildInfos.stream()
.map(BuildKiteBuildInfo::getBranch)
.distinct()
.sorted()
.toList();

Expand All @@ -144,6 +149,7 @@ public PipelineStepsDTO fetchPipelineSteps(String token, String organizationId,
.orgName(stepsParam.getOrgName())
.repository(stepsParam.getRepository())
.orgId(organizationId)
.branches(sortedBranches)
.build();
}
catch (RuntimeException e) {
Expand All @@ -159,10 +165,13 @@ public PipelineStepsDTO fetchPipelineSteps(String token, String organizationId,
}
}

private List<BuildKiteBuildInfo> fetchPipelineStepsByPage(String token, String orgId, String pipelineId,
private List<BuildKiteBuildInfo> fetchPipelineStepsByPage(String token, DeploymentEnvironment deploymentEnvironment,
PipelineStepsParam stepsParam) {
String page = "1";
String perPage = "100";
String orgId = deploymentEnvironment.getOrgId();
String pipelineId = deploymentEnvironment.getId();
List<String> branches = deploymentEnvironment.getBranches();
log.info(
"Start to paginated pipeline steps pagination info, orgId: {}, pipelineId: {}, stepsParam: {}, page:{}",
orgId, pipelineId, stepsParam, page);
Expand All @@ -171,7 +180,7 @@ private List<BuildKiteBuildInfo> fetchPipelineStepsByPage(String token, String o
stepsParam.setEndTime(TimeUtil.convertToISOFormat(stepsParam.getEndTime()));

ResponseEntity<List<BuildKiteBuildInfo>> pipelineStepsInfo = buildKiteFeignClient.getPipelineSteps(realToken,
orgId, pipelineId, page, perPage, stepsParam.getStartTime(), stepsParam.getEndTime());
orgId, pipelineId, page, perPage, stepsParam.getStartTime(), stepsParam.getEndTime(), branches);
log.info(
"Successfully get paginated pipeline steps pagination info, orgId: {},pipelineId: {}, stepsParam: {}, result status code: {}, page:{}",
orgId, pipelineId, stepsParam, pipelineStepsInfo.getStatusCode(), page);
Expand All @@ -188,7 +197,7 @@ private List<BuildKiteBuildInfo> fetchPipelineStepsByPage(String token, String o
List<CompletableFuture<List<BuildKiteBuildInfo>>> futures = IntStream
.range(Integer.parseInt(page) + 1, totalPage + 1)
.mapToObj(currentPage -> getBuildKiteStepsAsync(realToken, orgId, pipelineId, stepsParam, perPage,
currentPage))
currentPage, branches))
.toList();
List<BuildKiteBuildInfo> buildKiteBuildInfos = futures.stream()
.map(CompletableFuture::join)
Expand All @@ -200,13 +209,13 @@ private List<BuildKiteBuildInfo> fetchPipelineStepsByPage(String token, String o
}

private CompletableFuture<List<BuildKiteBuildInfo>> getBuildKiteStepsAsync(String token, String organizationId,
String pipelineId, PipelineStepsParam stepsParam, String perPage, int page) {
String pipelineId, PipelineStepsParam stepsParam, String perPage, int page, List<String> branches) {
return CompletableFuture.supplyAsync(() -> {
log.info("Start to paginated pipeline steps info, orgId: {}, pipelineId: {}, stepsParam: {}, page:{}",
organizationId, pipelineId, stepsParam, page);
List<BuildKiteBuildInfo> pipelineStepsInfo = buildKiteFeignClient.getPipelineStepsInfo(token,
organizationId, pipelineId, String.valueOf(page), perPage, stepsParam.getStartTime(),
stepsParam.getEndTime());
stepsParam.getEndTime(), branches);
log.info(
"Successfully get paginated pipeline steps info, orgId: {}, pipelineId: {}, pipeline steps size: {}, page:{}",
organizationId, pipelineId, pipelineStepsInfo.size(), page);
Expand All @@ -231,8 +240,8 @@ public List<BuildKiteBuildInfo> fetchPipelineBuilds(String token, DeploymentEnvi
try {
log.info("Start to get pipeline builds, param: {}", deploymentEnvironment);
PipelineStepsParam stepsParam = PipelineStepsParam.builder().startTime(startTime).endTime(endTime).build();
List<BuildKiteBuildInfo> buildKiteBuildInfos = fetchPipelineStepsByPage(token,
deploymentEnvironment.getOrgId(), deploymentEnvironment.getId(), stepsParam);
List<BuildKiteBuildInfo> buildKiteBuildInfos = fetchPipelineStepsByPage(token, deploymentEnvironment,
stepsParam);
log.info("Successfully get pipeline builds, param: {}, buildKite build info size: {}",
deploymentEnvironment, buildKiteBuildInfos.size());
return buildKiteBuildInfos;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,15 @@ void shouldReturnLastFailedOrSuccessJob() {
.withState("pass")
.withFinishedAt("2022-09-16T04:57:09.545Z")
.build();
BuildKiteJob successJob5 = BuildKiteJobBuilder.withDefault()
.withName("job9")
.withName("deploy uat")
.withState("pass")
.withFinishedAt(null)
.withStartedAt(null)
.build();
List<BuildKiteJob> failedJobs = Arrays.asList(failedJob1, failedJob2, failedJob3);
List<BuildKiteJob> successJobs = Arrays.asList(successJob1, successJob2, successJob3, successJob4);
List<BuildKiteJob> successJobs = Arrays.asList(successJob1, successJob2, successJob3, successJob4, successJob5);
List<String> steps = Arrays.asList("test", "build", "deploy qa", "deploy uat");

BuildKiteBuildInfo info = BuildKiteBuildInfoBuilder.withDefault().build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public void shouldReturnResponseWhenFetchPipelineStepsSuccess() {
ResponseEntity<List<BuildKiteBuildInfo>> responseEntity = new ResponseEntity<>(buildKiteBuildInfoList,
HttpStatus.OK);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);

PipelineStepsDTO pipelineStepsDTO = buildKiteService.fetchPipelineSteps(token, organizationId, pipelineId,
Expand All @@ -204,7 +204,7 @@ public void shouldThrowRequestFailedExceptionWhenFetchPipelineStepsWithException
when(mockException.getMessage()).thenReturn("exception");
when(mockException.getStatus()).thenReturn(500);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
any(), any()))
any(), any(), any()))
.thenThrow(mockException);

assertThrows(RequestFailedException.class,
Expand All @@ -229,14 +229,14 @@ public void shouldReturnMoreThanOnePageStepsWhenPageFetchPipelineSteps() {
ResponseEntity<List<BuildKiteBuildInfo>> responseEntity = new ResponseEntity<>(buildKiteBuildInfoList,
httpHeaders, HttpStatus.OK);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);
BuildKiteJob testJob3 = BuildKiteJob.builder().name("testJob3").build();
BuildKiteJob testJob4 = BuildKiteJob.builder().name("").build();
List<BuildKiteBuildInfo> buildKiteBuildInfoList2 = new ArrayList<>();
buildKiteBuildInfoList2.add(BuildKiteBuildInfo.builder().jobs(List.of(testJob3, testJob4)).build());
when(buildKiteFeignClient.getPipelineStepsInfo(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(buildKiteBuildInfoList2);

PipelineStepsDTO pipelineStepsDTO = buildKiteService.fetchPipelineSteps("test_token", "test_org_id",
Expand All @@ -261,10 +261,10 @@ public void shouldRThrowServerErrorWhenPageFetchPipelineStepsAndFetchNextPage404
ResponseEntity<List<BuildKiteBuildInfo>> responseEntity = new ResponseEntity<>(buildKiteBuildInfoList,
httpHeaders, HttpStatus.OK);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
any(), any()))
any(), any(), any()))
.thenReturn(responseEntity);
when(buildKiteFeignClient.getPipelineStepsInfo(anyString(), anyString(), anyString(), anyString(), anyString(),
any(), any()))
any(), any(), any()))
.thenThrow(new CompletionException(new NotFoundException("Client Error")));

assertThatThrownBy(() -> buildKiteService.fetchPipelineSteps("test_token", "test_org_id", "test_pipeline_id",
Expand All @@ -285,10 +285,10 @@ public void shouldRThrowTimeoutExceptionWhenPageFetchPipelineStepsAndFetchNextPa
ResponseEntity<List<BuildKiteBuildInfo>> responseEntity = new ResponseEntity<>(buildKiteBuildInfoList,
httpHeaders, HttpStatus.OK);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
any(), any()))
any(), any(), any()))
.thenReturn(responseEntity);
when(buildKiteFeignClient.getPipelineStepsInfo(anyString(), anyString(), anyString(), anyString(), anyString(),
any(), any()))
any(), any(), any()))
.thenThrow(new CompletionException(new ServiceUnavailableException("Service Unavailable")));

assertThatThrownBy(() -> buildKiteService.fetchPipelineSteps("test_token", "test_org_id", "test_pipeline_id",
Expand All @@ -309,10 +309,10 @@ public void shouldThrowServerErrorWhenPageFetchPipelineStepsAndFetchNextPage5xxE
ResponseEntity<List<BuildKiteBuildInfo>> responseEntity = new ResponseEntity<>(buildKiteBuildInfoList,
httpHeaders, HttpStatus.OK);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);
when(buildKiteFeignClient.getPipelineStepsInfo(anyString(), anyString(), anyString(), anyString(), anyString(),
any(), any()))
any(), any(), any()))
.thenThrow(new RequestFailedException(504, "Server Error"));

assertThatThrownBy(() -> buildKiteService.fetchPipelineSteps("test_token", "test_org_id", "test_pipeline_id",
Expand All @@ -334,10 +334,10 @@ public void shouldThrowInternalServerErrorExceptionWhenPageFetchPipelineStepsAnd
httpHeaders, HttpStatus.OK);

when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);
when(buildKiteFeignClient.getPipelineStepsInfo(anyString(), anyString(), anyString(), anyString(), anyString(),
any(), any()))
any(), any(), any()))
.thenReturn(buildKiteBuildInfoList);

assertThatThrownBy(() -> buildKiteService.fetchPipelineSteps("test_token", "test_org_id", "test_pipeline_id",
Expand All @@ -362,7 +362,7 @@ public void shouldReturnOnePageStepsWhenPageFetchPipelineStepsAndHeaderParseOneP
ResponseEntity<List<BuildKiteBuildInfo>> responseEntity = new ResponseEntity<>(buildKiteBuildInfoList,
httpHeaders, HttpStatus.OK);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);

PipelineStepsDTO pipelineStepsDTO = buildKiteService.fetchPipelineSteps("test_token", "test_org_id",
Expand All @@ -385,7 +385,7 @@ public void shouldReturnOnePageStepsWhenPageFetchPipelineStep() {
ResponseEntity<List<BuildKiteBuildInfo>> responseEntity = new ResponseEntity<>(null, httpHeaders,
HttpStatus.OK);
when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);

PipelineStepsDTO pipelineStepsDTO = buildKiteService.fetchPipelineSteps("test_token", "test_org_id",
Expand All @@ -407,7 +407,7 @@ public void shouldReturnBuildKiteBuildInfoWhenFetchPipelineBuilds() {
HttpStatus.OK);

when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);
List<BuildKiteBuildInfo> pipelineBuilds = buildKiteService.fetchPipelineBuilds(mockToken, mockDeployment,
mockStartTime, mockEndTime);
Expand All @@ -422,7 +422,7 @@ public void shouldThrowUnauthorizedExceptionWhenFetchPipelineBuilds401Exception(
DeploymentEnvironment mockDeployment = DeploymentEnvironmentBuilder.withDefault().build();

when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenThrow(new UnauthorizedException("unauthorized"));

Assertions
Expand All @@ -444,7 +444,7 @@ public void shouldThrowInternalServerErrorExceptionWhenFetchPipelineBuilds500Exc
HttpStatus.OK);

when(buildKiteFeignClient.getPipelineSteps(anyString(), anyString(), anyString(), anyString(), anyString(),
anyString(), anyString()))
anyString(), anyString(), any()))
.thenReturn(responseEntity);

assertThatThrownBy(() -> buildKiteService.fetchPipelineBuilds(mockToken, mockDeployment, null, mockEndTime))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
REMOVE_BUTTON,
STEP,
} from '../../../../fixtures'
import { PipelineSetting } from "@src/context/interface";

jest.mock('@src/context/Metrics/metricsSlice', () => ({
...jest.requireActual('@src/context/Metrics/metricsSlice'),
Expand Down Expand Up @@ -52,12 +53,13 @@ describe('PipelineMetricSelection', () => {
organization: '',
pipelineName: '',
step: '',
branches: []
}
const mockHandleClickRemoveButton = jest.fn()
const mockUpdatePipeline = jest.fn()

const setup = async (
deploymentFrequencySetting: { id: number; organization: string; pipelineName: string; step: string },
deploymentFrequencySetting: PipelineSetting,
isShowRemoveButton: boolean,
isDuplicated: boolean
) => {
Expand Down Expand Up @@ -128,7 +130,7 @@ describe('PipelineMetricSelection', () => {
throw new Error('error message')
})
const { getByText, getByRole } = await setup(
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '' },
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: [] },
false,
false
)
Expand All @@ -145,7 +147,7 @@ describe('PipelineMetricSelection', () => {
it('should show no steps warning message when getSteps succeed but get no steps', async () => {
metricsClient.getSteps = jest.fn().mockReturnValue({ response: [], haveStep: false })
const { getByText, getByRole } = await setup(
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '' },
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: [] },
false,
false
)
Expand All @@ -166,7 +168,7 @@ describe('PipelineMetricSelection', () => {
it('should show steps selection when getSteps succeed ', async () => {
metricsClient.getSteps = jest.fn().mockReturnValue({ response: ['steps'], haveStep: true })
const { getByRole, getByText } = await setup(
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '' },
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: '', branches: [] },
false,
false
)
Expand All @@ -185,7 +187,7 @@ describe('PipelineMetricSelection', () => {
it('should show duplicated message given duplicated id', async () => {
metricsClient.getSteps = jest.fn().mockReturnValue({ response: ['steps'], haveStep: true })
const { getByText } = await setup(
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: 'step1' },
{ id: 0, organization: 'mockOrgName', pipelineName: 'mockName', step: 'step1', branches: [] },
false,
true
)
Expand Down
Loading