Skip to content

Commit bf618e4

Browse files
committed
Add account_admins resource
1 parent 9e9f1ae commit bf618e4

10 files changed

+307
-33
lines changed

client/account.go

+21
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,24 @@ func (client *Client) DeleteAccount(id string) error {
270270

271271
return nil
272272
}
273+
274+
func GetAccountAdminsDiff(desiredAdmins []string, existingAdmins []string) (adminsToAdd []string, adminsToDelete []string) {
275+
276+
adminsToAdd = []string{}
277+
adminsToDelete = []string{}
278+
279+
for _, id := range existingAdmins {
280+
if ok := FindInSlice(desiredAdmins, id); !ok {
281+
adminsToDelete = append(adminsToDelete, id)
282+
}
283+
}
284+
285+
for _, id := range desiredAdmins {
286+
287+
if ok := FindInSlice(existingAdmins, id); !ok {
288+
adminsToAdd = append(adminsToAdd, id)
289+
}
290+
}
291+
292+
return adminsToAdd, adminsToDelete
293+
}

client/user.go

+75-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package client
22

3-
import "fmt"
3+
import (
4+
"errors"
5+
"fmt"
6+
)
47

58
type Credentials struct {
69
Permissions []string `json:"permissions,omitempty"`
@@ -50,6 +53,11 @@ type NewUser struct {
5053
Account []string `json:"account,omitempty"`
5154
}
5255

56+
type UserAccounts struct {
57+
UserName string `json:"userName`
58+
Account []Account `json:"account`
59+
}
60+
5361
func (client *Client) AddNewUserToAccount(accountId, userName, userEmail string) (*User, error) {
5462

5563
userDetails := fmt.Sprintf(`{"userName": "%s", "email": "%s"}`, userName, userEmail)
@@ -157,7 +165,7 @@ func (client *Client) DeleteUserAsAccountAdmin(accountId, userId string) error {
157165
return nil
158166
}
159167

160-
func (client *Client) ListUsers() (*[]User, error) {
168+
func (client *Client) GetAllUsers() (*[]User, error) {
161169

162170
opts := RequestOptions{
163171
Path: "/admin/user",
@@ -179,10 +187,41 @@ func (client *Client) ListUsers() (*[]User, error) {
179187
return &users, nil
180188
}
181189

190+
func (client *Client) GetUserByID(userId string) (*User, error) {
191+
192+
users, err := client.GetAllUsers()
193+
if err != nil {
194+
return nil, err
195+
}
196+
197+
for _, user := range *users {
198+
if user.ID == userId {
199+
return &user, nil
200+
}
201+
}
202+
203+
return nil, errors.New(fmt.Sprint("[ERROR] User with ID %s wasn't found.", userId))
204+
}
205+
182206
func (client *Client) DeleteUser(userName string) error {
183207

184208
opts := RequestOptions{
185-
Path: fmt.Sprintf("/admi/user/%s", userName),
209+
Path: fmt.Sprintf("/admin/user/%s", userName),
210+
Method: "DELETE",
211+
}
212+
213+
_, err := client.RequestAPI(&opts)
214+
if err != nil {
215+
return err
216+
}
217+
218+
return nil
219+
}
220+
221+
func (client *Client) DeleteUserFromAccount(accountId, userId string) error {
222+
223+
opts := RequestOptions{
224+
Path: fmt.Sprintf("/accounts/%s/%s", accountId, userId),
186225
Method: "DELETE",
187226
}
188227

@@ -193,3 +232,36 @@ func (client *Client) DeleteUser(userName string) error {
193232

194233
return nil
195234
}
235+
236+
func (client *Client) UpdateUserAccounts(userId string, accounts []Account) error {
237+
238+
// API call '/accounts/{accountId}/{userId}/adduser' doesn't work
239+
240+
user, err := client.GetUserByID(userId)
241+
if err != nil {
242+
return err
243+
}
244+
245+
postUser := UserAccounts{
246+
UserName: user.UserName,
247+
Account: accounts,
248+
}
249+
250+
body, err := EncodeToJSON(postUser)
251+
if err != nil {
252+
return err
253+
}
254+
255+
opts := RequestOptions{
256+
Path: "/admin/user/account",
257+
Method: "POST",
258+
Body: body,
259+
}
260+
261+
_, err = client.RequestAPI(&opts)
262+
if err != nil {
263+
return err
264+
}
265+
266+
return nil
267+
}

codefresh/data_user.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99

1010
func dataSourceUser() *schema.Resource {
1111
return &schema.Resource{
12-
Read: dataSourceUserRead,
12+
Read: dataSourceUserRead,
1313
Schema: *UserSchema(),
1414
}
1515
}
@@ -18,7 +18,7 @@ func dataSourceUserRead(d *schema.ResourceData, meta interface{}) error {
1818

1919
client := meta.(*cfClient.Client)
2020

21-
users, err := client.ListUsers()
21+
users, err := client.GetAllUsers()
2222
if err != nil {
2323
return err
2424
}

codefresh/data_users.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ func dataSourceUsersRead(d *schema.ResourceData, meta interface{}) error {
2525

2626
client := meta.(*cfClient.Client)
2727

28-
users, err := client.ListUsers()
28+
users, err := client.GetAllUsers()
2929
if err != nil {
3030
return err
3131
}

codefresh/provider.go

+7-6
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ func Provider() terraform.ResourceProvider {
3131
"codefresh_user": dataSourceUser(),
3232
},
3333
ResourcesMap: map[string]*schema.Resource{
34-
"codefresh_project": resourceProject(),
35-
"codefresh_pipeline": resourcePipeline(),
36-
"codefresh_team": resourceTeam(),
37-
"codefresh_account": resourceAccount(),
38-
"codefresh_api_key": resourceApiKey(),
39-
"codefresh_idp_accounts": resourceIDPAccounts(),
34+
"codefresh_project": resourceProject(),
35+
"codefresh_pipeline": resourcePipeline(),
36+
"codefresh_team": resourceTeam(),
37+
"codefresh_account": resourceAccount(),
38+
"codefresh_api_key": resourceApiKey(),
39+
"codefresh_idp_accounts": resourceIDPAccounts(),
40+
"codefresh_account_admins": resourceAccountAdmins(),
4041
},
4142
ConfigureFunc: configureProvider,
4243
}

codefresh/resource_account.go

+13-13
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ func resourceAccount() *schema.Resource {
1919
Type: schema.TypeString,
2020
Required: true,
2121
},
22-
"admins": {
23-
Type: schema.TypeSet,
24-
Optional: true,
25-
Elem: &schema.Schema{
26-
Type: schema.TypeString,
27-
},
28-
},
22+
// "admins": {
23+
// Type: schema.TypeSet,
24+
// Optional: true,
25+
// Elem: &schema.Schema{
26+
// Type: schema.TypeString,
27+
// },
28+
// },
2929
"limits": {
3030
Type: schema.TypeList,
3131
Optional: true,
@@ -133,10 +133,10 @@ func mapAccountToResource(account *cfClient.Account, d *schema.ResourceData) err
133133
return err
134134
}
135135

136-
err = d.Set("admins", account.Admins)
137-
if err != nil {
138-
return err
139-
}
136+
// err = d.Set("admins", account.Admins)
137+
// if err != nil {
138+
// return err
139+
// }
140140

141141
err = d.Set("limits", []map[string]interface{}{flattenLimits(*account.Limits)})
142142
if err != nil {
@@ -165,12 +165,12 @@ func flattenBuild(build cfClient.Build) map[string]interface{} {
165165
return res
166166
}
167167
func mapResourceToAccount(d *schema.ResourceData) *cfClient.Account {
168-
admins := d.Get("admins").(*schema.Set).List()
168+
// admins := d.Get("admins").(*schema.Set).List()
169169

170170
account := &cfClient.Account{
171171
ID: d.Id(),
172172
Name: d.Get("name").(string),
173-
Admins: convertStringArr(admins),
173+
// Admins: convertStringArr(admins),
174174
}
175175

176176
if _, ok := d.GetOk("limits"); ok {

codefresh/resource_account_admins.go

+121
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package codefresh
2+
3+
import (
4+
cfClient "github.com/codefresh-io/terraform-provider-codefresh/client"
5+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
6+
)
7+
8+
func resourceAccountAdmins() *schema.Resource {
9+
return &schema.Resource{
10+
Create: resourceAccountAdminsCreate,
11+
Read: resourceAccountAdminsRead,
12+
Update: resourceAccountAdminsUpdate,
13+
Delete: resourceAccountAdminsDelete,
14+
Importer: &schema.ResourceImporter{
15+
State: schema.ImportStatePassthrough,
16+
},
17+
Schema: map[string]*schema.Schema{
18+
"account_id": {
19+
Type: schema.TypeString,
20+
Required: true,
21+
},
22+
"users": {
23+
Type: schema.TypeSet,
24+
Required: true,
25+
Elem: &schema.Schema{
26+
Type: schema.TypeString,
27+
},
28+
},
29+
},
30+
}
31+
}
32+
33+
func resourceAccountAdminsCreate(d *schema.ResourceData, meta interface{}) error {
34+
35+
client := meta.(*cfClient.Client)
36+
37+
admins := d.Get("users").(*schema.Set).List()
38+
39+
accountId := d.Get("account_id").(string)
40+
41+
for _, admin := range convertStringArr(admins) {
42+
err := client.SetUserAsAccountAdmin(accountId, admin)
43+
if err != nil {
44+
return err
45+
}
46+
}
47+
48+
// d.SetId(time.Now().UTC().String())
49+
d.SetId(accountId)
50+
51+
return nil
52+
}
53+
54+
func resourceAccountAdminsDelete(d *schema.ResourceData, meta interface{}) error {
55+
56+
client := meta.(*cfClient.Client)
57+
58+
admins := d.Get("users").(*schema.Set).List()
59+
60+
accountId := d.Get("account_id").(string)
61+
62+
for _, admin := range convertStringArr(admins) {
63+
err := client.DeleteUserAsAccountAdmin(accountId, admin)
64+
if err != nil {
65+
return err
66+
}
67+
}
68+
69+
return nil
70+
}
71+
72+
func resourceAccountAdminsRead(d *schema.ResourceData, meta interface{}) error {
73+
74+
client := meta.(*cfClient.Client)
75+
76+
accountId := d.Id()
77+
78+
d.Set("account_id", accountId)
79+
80+
account, err := client.GetAccountByID(accountId)
81+
if err != nil {
82+
return nil
83+
}
84+
err = d.Set("users", account.Admins)
85+
if err != nil {
86+
return err
87+
}
88+
89+
return nil
90+
}
91+
92+
func resourceAccountAdminsUpdate(d *schema.ResourceData, meta interface{}) error {
93+
94+
client := meta.(*cfClient.Client)
95+
96+
accountId := d.Get("account_id").(string)
97+
desiredAdmins := d.Get("users").(*schema.Set).List()
98+
99+
account, err := client.GetAccountByID(accountId)
100+
if err != nil {
101+
return err
102+
}
103+
104+
adminsToAdd, AdminsToDelete := cfClient.GetAccountAdminsDiff(convertStringArr(desiredAdmins), account.Admins)
105+
106+
for _, userId := range AdminsToDelete {
107+
err := client.DeleteUserAsAccountAdmin(accountId, userId)
108+
if err != nil {
109+
return err
110+
}
111+
}
112+
113+
for _, userId := range adminsToAdd {
114+
err := client.SetUserAsAccountAdmin(accountId, userId)
115+
if err != nil {
116+
return err
117+
}
118+
}
119+
120+
return nil
121+
}

codefresh/resource_idp_accounts.go

+2
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ func resourceAccountIDPRead(d *schema.ResourceData, meta interface{}) error {
8181
}
8282

8383
func resourceAccountIDPDelete(_ *schema.ResourceData, _ interface{}) error {
84+
// todo
85+
// warning message
8486
return nil
8587
}
8688

0 commit comments

Comments
 (0)