1
1
import { ChangeDetectionStrategy , ChangeDetectorRef , Component , OnDestroy , OnInit } from '@angular/core' ;
2
2
import { Select , Store } from '@ngxs/store' ;
3
3
import {
4
+ UIArtifact ,
4
5
WorkflowNodeRun ,
5
6
WorkflowNodeRunArtifact ,
6
- WorkflowNodeRunStaticFiles ,
7
- WorkflowRunResultArtifact
7
+ WorkflowNodeRunStaticFiles , WorkflowRunResult ,
8
+ WorkflowRunResultArtifact , WorkflowRunResultArtifactManager
8
9
} from 'app/model/workflow.run.model' ;
9
10
10
11
import { AutoUnsubscribe } from 'app/shared/decorator/autoUnsubscribe' ;
11
12
import { Column , ColumnType , Filter } from 'app/shared/table/data-table.component' ;
12
13
import { WorkflowState } from 'app/store/workflow.state' ;
13
14
import { Observable , Subscription } from 'rxjs' ;
15
+ import { Workflow } from 'app/model/workflow.model' ;
14
16
15
17
@Component ( {
16
18
selector : 'app-workflow-artifact-list' ,
@@ -23,42 +25,46 @@ export class WorkflowRunArtifactListComponent implements OnInit, OnDestroy {
23
25
@Select ( WorkflowState . getSelectedNodeRun ( ) ) nodeRun$ : Observable < WorkflowNodeRun > ;
24
26
nodeRunSubs : Subscription ;
25
27
28
+ runResult : Array < WorkflowRunResult >
26
29
artifacts : Array < WorkflowNodeRunArtifact > ;
30
+
31
+ uiArtifacts : Array < UIArtifact > ;
27
32
staticFiles : Array < WorkflowNodeRunStaticFiles > ;
28
33
29
- filter : Filter < WorkflowNodeRunArtifact > ;
30
- columns : Array < Column < WorkflowNodeRunArtifact > > ;
34
+ filter : Filter < UIArtifact > ;
35
+ columns : Array < Column < UIArtifact > > ;
31
36
32
37
constructor ( private _cd : ChangeDetectorRef , private _store : Store ) {
33
38
this . filter = f => {
34
39
const lowerFilter = f . toLowerCase ( ) ;
35
40
return d => d . name . toLowerCase ( ) . indexOf ( lowerFilter ) !== - 1 ||
36
- d . sha512sum . toLowerCase ( ) . indexOf ( lowerFilter ) !== - 1
41
+ d . md5 . toLowerCase ( ) . indexOf ( lowerFilter ) !== - 1
37
42
} ;
38
43
this . columns = [
39
- < Column < WorkflowNodeRunArtifact > > {
44
+ < Column < UIArtifact > > {
40
45
type : ColumnType . LINK ,
41
46
name : 'artifact_name' ,
42
- selector : ( a : WorkflowNodeRunArtifact ) => {
47
+ selector : ( a : UIArtifact ) => {
43
48
let size = this . getHumainFileSize ( a . size ) ;
44
- let link = `./cdsapi/workflow/artifact/${ a . download_hash } `
45
- if ( ! a . id ) {
46
- link = `./cdscdn/item/run-result/${ a . download_hash } /download`
49
+ let link = a . link ;
50
+ let value = a . name ;
51
+ if ( size ) {
52
+ value += ` (${ size } )` ;
47
53
}
48
54
return {
49
55
link,
50
- value : ` ${ a . name } ( ${ size } )`
56
+ value
51
57
} ;
52
58
}
53
59
} ,
54
- < Column < WorkflowNodeRunArtifact > > {
55
- name : 'artifact_tag ' ,
56
- selector : ( a : WorkflowNodeRunArtifact ) => a . tag
60
+ < Column < UIArtifact > > {
61
+ name : 'Type of artifact ' ,
62
+ selector : ( a : UIArtifact ) => a . type
57
63
} ,
58
- < Column < WorkflowNodeRunArtifact > > {
64
+ < Column < UIArtifact > > {
59
65
type : ColumnType . TEXT_COPY ,
60
66
name : 'MD5 Sum' ,
61
- selector : ( a : WorkflowNodeRunArtifact ) => a . md5sum
67
+ selector : ( a : UIArtifact ) => a . md5
62
68
}
63
69
] ;
64
70
}
@@ -70,16 +76,36 @@ export class WorkflowRunArtifactListComponent implements OnInit, OnDestroy {
70
76
if ( ! nr ) {
71
77
return ;
72
78
}
73
- let resultArtifacts = nr ?. results . filter ( r => r . type === 'artifact' ) . map ( r => < WorkflowRunResultArtifact > r . data ) ;
74
- if ( ! resultArtifacts ) {
75
- resultArtifacts = new Array < WorkflowRunResultArtifact > ( ) ;
79
+
80
+ let computeArtifact = false ;
81
+ if ( nr . results && ( ! this . runResult || nr . results . length !== this . runResult . length ) ) {
82
+ computeArtifact = true
83
+ }
84
+ if ( nr . artifacts && ( ! this . artifacts || nr . artifacts . length !== this . artifacts . length ) ) {
85
+ computeArtifact = true
76
86
}
77
- if ( ( ! this . artifacts && ( nr . artifacts || resultArtifacts . length > 0 ) ) || ( this . artifacts && nr . artifacts && this . artifacts . length !== ( nr . artifacts . length + resultArtifacts . length ) ) ) {
78
- this . artifacts = new Array < WorkflowNodeRunArtifact > ( ) ;
87
+ if ( computeArtifact ) {
88
+ let uiArtifacts : Array < UIArtifact > ;
89
+ let uiRunResults : Array < UIArtifact > ;
90
+ this . uiArtifacts = new Array < UIArtifact > ( ) ;
91
+ if ( nr . results ) {
92
+ let w = this . _store . selectSnapshot ( WorkflowState . workflowRunSnapshot ) . workflow
93
+ uiRunResults = this . toUIArtifact ( w , nr . results ) ;
94
+ this . uiArtifacts . push ( ...uiRunResults ) ;
95
+ }
96
+
79
97
if ( nr . artifacts ) {
80
- this . artifacts . push ( ...nr . artifacts ) ;
98
+ uiArtifacts = nr . artifacts . map ( a => {
99
+ let uiArt = new UIArtifact ( ) ;
100
+ uiArt . name = a . name ;
101
+ uiArt . size = a . size ;
102
+ uiArt . md5 = a . md5sum ;
103
+ uiArt . type = 'file' ;
104
+ uiArt . link = `./cdscdn/item/artifact/${ a . download_hash } /download` ;
105
+ return uiArt ;
106
+ } ) ;
107
+ this . uiArtifacts . push ( ...uiArtifacts )
81
108
}
82
- this . artifacts . push ( ...this . toWorkflowNodeRunArtifacts ( resultArtifacts ) ) ;
83
109
this . _cd . markForCheck ( ) ;
84
110
}
85
111
if ( ( ! this . staticFiles && nr . static_files ) ||
@@ -90,25 +116,52 @@ export class WorkflowRunArtifactListComponent implements OnInit, OnDestroy {
90
116
} ) ;
91
117
}
92
118
93
- toWorkflowNodeRunArtifacts ( results : Array < WorkflowRunResultArtifact > ) : Array < WorkflowNodeRunArtifact > {
94
- let arts = new Array < WorkflowNodeRunArtifact > ( ) ;
95
- results . forEach ( r => {
96
- let a = new WorkflowNodeRunArtifact ( ) ;
97
- a . download_hash = r . cdn_hash ;
98
- a . md5sum = r . md5 ;
99
- a . size = r . size ;
100
- a . name = r . name ;
101
- arts . push ( a ) ;
102
- } )
103
- return arts ;
104
- }
105
-
106
119
getHumainFileSize ( size : number ) : string {
107
120
if ( size === 0 ) {
108
- return '0B ' ;
121
+ return '' ;
109
122
}
110
123
let i = Math . floor ( Math . log ( size ) / Math . log ( 1024 ) ) ;
111
124
let hSize = ( size / Math . pow ( 1024 , i ) ) . toFixed ( 2 ) ;
112
125
return hSize + ' ' + [ 'B' , 'kB' , 'MB' , 'GB' , 'TB' ] [ i ] ;
113
126
}
127
+
128
+ private toUIArtifact ( w : Workflow , results : Array < WorkflowRunResult > ) : Array < UIArtifact > {
129
+ if ( ! results ) {
130
+ return [ ] ;
131
+ }
132
+ let integrationArtifactManagerURL = '' ;
133
+ if ( w ?. integrations ) {
134
+ for ( let i = 0 ; i < w . integrations . length ; i ++ ) {
135
+ let integ = w . integrations [ i ] ;
136
+ if ( ! integ . project_integration . model . artifact_manager ) {
137
+ continue
138
+ }
139
+ integrationArtifactManagerURL = integ ?. project_integration ?. config [ 'url' ] ?. value ;
140
+ }
141
+ }
142
+
143
+ return results . map ( r => {
144
+ switch ( r . type ) {
145
+ case 'artifact' :
146
+ case 'coverage' :
147
+ let data = < WorkflowRunResultArtifact > r . data ;
148
+ let uiArtifact = new UIArtifact ( ) ;
149
+ uiArtifact . link = `./cdscdn/item/run-result/${ data . cdn_hash } /download` ;
150
+ uiArtifact . md5 = data . md5 ;
151
+ uiArtifact . name = data . name ;
152
+ uiArtifact . size = data . size ;
153
+ uiArtifact . type = 'file' ;
154
+ return uiArtifact ;
155
+ case 'artifact-manager' :
156
+ let dataAM = < WorkflowRunResultArtifactManager > r . data ;
157
+ let uiArtifactAM = new UIArtifact ( ) ;
158
+ uiArtifactAM . link = `${ integrationArtifactManagerURL } ${ dataAM . repository_name } /${ dataAM . path } ` ;
159
+ uiArtifactAM . md5 = dataAM . md5 ;
160
+ uiArtifactAM . name = dataAM . name ;
161
+ uiArtifactAM . size = dataAM . size ;
162
+ uiArtifactAM . type = dataAM . repository_type ;
163
+ return uiArtifactAM ;
164
+ }
165
+ } )
166
+ }
114
167
}
0 commit comments