Skip to content

Commit 5390914

Browse files
authored
Merge pull request #1099 from CircleCI-Public/develop
Cutting a new release
2 parents ebcbd1f + 6486634 commit 5390914

File tree

9 files changed

+227
-32
lines changed

9 files changed

+227
-32
lines changed

cmd/runner/resource_class.go

Lines changed: 64 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package runner
22

33
import (
4+
"encoding/json"
45
"io"
56

67
"github.com/olekukonko/tablewriter"
@@ -28,6 +29,7 @@ func newResourceClassCommand(o *runnerOpts, preRunE validator.Validator) *cobra.
2829
return nil
2930
}
3031

32+
jsonFormat := false
3133
genToken := false
3234
createCmd := &cobra.Command{
3335
Use: "create <resource-class> <description>",
@@ -41,21 +43,52 @@ func newResourceClassCommand(o *runnerOpts, preRunE validator.Validator) *cobra.
4143
if err != nil {
4244
return err
4345
}
44-
table := newResourceClassTable(cmd.OutOrStdout())
45-
defer table.Render()
46-
appendResourceClass(table, *rc)
4746

48-
if !genToken {
49-
return nil
47+
var token *runner.Token
48+
if genToken {
49+
token, err = o.r.CreateToken(args[0], "default")
50+
if err != nil {
51+
return err
52+
}
5053
}
5154

52-
token, err := o.r.CreateToken(args[0], "default")
53-
if err != nil {
54-
return err
55+
if jsonFormat && !genToken {
56+
// return JSON formatted output for resource-class (without generated token)
57+
jsonRc, err := json.Marshal(rc)
58+
if err != nil {
59+
return err
60+
}
61+
jsonWriter := cmd.OutOrStdout()
62+
if _, err := jsonWriter.Write(jsonRc); err != nil {
63+
return err
64+
}
65+
} else if jsonFormat && genToken {
66+
// return JSON formatted output for token since it contains enough related resource-class info
67+
jsonToken, err := json.Marshal(token)
68+
if err != nil {
69+
return err
70+
}
71+
jsonWriter := cmd.OutOrStdout()
72+
if _, err := jsonWriter.Write(jsonToken); err != nil {
73+
return err
74+
}
75+
} else {
76+
// return default ASCII table format for output
77+
table := newResourceClassTable(cmd.OutOrStdout())
78+
defer table.Render()
79+
appendResourceClass(table, *rc)
80+
81+
// check to conditionally return YAML formatted resource-class token
82+
if genToken {
83+
return generateConfig(*token, cmd.OutOrStdout())
84+
}
5585
}
56-
return generateConfig(*token, cmd.OutOrStdout())
86+
87+
return nil
5788
},
5889
}
90+
createCmd.PersistentFlags().BoolVar(&jsonFormat, "json", false,
91+
"Return output back in JSON format")
5992
createCmd.PersistentFlags().BoolVar(&genToken, "generate-token", false,
6093
"Generate a default token")
6194
cmd.AddCommand(createCmd)
@@ -79,7 +112,7 @@ func newResourceClassCommand(o *runnerOpts, preRunE validator.Validator) *cobra.
79112
"Delete resource-class and any associated tokens")
80113
cmd.AddCommand(deleteCmd)
81114

82-
cmd.AddCommand(&cobra.Command{
115+
listCmd := &cobra.Command{
83116
Use: "list <namespace>",
84117
Short: "List resource-classes for a namespace",
85118
Aliases: []string{"ls"},
@@ -91,15 +124,31 @@ func newResourceClassCommand(o *runnerOpts, preRunE validator.Validator) *cobra.
91124
return err
92125
}
93126

94-
table := newResourceClassTable(cmd.OutOrStdout())
95-
defer table.Render()
96-
for _, rc := range rcs {
97-
appendResourceClass(table, rc)
127+
if jsonFormat {
128+
// return JSON formatted for output
129+
jsonRcs, err := json.Marshal(rcs)
130+
if err != nil {
131+
return err
132+
}
133+
jsonWriter := cmd.OutOrStdout()
134+
if _, err := jsonWriter.Write(jsonRcs); err != nil {
135+
return err
136+
}
137+
} else {
138+
// return default ASCII table format for output
139+
table := newResourceClassTable(cmd.OutOrStdout())
140+
defer table.Render()
141+
for _, rc := range rcs {
142+
appendResourceClass(table, rc)
143+
}
98144
}
99145

100146
return nil
101147
},
102-
})
148+
}
149+
listCmd.PersistentFlags().BoolVar(&jsonFormat, "json", false,
150+
"Return output back in JSON format")
151+
cmd.AddCommand(listCmd)
103152

104153
return cmd
105154
}

