Skip to content

Commit 17fc838

Browse files
Merge pull request #2876 from devtron-labs/test/cd-trigger
decouple CD Trigger testing
2 parents 4c68555 + 59e4222 commit 17fc838

22 files changed

+292
-437
lines changed

.eslintignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ src/components/app/details/testViewer/TestRunList.tsx
103103
src/components/app/details/triggerView/EmptyStateCIMaterial.tsx
104104
src/components/app/details/triggerView/MaterialSource.tsx
105105
src/components/app/details/triggerView/__tests__/triggerview.test.tsx
106-
src/components/app/details/triggerView/cdMaterial.tsx
107-
src/components/app/details/triggerView/ciMaterial.tsx
108106
src/components/app/details/triggerView/ciWebhook.service.ts
109107
src/components/app/details/triggerView/config.ts
110108
src/components/app/details/triggerView/workflow.service.ts

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": "1.19.0-pre-2",
7+
"@devtron-labs/devtron-fe-common-lib": "1.19.0-beta-2",
88
"@esbuild-plugins/node-globals-polyfill": "0.2.3",
99
"@rjsf/core": "^5.13.3",
1010
"@rjsf/utils": "^5.13.3",

src/components/ApplicationGroup/AppGroup.types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export type BulkCDDetailDerivedFromNode = Required<
7979
>
8080
> & {
8181
stageNotAvailable: boolean
82-
warningMessage: string
82+
errorMessage: string
8383
triggerBlockedInfo: TriggerBlockedInfo
8484
consequence: CommonNodeAttr['pluginBlockState']
8585
showPluginWarning: CommonNodeAttr['showPluginWarning']
@@ -92,6 +92,7 @@ export type BulkCDDetailType = BulkCDDetailDerivedFromNode &
9292
*/
9393
areMaterialsLoading: boolean
9494
materialError: ServerErrors | null
95+
tagsWarningMessage: string
9596
}
9697

