Skip to content

Commit 612aa5e

Browse files
committed
resource_permission draft
1 parent c294d76 commit 612aa5e

File tree

3 files changed

+306
-0
lines changed

3 files changed

+306
-0
lines changed

client/permission.go

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package client
2+
3+
import (
4+
"fmt"
5+
)
6+
7+
// Permission spec
8+
type Permission struct {
9+
ID string `json:"_id,omitempty"`
10+
Team string `json:"role,omitempty"`
11+
Resource string `json:"resource,omitempty"`
12+
Action string `json:"action,omitempty"`
13+
Account string `json:"account,omitempty"`
14+
Tags []string `json:"tags,omitempty"`
15+
}
16+
17+
// GetPermissionList -
18+
func (client *Client) GetPermissionList(teamID, action, resource string) ([]Permission, error) {
19+
fullPath := "/abac"
20+
opts := RequestOptions{
21+
Path: fullPath,
22+
Method: "GET",
23+
}
24+
25+
resp, err := client.RequestAPI(&opts)
26+
27+
if err != nil {
28+
return nil, err
29+
}
30+
31+
var permissions, permissionsFiltered []Permission
32+
33+
err = DecodeResponseInto(resp, &permissions)
34+
if err != nil {
35+
return nil, err
36+
}
37+
38+
for _, p := range permissions {
39+
if teamID != "" && p.Team != teamID {
40+
continue
41+
}
42+
if action != "" && p.Action != action {
43+
continue
44+
}
45+
if resource != "" && p.Resource != resource {
46+
continue
47+
}
48+
permissionsFiltered = append(permissionsFiltered, p)
49+
}
50+
51+
return permissionsFiltered, nil
52+
}
53+
54+
// GetPermissionByID -
55+
func (client *Client) GetPermissionByID(id string) (*Permission, error) {
56+
fullPath := fmt.Sprintf("/abac/%s", id)
57+
opts := RequestOptions{
58+
Path: fullPath,
59+
Method: "GET",
60+
}
61+
62+
resp, err := client.RequestAPI(&opts)
63+
if err != nil {
64+
return nil, err
65+
}
66+
67+
var permission Permission
68+
err = DecodeResponseInto(resp, &permission)
69+
if err != nil {
70+
return nil, err
71+
}
72+
73+
return &permission, nil
74+
}
75+
76+
// CreatePermision -
77+
func (client *Client) CreatePermission(permission *Permission) (*Permission, error) {
78+
79+
body, err := EncodeToJSON(permission)
80+
81+
if err != nil {
82+
return nil, err
83+
}
84+
opts := RequestOptions{
85+
Path: "/abac",
86+
Method: "POST",
87+
Body: body,
88+
}
89+
90+
resp, err := client.RequestAPI(&opts)
91+
92+
if err != nil {
93+
return nil, err
94+
}
95+
96+
var newPermission Permission
97+
err = DecodeResponseInto(resp, &newPermission)
98+
if err != nil {
99+
return nil, err
100+
}
101+
102+
return &newPermission, nil
103+
}
104+
105+
// DeletePermission -
106+
func (client *Client) DeletePermission(id string) error {
107+
fullPath := fmt.Sprintf("/abac/%s", id)
108+
opts := RequestOptions{
109+
Path: fullPath,
110+
Method: "DELETE",
111+
}
112+
113+
_, err := client.RequestAPI(&opts)
114+
115+
if err != nil {
116+
return err
117+
}
118+
119+
return nil
120+
}

codefresh/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ func Provider() *schema.Provider {
4141
"codefresh_idp_accounts": resourceIDPAccounts(),
4242
"codefresh_account_admins": resourceAccountAdmins(),
4343
"codefresh_user": resourceUser(),
44+
"codefresh_permission": resourcePermission(),
4445
},
4546
ConfigureFunc: configureProvider,
4647
}

codefresh/resource_permission.go