cmd/runner/resource_class_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,31 @@ func Test_ResourceClass(t *testing.T) {
4747
assert.Check(t, cmp.Contains(stderr.String(), terms))
4848
})
4949

50+
t.Run("without default token and json", func(t *testing.T) {
51+
defer runner.reset()
52+
defer stdout.Reset()
53+
defer stderr.Reset()
54+
55+
cmd.SetArgs([]string{
56+
"create",
57+
"my-namespace/my-resource-class",
58+
"my-description",
59+
"--json",
60+
})
61+
62+
err := cmd.Execute()
63+
assert.NilError(t, err)
64+
65+
assert.Check(t, cmp.Equal(len(runner.resourceClasses), 1))
66+
assert.Check(t, cmp.Equal(runner.resourceClasses[0].ResourceClass, "my-namespace/my-resource-class"))
67+
assert.Check(t, cmp.Equal(runner.resourceClasses[0].Description, "my-description"))
68+
assert.Check(t, cmp.Contains(stdout.String(), "my-namespace/my-resource-class"))
69+
70+
assert.Check(t, cmp.Equal(len(runner.tokens), 0))
71+
72+
assert.Check(t, cmp.Contains(stderr.String(), terms))
73+
})
74+
5075
t.Run("with default token", func(t *testing.T) {
5176
defer runner.reset()
5277
defer stdout.Reset()
@@ -75,6 +100,36 @@ func Test_ResourceClass(t *testing.T) {
75100

76101
assert.Check(t, cmp.Contains(stderr.String(), terms))
77102
})
103+
104+
t.Run("with default token and json", func(t *testing.T) {
105+
defer runner.reset()
106+
defer stdout.Reset()
107+
defer stderr.Reset()
108+
109+
cmd.SetArgs([]string{
110+
"create",
111+
"my-namespace/my-other-resource-class",
112+
"my-description",
113+
"--generate-token",
114+
"--json",
115+
})
116+
117+
err := cmd.Execute()
118+
assert.NilError(t, err)
119+
out := stdout.String()
120+
121+
assert.Check(t, cmp.Equal(len(runner.resourceClasses), 1))
122+
assert.Check(t, cmp.Equal(runner.resourceClasses[0].ResourceClass, "my-namespace/my-other-resource-class"))
123+
assert.Check(t, cmp.Equal(runner.resourceClasses[0].Description, "my-description"))
124+
assert.Check(t, cmp.Contains(out, "my-namespace/my-other-resource-class"))
125+
126+
assert.Check(t, cmp.Equal(len(runner.tokens), 1))
127+
assert.Check(t, cmp.Equal(runner.tokens[0].ResourceClass, "my-namespace/my-other-resource-class"))
128+
assert.Check(t, cmp.Equal(runner.tokens[0].Nickname, "default"))
129+
assert.Check(t, cmp.Contains(out, "fake-token"))
130+
131+
assert.Check(t, cmp.Contains(stderr.String(), terms))
132+
})
78133
})
79134
}
80135

cmd/runner/telemetry_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ func Test_RunnerTelemetry(t *testing.T) {
5555
LocalArgs: map[string]string{
5656
"generate-token": "true",
5757
"help": "false",
58+
"json": "false",
5859
},
5960
}),
6061
})

cmd/runner/testdata/runner/resource-class/create-expected-usage.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ Usage:
33

44
Flags:
55
--generate-token Generate a default token
6+
--json Return output back in JSON format
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
Usage:
2-
runner resource-class list <namespace>
2+
runner resource-class list <namespace> [flags]
33

44
Aliases:
55
list, ls
6+
7+
Flags:
8+
--json Return output back in JSON format

