Skip to content

Commit 93dc361

Browse files
committed
feat: import scan-result api from fe-lib and update security modal props
1 parent 74f230e commit 93dc361

File tree

12 files changed

+201
-113
lines changed

12 files changed

+201
-113
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"homepage": "/dashboard",
66
"dependencies": {
7-
"@devtron-labs/devtron-fe-common-lib": "0.3.5-beta-3",
7+
"@devtron-labs/devtron-fe-common-lib": "0.3.5-beta-6",
88
"@esbuild-plugins/node-globals-polyfill": "0.2.3",
99
"@rjsf/core": "^5.13.3",
1010
"@rjsf/utils": "^5.13.3",

src/components/ResourceBrowser/ResourceList/ResourceBrowserActionMenu.tsx

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,17 @@
1515
*/
1616

1717
import React, { useState } from 'react'
18-
import { PopupMenu, Nodes, useMainContext, ModuleNameMap, SecurityModal } from '@devtron-labs/devtron-fe-common-lib'
18+
import {
19+
PopupMenu,
20+
Nodes,
21+
useMainContext,
22+
ModuleNameMap,
23+
SecurityModal,
24+
ResponseType,
25+
ApiResponseResultType,
26+
GetResourceScanDetailsPayloadType,
27+
useAsync,
28+
} from '@devtron-labs/devtron-fe-common-lib'
1929
import DeleteResourcePopup from './DeleteResourcePopup'
2030
import { importComponentFromFELibrary, getShowResourceScanModal } from '../../common'
2131
import { RESOURCE_ACTION_MENU } from '../Constants'
@@ -29,7 +39,24 @@ import { ReactComponent as MenuDots } from '../../../assets/icons/appstatus/ic-m
2939
import { NodeType } from '../../v2/appDetails/appDetails.type'
3040

3141
const OpenSecurityModalButton = importComponentFromFELibrary('OpenSecurityModalButton', null, 'function')
32-
const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', null, 'function')
42+
const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', false, 'function')
43+
const SecurityModalSidebar = importComponentFromFELibrary('SecurityModalSidebar', null, 'function')
44+
const getResourceScanDetails: ({
45+
name,
46+
namespace,
47+
clusterId,
48+
group,
49+
version,
50+
kind,
51+
appId,
52+
appType,
53+
deploymentType,
54+
isAppDetailView,
55+
}: GetResourceScanDetailsPayloadType) => Promise<ResponseType<ApiResponseResultType>> = importComponentFromFELibrary(
56+
'getResourceScanDetails',
57+
null,
58+
'function',
59+
)
3360

3461
const ResourceBrowserActionMenu: React.FC<ResourceBrowserActionMenuType> = ({
3562
clusterId,
@@ -41,9 +68,25 @@ const ResourceBrowserActionMenu: React.FC<ResourceBrowserActionMenuType> = ({
4168
}) => {
4269
const { installedModuleMap } = useMainContext()
4370

71+
const isSecurityScanV2Enabled = window._env_.ENABLE_RESOURCE_SCAN_V2 && isFELibAvailable
72+
4473
const [showDeleteDialog, setShowDeleteDialog] = useState(false)
4574
const [showVulnerabilityModal, setShowVulnerabilityModal] = useState(false)
4675

76+
const [resourceScanLoading, resourceScanResponse, resourceScanError] = useAsync(
77+
() =>
78+
getResourceScanDetails({
79+
name: String(resourceData.name),
80+
namespace: String(resourceData.namespace),
81+
group: selectedResource?.gvk?.Group,
82+
kind: selectedResource?.gvk?.Kind,
83+
version: selectedResource?.gvk?.Version,
84+
clusterId: +clusterId,
85+
}),
86+
[],
87+
showVulnerabilityModal && getResourceScanDetails && isSecurityScanV2Enabled,
88+
)
89+
4790
const toggleDeleteDialog = () => {
4891
setShowDeleteDialog((prevState) => !prevState)
4992
}
@@ -143,15 +186,13 @@ const ResourceBrowserActionMenu: React.FC<ResourceBrowserActionMenuType> = ({
143186

144187
{showVulnerabilityModal && !!isFELibAvailable && (
145188
<SecurityModal
146-
resourceScanPayload={{
147-
name: String(resourceData.name),
148-
namespace: String(resourceData.namespace),
149-
group: selectedResource?.gvk?.Group,
150-
kind: selectedResource?.gvk?.Kind,
151-
version: selectedResource?.gvk?.Version,
152-
clusterId: +clusterId,
153-
}}
189+
isResourceScan
154190
handleModalClose={handleCloseVulnerabilityModal}
191+
Sidebar={SecurityModalSidebar}
192+
isSecurityScanV2Enabled={isSecurityScanV2Enabled}
193+
isLoading={resourceScanLoading}
194+
error={resourceScanError}
195+
responseData={resourceScanResponse?.result}
155196
/>
156197
)}
157198
</>

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

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,37 @@
1-
import { getSecurityScan, useAsync } from '@devtron-labs/devtron-fe-common-lib'
2-
import { getLastExecutionMinByAppAndEnv } from '@Services/service'
1+
import {
2+
ApiResponseResultType,
3+
AppDetailsPayload,
4+
getExecutionDetails,
5+
ResponseType,
6+
useAsync,
7+
} from '@devtron-labs/devtron-fe-common-lib'
8+
import { importComponentFromFELibrary } from '@Components/common'
39
import { UseGetAppSecurityDetailsProps, UseGetAppSecurityDetailsReturnType } from './appDetails.type'
410

11+
const getSecurityScan: ({
12+
appId,
13+
envId,
14+
installedAppId,
15+
}: AppDetailsPayload) => Promise<ResponseType<ApiResponseResultType>> = importComponentFromFELibrary(
16+
'getSecurityScan',
17+
null,
18+
'function',
19+
)
20+
521
export const useGetAppSecurityDetails = ({
622
appId,
723
envId,
24+
installedAppId,
825
isSecurityScanV2Enabled,
926
}: UseGetAppSecurityDetailsProps): UseGetAppSecurityDetailsReturnType => {
1027
const [scanResultLoading, scanResultResponse, scanResultError, reloadScanResult] = useAsync(
11-
() => getSecurityScan({ appId, envId }),
12-
[appId, envId],
13-
isSecurityScanV2Enabled,
28+
() => getSecurityScan({ appId, envId, installedAppId }),
29+
[appId, envId, installedAppId],
30+
getSecurityScan && isSecurityScanV2Enabled,
1431
)
1532

1633
const [executionDetailsLoading, executionDetailsResponse, executionDetailsError, reloadExecutionDetails] = useAsync(
17-
() => getLastExecutionMinByAppAndEnv(appId, envId),
34+
() => getExecutionDetails({ appId, envId }),
1835
[appId, envId],
1936
!isSecurityScanV2Enabled,
2037
)

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

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { importComponentFromFELibrary } from '../../../common'
2626
import { useGetAppSecurityDetails } from './AppSecurity'
2727

2828
const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', null, 'function')
29+
const SecurityModalSidebar = importComponentFromFELibrary('SecurityModalSidebar', null, 'function')
2930

3031
export const SecurityVulnerabilityCard = ({
3132
cardLoading,
@@ -40,7 +41,7 @@ export const SecurityVulnerabilityCard = ({
4041
const handleModalClose = () => setShowScanDetailsModal(false)
4142

4243
const { scanDetailsLoading, scanResultResponse, executionDetailsResponse, scanDetailsError, reloadScanDetails } =
43-
useGetAppSecurityDetails({ appId, envId, isSecurityScanV2Enabled })
44+
useGetAppSecurityDetails({ appId, envId, installedAppId, isSecurityScanV2Enabled })
4445

4546
const imageScanFailed = scanResultResponse?.result.codeScan.status === 'Failed'
4647
const imageScanProgressing = scanResultResponse?.result.codeScan.status === 'Progressing'
@@ -52,10 +53,11 @@ export const SecurityVulnerabilityCard = ({
5253
}
5354
}
5455

55-
const scanResultSeverities = scanResultResponse?.result.imageScan.vulnerability?.summary.severities // For scan-result Api
56+
const scanResultSeverities = scanResultResponse?.result.imageScan.vulnerability?.summary.severities
57+
const executionDetailsSeverities = executionDetailsResponse?.result.imageScan.vulnerability?.summary.severities
5658
const severityCount: SeverityCount = isSecurityScanV2Enabled
5759
? getSeverityCountFromSummary(scanResultSeverities)
58-
: executionDetailsResponse?.result.severityCount ?? { critical: 0, high: 0, medium: 0, low: 0, unknown: 0 }
60+
: getSeverityCountFromSummary(executionDetailsSeverities)
5961

6062
const totalCount = getTotalSeverityCount(severityCount)
6163

@@ -190,21 +192,12 @@ export const SecurityVulnerabilityCard = ({
190192
<SecurityModal
191193
handleModalClose={handleModalClose}
192194
isExternalCI={isExternalCI}
193-
{...(isSecurityScanV2Enabled
194-
? {
195-
appDetailsPayload: {
196-
appId,
197-
envId,
198-
installedAppId: installedAppId ? String(installedAppId) : null,
199-
},
200-
}
201-
: {
202-
executionDetailsPayload: {
203-
appId,
204-
envId,
205-
imageScanDeployInfoId: executionDetailsResponse?.result.imageScanDeployInfoId,
206-
},
207-
})}
195+
Sidebar={SecurityModalSidebar}
196+
isSecurityScanV2Enabled={isSecurityScanV2Enabled}
197+
isHelmApp={!!installedAppId}
198+
isLoading={scanDetailsLoading}
199+
error={scanDetailsError}
200+
responseData={isSecurityScanV2Enabled ? scanResultResponse?.result : executionDetailsResponse?.result}
208201
/>
209202
)}
210203
</button>

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

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

17-
import { ACTION_STATE, getSecurityScan, ResponseType } from '@devtron-labs/devtron-fe-common-lib'
18-
import { getLastExecutionMinByAppAndEnv } from '@Services/service'
17+
import { ACTION_STATE, ApiResponseResultType, ResponseType } from '@devtron-labs/devtron-fe-common-lib'
1918
import { AggregatedNodes, OptionType } from '../../types'
2019
import { SyncErrorType, AppDetails } from '../../../v2/appDetails/appDetails.type'
2120

@@ -262,12 +261,13 @@ export interface LastUpdatedCardType {
262261
export interface UseGetAppSecurityDetailsProps {
263262
appId: string
264263
envId: string
264+
installedAppId: number
265265
isSecurityScanV2Enabled: boolean
266266
}
267267
export interface UseGetAppSecurityDetailsReturnType {
268268
scanDetailsLoading: boolean
269-
scanResultResponse: Awaited<ReturnType<typeof getSecurityScan>>
270-
executionDetailsResponse: Awaited<ReturnType<typeof getLastExecutionMinByAppAndEnv>>
269+
scanResultResponse: ResponseType<ApiResponseResultType>
270+
executionDetailsResponse: ResponseType<ApiResponseResultType>
271271
scanDetailsError: any
272272
reloadScanDetails: () => void
273273
}

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

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import {
4848
ErrorScreenManager,
4949
getTotalSeverityCount,
5050
getSeverityCountFromSummary,
51+
parseExecutionDetailResponse,
5152
} from '@devtron-labs/devtron-fe-common-lib'
5253
import { Switch, Route, Redirect, useRouteMatch, useParams, useHistory, generatePath } from 'react-router-dom'
5354
import {
@@ -71,6 +72,7 @@ import { importComponentFromFELibrary } from '@Components/common'
7172
import { useGetCISecurityDetails } from './CISecurity.utils'
7273

7374
const isFELibAvailable = importComponentFromFELibrary('isFELibAvailable', null, 'function')
75+
const SecurityModalSidebar = importComponentFromFELibrary('SecurityModalSidebar', null, 'function')
7476
const terminalStatus = new Set(['succeeded', 'failed', 'error', 'cancelled', 'nottriggered', 'notbuilt'])
7577
const statusSet = new Set(['starting', 'running', 'pending'])
7678

@@ -640,8 +642,6 @@ const HistoryLogs = ({
640642
artifactId={triggerDetails.artifactId}
641643
status={triggerDetails.status}
642644
appIdFromParent={appIdFromParent}
643-
isJobCI={isJobCI}
644-
isJobView={isJobView}
645645
/>
646646
</Route>
647647
}
@@ -673,19 +673,19 @@ export const NoVulnerabilityViewWithTool = ({ scanToolId }: { scanToolId: number
673673
)
674674
}
675675

676-
const SecurityTab = ({ ciPipelineId, artifactId, status, appIdFromParent, isJobCI, isJobView }: SecurityTabType) => {
676+
const SecurityTab = ({ ciPipelineId, artifactId, status, appIdFromParent }: SecurityTabType) => {
677677
const { appId } = useParams<{ appId: string }>()
678678
const { push } = useHistory()
679679
const isSecurityScanV2Enabled = window._env_.ENABLE_RESOURCE_SCAN_V2 && !!isFELibAvailable
680680

681681
const computedAppId = appId ?? appIdFromParent
682682

683-
const { scanDetailsLoading, scanResultResponse, executionDetailsResponse, scanDetailsError, reloadScanDetails } = useGetCISecurityDetails({
684-
appId: computedAppId,
685-
artifactId,
686-
isJobCard: isJobCI || isJobView,
687-
isSecurityScanV2Enabled,
688-
})
683+
const { scanDetailsLoading, scanResultResponse, executionDetailsResponse, scanDetailsError, reloadScanDetails } =
684+
useGetCISecurityDetails({
685+
appId: computedAppId,
686+
artifactId,
687+
isSecurityScanV2Enabled,
688+
})
689689

690690
const redirectToCreate = () => {
691691
if (!ciPipelineId) {
@@ -748,14 +748,9 @@ const SecurityTab = ({ ciPipelineId, artifactId, status, appIdFromParent, isJobC
748748
severityCount={severityCount}
749749
scanToolId={executionDetailsResponse?.result.scanToolId ?? SCAN_TOOL_ID_TRIVY}
750750
rootClassName="w-500"
751-
{...(isSecurityScanV2Enabled
752-
? { appDetailsPayload: { appId: computedAppId, artifactId } }
753-
: {
754-
executionDetailsPayload: {
755-
appId: computedAppId,
756-
artifactId,
757-
},
758-
})}
751+
SecurityModalSidebar={SecurityModalSidebar}
752+
isSecurityScanV2Enabled={isSecurityScanV2Enabled}
753+
responseData={isSecurityScanV2Enabled ? scanResultResponse?.result : parseExecutionDetailResponse(executionDetailsResponse?.result)}
759754
/>
760755
</div>
761756
)

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1-
import { getSecurityScan, useAsync } from '@devtron-labs/devtron-fe-common-lib'
1+
import { ApiResponseResultType, AppDetailsPayload, ResponseType, useAsync } from '@devtron-labs/devtron-fe-common-lib'
22
import { getLastExecutionByAppArtifactId } from '@Services/service'
3+
import { importComponentFromFELibrary } from '@Components/common'
34
import { UseGetCISecurityDetailsProps, UseGetCISecurityDetailsReturnType } from './types'
45

6+
const getSecurityScan: ({
7+
appId,
8+
envId,
9+
installedAppId,
10+
}: AppDetailsPayload) => Promise<ResponseType<ApiResponseResultType>> = importComponentFromFELibrary(
11+
'getSecurityScan',
12+
null,
13+
'function',
14+
)
15+
516
export const useGetCISecurityDetails = ({
617
appId,
718
artifactId,
8-
isJobCard,
919
isSecurityScanV2Enabled,
1020
}: UseGetCISecurityDetailsProps): UseGetCISecurityDetailsReturnType => {
1121
const [scanResultLoading, scanResultResponse, scanResultError, reloadScanResult] = useAsync(
12-
() => getSecurityScan({ artifactId, ...(isJobCard && { appId }) }),
22+
() => getSecurityScan({ artifactId, appId }),
1323
[artifactId, appId],
1424
isSecurityScanV2Enabled,
1525
)
1626

1727
const [executionDetailsLoading, executionDetailsResponse, executionDetailsError, reloadExecutionDetails] = useAsync(
18-
() => getLastExecutionByAppArtifactId(artifactId, isJobCard ? appId : null),
28+
() => getLastExecutionByAppArtifactId(artifactId, appId),
1929
[artifactId, appId],
2030
!isSecurityScanV2Enabled,
2131
)

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,13 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
import { FetchIdDataStatus, getSecurityScan, History, useScrollable } from '@devtron-labs/devtron-fe-common-lib'
16+
import {
17+
ApiResponseResultType,
18+
FetchIdDataStatus,
19+
History,
20+
ResponseType,
21+
useScrollable,
22+
} from '@devtron-labs/devtron-fe-common-lib'
1723
import { getLastExecutionByAppArtifactId } from '@Services/service'
1824

1925
export interface CIPipeline {
@@ -62,20 +68,17 @@ export interface SecurityTabType {
6268
artifactId: number
6369
status: string
6470
appIdFromParent?: string
65-
isJobCI: boolean
66-
isJobView: boolean
6771
}
6872

6973
export interface UseGetCISecurityDetailsProps {
7074
appId: string
7175
artifactId: number
72-
isJobCard: boolean
7376
isSecurityScanV2Enabled: boolean
7477
}
7578

7679
export interface UseGetCISecurityDetailsReturnType {
7780
scanDetailsLoading: boolean
78-
scanResultResponse: Awaited<ReturnType<typeof getSecurityScan>>
81+
scanResultResponse: ResponseType<ApiResponseResultType>
7982
executionDetailsResponse: Awaited<ReturnType<typeof getLastExecutionByAppArtifactId>>
8083
scanDetailsError: any
8184
reloadScanDetails: () => void

0 commit comments

Comments
 (0)