Skip to content

Commit 6ad66d4

Browse files
committed
feat: add support for scan-result api in security scans tab
1 parent 93dc361 commit 6ad66d4

File tree

8 files changed

+90
-63
lines changed

8 files changed

+90
-63
lines changed

src/components/app/details/appDetails/AppSecurity.tsx

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ import {
22
ApiResponseResultType,
33
AppDetailsPayload,
44
getExecutionDetails,
5+
getSeverityCountFromSummary,
6+
getTotalSeverityCount,
57
ResponseType,
8+
SeverityCount,
69
useAsync,
710
} from '@devtron-labs/devtron-fe-common-lib'
811
import { importComponentFromFELibrary } from '@Components/common'
@@ -22,25 +25,36 @@ export const useGetAppSecurityDetails = ({
2225
appId,
2326
envId,
2427
installedAppId,
28+
imageScanDeployInfoId,
2529
isSecurityScanV2Enabled,
2630
}: UseGetAppSecurityDetailsProps): UseGetAppSecurityDetailsReturnType => {
2731
const [scanResultLoading, scanResultResponse, scanResultError, reloadScanResult] = useAsync(
2832
() => getSecurityScan({ appId, envId, installedAppId }),
2933
[appId, envId, installedAppId],
30-
getSecurityScan && isSecurityScanV2Enabled,
34+
getSecurityScan && isSecurityScanV2Enabled && (!!appId || !!installedAppId),
3135
)
3236

3337
const [executionDetailsLoading, executionDetailsResponse, executionDetailsError, reloadExecutionDetails] = useAsync(
34-
() => getExecutionDetails({ appId, envId }),
35-
[appId, envId],
36-
!isSecurityScanV2Enabled,
38+
() => getExecutionDetails({ appId, envId, imageScanDeployInfoId }),
39+
[appId, envId, imageScanDeployInfoId],
40+
!isSecurityScanV2Enabled && !!appId,
3741
)
3842

43+
const scanDetailsResponse = isSecurityScanV2Enabled ? scanResultResponse : executionDetailsResponse
44+
45+
const severities = isSecurityScanV2Enabled
46+
? scanResultResponse?.result.imageScan.vulnerability?.summary.severities
47+
: executionDetailsResponse?.result.imageScan.vulnerability?.summary.severities
48+
const severityCount: SeverityCount = getSeverityCountFromSummary(severities)
49+
50+
const totalCount = getTotalSeverityCount(severityCount)
51+
3952
return {
4053
scanDetailsLoading: scanResultLoading || executionDetailsLoading,
41-
scanResultResponse,
42-
executionDetailsResponse,
54+
scanDetailsResponse,
4355
scanDetailsError: scanResultError || executionDetailsError,
4456
reloadScanDetails: isSecurityScanV2Enabled ? reloadScanResult : reloadExecutionDetails,
57+
severityCount,
58+
totalCount,
4559
}
4660
}

src/components/app/details/appDetails/SecurityVulnerabilityCard.tsx

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@
1616

