Skip to content

Commit 5a2e0a2

Browse files
authored
Merge pull request #621 from Tiboau/validateCloudProjectUserRole
Check if CloudProject user role exist
2 parents 48a08ba + c36e0d2 commit 5a2e0a2

File tree

1 file changed

+36
-44
lines changed

1 file changed

+36
-44
lines changed

ovh/resource_cloud_project_user.go

+36-44
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ func resourceCloudProjectUser() *schema.Resource {
4444
ForceNew: true,
4545
},
4646
"role_name": {
47-
Type: schema.TypeString,
48-
Optional: true,
49-
ForceNew: false,
50-
ValidateFunc: validateCloudProjectUserRoleFunc,
47+
Type: schema.TypeString,
48+
Optional: true,
49+
ForceNew: false,
5150
},
5251
"role_names": {
5352
Type: schema.TypeList,
@@ -108,6 +107,30 @@ func resourceCloudProjectUser() *schema.Resource {
108107
}
109108
}
110109

110+
func validateCloudProjectUserRoleFunc(config *Config, serviceName string, roles []string, role string) (*CloudProjectrolesResponse, error) {
111+
112+
endpoint := fmt.Sprintf("/cloud/project/%s/role",
113+
url.PathEscape(serviceName),
114+
)
115+
res := &CloudProjectrolesResponse{}
116+
if err := config.OVHClient.Get(endpoint, res); err != nil {
117+
return nil, fmt.Errorf("calling Get %s", endpoint)
118+
}
119+
120+
ovhRole := make([]string, 0, len(res.Roles))
121+
for _, val := range res.Roles {
122+
ovhRole = append(ovhRole, val.Name)
123+
}
124+
125+
for _, role := range append(roles, role) {
126+
if !slices.Contains(ovhRole, role) {
127+
return nil, fmt.Errorf("Role %q does not exist", role)
128+
}
129+
}
130+
131+
return res, nil
132+
}
133+
111134
func resourceCloudProjectUserImportState(ctx context.Context, d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
112135
userId := d.Id()
113136
// Fallback to the environment variable if service_name not given
@@ -129,47 +152,18 @@ func resourceCloudProjectUserImportState(ctx context.Context, d *schema.Resource
129152
return []*schema.ResourceData{d}, nil
130153
}
131154

132-
func validateCloudProjectUserRoleFunc(v interface{}, k string) (ws []string, errors []error) {
133-
err := helpers.ValidateStringEnum(v.(string), []string{
134-
"administrator",
135-
"ai_training_operator",
136-
"ai_training_read",
137-
"authentication",
138-
"backup_operator",
139-
"compute_operator",
140-
"image_operator",
141-
"infrastructure_supervisor",
142-
"network_operator",
143-
"network_security_operator",
144-
"objectstore_operator",
145-
"volume_operator",
146-
})
147-
148-
if err != nil {
149-
errors = append(errors, err)
150-
}
151-
return
152-
}
153-
154155
func resourceCloudProjectUserUpdate(d *schema.ResourceData, meta interface{}) error {
155156
config := meta.(*Config)
156157
serviceName := d.Get("service_name").(string)
157158
userId := d.Id()
158159
role := d.Get("role_name")
159160
roles, err := helpers.StringsFromSchema(d, "role_names")
161+
res := &CloudProjectrolesResponse{}
160162

163+
res, err = validateCloudProjectUserRoleFunc(config, serviceName, roles, role.(string))
161164
if err != nil {
162-
log.Fatal(err)
165+
return err
163166
}
164-
165-
endpoint := fmt.Sprintf("/cloud/project/%s/role",
166-
url.PathEscape(serviceName),
167-
)
168-
res := &CloudProjectrolesResponse{}
169-
if err := config.OVHClient.Get(endpoint, res); err != nil {
170-
return fmt.Errorf("calling Get %s", endpoint)
171-
}
172-
173167
update := []string{}
174168
for _, i := range res.Roles {
175169
if slices.Contains(roles, i.Name) {
@@ -182,7 +176,7 @@ func resourceCloudProjectUserUpdate(d *schema.ResourceData, meta interface{}) er
182176

183177
log.Printf("[DEBUG] roles IDs %s", update)
184178
log.Printf("[DEBUG] user %s", userId)
185-
endpoint = fmt.Sprintf("/cloud/project/%s/user/%s/role",
179+
endpoint := fmt.Sprintf("/cloud/project/%s/user/%s/role",
186180
url.PathEscape(serviceName),
187181
url.PathEscape(userId),
188182
)
@@ -200,16 +194,14 @@ func resourceCloudProjectUserUpdate(d *schema.ResourceData, meta interface{}) er
200194
func resourceCloudProjectUserCreate(d *schema.ResourceData, meta interface{}) error {
201195
config := meta.(*Config)
202196
serviceName := d.Get("service_name").(string)
203-
197+
role := d.Get("role_name")
204198
params := (&CloudProjectUserCreateOpts{}).FromResource(d)
205199

206-
for _, role := range params.Roles {
207-
if _, errs := validateCloudProjectUserRoleFunc(role, ""); errs != nil {
208-
return fmt.Errorf("roles contains unsupported value: %s.", role)
209-
}
210-
}
211-
212200
r := &CloudProjectUser{}
201+
_, err := validateCloudProjectUserRoleFunc(config, serviceName, params.Roles, role.(string))
202+
if err != nil {
203+
return err
204+
}
213205

214206
log.Printf("[DEBUG] Will create public cloud user: %s", params)
215207
endpoint := fmt.Sprintf(

0 commit comments

Comments
 (0)