Skip to content

Commit 36754a8

Browse files
Merge pull request #1690 from github/robertbrignull/handle_states_monitoring
Make the monitoring command slightly simpler and handle being called on any variant analysis
2 parents 4cc4232 + cc955c7 commit 36754a8

File tree

6 files changed

+30
-47
lines changed

6 files changed

+30
-47
lines changed
Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
import { VariantAnalysis } from './variant-analysis';
22

33
export type VariantAnalysisMonitorStatus =
4-
| 'InProgress'
5-
| 'CompletedSuccessfully'
6-
| 'CompletedUnsuccessfully'
7-
| 'Failed'
8-
| 'Cancelled'
9-
| 'TimedOut';
4+
| 'Completed'
5+
| 'Canceled';
106

117
export interface VariantAnalysisMonitorResult {
128
status: VariantAnalysisMonitorStatus;
13-
error?: string;
149
scannedReposDownloaded?: number[],
1510
variantAnalysis?: VariantAnalysis
1611
}

extensions/ql-vscode/src/remote-queries/shared/variant-analysis.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ export enum VariantAnalysisStatus {
4747
Canceled = 'canceled',
4848
}
4949

50+
export function isFinalVariantAnalysisStatus(status: VariantAnalysisStatus): boolean {
51+
return [
52+
// All states that indicates the analysis has completed and cannot change status anymore.
53+
VariantAnalysisStatus.Succeeded, VariantAnalysisStatus.Failed, VariantAnalysisStatus.Canceled,
54+
].includes(status);
55+
}
56+
5057
export enum VariantAnalysisFailureReason {
5158
NoReposQueried = 'noReposQueried',
5259
InternalError = 'internalError',

extensions/ql-vscode/src/remote-queries/variant-analysis-monitor.ts

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import { ExtensionContext, CancellationToken, commands, EventEmitter } from 'vsc
22
import { Credentials } from '../authentication';
33
import * as ghApiClient from './gh-api/gh-api-client';
44

5-
import { VariantAnalysis, VariantAnalysisStatus } from './shared/variant-analysis';
5+
import { isFinalVariantAnalysisStatus, VariantAnalysis } from './shared/variant-analysis';
66
import {
77
VariantAnalysis as VariantAnalysisApiResponse,
88
VariantAnalysisScannedRepository
99
} from './gh-api/variant-analysis';
1010
import { VariantAnalysisMonitorResult } from './shared/variant-analysis-monitor-result';
11-
import { processFailureReason, processUpdatedVariantAnalysis } from './variant-analysis-processor';
11+
import { processUpdatedVariantAnalysis } from './variant-analysis-processor';
1212
import { DisposableObject } from '../pure/disposable-object';
1313

1414
export class VariantAnalysisMonitor extends DisposableObject {
@@ -36,53 +36,37 @@ export class VariantAnalysisMonitor extends DisposableObject {
3636
throw Error('Error authenticating with GitHub');
3737
}
3838

39-
let variantAnalysisSummary: VariantAnalysisApiResponse;
4039
let attemptCount = 0;
4140
const scannedReposDownloaded: number[] = [];
4241

43-
this._onVariantAnalysisChange.fire(variantAnalysis);
44-
4542
while (attemptCount <= VariantAnalysisMonitor.maxAttemptCount) {
4643
await this.sleep(VariantAnalysisMonitor.sleepTime);
4744

4845
if (cancellationToken && cancellationToken.isCancellationRequested) {
49-
return { status: 'Cancelled', error: 'Variant Analysis was canceled.' };
46+
return { status: 'Canceled' };
5047
}
5148

52-
variantAnalysisSummary = await ghApiClient.getVariantAnalysis(
49+
const variantAnalysisSummary = await ghApiClient.getVariantAnalysis(
5350
credentials,
5451
variantAnalysis.controllerRepo.id,
5552
variantAnalysis.id
5653
);
5754

58-
if (variantAnalysisSummary.failure_reason) {
59-
variantAnalysis.status = VariantAnalysisStatus.Failed;
60-
variantAnalysis.failureReason = processFailureReason(variantAnalysisSummary.failure_reason);
61-
62-
this._onVariantAnalysisChange.fire(variantAnalysis);
63-
64-
return {
65-
status: 'Failed',
66-
error: `Variant Analysis has failed: ${variantAnalysisSummary.failure_reason}`,
67-
variantAnalysis: variantAnalysis
68-
};
69-
}
70-
7155
variantAnalysis = processUpdatedVariantAnalysis(variantAnalysis, variantAnalysisSummary);
7256

7357
this._onVariantAnalysisChange.fire(variantAnalysis);
7458

7559
const downloadedRepos = this.downloadVariantAnalysisResults(variantAnalysisSummary, scannedReposDownloaded);
7660
scannedReposDownloaded.push(...downloadedRepos);
7761

78-
if (variantAnalysisSummary.status === 'completed') {
62+
if (isFinalVariantAnalysisStatus(variantAnalysis.status) || variantAnalysis.failureReason) {
7963
break;
8064
}
8165

8266
attemptCount++;
8367
}
8468

85-
return { status: 'CompletedSuccessfully', scannedReposDownloaded: scannedReposDownloaded };
69+
return { status: 'Completed', scannedReposDownloaded, variantAnalysis };
8670
}
8771

8872
private scheduleForDownload(

extensions/ql-vscode/src/remote-queries/variant-analysis-processor.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export function processUpdatedVariantAnalysis(
6262
executionStartTime: previousVariantAnalysis.executionStartTime,
6363
createdAt: response.created_at,
6464
updatedAt: response.updated_at,
65-
status: processApiStatus(response.status),
65+
status: processApiStatus(response.status, response.failure_reason),
6666
completedAt: response.completed_at,
6767
actionsWorkflowRunId: response.actions_workflow_run_id,
6868
scannedRepos: scannedRepos,
@@ -158,12 +158,13 @@ function processApiRepoStatus(analysisStatus: ApiVariantAnalysisRepoStatus): Var
158158
}
159159
}
160160

161-
function processApiStatus(status: ApiVariantAnalysisStatus): VariantAnalysisStatus {
162-
switch (status) {
163-
case 'in_progress':
164-
return VariantAnalysisStatus.InProgress;
165-
case 'completed':
166-
return VariantAnalysisStatus.Succeeded;
161+
function processApiStatus(status: ApiVariantAnalysisStatus, failureReason: string | undefined): VariantAnalysisStatus {
162+
if (status === 'in_progress') {
163+
return VariantAnalysisStatus.InProgress;
164+
} else if (failureReason !== undefined) {
165+
return VariantAnalysisStatus.Failed;
166+
} else {
167+
return VariantAnalysisStatus.Succeeded;
167168
}
168169
}
169170

extensions/ql-vscode/src/vscode-tests/cli-integration/remote-queries/variant-analysis-monitor.test.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -83,23 +83,22 @@ describe('Variant Analysis Monitor', async function() {
8383

8484
const result = await variantAnalysisMonitor.monitorVariantAnalysis(variantAnalysis, cancellationTokenSource.token);
8585

86-
expect(result).to.eql({ status: 'Cancelled', error: 'Variant Analysis was canceled.' });
86+
expect(result).to.eql({ status: 'Canceled' });
8787
});
8888

8989
describe('when the variant analysis fails', async () => {
9090
let mockFailedApiResponse: VariantAnalysisApiResponse;
9191

9292
beforeEach(async function() {
93-
mockFailedApiResponse = createFailedMockApiResponse('in_progress');
93+
mockFailedApiResponse = createFailedMockApiResponse();
9494
mockGetVariantAnalysis = sandbox.stub(ghApiClient, 'getVariantAnalysis').resolves(mockFailedApiResponse);
9595
});
9696

9797
it('should mark as failed locally and stop monitoring', async () => {
9898
const result = await variantAnalysisMonitor.monitorVariantAnalysis(variantAnalysis, cancellationTokenSource.token);
9999

100100
expect(mockGetVariantAnalysis.calledOnce).to.be.true;
101-
expect(result.status).to.eql('Failed');
102-
expect(result.error).to.eql(`Variant Analysis has failed: ${mockFailedApiResponse.failure_reason}`);
101+
expect(result.status).to.eql('Completed');
103102
expect(result.variantAnalysis?.status).to.equal(VariantAnalysisStatus.Failed);
104103
expect(result.variantAnalysis?.failureReason).to.equal(processFailureReason(mockFailedApiResponse.failure_reason as VariantAnalysisFailureReason));
105104
});
@@ -130,7 +129,7 @@ describe('Variant Analysis Monitor', async function() {
130129
it('should succeed and return a list of scanned repo ids', async () => {
131130
const result = await variantAnalysisMonitor.monitorVariantAnalysis(variantAnalysis, cancellationTokenSource.token);
132131

133-
expect(result.status).to.equal('CompletedSuccessfully');
132+
expect(result.status).to.equal('Completed');
134133
expect(result.scannedReposDownloaded).to.eql(succeededRepos.map(r => r.repository.id));
135134
});
136135

@@ -173,7 +172,7 @@ describe('Variant Analysis Monitor', async function() {
173172
it('should succeed and return an empty list of scanned repo ids', async () => {
174173
const result = await variantAnalysisMonitor.monitorVariantAnalysis(variantAnalysis, cancellationTokenSource.token);
175174

176-
expect(result.status).to.equal('CompletedSuccessfully');
175+
expect(result.status).to.equal('Completed');
177176
expect(result.scannedReposDownloaded).to.eql([]);
178177
});
179178

@@ -194,7 +193,7 @@ describe('Variant Analysis Monitor', async function() {
194193
it('should succeed and return an empty list of scanned repo ids', async () => {
195194
const result = await variantAnalysisMonitor.monitorVariantAnalysis(variantAnalysis, cancellationTokenSource.token);
196195

197-
expect(result.status).to.equal('CompletedSuccessfully');
196+
expect(result.status).to.equal('Completed');
198197
expect(result.scannedReposDownloaded).to.eql([]);
199198
});
200199

extensions/ql-vscode/src/vscode-tests/factories/remote-queries/gh-api/variant-analysis-api-response.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,10 @@ export function createMockApiResponse(
3939
}
4040

4141
export function createFailedMockApiResponse(
42-
status: VariantAnalysisStatus = 'in_progress',
4342
scannedRepos: VariantAnalysisScannedRepository[] = createMockScannedRepos(),
4443
skippedRepos: VariantAnalysisSkippedRepositories = createMockSkippedRepos(),
4544
): VariantAnalysisApiResponse {
46-
const variantAnalysis = createMockApiResponse(status, scannedRepos, skippedRepos);
47-
variantAnalysis.status = status;
45+
const variantAnalysis = createMockApiResponse('completed', scannedRepos, skippedRepos);
4846
variantAnalysis.failure_reason = 'internal_error';
49-
5047
return variantAnalysis;
5148
}

0 commit comments

Comments
 (0)