Skip to content

Commit 8605aaa

Browse files
authored
Merge pull request #1140 from CircleCI-Public/life-1571/add-get-pipeline-to-pipeline-client
[LIFE-1571] add get pipeline definition to pipeline package
2 parents 5da9445 + ab89312 commit 8605aaa

File tree

7 files changed

+146
-41
lines changed

7 files changed

+146
-41
lines changed

api/pipeline/pipeline.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,19 @@ type CreatePipelineInfo struct {
77
ConfigSourceRepoFullName string
88
}
99

10+
type PipelineDefinition struct {
11+
ConfigSourceId string
12+
CheckoutSourceId string
13+
}
14+
15+
type GetPipelineDefinitionOptions struct {
16+
ProjectID string
17+
PipelineDefinitionID string
18+
}
19+
1020
// PipelineClient is the interface to interact with pipeline and it's
1121
// components.
1222
type PipelineClient interface {
1323
CreatePipeline(projectID string, name string, description string, repoID string, configRepoID string, filePath string) (*CreatePipelineInfo, error)
24+
GetPipelineDefinition(options GetPipelineDefinitionOptions) (*PipelineDefinition, error)
1425
}

api/pipeline/pipeline_rest.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,15 @@ type createPipelineDefinitionResponse struct {
6060
CheckoutSource CheckoutSourceResponse `json:"checkout_source"`
6161
}
6262

63+
type GetPipelineDefinitionResponse struct {
64+
ID string `json:"id"`
65+
Name string `json:"name"`
66+
Description string `json:"description"`
67+
CreatedAt string `json:"created_at"`
68+
ConfigSource ConfigSourceResponse `json:"config_source"`
69+
CheckoutSource CheckoutSourceResponse `json:"checkout_source"`
70+
}
71+
6372
// NewPipelineRestClient returns a new pipelineRestClient satisfying the api.PipelineInterface
6473
// interface via the REST API.
6574
func NewPipelineRestClient(config settings.Config) (*pipelineRestClient, error) {
@@ -107,3 +116,22 @@ func (c *pipelineRestClient) CreatePipeline(projectID string, name string, descr
107116
ConfigSourceRepoFullName: resp.ConfigSource.Repo.FullName,
108117
}, nil
109118
}
119+
120+
func (c *pipelineRestClient) GetPipelineDefinition(options GetPipelineDefinitionOptions) (*PipelineDefinition, error) {
121+
path := fmt.Sprintf("projects/%s/pipeline-definitions/%s", options.ProjectID, options.PipelineDefinitionID)
122+
req, err := c.client.NewRequest("GET", &url.URL{Path: path}, nil)
123+
if err != nil {
124+
return nil, err
125+
}
126+
127+
var resp GetPipelineDefinitionResponse
128+
_, err = c.client.DoRequest(req, &resp)
129+
if err != nil {
130+
return nil, err
131+
}
132+
133+
return &PipelineDefinition{
134+
ConfigSourceId: resp.ConfigSource.Repo.ExternalID,
135+
CheckoutSourceId: resp.CheckoutSource.Repo.ExternalID,
136+
}, nil
137+
}