1717
import React, { useState } from 'react'
1818
import Tippy from '@tippyjs/react'
19-
import { getSeverityCountFromSummary, getTotalSeverityCount, SecurityModal, SeverityCount } from '@devtron-labs/devtron-fe-common-lib'
19+
import {
20+
getSeverityCountFromSummary,
21+
getTotalSeverityCount,
22+
SecurityModal,
23+
SeverityCount,
24+
} from '@devtron-labs/devtron-fe-common-lib'
2025
import { ReactComponent as Question } from '../../../../assets/icons/ic-help-outline.svg'
2126
import { ReactComponent as Bug } from '../../../../assets/icons/ic-nav-bug.svg'
2227
import { ReactComponent as Secure } from '../../../../assets/icons/ic-secure.svg'
@@ -40,11 +45,13 @@ export const SecurityVulnerabilityCard = ({
4045

4146
const handleModalClose = () => setShowScanDetailsModal(false)
4247

43-
const { scanDetailsLoading, scanResultResponse, executionDetailsResponse, scanDetailsError, reloadScanDetails } =
44-
useGetAppSecurityDetails({ appId, envId, installedAppId, isSecurityScanV2Enabled })
48+
const { scanDetailsLoading, scanDetailsResponse, scanDetailsError, reloadScanDetails, severityCount } =
49+
useGetAppSecurityDetails({ appId: +appId, envId: +envId, installedAppId, isSecurityScanV2Enabled })
4550

46-
const imageScanFailed = scanResultResponse?.result.codeScan.status === 'Failed'
47-
const imageScanProgressing = scanResultResponse?.result.codeScan.status === 'Progressing'
51+
// Since we get status in v2 Api only
52+
const imageScanFailed: boolean = isSecurityScanV2Enabled && scanDetailsResponse?.result.codeScan.status === 'Failed'
53+
const imageScanProgressing: boolean =
54+
isSecurityScanV2Enabled && scanDetailsResponse?.result.codeScan.status === 'Progressing'
4855

4956
const handleOnCardClick = () => {
5057
if (!cardLoading && !scanDetailsError && !showScanDetailsModal) {
@@ -53,12 +60,6 @@ export const SecurityVulnerabilityCard = ({
5360
}
5461
}
5562

56-
const scanResultSeverities = scanResultResponse?.result.imageScan.vulnerability?.summary.severities
57-
const executionDetailsSeverities = executionDetailsResponse?.result.imageScan.vulnerability?.summary.severities
58-
const severityCount: SeverityCount = isSecurityScanV2Enabled
59-
? getSeverityCountFromSummary(scanResultSeverities)
60-
: getSeverityCountFromSummary(executionDetailsSeverities)
61-
6263
const totalCount = getTotalSeverityCount(severityCount)
6364

6465
const getIcon = () => {
@@ -142,10 +143,7 @@ export const SecurityVulnerabilityCard = ({
142143
return <LoadingCard />
143144
}
144145

145-
if (
146-
(scanResultResponse && !scanResultResponse.result.scanned) ||
147-
(executionDetailsResponse && !executionDetailsResponse.result.scanned)
148-
) {
146+
if (scanDetailsResponse && !scanDetailsResponse.result.scanned) {
149147
return null
150148
}
151149

@@ -197,7 +195,7 @@ export const SecurityVulnerabilityCard = ({
197195
isHelmApp={!!installedAppId}
198196
isLoading={scanDetailsLoading}
199197
error={scanDetailsError}
200-
responseData={isSecurityScanV2Enabled ? scanResultResponse?.result : executionDetailsResponse?.result}
198+
responseData={scanDetailsResponse?.result}
201199
/>
202200
)}
203201
</button>

src/components/app/details/appDetails/appDetails.type.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@
1414
* limitations under the License.
1515
*/
1616

17-
import { ACTION_STATE, ApiResponseResultType, ResponseType } from '@devtron-labs/devtron-fe-common-lib'
17+
import {
18+
ACTION_STATE,
19+
ApiResponseResultType,
20+
ResponseType,
21+
ServerErrors,
22+
SeverityCount,
23+
} from '@devtron-labs/devtron-fe-common-lib'
1824
import { AggregatedNodes, OptionType } from '../../types'
1925
import { SyncErrorType, AppDetails } from '../../../v2/appDetails/appDetails.type'
2026

@@ -259,15 +265,17 @@ export interface LastUpdatedCardType {
259265
}
260266

261267
export interface UseGetAppSecurityDetailsProps {
262-
appId: string
263-
envId: string
264-
installedAppId: number
268+
appId: number
269+
envId: number
270+
installedAppId?: number
271+
imageScanDeployInfoId?: number
265272
isSecurityScanV2Enabled: boolean
266273
}
267274
export interface UseGetAppSecurityDetailsReturnType {
268275
scanDetailsLoading: boolean
269-
scanResultResponse: ResponseType<ApiResponseResultType>
270-
executionDetailsResponse: ResponseType<ApiResponseResultType>
271-
scanDetailsError: any
276+
scanDetailsResponse: ResponseType<ApiResponseResultType>
277+
scanDetailsError: ServerErrors
272278
reloadScanDetails: () => void
279+
severityCount: SeverityCount
280+
totalCount: number
273281
}

src/components/app/details/cIDetails/CIDetails.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -680,9 +680,9 @@ const SecurityTab = ({ ciPipelineId, artifactId, status, appIdFromParent }: Secu
680680

681681
const computedAppId = appId ?? appIdFromParent
682682

683-
const { scanDetailsLoading, scanResultResponse, executionDetailsResponse, scanDetailsError, reloadScanDetails } =
683+
const { scanDetailsLoading, scanResultResponse, executionDetailsResponse, scanDetailsError, reloadScanDetails, severityCount, totalCount } =
684684
useGetCISecurityDetails({
685-
appId: computedAppId,
685+
appId: +computedAppId,
686686
artifactId,
687687
isSecurityScanV2Enabled,
688688
})
@@ -727,14 +727,7 @@ const SecurityTab = ({ ciPipelineId, artifactId, status, appIdFromParent }: Secu
727727
return <ImageNotScannedView />
728728
}
729729

730-
const scanResultSeverities = scanResultResponse?.result.imageScan.vulnerability?.summary.severities // For scan-result Api
731-
const severityCount: SeverityCount = isSecurityScanV2Enabled
732-
? getSeverityCountFromSummary(scanResultSeverities)
733-
: executionDetailsResponse?.result.severityCount ?? { critical: 0, high: 0, medium: 0, low: 0, unknown: 0 }
734-
735-
const totalSeverities = getTotalSeverityCount(severityCount)
736-
737-
if (artifactId && !totalSeverities) {
730+
if (artifactId && !totalCount) {
738731
return (
739732
<NoVulnerabilityViewWithTool
740733
scanToolId={isSecurityScanV2Enabled ? SCAN_TOOL_ID_TRIVY : executionDetailsResponse.result?.scanToolId} // Since v2 scan is via trivy only

src/components/app/details/cIDetails/CISecurity.utils.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { ApiResponseResultType, AppDetailsPayload, ResponseType, useAsync } from '@devtron-labs/devtron-fe-common-lib'
1+
import {
2+
ApiResponseResultType,
3+
AppDetailsPayload,
4+
getSeverityCountFromSummary,
5+
getTotalSeverityCount,
6+
ResponseType,
7+
SeverityCount,
8+
useAsync,
9+
} from '@devtron-labs/devtron-fe-common-lib'
210
import { getLastExecutionByAppArtifactId } from '@Services/service'
311
import { importComponentFromFELibrary } from '@Components/common'
412
import { UseGetCISecurityDetailsProps, UseGetCISecurityDetailsReturnType } from './types'
@@ -30,11 +38,19 @@ export const useGetCISecurityDetails = ({
3038
!isSecurityScanV2Enabled,
3139
)
3240

41+
const severityCount: SeverityCount = isSecurityScanV2Enabled
42+
? getSeverityCountFromSummary(scanResultResponse?.result.imageScan.vulnerability?.summary.severities)
43+
: executionDetailsResponse?.result.severityCount ?? { critical: 0, high: 0, medium: 0, low: 0, unknown: 0 }
44+
45+
const totalCount = getTotalSeverityCount(severityCount)
46+
3347
return {
3448
scanDetailsLoading: scanResultLoading || executionDetailsLoading,
3549
scanResultResponse,
3650
executionDetailsResponse,
3751
scanDetailsError: scanResultError || executionDetailsError,
3852
reloadScanDetails: isSecurityScanV2Enabled ? reloadScanResult : reloadExecutionDetails,
53+
severityCount,
54+
totalCount,
3955
}
4056
}

src/components/app/details/cIDetails/types.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
useScrollable,
2222
} from '@devtron-labs/devtron-fe-common-lib'
2323
import { getLastExecutionByAppArtifactId } from '@Services/service'
24+
import { UseGetAppSecurityDetailsProps, UseGetAppSecurityDetailsReturnType } from '../appDetails/appDetails.type'
2425

2526
export interface CIPipeline {
2627
name: string
@@ -70,16 +71,16 @@ export interface SecurityTabType {
7071
appIdFromParent?: string
7172
}
7273

73-
export interface UseGetCISecurityDetailsProps {
74-
appId: string
74+
export interface UseGetCISecurityDetailsProps
75+
extends Pick<UseGetAppSecurityDetailsProps, 'appId' | 'isSecurityScanV2Enabled'> {
7576
artifactId: number
76-
isSecurityScanV2Enabled: boolean
7777
}
7878

79-
export interface UseGetCISecurityDetailsReturnType {
80-
scanDetailsLoading: boolean
79+
export interface UseGetCISecurityDetailsReturnType
80+
extends Pick<
81+
UseGetAppSecurityDetailsReturnType,
82+
'scanDetailsLoading' | 'scanDetailsError' | 'reloadScanDetails' | 'severityCount' | 'totalCount'
83+
> {
8184
scanResultResponse: ResponseType<ApiResponseResultType>
8285
executionDetailsResponse: Awaited<ReturnType<typeof getLastExecutionByAppArtifactId>>
83-
scanDetailsError: any
84-
reloadScanDetails: () => void
8586
}

src/components/app/details/triggerView/cdMaterial.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1581,7 +1581,6 @@ const CDMaterial = ({
15811581
changesCard={renderGitMaterialInfo(mat)}
15821582
isScanned={mat.scanned}
15831583
isScanEnabled={mat.scanEnabled}
1584-
isScanV2Enabled={isScanV2Enabled}
15851584
SecurityModalSidebar={SecurityModalSidebar}
15861585
getSecurityScan={getSecurityScan}
15871586
/>

src/components/security/SecurityScansTab/SecurityScansTab.tsx

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ import {
2020
abortPreviousRequests,
2121
getIsRequestAborted,
2222
SecurityModal,
23-
getExecutionDetails,
2423
} from '@devtron-labs/devtron-fe-common-lib'
2524
import { useMemo, useRef, useState } from 'react'
2625
import { getSeverityWithCount, importComponentFromFELibrary } from '@Components/common'
26+
import { useGetAppSecurityDetails } from '@Components/app/details/appDetails/AppSecurity'
2727
import { ReactComponent as ICDevtron } from '../../../assets/icons/ic-devtron-app.svg'
2828
import { getSecurityScanList, getVulnerabilityFilterData } from '../security.service'
2929
import {
@@ -66,16 +66,14 @@ export const SecurityScansTab = () => {
6666
updateSearchParams,
6767
} = urlFilters
6868

69-
const [executionDetailsLoading, executionDetailsResponse, executionsDetailsError] = useAsync(
70-
() =>
71-
getExecutionDetails({
72-
appId: scanDetails.uniqueId.appId,
73-
envId: scanDetails.uniqueId.envId,
74-
imageScanDeployInfoId: scanDetails.uniqueId.imageScanDeployInfoId,
75-
}),
76-
[scanDetails],
77-
!!scanDetails.uniqueId.appId,
78-
)
69+
const isSecurityScanV2Enabled = window._env_.ENABLE_RESOURCE_SCAN_V2 && SecurityModalSidebar
70+
71+
const { scanDetailsLoading, scanDetailsResponse, scanDetailsError } = useGetAppSecurityDetails({
72+
appId: scanDetails.uniqueId.appId,
73+
envId: scanDetails.uniqueId.envId,
74+
imageScanDeployInfoId: scanDetails.uniqueId.imageScanDeployInfoId,
75+
isSecurityScanV2Enabled,
76+
})
7977

8078
const payload: ScanListPayloadType = {
8179
offset,
@@ -362,11 +360,11 @@ export const SecurityScansTab = () => {
362360
<SecurityModal
363361
handleModalClose={handleCloseScanDetailsModal}
364362
Sidebar={SecurityModalSidebar}
365-
isSecurityScanV2Enabled={false}
363+
isSecurityScanV2Enabled={isSecurityScanV2Enabled}
366364
isHelmApp={false}
367-
isLoading={executionDetailsLoading}
368-
error={executionsDetailsError}
369-
responseData={executionDetailsResponse?.result}
365+
isLoading={scanDetailsLoading}
366+
error={scanDetailsError}
367+
responseData={scanDetailsResponse?.result}
370368
/>
371369
)
372370
}

0 commit comments

Comments
 (0)