Skip to content

Commit 6cd97fe

Browse files
committed
capture all fields of WorkspaceOwner when converting to cty.Value
1 parent b379cc5 commit 6cd97fe

3 files changed

Lines changed: 93 additions & 12 deletions

File tree

owner.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,14 @@ import (
66
"github.com/aquasecurity/trivy/pkg/iac/terraform"
77
tfcontext "github.com/aquasecurity/trivy/pkg/iac/terraform/context"
88
"github.com/zclconf/go-cty/cty"
9-
"github.com/zclconf/go-cty/cty/gocty"
10-
"golang.org/x/xerrors"
119
)
1210

13-
func workspaceOwnerHook(dfs fs.FS, input Input) (func(ctx *tfcontext.Context, blocks terraform.Blocks, inputVars map[string]cty.Value), error) {
14-
if input.Owner.Groups == nil {
15-
input.Owner.Groups = []string{}
16-
}
17-
ownerGroups, err := gocty.ToCtyValue(input.Owner.Groups, cty.List(cty.String))
11+
func WorkspaceOwnerHook(dfs fs.FS, input Input) (func(ctx *tfcontext.Context, blocks terraform.Blocks, inputVars map[string]cty.Value), error) {
12+
ownerValue, err := input.Owner.ToCtyValue()
1813
if err != nil {
19-
return nil, xerrors.Errorf("converting owner groups: %w", err)
14+
return nil, err
2015
}
2116

22-
ownerValue := cty.ObjectVal(map[string]cty.Value{
23-
"groups": ownerGroups,
24-
})
25-
2617
return func(ctx *tfcontext.Context, blocks terraform.Blocks, inputVars map[string]cty.Value) {
2718
for _, block := range blocks.OfType("data") {
2819
// TODO: Does it have to be me?

types/owner.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package types
22

33
import (
44
"github.com/google/uuid"
5+
"github.com/zclconf/go-cty/cty"
6+
"github.com/zclconf/go-cty/cty/gocty"
57
)
68

79
// Based on https://github.com/coder/terraform-provider-coder/blob/9a745586b23a9cb5de2f65a2dcac12e48b134ffa/provider/workspace_owner.go#L72
@@ -25,7 +27,52 @@ type WorkspaceOwner struct {
2527
RBACRoles []WorkspaceOwnerRBACRole `json:"rbac_roles"`
2628
}
2729

30+
func (o *WorkspaceOwner) ToCtyValue() (cty.Value, error) {
31+
convertedGroups, err := gocty.ToCtyValue(o.Groups, cty.List(cty.String))
32+
if err != nil {
33+
return cty.Value{}, err
34+
}
35+
36+
roleValues := make([]cty.Value, 0, len(o.RBACRoles))
37+
for _, role := range o.RBACRoles {
38+
roleValue, err := role.ToCtyValue()
39+
if err != nil {
40+
return cty.Value{}, err
41+
}
42+
roleValues = append(roleValues, roleValue)
43+
}
44+
var convertedRoles cty.Value = cty.ListValEmpty(WorkspaceOwnerRBACRole{}.CtyType())
45+
if len(roleValues) > 0 {
46+
convertedRoles = cty.ListVal(roleValues)
47+
}
48+
49+
return cty.ObjectVal(map[string]cty.Value{
50+
"id": cty.StringVal(o.ID.String()),
51+
"name": cty.StringVal(o.Name),
52+
"full_name": cty.StringVal(o.FullName),
53+
"email": cty.StringVal(o.Email),
54+
"ssh_public_key": cty.StringVal(o.SSHPublicKey),
55+
"groups": convertedGroups,
56+
"login_type": cty.StringVal(o.LoginType),
57+
"rbac_roles": convertedRoles,
58+
}), nil
59+
}
60+
2861
type WorkspaceOwnerRBACRole struct {
2962
Name string `json:"name"`
3063
OrgID uuid.UUID `json:"org_id"`
3164
}
65+
66+
func (_ WorkspaceOwnerRBACRole) CtyType() cty.Type {
67+
return cty.Object(map[string]cty.Type{
68+
"name": cty.String,
69+
"org_id": cty.String,
70+
})
71+
}
72+
73+
func (r *WorkspaceOwnerRBACRole) ToCtyValue() (cty.Value, error) {
74+
return cty.ObjectVal(map[string]cty.Value{
75+
"name": cty.StringVal(r.Name),
76+
"org_id": cty.StringVal(r.OrgID.String()),
77+
}), nil
78+
}

types/owner_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package types
2+
3+
import (
4+
"testing"
5+
6+
"github.com/google/uuid"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestToCtyValue(t *testing.T) {
11+
owner := WorkspaceOwner{
12+
ID: uuid.MustParse("f6457744-3e16-45b2-b3b0-80c2df491c99"),
13+
Name: "Nissa",
14+
FullName: "Nissa, Worldwaker",
15+
Email: "nissa@coder.com",
16+
SSHPublicKey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBSHXs/HCgZlpEBOXLvLw4KaOrhy1DM1Vw6M/HPVE/UA\n",
17+
Groups: []string{"Everyone", "Planeswalkers", "Green"},
18+
LoginType: "password",
19+
RBACRoles: []WorkspaceOwnerRBACRole{
20+
{Name: "User Admin"},
21+
{Name: "Organization User Admin", OrgID: uuid.MustParse("5af9253a-ecde-4a71-b8f5-c8d15be9e52b")},
22+
},
23+
}
24+
25+
_, err := owner.ToCtyValue()
26+
require.NoError(t, err)
27+
}
28+
29+
func TestToCtyValueWithNilLists(t *testing.T) {
30+
owner := WorkspaceOwner{
31+
ID: uuid.MustParse("f6457744-3e16-45b2-b3b0-80c2df491c99"),
32+
Name: "Nissa",
33+
FullName: "Nissa, Worldwaker",
34+
Email: "nissa@coder.com",
35+
SSHPublicKey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBSHXs/HCgZlpEBOXLvLw4KaOrhy1DM1Vw6M/HPVE/UA\n",
36+
Groups: nil,
37+
LoginType: "password",
38+
RBACRoles: nil,
39+
}
40+
41+
_, err := owner.ToCtyValue()
42+
require.NoError(t, err)
43+
}

0 commit comments

Comments
 (0)