9798
export interface BulkCDDetailTypeResponse {

src/components/ApplicationGroup/Details/TriggerView/EnvTriggerView.tsx

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

17-
import React, { useEffect, useRef, useState } from 'react'
17+
import React, { useEffect, useState } from 'react'
1818
import { Prompt, Route, Switch, useHistory, useLocation, useParams, useRouteMatch } from 'react-router-dom'
1919
import Tippy from '@tippyjs/react'
2020

@@ -29,7 +29,6 @@ import {
2929
DEFAULT_ROUTE_PROMPT_MESSAGE,
3030
DeploymentNodeType,
3131
ErrorScreenManager,
32-
handleAnalyticsEvent,
3332
PopupMenu,
3433
Progressing,
3534
ServerErrors,
@@ -43,7 +42,8 @@ import {
4342
} from '@devtron-labs/devtron-fe-common-lib'
4443

4544
import { BuildImageModal, BulkBuildImageModal } from '@Components/app/details/triggerView/BuildImageModal'
46-
import { BulkDeployModal, DeployImageModal } from '@Components/app/details/triggerView/DeployImageModal'
45+
import CDMaterial from '@Components/app/details/triggerView/CDMaterial'
46+
import { BulkDeployModal } from '@Components/app/details/triggerView/DeployImageModal'
4747
import { shouldRenderWebhookAddImageModal } from '@Components/app/details/triggerView/TriggerView.utils'
4848
import { getExternalCIConfig } from '@Components/ciPipeline/Webhook/webhook.service'
4949

@@ -58,7 +58,7 @@ import { TRIGGER_VIEW_PARAMS } from '../../../app/details/triggerView/Constants'
5858
import { CIMaterialRouterProps, MATERIAL_TYPE } from '../../../app/details/triggerView/types'
5959
import { Workflow } from '../../../app/details/triggerView/workflow/Workflow'
6060
import { triggerBranchChange } from '../../../app/service'
61-
import { getCDPipelineURL, importComponentFromFELibrary, sortObjectArrayAlphabetically } from '../../../common'
61+
import { importComponentFromFELibrary, sortObjectArrayAlphabetically } from '../../../common'
6262
import { getModuleInfo } from '../../../v2/devtronStackManager/DevtronStackManager.service'
6363
import { getWorkflows, getWorkflowStatus } from '../../AppGroup.service'
6464
import {
@@ -70,14 +70,12 @@ import {
7070
import { processWorkflowStatuses } from '../../AppGroup.utils'
7171
import {
7272
BulkResponseStatus,
73-
ENV_TRIGGER_VIEW_GA_EVENTS,
7473
GetBranchChangeStatus,
7574
SKIPPED_RESOURCES_MESSAGE,
7675
SKIPPED_RESOURCES_STATUS_TEXT,
7776
} from '../../Constants'
7877
import BulkSourceChange from './BulkSourceChange'
79-
import { RenderCDMaterialContentProps } from './types'
80-
import { getSelectedNodeAndAppId, getSelectedNodeAndMeta } from './utils'
78+
import { getSelectedNodeAndAppId } from './utils'
8179

8280
import './EnvTriggerView.scss'
8381

@@ -492,7 +490,7 @@ const EnvTriggerView = ({ filteredAppIds, isVirtualEnv }: AppGroupDetailDefaultT
492490
workflows={filteredWorkflows}
493491
isVirtualEnvironment={isVirtualEnv}
494492
envId={+envId}
495-
handleSuccess={reloadTriggerView}
493+
handleSuccess={getWorkflowStatusData}
496494
/>
497495
)
498496
}
@@ -529,95 +527,18 @@ const EnvTriggerView = ({ filteredAppIds, isVirtualEnv }: AppGroupDetailDefaultT
529527
)
530528
}
531529

532-
const renderCDMaterialContent = ({
533-
node,
534-
appId,
535-
workflowId,
536-
selectedAppName,
537-
doesWorkflowContainsWebhook,
538-
ciNodeId,
539-
}: RenderCDMaterialContentProps) => {
540-
const configurePluginURL = getCDPipelineURL(
541-
String(appId),
542-
workflowId,
543-
doesWorkflowContainsWebhook ? '0' : ciNodeId,
544-
doesWorkflowContainsWebhook,
545-
node?.id,
546-
true,
547-
)
548-
549-
const cdMaterialType = location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE)
550-
? MATERIAL_TYPE.inputMaterialList
551-
: MATERIAL_TYPE.rollbackMaterialList
552-
553-
return (
554-
<DeployImageModal
555-
appId={appId}
556-
envId={node?.environmentId}
557-
appName={selectedAppName}
558-
stageType={node.type as DeploymentNodeType}
559-
envName={node?.environmentName}
560-
pipelineId={+node.id}
561-
materialType={cdMaterialType}
562-
handleClose={revertToPreviousURL}
563-
handleSuccess={getWorkflowStatusData}
564-
deploymentAppType={node?.deploymentAppType}
565-
isVirtualEnvironment={isVirtualEnv}
566-
showPluginWarningBeforeTrigger={node?.showPluginWarning}
567-
consequence={node?.pluginBlockState}
568-
configurePluginURL={configurePluginURL}
569-
isTriggerBlockedDueToPlugin={node?.showPluginWarning && node?.isTriggerBlocked}
570-
triggerType={node?.triggerType}
571-
parentEnvironmentName={node?.parentEnvironmentName}
572-
/>
573-
)
574-
}
575-
576-
const renderCDMaterial = (): JSX.Element | null => {
577-
if (
578-
location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE) ||
579-
location.search.includes(TRIGGER_VIEW_PARAMS.ROLLBACK_NODE)
580-
) {
581-
const { node, appId, workflowId, appName, selectedCINode } = getSelectedNodeAndMeta(
582-
filteredWorkflows,
583-
location.search,
584-
)
585-
586-
if (!node?.id) {
587-
return null
588-
}
589-
590-
return renderCDMaterialContent({
591-
node,
592-
appId,
593-
selectedAppName: appName,
594-
workflowId,
595-
doesWorkflowContainsWebhook: selectedCINode?.type === WorkflowNodeType.WEBHOOK,
596-
ciNodeId: selectedCINode?.id,
597-
})
598-
}
599-
600-
return null
601-
}
602-
603530
const renderApprovalMaterial = () => {
604531
if (ApprovalMaterialModal && location.search.includes(TRIGGER_VIEW_PARAMS.APPROVAL_NODE)) {
605532
const { node, appId } = getSelectedNodeAndAppId(filteredWorkflows, location.search)
606533

607-
if (!node?.id || !appId) {
608-
showError('Invalid node id')
609-
return null
610-
}
611-
612534
return (
613535
<ApprovalMaterialModal
614-
isLoading={false}
615536
node={node ?? ({} as CommonNodeAttr)}
616537
materialType={MATERIAL_TYPE.inputMaterialList}
617538
stageType={DeploymentNodeType.CD}
618539
closeApprovalModal={closeApprovalModal}
619540
appId={appId}
620-
pipelineId={node.id}
541+
pipelineId={node?.id}
621542
getModuleInfo={getModuleInfo}
622543
ciPipelineId={node?.connectingCiPipelineId}
623544
history={history}
@@ -831,7 +752,12 @@ const EnvTriggerView = ({ filteredAppIds, isVirtualEnv }: AppGroupDetailDefaultT
831752
/>
832753
</Route>
833754
</Switch>
834-
{renderCDMaterial()}
755+
<CDMaterial
756+
workflows={filteredWorkflows}
757+
handleClose={revertToPreviousURL}
758+
handleSuccess={getWorkflowStatusData}
759+
isTriggerView={false}
760+
/>
835761
{renderBulkCDMaterial()}
836762
{renderBulkCIMaterial()}
837763
{renderApprovalMaterial()}

src/components/ApplicationGroup/Details/TriggerView/TriggerResponseModal.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ const TriggerResponseModalBody = ({ responseList, isLoading, isVirtualEnv }: Tri
8181
return <Progressing pageLoader />
8282
}
8383
return (
84-
<div className="response-list-container bg__primary pr-20 pb-16 pl-20 flex-grow-1">
84+
<div className="response-list-container bg__primary pr-20 pb-16 pl-20 flex-grow-1 h-100">
8585
<div
8686
className="dc__position-sticky dc__top-0 bg__primary dc__border-bottom response-row dc__border-bottom pt-24 pb-8"
8787
style={{ zIndex: 1 }}

src/components/ApplicationGroup/Details/TriggerView/types.ts

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

17-
import { CommonNodeAttr } from '@devtron-labs/devtron-fe-common-lib'
18-
1917
// Legacy components with no props so setting to any
2018
export interface BulkSourceChangeProps {
2119
closePopup: any
@@ -29,12 +27,3 @@ export interface SourceUpdateResponseModalProps {
2927
responseList: any
3028
isLoading: any
3129
}
32-
33-
export interface RenderCDMaterialContentProps {
34-
node: CommonNodeAttr
35-
appId: number
36-
selectedAppName: string
37-
workflowId: string
38-
doesWorkflowContainsWebhook: boolean
39-
ciNodeId: string
40-
}

src/components/ApplicationGroup/Details/TriggerView/utils.ts

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

17-
import { CommonNodeAttr, DeploymentNodeType, WorkflowNodeType, WorkflowType } from '@devtron-labs/devtron-fe-common-lib'
17+
import { CommonNodeAttr, DeploymentNodeType, WorkflowType } from '@devtron-labs/devtron-fe-common-lib'
1818

1919
import { DeployImageContentProps } from '@Components/app/details/triggerView/DeployImageModal/types'
2020
import { getNodeIdAndTypeFromSearch } from '@Components/app/details/triggerView/TriggerView.utils'
@@ -56,45 +56,6 @@ export const getSelectedAppListForBulkStrategy = (
5656
return appList.filter(({ pipelineId }) => feasiblePipelineIds.has(pipelineId))
5757
}
5858

59-
export const getSelectedNodeAndMeta = (
60-
workflows: WorkflowType[],
61-
search: string,
62-
): { node: CommonNodeAttr; workflowId: string; appId: number; appName: string; selectedCINode: CommonNodeAttr } => {
63-
const { cdNodeId, nodeType } = getNodeIdAndTypeFromSearch(search)
64-
65-
const result = workflows.reduce(
66-
(acc, workflow) => {
67-
if (acc.node) return acc
68-
const foundNode = workflow.nodes.find((node) => cdNodeId === node.id && node.type === nodeType)
69-
70-
if (foundNode) {
71-
const selectedCINode = workflow.nodes.find(
72-
(node) => node.type === WorkflowNodeType.CI || node.type === WorkflowNodeType.WEBHOOK,
73-
)
74-
return {
75-
node: foundNode,
76-
workflowId: workflow.id,
77-
appId: workflow.appId,
78-
appName: workflow.name,
79-
selectedCINode,
80-
}
81-
}
82-
return acc
83-
},
84-
{ node: undefined, workflowId: undefined, appId: undefined, appName: undefined, selectedCINode: undefined },
85-
)
86-
87-
return (
88-
result || {
89-
node: undefined,
90-
workflowId: undefined,
91-
appId: undefined,
92-
appName: undefined,
93-
selectedCINode: undefined,
94-
}
95-
)
96-
}
97-
9859
export const getSelectedNodeAndAppId = (
9960
workflows: WorkflowType[],
10061
search: string,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,8 +591,8 @@ const Details: React.FC<DetailsType> = ({
591591
environmentId={appDetails.environmentId}
592592
environmentName={appDetails.environmentName}
593593
isVirtualEnvironment={appDetails.isVirtualEnvironment}
594+
appName={appDetails.appName}
594595
deploymentAppType={appDetails.deploymentAppType}
595-
loadingDetails={loadingDetails}
596596
cdModal={{
597597
cdPipelineId: appDetails.cdPipelineId,
598598
ciPipelineId: appDetails.ciPipelineId,

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ const AppDetailsCDModal = ({
3434
cdModal,
3535
deploymentAppType,
3636
isVirtualEnvironment,
37-
loadingDetails,
3837
environmentName,
3938
handleSuccess,
4039
materialType,
@@ -55,7 +54,6 @@ const AppDetailsCDModal = ({
5554
ApprovalMaterialModal &&
5655
location.search.includes(TRIGGER_VIEW_PARAMS.APPROVAL_NODE) && (
5756
<ApprovalMaterialModal
58-
isLoading={loadingDetails}
5957
node={node}
6058
materialType={materialType}
6159
stageType={DeploymentNodeType.CD}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { useLocation } from 'react-router-dom'
2+
3+
import { DeploymentNodeType } from '@devtron-labs/devtron-fe-common-lib'
4+
5+
import { getCDPipelineURL, useAppContext } from '@Components/common'
6+
7+
import { TRIGGER_VIEW_PARAMS } from './Constants'
8+
import { DeployImageModal } from './DeployImageModal'
9+
import { getSelectedNodeFromWorkflows } from './TriggerView.utils'
10+
import { CDMaterialProps, MATERIAL_TYPE } from './types'
11+
12+
const CDMaterial = ({ workflows, handleClose, handleSuccess, isTriggerView }: CDMaterialProps) => {
13+
const location = useLocation()
14+
const { currentAppName: triggerViewAppName } = useAppContext()
15+
16+
if (
17+
location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE) ||
18+
location.search.includes(TRIGGER_VIEW_PARAMS.ROLLBACK_NODE)
19+
) {
20+
const { node: cdNode, cdNodeId } = getSelectedNodeFromWorkflows(workflows, location.search)
21+
22+
const materialType = location.search.includes(TRIGGER_VIEW_PARAMS.CD_NODE)
23+
? MATERIAL_TYPE.inputMaterialList
24+
: MATERIAL_TYPE.rollbackMaterialList
25+
26+
const selectedWorkflow = workflows.find((wf) => wf.nodes.some((node) => node.id === cdNodeId))
27+
const selectedCINode = selectedWorkflow?.nodes.find((node) => node.type === 'CI' || node.type === 'WEBHOOK')
28+
const doesWorkflowContainsWebhook = selectedCINode?.type === 'WEBHOOK'
29+
30+
const appId = selectedWorkflow?.appId ?? 0
31+
32+
const configurePluginURL = getCDPipelineURL(
33+
String(appId),
34+
selectedWorkflow?.id || '0',
35+
doesWorkflowContainsWebhook ? '0' : selectedCINode?.id,
36+
doesWorkflowContainsWebhook,
37+
cdNode.id || '0',
38+
true,
39+
)
40+
41+
return (
42+
<DeployImageModal
43+
materialType={materialType}
44+
appId={appId}
45+
envId={cdNode.environmentId}
46+
appName={isTriggerView ? triggerViewAppName : selectedWorkflow?.name ?? ''}
47+
stageType={cdNode.type as DeploymentNodeType}
48+
envName={cdNode.environmentName}
49+
pipelineId={Number(cdNodeId)}
50+
handleClose={handleClose}
51+
handleSuccess={handleSuccess}
52+
deploymentAppType={cdNode.deploymentAppType}
53+
isVirtualEnvironment={cdNode.isVirtualEnvironment}
54+
showPluginWarningBeforeTrigger={cdNode.showPluginWarning}
55+
consequence={cdNode.pluginBlockState}
56+
configurePluginURL={configurePluginURL}
57+
isTriggerBlockedDueToPlugin={cdNode.showPluginWarning && cdNode.isTriggerBlocked}
58+
triggerType={cdNode.triggerType}
59+
parentEnvironmentName={cdNode.parentEnvironmentName}
60+
/>
61+
)
62+
}
63+
64+
return null
65+
}
66+
67+
export default CDMaterial

0 commit comments

Comments
 (0)