config/pipeline.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,26 @@ func LocalPipelineValues(parameters Parameters) Values {
3434
vals := map[string]interface{}{
3535
"pipeline.id": "00000000-0000-0000-0000-000000000001",
3636
"pipeline.number": 1,
37+
"pipeline.name": "",
3738
"pipeline.project.git_url": gitUrl,
3839
"pipeline.project.type": projectType,
3940
"pipeline.git.tag": git.Tag(),
4041
"pipeline.git.branch": git.Branch(),
4142
"pipeline.git.revision": revision,
4243
"pipeline.git.base_revision": revision,
4344
"pipeline.git.branch.is_default": false,
45+
"pipeline.git.commit.author_avatar_url": "",
46+
"pipeline.git.commit.author_email": "",
47+
"pipeline.git.commit.author_login": "",
48+
"pipeline.git.commit.author_name": "",
49+
"pipeline.git.commit.body": "",
50+
"pipeline.git.commit.subject": "",
51+
"pipeline.git.commit.url": "",
52+
"pipeline.git.repo_id": "",
53+
"pipeline.git.repo_name": "",
54+
"pipeline.git.repo_owner": "",
55+
"pipeline.git.repo_url": gitUrl,
56+
"pipeline.git.ssh_checkout_url": "",
4457
"pipeline.trigger_parameters.circleci.event_time": "2020-01-01T00:00:00Z",
4558
"pipeline.trigger_parameters.webhook.body": "",
4659
"pipeline.trigger_parameters.github_app.branch": "main",
@@ -63,6 +76,11 @@ func LocalPipelineValues(parameters Parameters) Values {
6376
"pipeline.trigger_parameters.gitlab.default_branch": "main",
6477
"pipeline.trigger_parameters.gitlab.x_gitlab_event_id": "00000000-0000-0000-0000-000000000001",
6578
"pipeline.trigger_parameters.gitlab.is_fork_merge_request": false,
79+
"pipeline.trigger.type": "",
80+
"pipeline.trigger.id": "00000000-0000-0000-0000-000000000001",
81+
"pipeline.trigger.name": "",
82+
"pipeline.event.name": "",
83+
"pipeline.event.action": "",
6684
}
6785

6886
for k, v := range parameters {

config/pipeline_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,26 @@ func TestLocalPipelineValues(t *testing.T) {
1919
wantKeys: []string{
2020
"pipeline.id",
2121
"pipeline.number",
22+
"pipeline.name",
2223
"pipeline.project.git_url",
2324
"pipeline.project.type",
2425
"pipeline.git.tag",
2526
"pipeline.git.branch",
2627
"pipeline.git.revision",
2728
"pipeline.git.base_revision",
2829
"pipeline.git.branch.is_default",
30+
"pipeline.git.commit.author_avatar_url",
31+
"pipeline.git.commit.author_email",
32+
"pipeline.git.commit.author_login",
33+
"pipeline.git.commit.author_name",
34+
"pipeline.git.commit.body",
35+
"pipeline.git.commit.subject",
36+
"pipeline.git.commit.url",
37+
"pipeline.git.repo_id",
38+
"pipeline.git.repo_name",
39+
"pipeline.git.repo_owner",
40+
"pipeline.git.repo_url",
41+
"pipeline.git.ssh_checkout_url",
2942
"pipeline.trigger_parameters.circleci.event_time",
3043
"pipeline.trigger_parameters.webhook.body",
3144
"pipeline.trigger_parameters.github_app.branch",
@@ -48,6 +61,11 @@ func TestLocalPipelineValues(t *testing.T) {
4861
"pipeline.trigger_parameters.gitlab.default_branch",
4962
"pipeline.trigger_parameters.gitlab.x_gitlab_event_id",
5063
"pipeline.trigger_parameters.gitlab.is_fork_merge_request",
64+
"pipeline.trigger.type",
65+
"pipeline.trigger.id",
66+
"pipeline.trigger.name",
67+
"pipeline.event.name",
68+
"pipeline.event.action",
5169
},
5270
},
5371
{
@@ -56,6 +74,7 @@ func TestLocalPipelineValues(t *testing.T) {
5674
wantKeys: []string{
5775
"pipeline.id",
5876
"pipeline.number",
77+
"pipeline.name",
5978
"pipeline.project.git_url",
6079
"pipeline.project.type",
6180
"pipeline.git.tag",
@@ -65,6 +84,18 @@ func TestLocalPipelineValues(t *testing.T) {
6584
"pipeline.parameters.foo",
6685
"pipeline.parameters.baz",
6786
"pipeline.git.branch.is_default",
87+
"pipeline.git.commit.author_avatar_url",
88+
"pipeline.git.commit.author_email",
89+
"pipeline.git.commit.author_login",
90+
"pipeline.git.commit.author_name",
91+
"pipeline.git.commit.body",
92+
"pipeline.git.commit.subject",
93+
"pipeline.git.commit.url",
94+
"pipeline.git.repo_id",
95+
"pipeline.git.repo_name",
96+
"pipeline.git.repo_owner",
97+
"pipeline.git.repo_url",
98+
"pipeline.git.ssh_checkout_url",
6899
"pipeline.trigger_parameters.circleci.event_time",
69100
"pipeline.trigger_parameters.webhook.body",
70101
"pipeline.trigger_parameters.github_app.branch",
@@ -87,6 +118,11 @@ func TestLocalPipelineValues(t *testing.T) {
87118
"pipeline.trigger_parameters.gitlab.default_branch",
88119
"pipeline.trigger_parameters.gitlab.x_gitlab_event_id",
89120
"pipeline.trigger_parameters.gitlab.is_fork_merge_request",
121+
"pipeline.trigger.type",
122+
"pipeline.trigger.id",
123+
"pipeline.trigger.name",
124+
"pipeline.event.name",
125+
"pipeline.event.action",
90126
},
91127
},
92128
}

0 commit comments

Comments
 (0)