Skip to content

Commit

Permalink
Add account_admins resource
Browse files Browse the repository at this point in the history
  • Loading branch information
palson-cf committed Jul 17, 2020
1 parent 9e9f1ae commit bf618e4
Show file tree
Hide file tree
Showing 10 changed files with 307 additions and 33 deletions.
21 changes: 21 additions & 0 deletions client/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,3 +270,24 @@ func (client *Client) DeleteAccount(id string) error {

return nil
}

func GetAccountAdminsDiff(desiredAdmins []string, existingAdmins []string) (adminsToAdd []string, adminsToDelete []string) {

adminsToAdd = []string{}
adminsToDelete = []string{}

for _, id := range existingAdmins {
if ok := FindInSlice(desiredAdmins, id); !ok {
adminsToDelete = append(adminsToDelete, id)
}
}

for _, id := range desiredAdmins {

if ok := FindInSlice(existingAdmins, id); !ok {
adminsToAdd = append(adminsToAdd, id)
}
}

return adminsToAdd, adminsToDelete
}
78 changes: 75 additions & 3 deletions client/user.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package client

import "fmt"
import (
"errors"
"fmt"
)

type Credentials struct {
Permissions []string `json:"permissions,omitempty"`
Expand Down Expand Up @@ -50,6 +53,11 @@ type NewUser struct {
Account []string `json:"account,omitempty"`
}

type UserAccounts struct {
UserName string `json:"userName`
Account []Account `json:"account`
}

func (client *Client) AddNewUserToAccount(accountId, userName, userEmail string) (*User, error) {

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

func (client *Client) ListUsers() (*[]User, error) {
func (client *Client) GetAllUsers() (*[]User, error) {

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

func (client *Client) GetUserByID(userId string) (*User, error) {

users, err := client.GetAllUsers()
if err != nil {
return nil, err
}

for _, user := range *users {
if user.ID == userId {
return &user, nil
}
}

return nil, errors.New(fmt.Sprint("[ERROR] User with ID %s wasn't found.", userId))
}

func (client *Client) DeleteUser(userName string) error {

opts := RequestOptions{
Path: fmt.Sprintf("/admi/user/%s", userName),
Path: fmt.Sprintf("/admin/user/%s", userName),
Method: "DELETE",
}

_, err := client.RequestAPI(&opts)
if err != nil {
return err
}

return nil
}

func (client *Client) DeleteUserFromAccount(accountId, userId string) error {

opts := RequestOptions{
Path: fmt.Sprintf("/accounts/%s/%s", accountId, userId),
Method: "DELETE",
}

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

return nil
}

func (client *Client) UpdateUserAccounts(userId string, accounts []Account) error {

// API call '/accounts/{accountId}/{userId}/adduser' doesn't work

user, err := client.GetUserByID(userId)
if err != nil {
return err
}

postUser := UserAccounts{
UserName: user.UserName,
Account: accounts,
}

body, err := EncodeToJSON(postUser)
if err != nil {
return err
}

opts := RequestOptions{
Path: "/admin/user/account",
Method: "POST",
Body: body,
}

_, err = client.RequestAPI(&opts)
if err != nil {
return err
}

return nil
}
4 changes: 2 additions & 2 deletions codefresh/data_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (

func dataSourceUser() *schema.Resource {
return &schema.Resource{
Read: dataSourceUserRead,
Read: dataSourceUserRead,
Schema: *UserSchema(),
}
}
Expand All @@ -18,7 +18,7 @@ func dataSourceUserRead(d *schema.ResourceData, meta interface{}) error {

client := meta.(*cfClient.Client)

users, err := client.ListUsers()
users, err := client.GetAllUsers()
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion codefresh/data_users.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func dataSourceUsersRead(d *schema.ResourceData, meta interface{}) error {

client := meta.(*cfClient.Client)

users, err := client.ListUsers()
users, err := client.GetAllUsers()
if err != nil {
return err
}
Expand Down
13 changes: 7 additions & 6 deletions codefresh/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,13 @@ func Provider() terraform.ResourceProvider {
"codefresh_user": dataSourceUser(),
},
ResourcesMap: map[string]*schema.Resource{
"codefresh_project": resourceProject(),
"codefresh_pipeline": resourcePipeline(),
"codefresh_team": resourceTeam(),
"codefresh_account": resourceAccount(),
"codefresh_api_key": resourceApiKey(),
"codefresh_idp_accounts": resourceIDPAccounts(),
"codefresh_project": resourceProject(),
"codefresh_pipeline": resourcePipeline(),
"codefresh_team": resourceTeam(),
"codefresh_account": resourceAccount(),
"codefresh_api_key": resourceApiKey(),
"codefresh_idp_accounts": resourceIDPAccounts(),
"codefresh_account_admins": resourceAccountAdmins(),
},
ConfigureFunc: configureProvider,
}
Expand Down
26 changes: 13 additions & 13 deletions codefresh/resource_account.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ func resourceAccount() *schema.Resource {
Type: schema.TypeString,
Required: true,
},
"admins": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
// "admins": {
// Type: schema.TypeSet,
// Optional: true,
// Elem: &schema.Schema{
// Type: schema.TypeString,
// },
// },
"limits": {
Type: schema.TypeList,
Optional: true,
Expand Down Expand Up @@ -133,10 +133,10 @@ func mapAccountToResource(account *cfClient.Account, d *schema.ResourceData) err
return err
}

err = d.Set("admins", account.Admins)
if err != nil {
return err
}
// err = d.Set("admins", account.Admins)
// if err != nil {
// return err
// }

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

account := &cfClient.Account{
ID: d.Id(),
Name: d.Get("name").(string),
Admins: convertStringArr(admins),
// Admins: convertStringArr(admins),
}

if _, ok := d.GetOk("limits"); ok {
Expand Down
121 changes: 121 additions & 0 deletions codefresh/resource_account_admins.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package codefresh

import (
cfClient "github.com/codefresh-io/terraform-provider-codefresh/client"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)

func resourceAccountAdmins() *schema.Resource {
return &schema.Resource{
Create: resourceAccountAdminsCreate,
Read: resourceAccountAdminsRead,
Update: resourceAccountAdminsUpdate,
Delete: resourceAccountAdminsDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeString,
Required: true,
},
"users": {
Type: schema.TypeSet,
Required: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
}
}

func resourceAccountAdminsCreate(d *schema.ResourceData, meta interface{}) error {

client := meta.(*cfClient.Client)

admins := d.Get("users").(*schema.Set).List()

accountId := d.Get("account_id").(string)

for _, admin := range convertStringArr(admins) {
err := client.SetUserAsAccountAdmin(accountId, admin)
if err != nil {
return err
}
}

// d.SetId(time.Now().UTC().String())
d.SetId(accountId)

return nil
}

func resourceAccountAdminsDelete(d *schema.ResourceData, meta interface{}) error {

client := meta.(*cfClient.Client)

admins := d.Get("users").(*schema.Set).List()

accountId := d.Get("account_id").(string)

for _, admin := range convertStringArr(admins) {
err := client.DeleteUserAsAccountAdmin(accountId, admin)
if err != nil {
return err
}
}

return nil
}

func resourceAccountAdminsRead(d *schema.ResourceData, meta interface{}) error {

client := meta.(*cfClient.Client)

accountId := d.Id()

d.Set("account_id", accountId)

account, err := client.GetAccountByID(accountId)
if err != nil {
return nil
}
err = d.Set("users", account.Admins)
if err != nil {
return err
}

return nil
}

func resourceAccountAdminsUpdate(d *schema.ResourceData, meta interface{}) error {

client := meta.(*cfClient.Client)

accountId := d.Get("account_id").(string)
desiredAdmins := d.Get("users").(*schema.Set).List()

account, err := client.GetAccountByID(accountId)
if err != nil {
return err
}

adminsToAdd, AdminsToDelete := cfClient.GetAccountAdminsDiff(convertStringArr(desiredAdmins), account.Admins)

for _, userId := range AdminsToDelete {
err := client.DeleteUserAsAccountAdmin(accountId, userId)
if err != nil {
return err
}
}

for _, userId := range adminsToAdd {
err := client.SetUserAsAccountAdmin(accountId, userId)
if err != nil {
return err
}
}

return nil
}
2 changes: 2 additions & 0 deletions codefresh/resource_idp_accounts.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ func resourceAccountIDPRead(d *schema.ResourceData, meta interface{}) error {
}

func resourceAccountIDPDelete(_ *schema.ResourceData, _ interface{}) error {
// todo
// warning message
return nil
}

Expand Down

0 comments on commit bf618e4

Please sign in to comment.