1
1
package workflow
2
2
3
3
import (
4
- "archive/tar"
5
4
"bytes"
6
5
"context"
7
- "fmt "
6
+ "encoding/base64 "
8
7
"io"
9
8
"reflect"
10
9
@@ -19,7 +18,6 @@ import (
19
18
"github.com/ovh/cds/engine/api/workflowtemplate"
20
19
"github.com/ovh/cds/sdk"
21
20
"github.com/ovh/cds/sdk/exportentities"
22
- "github.com/ovh/cds/sdk/log"
23
21
)
24
22
25
23
// Export a workflow
@@ -61,29 +59,32 @@ func exportWorkflow(wf sdk.Workflow, f exportentities.Format, w io.Writer, opts
61
59
}
62
60
63
61
// Pull a workflow with all it dependencies; it writes a tar buffer in the writer
64
- func Pull (ctx context.Context , db gorp.SqlExecutor , cache cache.Store , proj * sdk.Project , name string , f exportentities.Format , encryptFunc sdk.EncryptFunc , u * sdk.User , w io.Writer , opts ... exportentities.WorkflowOptions ) error {
62
+ func Pull (ctx context.Context , db gorp.SqlExecutor , cache cache.Store , proj * sdk.Project , name string , f exportentities.Format ,
63
+ encryptFunc sdk.EncryptFunc , u * sdk.User , opts ... exportentities.WorkflowOptions ) (exportentities.WorkflowPulled , error ) {
65
64
ctx , end := observability .Span (ctx , "workflow.Pull" )
66
65
defer end ()
67
66
67
+ var wp exportentities.WorkflowPulled
68
+
68
69
options := LoadOptions {
69
70
DeepPipeline : true ,
70
71
}
71
72
wf , errload := Load (ctx , db , cache , proj , name , u , options )
72
73
if errload != nil {
73
- return sdk .WrapError (errload , "Cannot load workflow %s" , name )
74
+ return wp , sdk .WrapError (errload , "cannot load workflow %s" , name )
74
75
}
75
76
76
77
i , err := workflowtemplate .GetInstanceByWorkflowID (db , wf .ID )
77
78
if err != nil {
78
- return err
79
+ return wp , err
79
80
}
80
81
if i != nil {
81
82
wf .Template , err = workflowtemplate .GetByID (db , i .WorkflowTemplateID )
82
83
if err != nil {
83
- return err
84
+ return wp , err
84
85
}
85
86
if err := group .AggregateOnWorkflowTemplate (db , wf .Template ); err != nil {
86
- return err
87
+ return wp , err
87
88
}
88
89
}
89
90
@@ -96,12 +97,12 @@ func Pull(ctx context.Context, db gorp.SqlExecutor, cache cache.Store, proj *sdk
96
97
app := & apps [i ]
97
98
vars , errv := application .GetAllVariable (db , proj .Key , app .Name , application .WithClearPassword ())
98
99
if errv != nil {
99
- return sdk .WrapError (errv , "Cannot load application variables %s" , app .Name )
100
+ return wp , sdk .WrapError (errv , "cannot load application variables %s" , app .Name )
100
101
}
101
102
app .Variable = vars
102
103
103
- if errk := application .LoadAllDecryptedKeys (db , app ); errk != nil {
104
- return sdk .WrapError (errk , "Cannot load application keys %s" , app .Name )
104
+ if err := application .LoadAllDecryptedKeys (db , app ); err != nil {
105
+ return wp , sdk .WrapError (err , "cannot load application keys %s" , app .Name )
105
106
}
106
107
}
107
108
@@ -110,39 +111,21 @@ func Pull(ctx context.Context, db gorp.SqlExecutor, cache cache.Store, proj *sdk
110
111
env := & envs [i ]
111
112
vars , errv := environment .GetAllVariable (db , proj .Key , env .Name , environment .WithClearPassword ())
112
113
if errv != nil {
113
- return sdk .WrapError (errv , "Cannot load environment variables %s" , env .Name )
114
+ return wp , sdk .WrapError (errv , "cannot load environment variables %s" , env .Name )
114
115
}
115
116
env .Variable = vars
116
117
117
- if errk := environment .LoadAllDecryptedKeys (db , env ); errk != nil {
118
- return sdk .WrapError (errk , "Cannot load environment keys %s" , env .Name )
118
+ if err := environment .LoadAllDecryptedKeys (db , env ); err != nil {
119
+ return wp , sdk .WrapError (err , "cannot load environment keys %s" , env .Name )
119
120
}
120
121
}
121
122
122
- tw := tar .NewWriter (w )
123
- defer func () {
124
- if err := tw .Close (); err != nil {
125
- log .Error ("%v" , sdk .WrapError (err , "Unable to close tar writer" ))
126
- }
127
- }()
128
-
129
123
buffw := new (bytes.Buffer )
130
- size , errw := exportWorkflow (* wf , f , buffw , opts ... )
131
- if errw != nil {
132
- return sdk .WrapError (errw , "Unable to export workflow" )
133
- }
134
-
135
- hdr := & tar.Header {
136
- Name : fmt .Sprintf ("%s.yml" , wf .Name ),
137
- Mode : 0644 ,
138
- Size : int64 (size ),
139
- }
140
- if err := tw .WriteHeader (hdr ); err != nil {
141
- return sdk .WrapError (err , "Unable to write workflow header %+v" , hdr )
142
- }
143
- if _ , err := io .Copy (tw , buffw ); err != nil {
144
- return sdk .WrapError (err , "Unable to copy workflow buffer" )
124
+ if _ , err := exportWorkflow (* wf , f , buffw , opts ... ); err != nil {
125
+ return wp , sdk .WrapError (err , "unable to export workflow" )
145
126
}
127
+ wp .Workflow .Name = wf .Name
128
+ wp .Workflow .Value = base64 .StdEncoding .EncodeToString (buffw .Bytes ())
146
129
147
130
var withPermissions bool
148
131
for _ , f := range opts {
@@ -151,63 +134,35 @@ func Pull(ctx context.Context, db gorp.SqlExecutor, cache cache.Store, proj *sdk
151
134
}
152
135
}
153
136
154
- for _ , a := range apps {
137
+ wp .Applications = make ([]exportentities.WorkflowPulledItem , len (apps ))
138
+ for i , a := range apps {
155
139
buff := new (bytes.Buffer )
156
- size , err := application .ExportApplication (db , a , f , withPermissions , encryptFunc , buff )
157
- if err != nil {
158
- return sdk .WrapError (err , "Unable to export app %s" , a .Name )
159
- }
160
- hdr := & tar.Header {
161
- Name : fmt .Sprintf ("%s.app.yml" , a .Name ),
162
- Mode : 0644 ,
163
- Size : int64 (size ),
164
- }
165
- if err := tw .WriteHeader (hdr ); err != nil {
166
- return sdk .WrapError (err , "Unable to write app header %+v" , hdr )
167
- }
168
- if _ , err := io .Copy (tw , buff ); err != nil {
169
- return sdk .WrapError (err , "Unable to copy app buffer" )
140
+ if _ , err := application .ExportApplication (db , a , f , withPermissions , encryptFunc , buff ); err != nil {
141
+ return wp , sdk .WrapError (err , "unable to export app %s" , a .Name )
170
142
}
143
+ wp .Applications [i ].Name = a .Name
144
+ wp .Applications [i ].Value = base64 .StdEncoding .EncodeToString (buff .Bytes ())
171
145
}
172
146
173
- for _ , e := range envs {
147
+ wp .Environments = make ([]exportentities.WorkflowPulledItem , len (envs ))
148
+ for i , e := range envs {
174
149
buff := new (bytes.Buffer )
175
- size , err := environment .ExportEnvironment (db , e , f , withPermissions , encryptFunc , buff )
176
- if err != nil {
177
- return sdk .WrapError (err , "Unable to export env %s" , e .Name )
178
- }
179
-
180
- hdr := & tar.Header {
181
- Name : fmt .Sprintf ("%s.env.yml" , e .Name ),
182
- Mode : 0644 ,
183
- Size : int64 (size ),
184
- }
185
- if err := tw .WriteHeader (hdr ); err != nil {
186
- return sdk .WrapError (err , "Unable to write env header %+v" , hdr )
187
- }
188
- if _ , err := io .Copy (tw , buff ); err != nil {
189
- return sdk .WrapError (err , "Unable to copy env buffer" )
150
+ if _ , err := environment .ExportEnvironment (db , e , f , withPermissions , encryptFunc , buff ); err != nil {
151
+ return wp , sdk .WrapError (err , "unable to export env %s" , e .Name )
190
152
}
153
+ wp .Environments [i ].Name = e .Name
154
+ wp .Environments [i ].Value = base64 .StdEncoding .EncodeToString (buff .Bytes ())
191
155
}
192
156
193
- for _ , p := range pips {
157
+ wp .Pipelines = make ([]exportentities.WorkflowPulledItem , len (pips ))
158
+ for i , p := range pips {
194
159
buff := new (bytes.Buffer )
195
- size , err := pipeline .ExportPipeline (p , f , withPermissions , buff )
196
- if err != nil {
197
- return sdk .WrapError (err , "Unable to export pipeline %s" , p .Name )
198
- }
199
- hdr := & tar.Header {
200
- Name : fmt .Sprintf ("%s.pip.yml" , p .Name ),
201
- Mode : 0644 ,
202
- Size : int64 (size ),
203
- }
204
- if err := tw .WriteHeader (hdr ); err != nil {
205
- return sdk .WrapError (err , "Unable to write pipeline header %+v" , hdr )
206
- }
207
- if _ , err := io .Copy (tw , buff ); err != nil {
208
- return sdk .WrapError (err , "Unable to copy pip buffer" )
160
+ if _ , err := pipeline .ExportPipeline (p , f , withPermissions , buff ); err != nil {
161
+ return wp , sdk .WrapError (err , "unable to export pipeline %s" , p .Name )
209
162
}
163
+ wp .Pipelines [i ].Name = p .Name
164
+ wp .Pipelines [i ].Value = base64 .StdEncoding .EncodeToString (buff .Bytes ())
210
165
}
211
166
212
- return nil
167
+ return wp , nil
213
168
}
0 commit comments