api/pipeline/pipeline_rest_test.go

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,3 +153,94 @@ func Test_pipelineRestClient_CreatePipeline(t *testing.T) {
153153
})
154154
}
155155
}
156+
157+
func Test_pipelineRestClient_GetPipelineDefinition(t *testing.T) {
158+
const (
159+
projectID = "test-project-id"
160+
pipelineDefinitionID = "test-pipeline-definition-id"
161+
)
162+
tests := []struct {
163+
name string
164+
options pipeline.GetPipelineDefinitionOptions
165+
handler http.HandlerFunc
166+
want *pipeline.PipelineDefinition
167+
wantErr bool
168+
}{
169+
{
170+
name: "Should handle a successful request with GetPipelineDefinition",
171+
options: pipeline.GetPipelineDefinitionOptions{
172+
ProjectID: projectID,
173+
PipelineDefinitionID: pipelineDefinitionID,
174+
},
175+
handler: func(w http.ResponseWriter, r *http.Request) {
176+
assert.Equal(t, r.Header.Get("circle-token"), "token")
177+
assert.Equal(t, r.Header.Get("accept"), "application/json")
178+
assert.Equal(t, r.Header.Get("user-agent"), version.UserAgent())
179+
180+
assert.Equal(t, r.Method, "GET")
181+
assert.Equal(t, r.URL.Path, fmt.Sprintf("/api/v2/projects/%s/pipeline-definitions/%s", projectID, pipelineDefinitionID))
182+
183+
w.Header().Set("Content-Type", "application/json")
184+
w.WriteHeader(http.StatusOK)
185+
_, err := w.Write([]byte(`
186+
{
187+
"id": "123",
188+
"name": "test-pipeline",
189+
"description": "test-description",
190+
"created_at": "2024-01-01T00:00:00Z",
191+
"checkout_source": {
192+
"provider": "github_app",
193+
"repo": {
194+
"external_id": "test-repo-id",
195+
"full_name": "test-repo"
196+
}
197+
},
198+
"config_source": {
199+
"provider": "github_app",
200+
"repo": {
201+
"external_id": "test-config-repo-id",
202+
"full_name": "test-config-repo"
203+
}
204+
}
205+
}`))
206+
assert.NilError(t, err)
207+
},
208+
want: &pipeline.PipelineDefinition{
209+
ConfigSourceId: "test-config-repo-id",
210+
CheckoutSourceId: "test-repo-id",
211+
},
212+
},
213+
{
214+
name: "Should handle an error request with GetPipelineDefinition",
215+
options: pipeline.GetPipelineDefinitionOptions{
216+
ProjectID: projectID,
217+
PipelineDefinitionID: pipelineDefinitionID,
218+
},
219+
handler: func(w http.ResponseWriter, _ *http.Request) {
220+
w.Header().Set("content-type", "application/json")
221+
w.WriteHeader(http.StatusInternalServerError)
222+
_, err := w.Write([]byte(`{"message": "error"}`))
223+
assert.NilError(t, err)
224+
},
225+
wantErr: true,
226+
},
227+
}
228+
for _, tt := range tests {
229+
t.Run(tt.name, func(t *testing.T) {
230+
server := httptest.NewServer(tt.handler)
231+
defer server.Close()
232+
233+
p, err := getPipelineRestClient(server)
234+
assert.NilError(t, err)
235+
236+
got, err := p.GetPipelineDefinition(tt.options)
237+
if (err != nil) != tt.wantErr {
238+
t.Errorf("pipelineRestClient.GetPipelineDefinition() error = %v, wantErr %v", err, tt.wantErr)
239+
return
240+
}
241+
if !reflect.DeepEqual(got, tt.want) {
242+
t.Errorf("pipelineRestClient.GetPipelineDefinition() = %v, want %v", got, tt.want)
243+
}
244+
})
245+
}
246+
}