+185
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
package codefresh
2+
3+
import (
4+
"fmt"
5+
cfClient "github.com/codefresh-io/terraform-provider-codefresh/client"
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
7+
8+
)
9+
10+
func resourcePermission() *schema.Resource {
11+
return &schema.Resource{
12+
Create: resourcePermissionCreate,
13+
Read: resourcePermissionRead,
14+
Update: resourcePermissionUpdate,
15+
Delete: resourcePermissionDelete,
16+
Importer: &schema.ResourceImporter{
17+
State: schema.ImportStatePassthrough,
18+
},
19+
Schema: map[string]*schema.Schema{
20+
"_id": {
21+
Type: schema.TypeString,
22+
Optional: true,
23+
Computed: true,
24+
},
25+
"team": {
26+
Type: schema.TypeString,
27+
Required: true,
28+
},
29+
"account": {
30+
Type: schema.TypeString,
31+
Optional: true,
32+
Computed: true,
33+
},
34+
"resource": {
35+
Type: schema.TypeString,
36+
Required: true,
37+
ValidateFunc: func(val interface{}, key string) (warns []string, errs []error) {
38+
v := val.(string)
39+
if v != "cluster" || v != "pipeline" {
40+
errs = append(errs, fmt.Errorf("%q must be between \"pipeline\" or \"cluster\", got: %s", key, v))
41+
}
42+
return
43+
},
44+
},
45+
"action": {
46+
Type: schema.TypeString,
47+
Required: true,
48+
ValidateFunc: func(val interface{}, key string) (warns []string, errs []error) {
49+
v := val.(string)
50+
if v != "create" || v != "read" || v != "update" || v != "delete" || v != "approve" {
51+
errs = append(errs, fmt.Errorf("%q must be between one of create,read,update,delete,approve, got: %s", key, v))
52+
}
53+
return
54+
},
55+
},
56+
"tags": {
57+
Type: schema.TypeSet,
58+
Optional: true,
59+
Elem: &schema.Schema{
60+
Type: schema.TypeString,
61+
},
62+
Default: []string{"*", "untagged"},
63+
},
64+
},
65+
}
66+
}
67+
68+
func resourcePermissionCreate(d *schema.ResourceData, meta interface{}) error {
69+
client := meta.(*cfClient.Client)
70+
71+
permission := *mapResourceToPermission(d)
72+
73+
resp, err := client.CreatePermission(&permission)
74+
if err != nil {
75+
return err
76+
}
77+
78+
d.SetId(resp.ID)
79+
80+
return resourcePermissionRead(d, meta)
81+
}
82+
83+
func resourcePermissionRead(d *schema.ResourceData, meta interface{}) error {
84+
85+
client := meta.(*cfClient.Client)
86+
87+
permissionID := d.Id()
88+
if permissionID == "" {
89+
d.SetId("")
90+
return nil
91+
}
92+
93+
permission, err := client.GetPermissionByID(permissionID)
94+
if err != nil {
95+
return err
96+
}
97+
98+
err = mapPermissionToResource(permission, d)
99+
if err != nil {
100+
return err
101+
}
102+
103+
return nil
104+
}
105+
106+
func resourcePermissionUpdate(d *schema.ResourceData, meta interface{}) error {
107+
client := meta.(*cfClient.Client)
108+
109+
permission := *mapResourceToPermission(d)
110+
111+
112+
// existingPermission, err := client.GetPermissionByID(permission.ID)
113+
// if err != nil {
114+
// return nil
115+
// }
116+
117+
resp, err := client.CreatePermission(&permission)
118+
if err != nil {
119+
return err
120+
}
121+
d.SetId(resp.ID)
122+
123+
return resourcePermissionRead(d, meta)
124+
}
125+
126+
func resourcePermissionDelete(d *schema.ResourceData, meta interface{}) error {
127+
client := meta.(*cfClient.Client)
128+
129+
err := client.DeletePermission(d.Id())
130+
if err != nil {
131+
return err
132+
}
133+
134+
return nil
135+
}
136+
137+
func mapPermissionToResource(permission *cfClient.Permission, d *schema.ResourceData) error {
138+
139+
err := d.Set("_id", permission.ID)
140+
if err != nil {
141+
return err
142+
}
143+
144+
err = d.Set("team", permission.Team)
145+
if err != nil {
146+
return err
147+
}
148+
149+
err = d.Set("account", permission.Account)
150+
if err != nil {
151+
return err
152+
}
153+
154+
err = d.Set("action", permission.Action)
155+
if err != nil {
156+
return err
157+
}
158+
159+
err = d.Set("resource", permission.Resource)
160+
if err != nil {
161+
return err
162+
}
163+
164+
err = d.Set("tags", permission.Tags)
165+
if err != nil {
166+
return err
167+
}
168+
169+
return nil
170+
}
171+
172+
func mapResourceToPermission(d *schema.ResourceData) *cfClient.Permission {
173+
174+
tags := d.Get("tags").(*schema.Set).List()
175+
permission := &cfClient.Permission{
176+
ID: d.Id(),
177+
Team: d.Get("team").(string),
178+
Action: d.Get("action").(string),
179+
Resource: d.Get("string").(string),
180+
//Account: d.Get("account_id").(string),
181+
Tags: convertStringArr(tags),
182+
}
183+
184+
return permission
185+
}

0 commit comments

Comments
 (0)