alibabacloudstack/resource_apsarastack_ascm_user_group.go (184 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "log" "strconv" "time" "fmt" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func resourceAlibabacloudStackAscmUserGroup() *schema.Resource { resource := &schema.Resource{ Schema: map[string]*schema.Schema{ "group_name": { Type: schema.TypeString, ForceNew: true, Required: true, }, "organization_id": { Type: schema.TypeString, Optional: true, Computed: true, ForceNew: true, Deprecated: "Field 'organization_id' has been deprecated. Use the organization to which the current user belongs", }, "user_group_id": { Type: schema.TypeString, Computed: true, }, "role_in_ids": { Type: schema.TypeSet, Optional: true, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, Deprecated: "Field 'role_in_ids' is deprecated and will be removed in a future release. Please use 'role_ids' instead.", ConflictsWith: []string{"role_ids"}, }, "role_ids": { Type: schema.TypeSet, Optional: true, Computed: true, Elem: &schema.Schema{Type: schema.TypeString}, ConflictsWith: []string{"role_in_ids"}, }, }, } setResourceFunc(resource, resourceAlibabacloudStackAscmUserGroupCreate, resourceAlibabacloudStackAscmUserGroupRead, resourceAlibabacloudStackAscmUserGroupUpdate, resourceAlibabacloudStackAscmUserGroupDelete) return resource } func resourceAlibabacloudStackAscmUserGroupCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) groupName := d.Get("group_name").(string) var organizationId string if _, ok:= d.GetOk("organization_id"); ok { organizationId = d.Get("organization_id").(string) } else { organizationId = client.Department } var roleIdList []string if v, ok := connectivity.GetResourceDataOk(d, "role_in_ids", "role_ids"); ok { roleIds := expandStringList(v.(*schema.Set).List()) for _, roleId := range roleIds { roleIdList = append(roleIdList, roleId) } } requeststring, err := json.Marshal(map[string]interface{}{"roleIdList": roleIdList}) request := client.NewCommonRequest("POST", "ascm", "2019-05-10", "CreateUserGroup", "/ascm/auth/user/createUserGroup") request.QueryParams["groupName"] = groupName request.QueryParams["organizationId"] = organizationId // request.QueryParams["roleIdList"] = string(requeststring) request.SetContent(requeststring) bresponse, err := client.ProcessCommonRequest(request) log.Printf("response of raw CreateUserGroup is : %s", bresponse) if err != nil { errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_user_group", "CreateUserGroup", errmsg) } addDebug("CreateUserGroup", bresponse, request, request.QueryParams) d.SetId(groupName) return nil } func resourceAlibabacloudStackAscmUserGroupUpdate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) userGroupId := d.Get("user_group_id").(string) if _, ok := d.GetOk("role_ids"); ok && !d.IsNewResource(){ oldV, newV := d.GetChange("role_ids") // 转换新旧值(确保类型安全) newSet, okNew := newV.(*schema.Set) if !okNew { return fmt.Errorf("unexpected type for new role_ids") } oldSet, okOld := oldV.(*schema.Set) if !okOld { return fmt.Errorf("unexpected type for old role_ids") } remove := oldSet.Difference(newSet).List() create := newSet.Difference(oldSet).List() for _, roleId := range(create) { request := client.NewCommonRequest("POST", "ascm", "2019-05-10", "AddRoleToUserGroup", "/ascm/auth/user/addRoleToUserGroup") request.QueryParams["userGroupId"] = userGroupId request.QueryParams["roleId"] = roleId.(string) bresponse, err := client.ProcessCommonRequest(request) if err != nil || bresponse.GetHttpStatus() != 200 { errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_user_group", "AddRoleToUser", errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug("AddRoleToUser", bresponse, request, request.QueryParams) log.Printf("response of queryparams AddRoleToUser is : %s", request.QueryParams) } for _, roleId := range(remove) { request := client.NewCommonRequest("POST", "ascm", "2019-05-10", "RemoveRoleFromUserGroup", "/ascm/auth/user/removeRoleFromUserGroup") request.QueryParams["userGroupId"] = userGroupId request.QueryParams["roleId"] = roleId.(string) bresponse, err := client.ProcessCommonRequest(request) if err != nil || bresponse.GetHttpStatus() != 200 { errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_user_group", "RemoveRoleFromUser", errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug("AddRoleToUser", bresponse, request, request.QueryParams) log.Printf("response of queryparams AddRoleToUser is : %s", request.QueryParams) } } return nil } func resourceAlibabacloudStackAscmUserGroupRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) ascmService := AscmService{client} object, err := ascmService.DescribeAscmUserGroup(d.Id()) if err != nil { if errmsgs.NotFoundError(err) { d.SetId("") return nil } return errmsgs.WrapError(err) } if len(object.Data) == 0 { d.SetId("") return nil } d.Set("user_group_id", strconv.Itoa(object.Data[0].Id)) d.Set("group_name", object.Data[0].GroupName) d.Set("organization_id", strconv.Itoa(object.Data[0].OrganizationId)) var roleIds []string if len(object.Data[0].Roles) >= 0 { for _, role := range object.Data[0].Roles { roleIds = append(roleIds, strconv.Itoa(role.Id)) } } connectivity.SetResourceData(d, roleIds, "role_ids", "role_in_ids") return nil } func resourceAlibabacloudStackAscmUserGroupDelete(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AlibabacloudStackClient) ascmService := AscmService{client} check, err := ascmService.DescribeAscmUserGroup(d.Id()) if err != nil { return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), "IsUserGroupExist", errmsgs.AlibabacloudStackSdkGoERROR) } err = resource.Retry(2*time.Minute, func() *resource.RetryError { request := client.NewCommonRequest("POST", "ascm", "2019-05-10", "DeleteUserGroup", "/ascm/auth/user/deleteUserGroup") request.QueryParams["userGroupId"] = strconv.Itoa(check.Data[0].Id) bresponse, err := client.ProcessCommonRequest(request) if err != nil { errmsg := "" if bresponse != nil { errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse) } return resource.RetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_ascm_user_group", "DeleteUserGroup", errmsg)) } return nil }) return nil }