Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(CodeArts/Deploy): fix error and add acc test #6292

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions docs/resources/codearts_deploy_group_permission.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,13 @@ In addition to all arguments above, the following attributes are exported:

* `id` - The resource ID.

## Timeouts

This resource provides the following timeouts configuration options:

* `create` - Default is 10 minutes.
* `update` - Default is 10 minutes.

## Import

The CodeArts deploy group permission resource can be imported using the `project_id`, `group_id`, `role_id` and
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,41 @@ resource "huaweicloud_codearts_deploy_application_permission" "test" {
}
}`, testDeployApplication_basic(rName), value)
}

func TestAccDeployApplicationPermissionModify_conflict(t *testing.T) {
rName := acceptance.RandomAccResourceName()
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { acceptance.TestAccPreCheck(t) },
ProviderFactories: acceptance.TestAccProviderFactories,
CheckDestroy: nil,
Steps: []resource.TestStep{
{
Config: testAccDeployApplicationPermissionModify_conflict(rName),
},
},
})
}

func testAccDeployApplicationPermissionModify_conflict(rName string) string {
return fmt.Sprintf(`
%s

resource "huaweicloud_codearts_deploy_application_permission" "test" {
count = 2

project_id = huaweicloud_codearts_deploy_application.test.project_id
application_ids = [huaweicloud_codearts_deploy_application.test.id]

roles {
role_id = try(huaweicloud_codearts_deploy_application.test.permission_matrix[2].role_id, "")
can_modify = false
can_disable = true
can_delete = true
can_view = true
can_execute = true
can_copy = true
can_manage = true
can_create_env = true
}
}`, testDeployApplication_basic(rName))
}
Original file line number Diff line number Diff line change
Expand Up @@ -392,3 +392,83 @@ resource "huaweicloud_codearts_deploy_application" "test" {
}
`, testProject_basic(name), name)
}

func TestAccDeployApplication_conflict(t *testing.T) {
var obj interface{}

name := acceptance.RandomAccResourceName()
rName := "huaweicloud_codearts_deploy_application.test"

rc := acceptance.InitResourceCheck(
rName,
&obj,
getDeployApplicationResourceFunc,
)

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() {
acceptance.TestAccPreCheck(t)
},
ProviderFactories: acceptance.TestAccProviderFactories,
CheckDestroy: rc.CheckResourceDestroy(),
Steps: []resource.TestStep{
{
Config: testDeployApplication_conflict(name, "project"),
},
{
Config: testDeployApplication_conflict(name, "instance"),
},
},
})
}

func testDeployApplication_conflict(name, level string) string {
return fmt.Sprintf(`
%[1]s

resource "huaweicloud_codearts_deploy_application" "test" {
count = 2

project_id = huaweicloud_codearts_project.test.id
name = "%[2]s-${count.index}"
description = "test description"
is_draft = true
create_type = "template"
trigger_source = "0"
permission_level = "%[3]s"

operation_list {
name = "Download Package"
description = "download package description"
code = "https://example.com/xxx.zip"
entrance = "main.yml"
version = "1.1.282"
module_id = "devcloud2018.select_deploy_source_task.select_deploy_source_tab"
params = <<EOF
[
{
"name":"groupId",
"label":"env",
"displaySettings":{
"DevCloud.ControlType":"DeploymentGroup",
"DevCloud.ControlType.Select":[
{
"displayName":"",
"value":""
}
]
},
"defaultDisplay":[
{
"displayName":"$${host_group}",
"value":"$${host_group}",
"os":"linux"
}
]
}
]
EOF
}
}
`, testProject_basic(name), name, level)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package codeartsdeploy
import (
"context"
"fmt"
"time"

"github.com/hashicorp/go-uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"github.com/chnsz/golangsdk"
Expand All @@ -21,6 +23,11 @@ func ResourceDeployApplicationPermission() *schema.Resource {
UpdateContext: resourceDeployApplicationPermissionCreateOrUpdate,
DeleteContext: resourceDeployApplicationPermissionDelete,

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(10 * time.Minute),
Update: schema.DefaultTimeout(10 * time.Minute),
},

Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Expand Down Expand Up @@ -106,7 +113,12 @@ func resourceDeployApplicationPermissionCreateOrUpdate(ctx context.Context, d *s
return diag.Errorf("error creating CodeArts deploy client: %s", err)
}

err = modifyDeployApplicationPermission(client, d)
timeout := d.Timeout(schema.TimeoutCreate)
if !d.IsNewResource() {
timeout = d.Timeout(schema.TimeoutUpdate)
}

err = modifyDeployApplicationPermission(ctx, client, d, timeout)
if err != nil {
return diag.FromErr(err)
}
Expand All @@ -122,15 +134,36 @@ func resourceDeployApplicationPermissionCreateOrUpdate(ctx context.Context, d *s
return resourceDeployApplicationPermissionRead(ctx, d, meta)
}

func modifyDeployApplicationPermission(client *golangsdk.ServiceClient, d *schema.ResourceData) error {
func modifyDeployApplicationPermission(ctx context.Context, client *golangsdk.ServiceClient, d *schema.ResourceData,
timeout time.Duration) error {
httpUrl := "v3/applications/permissions"
modifyPath := client.Endpoint + httpUrl
modifyOpt := golangsdk.RequestOpts{
KeepResponseBody: true,
JSONBody: buildDeployApplicationPermissionBodyParams(d),
MoreHeaders: map[string]string{
"Content-Type": "application/json",
// API's language defaults to zh-cn.
// When response is error, diag.Diagnostics sometimes will cause error:
// `error while marshaling: string field contains invalid UTF-8`
"X-Language": "en-us",
},
JSONBody: buildDeployApplicationPermissionBodyParams(d),
}

_, err := client.Request("PUT", modifyPath, &modifyOpt)
err := resource.RetryContext(ctx, timeout, func() *resource.RetryError {
_, err := client.Request("PUT", modifyPath, &modifyOpt)
isRetry, err := handleDeployApplicationPermissionLevelOperationError(err)
if isRetry {
// lintignore:R018
time.Sleep(10 * time.Second)
return resource.RetryableError(err)
}
if err != nil {
return resource.NonRetryableError(err)
}
return nil
})

if err != nil {
return fmt.Errorf("error updating CodeArts deploy application permission: %s", err)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,6 @@ func getDeployGroupPermissionMatrix(client *golangsdk.ServiceClient, id string)
func flattenDeployGroupCreatedBy(resp interface{}) []interface{} {
curJson := utils.PathSearch("created_by", resp, nil)
if curJson == nil {
log.Printf("[ERROR] error flatten created_by, cause this field is not found in API response")
return nil
}

Expand All @@ -374,7 +373,6 @@ func flattenDeployGroupCreatedBy(resp interface{}) []interface{} {
func flattenDeployGroupPermission(resp interface{}) []interface{} {
curJson := utils.PathSearch("permission", resp, nil)
if curJson == nil {
log.Printf("[ERROR] error flatten permission, cause this field is not found in API response")
return nil
}

Expand Down Expand Up @@ -489,8 +487,9 @@ func resourceDeployGroupImportState(_ context.Context, d *schema.ResourceData,
}

d.SetId(parts[1])
if err := d.Set("project_id", parts[0]); err != nil {
return nil, fmt.Errorf("error saving project ID: %s", err)
}
return []*schema.ResourceData{d}, nil
mErr := multierror.Append(nil,
d.Set("project_id", parts[0]),
)

return []*schema.ResourceData{d}, mErr.ErrorOrNil()
}
Loading