Skip to content

Commit 5429310

Browse files
initial implementation
1 parent 59f99a0 commit 5429310

File tree

3 files changed

+332
-0
lines changed

3 files changed

+332
-0
lines changed

codefresh/cfclient/service_user.go

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
package cfclient
2+
3+
import (
4+
"fmt"
5+
"golang.org/x/exp/slices"
6+
7+
)
8+
9+
type ServiceUser struct {
10+
ID string `json:"_id,omitempty"`
11+
Name string `json:"userName,omitempty"`
12+
Teams []Team `json:"teams,omitempty"`
13+
Roles []string `json:"roles,omitempty"`
14+
}
15+
16+
type ServiceUserCreateUpdate struct {
17+
ID string `json:"_id,omitempty"`
18+
Name string `json:"userName,omitempty"`
19+
TeamIDs []string `json:"teamIds,omitempty"`
20+
AssignAdminRole bool `json:"assignAdminRole,omitempty"`
21+
}
22+
23+
// GetID implement CodefreshObject interface
24+
func (serviceuser *ServiceUser) GetID() string {
25+
return serviceuser.ID
26+
}
27+
28+
func (serviceuser *ServiceUser) HasAdminRole() bool {
29+
return slices.Contains(serviceuser.Roles, "Admin")
30+
}
31+
32+
func (client *Client) GetServiceUserList() ([]ServiceUser, error) {
33+
fullPath := "/service-users"
34+
opts := RequestOptions{
35+
Path: fullPath,
36+
Method: "GET",
37+
}
38+
39+
resp, err := client.RequestAPI(&opts)
40+
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
var serviceusers []ServiceUser
46+
47+
err = DecodeResponseInto(resp, &serviceusers)
48+
if err != nil {
49+
return nil, err
50+
}
51+
52+
return serviceusers, nil
53+
}
54+
55+
func (client *Client) GetServiceUserByName(name string) (*ServiceUser, error) {
56+
57+
serviceusers, err := client.GetServiceUserList()
58+
if err != nil {
59+
return nil, err
60+
}
61+
62+
for _, serviceuser := range serviceusers {
63+
if serviceuser.Name == name {
64+
return &serviceuser, nil
65+
}
66+
}
67+
68+
return nil, nil
69+
}
70+
71+
func (client *Client) GetServiceUserByID(id string) (*ServiceUser, error) {
72+
73+
fullPath := fmt.Sprintf("/service-users/%s", id)
74+
opts := RequestOptions{
75+
Path: fullPath,
76+
Method: "GET",
77+
}
78+
79+
resp, err := client.RequestAPI(&opts)
80+
81+
if err != nil {
82+
return nil, err
83+
}
84+
85+
var serviceuser ServiceUser
86+
87+
err = DecodeResponseInto(resp, &serviceuser)
88+
if err != nil {
89+
return nil, err
90+
}
91+
92+
return &serviceuser, nil
93+
}
94+
95+
func (client *Client) CreateServiceUser(serviceUserCreateUpdate *ServiceUserCreateUpdate) (*ServiceUser, error) {
96+
97+
fullPath := "/service-users"
98+
body, err := EncodeToJSON(serviceUserCreateUpdate)
99+
100+
if err != nil {
101+
return nil, err
102+
}
103+
104+
opts := RequestOptions{
105+
Path: fullPath,
106+
Method: "POST",
107+
Body: body,
108+
}
109+
110+
resp, err := client.RequestAPI(&opts)
111+
112+
if err != nil {
113+
return nil, err
114+
}
115+
116+
var serviceuser ServiceUser
117+
118+
err = DecodeResponseInto(resp, &serviceuser)
119+
if err != nil {
120+
return nil, err
121+
}
122+
123+
return &serviceuser, nil
124+
}
125+
126+
func (client *Client) UpdateServiceUser(serviceUserCreateUpdate *ServiceUserCreateUpdate) (*ServiceUser, error) {
127+
128+
fullPath := fmt.Sprintf("/service-users/%s", serviceUserCreateUpdate.ID)
129+
body, err := EncodeToJSON(serviceUserCreateUpdate)
130+
131+
if err != nil {
132+
return nil, err
133+
}
134+
135+
opts := RequestOptions{
136+
Path: fullPath,
137+
Method: "PATCH",
138+
Body: body,
139+
}
140+
141+
resp, err := client.RequestAPI(&opts)
142+
143+
if err != nil {
144+
return nil, err
145+
}
146+
147+
var serviceuser ServiceUser
148+
149+
err = DecodeResponseInto(resp, &serviceuser)
150+
if err != nil {
151+
return nil, err
152+
}
153+
154+
return &serviceuser, nil
155+
}
156+
157+
func (client *Client) DeleteServiceUser(id string) error {
158+
fullPath := fmt.Sprintf("/service-users/%s", id)
159+
opts := RequestOptions{
160+
Path: fullPath,
161+
Method: "DELETE",
162+
}
163+
164+
_, err := client.RequestAPI(&opts)
165+
166+
if err != nil {
167+
return err
168+
}
169+
170+
return nil
171+
}

