Skip to content

Commit c9486c0

Browse files
authored
fix(cdsctl): ask for branch and message when migrate workflow ascode (#5210)
1 parent 3ad40ff commit c9486c0

File tree

6 files changed

+102
-57
lines changed

6 files changed

+102
-57
lines changed

cli/cdsctl/workflow_transform_as_code.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ var workflowTransformAsCodeCmd = cli.Command{
1919
},
2020
Flags: []cli.Flag{
2121
{Name: "silent", Type: cli.FlagBool},
22+
{Name: "branch", Type: cli.FlagString},
23+
{Name: "message", Type: cli.FlagString},
2224
},
2325
}
2426

@@ -31,7 +33,18 @@ func workflowTransformAsCodeRun(v cli.Values) (interface{}, error) {
3133
return nil, sdk.ErrWorkflowAlreadyAsCode
3234
}
3335

34-
ope, err := client.WorkflowTransformAsCode(v.GetString(_ProjectKey), v.GetString(_WorkflowName))
36+
noInteractive := v.GetBool("no-interactive")
37+
38+
branch := v.GetString("branch")
39+
message := v.GetString("message")
40+
if !noInteractive && branch == "" {
41+
branch = cli.AskValue("Give a branch name")
42+
}
43+
if !noInteractive && message == "" {
44+
message = cli.AskValue("Give a commit message")
45+
}
46+
47+
ope, err := client.WorkflowTransformAsCode(v.GetString(_ProjectKey), v.GetString(_WorkflowName), branch, message)
3548
if err != nil {
3649
return nil, err
3750
}
@@ -40,7 +53,8 @@ func workflowTransformAsCodeRun(v cli.Values) (interface{}, error) {
4053
fmt.Println("CDS is pushing files on your repository. A pull request will be created, please wait...")
4154
}
4255
for {
43-
if err := client.WorkflowTransformAsCodeFollow(v.GetString(_ProjectKey), v.GetString(_WorkflowName), ope); err != nil {
56+
ope, err = client.WorkflowTransformAsCodeFollow(v.GetString(_ProjectKey), v.GetString(_WorkflowName), ope.UUID)
57+
if err != nil {
4458
return nil, err
4559
}
4660
if ope.Status > sdk.OperationStatusProcessing {
@@ -49,6 +63,10 @@ func workflowTransformAsCodeRun(v cli.Values) (interface{}, error) {
4963
time.Sleep(1 * time.Second)
5064
}
5165

66+
if ope.Status == sdk.OperationStatusError {
67+
sdk.Exit("An error occured when migrate: %v", ope.Error)
68+
}
69+
5270
urlSplitted := strings.Split(ope.Setup.Push.PRLink, "/")
5371
id, err := strconv.Atoi(urlSplitted[len(urlSplitted)-1])
5472
if err != nil {

engine/api/workflow_ascode.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ func (api *API) postWorkflowAsCodeHandler() service.Handler {
5050
branch := FormString(r, "branch")
5151
message := FormString(r, "message")
5252

53+
if branch == "" || message == "" {
54+
return sdk.NewErrorFrom(sdk.ErrWrongRequest, "missing branch or message data")
55+
}
56+
5357
u := getAPIConsumer(ctx)
5458
p, err := project.Load(api.mustDB(), key,
5559
project.LoadOptions.WithApplicationWithDeploymentStrategies,

engine/api/workflow_ascode_test.go

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"context"
66
"encoding/json"
7-
"fmt"
87
"io/ioutil"
98
"net/http"
109
"net/http/httptest"
@@ -187,6 +186,10 @@ func TestPostUpdateWorkflowAsCodeHandler(t *testing.T) {
187186
})
188187

189188
req := assets.NewJWTAuthentifiedRequest(t, pass, "POST", uri, w)
189+
q := req.URL.Query()
190+
q.Set("branch", "master")
191+
q.Set("message", "my message")
192+
req.URL.RawQuery = q.Encode()
190193

191194
// Do the request
192195
wr := httptest.NewRecorder()
@@ -198,35 +201,37 @@ func TestPostUpdateWorkflowAsCodeHandler(t *testing.T) {
198201

199202
retry := 0
200203
for {
204+
retry++
205+
if retry > 10 {
206+
t.Log("Number of retry reached")
207+
t.Fail()
208+
break
209+
}
210+
201211
// Get operation
202212
uriGET := api.Router.GetRoute("GET", api.getWorkflowAsCodeHandler, map[string]string{
203213
"key": proj.Key,
204214
"permWorkflowName": w.Name,
205215
"uuid": myOpe.UUID,
206216
})
207217
reqGET, err := http.NewRequest("GET", uriGET, nil)
208-
test.NoError(t, err)
218+
require.NoError(t, err)
209219
assets.AuthentifyRequest(t, reqGET, u, pass)
210220
wrGet := httptest.NewRecorder()
211221
api.Router.Mux.ServeHTTP(wrGet, reqGET)
212-
assert.Equal(t, 200, wrGet.Code)
222+
require.Equal(t, 200, wrGet.Code)
223+
213224
myOpeGet := new(sdk.Operation)
214-
assert.NoError(t, json.Unmarshal(wrGet.Body.Bytes(), myOpeGet))
225+
require.NoError(t, json.Unmarshal(wrGet.Body.Bytes(), myOpeGet))
215226
if myOpeGet.Status < sdk.OperationStatusDone {
216227
time.Sleep(1 * time.Second)
217-
retry++
218-
219-
if retry > 10 {
220-
t.Fail()
221-
break
222-
}
223228
continue
224229
}
225-
test.NoError(t, json.Unmarshal(wrGet.Body.Bytes(), myOpeGet))
230+
231+
require.Equal(t, sdk.OperationStatusDone, myOpeGet.Status, "Invalid status for operation %v", string(wrGet.Body.Bytes()))
226232
assert.Equal(t, "myURL", myOpeGet.Setup.Push.PRLink)
227233
break
228234
}
229-
230235
}
231236

232237
func TestPostMigrateWorkflowAsCodeHandler(t *testing.T) {
@@ -381,7 +386,12 @@ func TestPostMigrateWorkflowAsCodeHandler(t *testing.T) {
381386
"permWorkflowName": w.Name,
382387
})
383388

384-
req := assets.NewJWTAuthentifiedRequest(t, pass, "POST", fmt.Sprintf("%s?migrate=true", uri), nil)
389+
req := assets.NewJWTAuthentifiedRequest(t, pass, "POST", uri, nil)
390+
q := req.URL.Query()
391+
q.Set("migrate", "true")
392+
q.Set("branch", "master")
393+
q.Set("message", "my message")
394+
req.URL.RawQuery = q.Encode()
385395

386396
// Do the request
387397
wr := httptest.NewRecorder()
@@ -393,12 +403,12 @@ func TestPostMigrateWorkflowAsCodeHandler(t *testing.T) {
393403

394404
cpt := 0
395405
for {
406+
cpt++
396407
if cpt > 10 {
408+
t.Log("Number of retry reached")
397409
t.Fail()
398410
break
399411
}
400-
cpt++
401-
time.Sleep(2 * time.Second)
402412

403413
// Get operation
404414
uriGET := api.Router.GetRoute("GET", api.getWorkflowAsCodeHandler, map[string]string{
@@ -407,17 +417,20 @@ func TestPostMigrateWorkflowAsCodeHandler(t *testing.T) {
407417
"uuid": myOpe.UUID,
408418
})
409419
reqGET, err := http.NewRequest("GET", uriGET, nil)
410-
test.NoError(t, err)
420+
require.NoError(t, err)
411421
assets.AuthentifyRequest(t, reqGET, u, pass)
412422
wrGet := httptest.NewRecorder()
413423
api.Router.Mux.ServeHTTP(wrGet, reqGET)
414-
assert.Equal(t, 200, wrGet.Code)
415-
myOpeGet := new(sdk.Operation)
416-
test.NoError(t, json.Unmarshal(wrGet.Body.Bytes(), myOpeGet))
424+
require.Equal(t, 200, wrGet.Code)
417425

426+
myOpeGet := new(sdk.Operation)
427+
require.NoError(t, json.Unmarshal(wrGet.Body.Bytes(), myOpeGet))
418428
if myOpeGet.Status < sdk.OperationStatusDone {
429+
time.Sleep(1 * time.Second)
419430
continue
420431
}
432+
433+
require.Equal(t, sdk.OperationStatusDone, myOpeGet.Status, "Invalid status for operation %v", string(wrGet.Body.Bytes()))
421434
assert.Equal(t, "myURL", myOpeGet.Setup.Push.PRLink)
422435
break
423436
}

sdk/cdsclient/client_workflow_as_code.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,33 @@ package cdsclient
33
import (
44
"context"
55
"fmt"
6+
"net/http"
67

78
"github.com/ovh/cds/sdk"
89
)
910

10-
func (c *client) WorkflowTransformAsCode(projectKey, workflowName string) (*sdk.Operation, error) {
11-
ope := new(sdk.Operation)
12-
path := fmt.Sprintf("/project/%s/workflows/%s/ascode?migrate=true", projectKey, workflowName)
13-
if _, err := c.PostJSON(context.Background(), path, nil, &ope); err != nil {
11+
func (c *client) WorkflowTransformAsCode(projectKey, workflowName, branch, message string) (*sdk.Operation, error) {
12+
var ope sdk.Operation
13+
path := fmt.Sprintf("/project/%s/workflows/%s/ascode", projectKey, workflowName)
14+
if _, err := c.PostJSON(context.Background(), path, nil, &ope, func(r *http.Request) {
15+
q := r.URL.Query()
16+
q.Set("migrate", "true")
17+
q.Set("branch", branch)
18+
q.Set("message", message)
19+
r.URL.RawQuery = q.Encode()
20+
}); err != nil {
1421
return nil, err
1522
}
16-
return ope, nil
23+
return &ope, nil
1724
}
1825

19-
func (c client) WorkflowTransformAsCodeFollow(projectKey, workflowName string, ope *sdk.Operation) error {
20-
path := fmt.Sprintf("/project/%s/workflows/%s/ascode/%s", projectKey, workflowName, ope.UUID)
21-
if _, err := c.GetJSON(context.Background(), path, ope); err != nil {
22-
return err
26+
func (c client) WorkflowTransformAsCodeFollow(projectKey, workflowName, opeUUID string) (*sdk.Operation, error) {
27+
var ope sdk.Operation
28+
path := fmt.Sprintf("/project/%s/workflows/%s/ascode/%s", projectKey, workflowName, opeUUID)
29+
if _, err := c.GetJSON(context.Background(), path, &ope); err != nil {
30+
return nil, err
2331
}
24-
return nil
32+
return &ope, nil
2533
}
2634

2735
func (c *client) WorkflowAsCodeStart(projectKey string, repoURL string, repoStrategy sdk.RepositoryStrategy) (*sdk.Operation, error) {

sdk/cdsclient/interface.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,8 +323,8 @@ type WorkflowClient interface {
323323
WorkflowAllHooksList() ([]sdk.NodeHook, error)
324324
WorkflowCachePush(projectKey, integrationName, ref string, tarContent io.Reader, size int) error
325325
WorkflowCachePull(projectKey, integrationName, ref string) (io.Reader, error)
326-
WorkflowTransformAsCode(projectKey, workflowName string) (*sdk.Operation, error)
327-
WorkflowTransformAsCodeFollow(projectKey, workflowName string, ope *sdk.Operation) error
326+
WorkflowTransformAsCode(projectKey, workflowName, branch, message string) (*sdk.Operation, error)
327+
WorkflowTransformAsCodeFollow(projectKey, workflowName, opeUUID string) (*sdk.Operation, error)
328328
}
329329

330330
// MonitoringClient exposes monitoring functions

sdk/cdsclient/mock_cdsclient/interface_mock.go

Lines changed: 26 additions & 24 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)