api/trigger/trigger.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,4 @@ type GetPipelineDefinitionOptions struct {
1313
// TriggerClient is the interface to interact with trigger
1414
type TriggerClient interface {
1515
CreateTrigger(options CreateTriggerOptions) (*CreateTriggerInfo, error)
16-
GetPipelineDefinition(options GetPipelineDefinitionOptions) (*PipelineDefinition, error)
1716
}

api/trigger/trigger_rest.go

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"net/url"
66

7-
"github.com/CircleCI-Public/circleci-cli/api/pipeline"
87
"github.com/CircleCI-Public/circleci-cli/api/rest"
98
"github.com/CircleCI-Public/circleci-cli/settings"
109
)
@@ -100,36 +99,3 @@ func (c *triggerRestClient) CreateTrigger(options CreateTriggerOptions) (*Create
10099
Name: resp.Name,
101100
}, nil
102101
}
103-
104-
type PipelineDefinition struct {
105-
ConfigSourceId string
106-
CheckoutSourceId string
107-
}
108-
109-
type GetPipelineDefinitionResponse struct {
110-
ID string `json:"id"`
111-
Name string `json:"name"`
112-
Description string `json:"description"`
113-
CreatedAt string `json:"created_at"`
114-
ConfigSource pipeline.ConfigSourceResponse `json:"config_source"`
115-
CheckoutSource pipeline.CheckoutSourceResponse `json:"checkout_source"`
116-
}
117-
118-
func (c *triggerRestClient) GetPipelineDefinition(options GetPipelineDefinitionOptions) (*PipelineDefinition, error) {
119-
path := fmt.Sprintf("projects/%s/pipeline-definitions/%s", options.ProjectID, options.PipelineDefinitionID)
120-
req, err := c.client.NewRequest("GET", &url.URL{Path: path}, nil)
121-
if err != nil {
122-
return nil, err
123-
}
124-
125-
var resp GetPipelineDefinitionResponse
126-
_, err = c.client.DoRequest(req, &resp)
127-
if err != nil {
128-
return nil, err
129-
}
130-
131-
return &PipelineDefinition{
132-
ConfigSourceId: resp.ConfigSource.Repo.ExternalID,
133-
CheckoutSourceId: resp.CheckoutSource.Repo.ExternalID,
134-
}, nil
135-
}

cmd/trigger/create.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package trigger
33
import (
44
"github.com/spf13/cobra"
55

6+
"github.com/CircleCI-Public/circleci-cli/api/pipeline"
67
"github.com/CircleCI-Public/circleci-cli/api/trigger"
78
"github.com/CircleCI-Public/circleci-cli/cmd/validator"
89
)
@@ -81,11 +82,11 @@ Notes:
8182
repoID = ops.reader.ReadStringFromUser(repoPrompt)
8283
}
8384

84-
pipelineOptions := trigger.GetPipelineDefinitionOptions{
85+
pipelineOptions := pipeline.GetPipelineDefinitionOptions{
8586
ProjectID: projectID,
8687
PipelineDefinitionID: pipelineDefinitionID,
8788
}
88-
pipelineResp, pipelineErr := ops.triggerClient.GetPipelineDefinition(pipelineOptions)
89+
pipelineResp, pipelineErr := ops.pipelineClient.GetPipelineDefinition(pipelineOptions)
8990

9091
if pipelineErr != nil {
9192
cmd.Println("\nThere was an error fetching your pipeline definition")

cmd/trigger/trigger.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package trigger
33
import (
44
"github.com/spf13/cobra"
55

6+
"github.com/CircleCI-Public/circleci-cli/api/pipeline"
67
triggerapi "github.com/CircleCI-Public/circleci-cli/api/trigger"
78
"github.com/CircleCI-Public/circleci-cli/cmd/validator"
89
"github.com/CircleCI-Public/circleci-cli/prompt"
@@ -16,8 +17,9 @@ type UserInputReader interface {
1617
}
1718

1819
type triggerOpts struct {
19-
triggerClient triggerapi.TriggerClient
20-
reader UserInputReader
20+
triggerClient triggerapi.TriggerClient
21+
pipelineClient pipeline.PipelineClient
22+
reader UserInputReader
2123
}
2224

2325
// TriggerOption configures a command created by NewTriggerCommand
@@ -47,11 +49,18 @@ func NewTriggerCommand(config *settings.Config, preRunE validator.Validator, opt
4749
Use: "trigger",
4850
Short: "Operate on triggers",
4951
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
50-
client, err := triggerapi.NewTriggerRestClient(*config)
52+
triggerClient, err := triggerapi.NewTriggerRestClient(*config)
5153
if err != nil {
5254
return err
5355
}
54-
pos.triggerClient = client
56+
pos.triggerClient = triggerClient
57+
58+
pipelineClient, err := pipeline.NewPipelineRestClient(*config)
59+
if err != nil {
60+
return err
61+
}
62+
pos.pipelineClient = pipelineClient
63+
5564
return nil
5665
},
5766
}

0 commit comments

Comments
 (0)