codefresh/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ func Provider() *schema.Provider {
7373
"codefresh_idp": resourceIdp(),
7474
"codefresh_account_idp": resourceAccountIdp(),
7575
"codefresh_account_gitops_settings": resourceAccountGitopsSettings(),
76+
"codefresh_service_account": resourceServiceAccount(),
7677
},
7778
ConfigureFunc: configureProvider,
7879
}

codefresh/resource_service_user.go

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
package codefresh
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/codefresh-io/terraform-provider-codefresh/codefresh/cfclient"
7+
"github.com/codefresh-io/terraform-provider-codefresh/codefresh/internal/datautil"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func resourceServiceAccount() *schema.Resource {
12+
return &schema.Resource{
13+
Description: "A service account is an identity that provides automated processes, applications, and services with the necessary permissions to interact securely with the Codefresh platform",
14+
Create: resourceServiceAccountCreate,
15+
Read: resourceServiceAccountRead,
16+
Update: resourceServiceAccountUpdate,
17+
Delete: resourceServiceAccountDelete,
18+
Importer: &schema.ResourceImporter{
19+
State: schema.ImportStatePassthrough,
20+
},
21+
Schema: map[string]*schema.Schema{
22+
"name": {
23+
Description: "Service account display name",
24+
Type: schema.TypeString,
25+
Required: true,
26+
},
27+
"assign_admin_role": {
28+
Description: "Whether or not to assign account admin role to the service account",
29+
Type: schema.TypeBool,
30+
Optional: true,
31+
Default: false,
32+
},
33+
"assigned_teams": {
34+
Description: "A list of team IDs the service account is be assigned to",
35+
Type: schema.TypeSet,
36+
Optional: true,
37+
Elem: &schema.Schema{
38+
Type: schema.TypeString,
39+
},
40+
},
41+
},
42+
}
43+
}
44+
45+
func resourceServiceAccountCreate(d *schema.ResourceData, meta interface{}) error {
46+
client := meta.(*cfclient.Client)
47+
48+
newSerivceAccount := *mapResourceToServiceAccount(d)
49+
50+
resp, err := client.CreateServiceUser(&newSerivceAccount)
51+
if err != nil {
52+
return err
53+
}
54+
55+
d.SetId(resp.ID)
56+
57+
return nil
58+
}
59+
60+
func resourceServiceAccountRead(d *schema.ResourceData, meta interface{}) error {
61+
62+
client := meta.(*cfclient.Client)
63+
64+
serviceAccountID := d.Id()
65+
66+
if serviceAccountID == "" {
67+
d.SetId("")
68+
return nil
69+
}
70+
71+
serviceAccount, err := client.GetServiceUserByID(serviceAccountID)
72+
73+
if err != nil {
74+
return err
75+
}
76+
77+
err = mapServiceAccountToResource(serviceAccount, d)
78+
if err != nil {
79+
return err
80+
}
81+
82+
return nil
83+
}
84+
85+
func resourceServiceAccountUpdate(d *schema.ResourceData, meta interface{}) error {
86+
client := meta.(*cfclient.Client)
87+
88+
updateServiceAccount := *mapResourceToServiceAccount(d)
89+
90+
91+
_, err := client.UpdateServiceUser(&updateServiceAccount)
92+
93+
if err != nil {
94+
return err
95+
}
96+
97+
return nil
98+
}
99+
100+
func resourceServiceAccountDelete(d *schema.ResourceData, meta interface{}) error {
101+
client := meta.(*cfclient.Client)
102+
103+
err := client.DeleteServiceUser(d.Id())
104+
105+
if err != nil {
106+
return err
107+
}
108+
109+
return nil
110+
}
111+
112+
func mapServiceAccountToResource(serviceAccount *cfclient.ServiceUser, d *schema.ResourceData) error {
113+
114+
if serviceAccount == nil {
115+
return fmt.Errorf("mapServiceAccountToResource - cannot find service account")
116+
}
117+
err := d.Set("name", serviceAccount.Name)
118+
119+
if err != nil {
120+
return err
121+
}
122+
123+
teamIds := []string{}
124+
125+
for _, team := range serviceAccount.Teams {
126+
teamIds = append(teamIds, team.ID)
127+
}
128+
129+
err = d.Set("assigned_teams", teamIds)
130+
131+
if err != nil {
132+
return err
133+
}
134+
135+
err = d.Set("assign_admin_role", serviceAccount.HasAdminRole())
136+
137+
if err != nil {
138+
return err
139+
}
140+
141+
return nil
142+
}
143+
144+
func flattenServiceAccountTeams(users []cfclient.TeamUser) []string {
145+
res := []string{}
146+
for _, user := range users {
147+
res = append(res, user.ID)
148+
}
149+
return res
150+
}
151+
152+
func mapResourceToServiceAccount(d *schema.ResourceData) *cfclient.ServiceUserCreateUpdate {
153+
154+
return &cfclient.ServiceUserCreateUpdate{
155+
ID: d.Id(),
156+
Name: d.Get("name").(string),
157+
TeamIDs: datautil.ConvertStringArr(d.Get("assigned_teams").(*schema.Set).List()),
158+
AssignAdminRole: d.Get("assign_admin_role").(bool),
159+
}
160+
}

0 commit comments

Comments
 (0)