From bb55b4acc9e70dbdd47f8b1ab2b5f400d61873e1 Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Thu, 12 Sep 2024 08:30:10 -0500 Subject: [PATCH 01/11] Deprecate workspace details attribute --- ibm/service/power/resource_ibm_pi_workspace.go | 11 ++++++++--- website/docs/r/pi_workspace.html.markdown | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index 6315413830..07fe8720ee 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -8,7 +8,6 @@ import ( "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" - "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" @@ -61,8 +60,14 @@ func ResourceIBMPIWorkspace() *schema.Resource { }, // Attributes + Attr_CRN: { + Computed: true, + Description: "The Workspace crn.", + Type: schema.TypeString, + }, Attr_WorkspaceDetails: { Computed: true, + Deprecated: "This field is deprecated, use crn instead.", Description: "Workspace information.", Type: schema.TypeMap, }, @@ -139,10 +144,10 @@ func resourceIBMPIWorkspaceRead(ctx context.Context, d *schema.ResourceData, met d.Set(Arg_Name, controller.Name) wsDetails := map[string]interface{}{ Attr_CreationDate: controller.CreatedAt, - Attr_CRN: controller.TargetCRN, + Attr_CRN: controller.CRN, } - d.Set(Attr_WorkspaceDetails, flex.Flatten(wsDetails)) + d.Set(Attr_CRN, controller.CRN) return nil } diff --git a/website/docs/r/pi_workspace.html.markdown b/website/docs/r/pi_workspace.html.markdown index 04a92a2c57..1bc684a7df 100644 --- a/website/docs/r/pi_workspace.html.markdown +++ b/website/docs/r/pi_workspace.html.markdown @@ -53,7 +53,8 @@ Review the argument references that you can specify for your resource. In addition to all argument reference listed, you can access the following attribute references after your resource source is created. - `id` - (String) Workspace ID. -- `workspace_details` - (Map) Workspace information. +- `crn` - (String) Workspace crn. +- `workspace_details` - (Deprecated, Map) Workspace information. Nested schema for `workspace_details`: - `creation_date` - (String) Date of workspace creation. From 9cc03e7041df04790f2143d046c45d7434fd68b4 Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Thu, 12 Sep 2024 09:06:13 -0500 Subject: [PATCH 02/11] Add user-tags field to workspace create --- ibm/service/power/ibm_pi_constants.go | 1 + .../power/resource_ibm_pi_workspace.go | 23 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ibm/service/power/ibm_pi_constants.go b/ibm/service/power/ibm_pi_constants.go index 6f3fff8509..248ca86d86 100644 --- a/ibm/service/power/ibm_pi_constants.go +++ b/ibm/service/power/ibm_pi_constants.go @@ -85,6 +85,7 @@ const ( Arg_SysType = "pi_sys_type" Arg_TargetStorageTier = "pi_target_storage_tier" Arg_UserData = "pi_user_data" + Arg_UserTags = "pi_user_tags" Arg_VirtualCoresAssigned = "pi_virtual_cores_assigned" Arg_VirtualOpticalDevice = "pi_virtual_optical_device" Arg_VolumeCloneName = "pi_volume_clone_name" diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index 07fe8720ee..70ce8c8d13 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -8,6 +8,7 @@ import ( "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/validate" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" @@ -58,6 +59,13 @@ func ResourceIBMPIWorkspace() *schema.Resource { Type: schema.TypeString, ValidateFunc: validation.NoZeroValues, }, + Arg_UserTags: { + Description: "The user tags attached to this resource.", + Elem: &schema.Schema{Type: schema.TypeString}, + ForceNew: true, + Optional: true, + Type: schema.TypeList, + }, // Attributes Attr_CRN: { @@ -86,9 +94,16 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m resourceGroup := d.Get(Arg_ResourceGroupID).(string) plan := d.Get(Arg_Plan).(string) + userTags := make([]string, 0) + if tags, ok := d.GetOk(Arg_UserTags); ok { + if len(tags.([]interface{})) > 0 { + userTags = flex.ExpandStringList(tags.([]interface{})) + } + } + // No need for cloudInstanceID because we are creating a workspace client := instance.NewIBMPIWorkspacesClient(ctx, sess, "") - controller, _, err := client.Create(name, datacenter, resourceGroup, plan) + controller, _, err := client.CreateWithUserTags(name, datacenter, resourceGroup, plan, userTags) if err != nil { log.Printf("[DEBUG] create workspace failed %v", err) return diag.FromErr(err) @@ -142,12 +157,14 @@ func resourceIBMPIWorkspaceRead(ctx context.Context, d *schema.ResourceData, met return diag.FromErr(err) } d.Set(Arg_Name, controller.Name) + d.Set(Attr_CRN, controller.CRN) + + // Deprecated Workspace Details Set wsDetails := map[string]interface{}{ Attr_CreationDate: controller.CreatedAt, Attr_CRN: controller.CRN, } - - d.Set(Attr_CRN, controller.CRN) + d.Set(Attr_WorkspaceDetails, flex.Flatten(wsDetails)) return nil } From 23b616c5ce36aa63d97e6eeab52cf3c9b29e3888 Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Thu, 12 Sep 2024 09:10:49 -0500 Subject: [PATCH 03/11] Add user tags to markdown --- website/docs/r/pi_workspace.html.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/website/docs/r/pi_workspace.html.markdown b/website/docs/r/pi_workspace.html.markdown index 1bc684a7df..a17dcc6c75 100644 --- a/website/docs/r/pi_workspace.html.markdown +++ b/website/docs/r/pi_workspace.html.markdown @@ -47,6 +47,7 @@ Review the argument references that you can specify for your resource. - `pi_name` - (Required, String) A descriptive name used to identify the workspace. - `pi_plan` - (Optional, String) Plan associated with the offering; Valid values are `public` or `private`. The default value is `public`. - `pi_resource_group_id` - (Required, String) The ID of the resource group where you want to create the workspace. You can retrieve the value from data source `ibm_resource_group`. +- `pi_user_tags` - (Optional, List) The user tags attached to this resource. ## Attribute reference From 1580a9792b2bcbc43eaea783321e39f3308f7df7 Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Thu, 12 Sep 2024 12:44:01 -0500 Subject: [PATCH 04/11] Add user tags to workspace in alternate way --- .../power/resource_ibm_pi_workspace.go | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index 70ce8c8d13..bf71432530 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -94,16 +94,9 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m resourceGroup := d.Get(Arg_ResourceGroupID).(string) plan := d.Get(Arg_Plan).(string) - userTags := make([]string, 0) - if tags, ok := d.GetOk(Arg_UserTags); ok { - if len(tags.([]interface{})) > 0 { - userTags = flex.ExpandStringList(tags.([]interface{})) - } - } - // No need for cloudInstanceID because we are creating a workspace client := instance.NewIBMPIWorkspacesClient(ctx, sess, "") - controller, _, err := client.CreateWithUserTags(name, datacenter, resourceGroup, plan, userTags) + controller, _, err := client.Create(name, datacenter, resourceGroup, plan) if err != nil { log.Printf("[DEBUG] create workspace failed %v", err) return diag.FromErr(err) @@ -115,6 +108,23 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } + // Add user tags for newly created workspace + if tags, ok := d.GetOk(Arg_UserTags); ok { + if len(tags.([]interface{})) > 0 { + userTags := flex.ExpandStringList(tags.([]interface{})) + gtClient, err := meta.(conns.ClientSession).GlobalTaggingAPI() + if err != nil { + log.Printf("[ERROR] Error getting global tagging client settings: %s", err) + return diag.FromErr(err) + } + _, err = gtClient.Tags().AttachTags(*controller.CRN, userTags) + if err != nil { + log.Printf( + "[ERROR] The resource instance has failed updating user tags (%s) err: %s", d.Id(), err) + return diag.FromErr(err) + } + } + } return resourceIBMPIWorkspaceRead(ctx, d, meta) } From 9b70ac0f64797ba1d96606ec1f81b0b58c9f9a2e Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Tue, 17 Sep 2024 14:28:17 -0500 Subject: [PATCH 05/11] Update to v1.8.1 SDK --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2effbbf28c..5b58b4f178 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.22.5 require ( github.com/IBM-Cloud/bluemix-go v0.0.0-20240719075425-078fcb3a55be github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240725064144-454a2ae23113 - github.com/IBM-Cloud/power-go-client v1.7.0 + github.com/IBM-Cloud/power-go-client v1.8.1 github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca github.com/IBM/appconfiguration-go-admin-sdk v0.3.0 github.com/IBM/appid-management-go-sdk v0.0.0-20210908164609-dd0e0eaf732f diff --git a/go.sum b/go.sum index c3a7916418..26283830e5 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/IBM-Cloud/bluemix-go v0.0.0-20240719075425-078fcb3a55be/go.mod h1:/7h github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240725064144-454a2ae23113 h1:f2Erqfea1dKpaTFagTJM6W/wnD3JGq/Vn9URh8nuRwk= github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240725064144-454a2ae23113/go.mod h1:xUQL9SGAjoZFd4GNjrjjtEpjpkgU7RFXRyHesbKTjiY= github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.5.3/go.mod h1:RiUvKuHKTBmBApDMUQzBL14pQUGKcx/IioKQPIcRQjs= -github.com/IBM-Cloud/power-go-client v1.7.0 h1:/GuGwPMTKoCZACfnwt7b6wKr4v32q1VO1AMFGNETRN4= -github.com/IBM-Cloud/power-go-client v1.7.0/go.mod h1:9izycYAmNQ+NAdVPXDC3fHYxqWLjlR2YiwqKYveMv5Y= +github.com/IBM-Cloud/power-go-client v1.8.1 h1:tx1aPJmIQrNru1MD1VHGNasGx3eRIs0zzPZ0KvdFQrg= +github.com/IBM-Cloud/power-go-client v1.8.1/go.mod h1:N4RxrsMUvBQjSQ/qPk0iMZ8zK+fZPRTnHi/gTaASw0g= github.com/IBM-Cloud/softlayer-go v1.0.5-tf h1:koUAyF9b6X78lLLruGYPSOmrfY2YcGYKOj/Ug9nbKNw= github.com/IBM-Cloud/softlayer-go v1.0.5-tf/go.mod h1:6HepcfAXROz0Rf63krk5hPZyHT6qyx2MNvYyHof7ik4= github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca h1:crniVcf+YcmgF03NmmfonXwSQ73oJF+IohFYBwknMxs= From 55677aefdb0c23e912da8a3711374faf26e43bc6 Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Tue, 24 Sep 2024 13:00:25 -0500 Subject: [PATCH 06/11] Update user tags field from list to set --- ibm/service/power/resource_ibm_pi_workspace.go | 9 +++++---- website/docs/r/pi_workspace.html.markdown | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index bf71432530..6fe5997dcb 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -60,11 +60,12 @@ func ResourceIBMPIWorkspace() *schema.Resource { ValidateFunc: validation.NoZeroValues, }, Arg_UserTags: { - Description: "The user tags attached to this resource.", + Description: "List of user tags attached to the resource.", Elem: &schema.Schema{Type: schema.TypeString}, ForceNew: true, Optional: true, - Type: schema.TypeList, + Set: schema.HashString, + Type: schema.TypeSet, }, // Attributes @@ -110,8 +111,8 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m // Add user tags for newly created workspace if tags, ok := d.GetOk(Arg_UserTags); ok { - if len(tags.([]interface{})) > 0 { - userTags := flex.ExpandStringList(tags.([]interface{})) + if len(flex.FlattenSet(tags.(*schema.Set))) > 0 { + userTags := flex.FlattenSet(tags.(*schema.Set)) gtClient, err := meta.(conns.ClientSession).GlobalTaggingAPI() if err != nil { log.Printf("[ERROR] Error getting global tagging client settings: %s", err) diff --git a/website/docs/r/pi_workspace.html.markdown b/website/docs/r/pi_workspace.html.markdown index a17dcc6c75..192785d58f 100644 --- a/website/docs/r/pi_workspace.html.markdown +++ b/website/docs/r/pi_workspace.html.markdown @@ -47,7 +47,7 @@ Review the argument references that you can specify for your resource. - `pi_name` - (Required, String) A descriptive name used to identify the workspace. - `pi_plan` - (Optional, String) Plan associated with the offering; Valid values are `public` or `private`. The default value is `public`. - `pi_resource_group_id` - (Required, String) The ID of the resource group where you want to create the workspace. You can retrieve the value from data source `ibm_resource_group`. -- `pi_user_tags` - (Optional, List) The user tags attached to this resource. +- `pi_user_tags` - (Optional, List) List of user tags attached to the resource. ## Attribute reference From 2bc0ca4ef71706635992589173b5403af7e51315 Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Tue, 24 Sep 2024 13:16:44 -0500 Subject: [PATCH 07/11] Add user tag acceptance test to workspace resource --- .../power/resource_ibm_pi_workspace_test.go | 47 +++++++++++++++---- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/ibm/service/power/resource_ibm_pi_workspace_test.go b/ibm/service/power/resource_ibm_pi_workspace_test.go index dd5938119e..a9eac1d5ef 100644 --- a/ibm/service/power/resource_ibm_pi_workspace_test.go +++ b/ibm/service/power/resource_ibm_pi_workspace_test.go @@ -7,8 +7,9 @@ import ( "strings" "testing" - st "github.com/IBM-Cloud/power-go-client/clients/instance" acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + + "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" "github.com/IBM-Cloud/terraform-provider-ibm/ibm/service/power" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" @@ -34,14 +35,41 @@ func TestAccIBMPIWorkspaceBasic(t *testing.T) { }) } +func TestAccIBMPIWorkspaceUserTags(t *testing.T) { + name := fmt.Sprintf("tf-pi-workspace-%d", acctest.RandIntRange(10, 100)) + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccIBMPIWorkspaceDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMPIWorkspaceUserTagConfig(name), + Check: resource.ComposeTestCheckFunc( + testAccCheckIBMPIWorkspaceExists("ibm_pi_workspace.powervs_service_instance"), + resource.TestCheckResourceAttrSet("ibm_pi_workspace.powervs_service_instance", "id"), + ), + }, + }, + }) +} + func testAccCheckIBMPIWorkspaceConfig(name string) string { return fmt.Sprintf(` - resource "ibm_pi_workspace" "powervs_service_instance" { - pi_name = "%[1]s" - pi_datacenter = "dal12" - pi_resource_group_id = "%[2]s" - } - `, name, acc.Pi_resource_group_id) + resource "ibm_pi_workspace" "powervs_service_instance" { + pi_name = "%[1]s" + pi_datacenter = "dal12" + pi_resource_group_id = "%[2]s" + }`, name, acc.Pi_resource_group_id) +} + +func testAccCheckIBMPIWorkspaceUserTagConfig(name string) string { + return fmt.Sprintf(` + resource "ibm_pi_workspace" "powervs_service_instance" { + pi_name = "%[1]s" + pi_datacenter = "dal12" + pi_resource_group_id = "%[2]s" + pi_user_tags = ["env:dev", "dataresidency:france"] + }`, name, acc.Pi_resource_group_id) } func testAccIBMPIWorkspaceDestroy(s *terraform.State) error { @@ -54,7 +82,7 @@ func testAccIBMPIWorkspaceDestroy(s *terraform.State) error { continue } cloudInstanceID := rs.Primary.ID - client := st.NewIBMPIWorkspacesClient(context.Background(), sess, cloudInstanceID) + client := instance.NewIBMPIWorkspacesClient(context.Background(), sess, cloudInstanceID) workspace, resp, err := client.GetRC(cloudInstanceID) if err == nil { if *workspace.State == power.State_Active { @@ -71,7 +99,6 @@ func testAccIBMPIWorkspaceDestroy(s *terraform.State) error { func testAccCheckIBMPIWorkspaceExists(n string) resource.TestCheckFunc { return func(s *terraform.State) error { - rs, ok := s.RootModule().Resources[n] if !ok { @@ -88,7 +115,7 @@ func testAccCheckIBMPIWorkspaceExists(n string) resource.TestCheckFunc { } cloudInstanceID := rs.Primary.ID - client := st.NewIBMPIWorkspacesClient(context.Background(), sess, cloudInstanceID) + client := instance.NewIBMPIWorkspacesClient(context.Background(), sess, cloudInstanceID) _, _, err = client.GetRC(cloudInstanceID) if err != nil { return err From 0ed1f8e829f85c08583c688161422bb0514c2ad5 Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Thu, 26 Sep 2024 18:39:17 -0500 Subject: [PATCH 08/11] Add update tags to workspace resource --- ibm/service/power/ibm_pi_constants.go | 1 + .../power/resource_ibm_pi_workspace.go | 38 +++++++++++++++---- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/ibm/service/power/ibm_pi_constants.go b/ibm/service/power/ibm_pi_constants.go index 248ca86d86..e6a0930629 100644 --- a/ibm/service/power/ibm_pi_constants.go +++ b/ibm/service/power/ibm_pi_constants.go @@ -444,6 +444,7 @@ const ( Shared = "shared" Soft = "soft" Suffix = "suffix" + UserTagType = "user" Vlan = "vlan" vSCSI = "vSCSI" Warning = "WARNING" diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index 6fe5997dcb..461e05a777 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "strings" "time" "github.com/IBM-Cloud/power-go-client/clients/instance" @@ -19,13 +20,15 @@ import ( func ResourceIBMPIWorkspace() *schema.Resource { return &schema.Resource{ CreateContext: resourceIBMPIWorkspaceCreate, - ReadContext: resourceIBMPIWorkspaceRead, DeleteContext: resourceIBMPIWorkspaceDelete, + ReadContext: resourceIBMPIWorkspaceRead, + UpdateContext: resourceIBMPIWorkspaceUpdate, Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(30 * time.Minute), Delete: schema.DefaultTimeout(30 * time.Minute), + Update: schema.DefaultTimeout(10 * time.Minute), }, Schema: map[string]*schema.Schema{ @@ -62,7 +65,6 @@ func ResourceIBMPIWorkspace() *schema.Resource { Arg_UserTags: { Description: "List of user tags attached to the resource.", Elem: &schema.Schema{Type: schema.TypeString}, - ForceNew: true, Optional: true, Set: schema.HashString, Type: schema.TypeSet, @@ -103,8 +105,10 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } - d.SetId(*controller.GUID) - _, err = waitForResourceInstanceCreate(ctx, client, *controller.GUID, d.Timeout(schema.TimeoutCreate)) + cloudInstanceID := strings.Split(*controller.CRN, ":")[7] + d.SetId(cloudInstanceID) + + _, err = waitForResourceWorkspaceCreate(ctx, client, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) if err != nil { return diag.FromErr(err) } @@ -129,7 +133,7 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m return resourceIBMPIWorkspaceRead(ctx, d, meta) } -func waitForResourceInstanceCreate(ctx context.Context, client *instance.IBMPIWorkspacesClient, id string, timeout time.Duration) (interface{}, error) { +func waitForResourceWorkspaceCreate(ctx context.Context, client *instance.IBMPIWorkspacesClient, id string, timeout time.Duration) (interface{}, error) { stateConf := &retry.StateChangeConf{ Pending: []string{State_InProgress, State_Inactive, State_Provisioning}, Target: []string{State_Active}, @@ -168,6 +172,12 @@ func resourceIBMPIWorkspaceRead(ctx context.Context, d *schema.ResourceData, met return diag.FromErr(err) } d.Set(Arg_Name, controller.Name) + tags, err := flex.GetGlobalTagsUsingCRN(meta, *controller.CRN, "", UserTagType) + if err != nil { + log.Printf("Error on get of workspace (%s) user_tags: %s", cloudInstanceID, err) + } + d.Set(Arg_UserTags, tags) + d.Set(Attr_CRN, controller.CRN) // Deprecated Workspace Details Set @@ -192,7 +202,7 @@ func resourceIBMPIWorkspaceDelete(ctx context.Context, d *schema.ResourceData, m if err != nil && response != nil && response.StatusCode == 410 { return nil } - _, err = waitForResourceInstanceDelete(ctx, client, cloudInstanceID, d.Timeout(schema.TimeoutDelete)) + _, err = waitForResourceWorkspaceDelete(ctx, client, cloudInstanceID, d.Timeout(schema.TimeoutDelete)) if err != nil { return diag.FromErr(err) } @@ -201,7 +211,7 @@ func resourceIBMPIWorkspaceDelete(ctx context.Context, d *schema.ResourceData, m return nil } -func waitForResourceInstanceDelete(ctx context.Context, client *instance.IBMPIWorkspacesClient, id string, timeout time.Duration) (interface{}, error) { +func waitForResourceWorkspaceDelete(ctx context.Context, client *instance.IBMPIWorkspacesClient, id string, timeout time.Duration) (interface{}, error) { stateConf := &retry.StateChangeConf{ Pending: []string{State_InProgress, State_Inactive, State_Active}, Target: []string{State_Removed, State_PendingReclamation}, @@ -232,3 +242,17 @@ func isIBMPIResourceDeleteRefreshFunc(client *instance.IBMPIWorkspacesClient, id } } } + +func resourceIBMPIWorkspaceUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + if d.HasChange(Arg_UserTags) { + crn := d.Get(Attr_CRN) + if crn != "" { + oldList, newList := d.GetChange(Arg_UserTags) + err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, crn.(string), "", UserTagType) + if err != nil { + log.Printf("Error on update of workspace (%s) user_tags: %s", crn, err) + } + } + } + return resourceIBMPIWorkspaceRead(ctx, d, meta) +} From 4778e1e6364782493788805da4e5646bf7282bca Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Thu, 26 Sep 2024 18:59:19 -0500 Subject: [PATCH 09/11] Fix workspace tagging on create --- ibm/service/power/resource_ibm_pi_workspace.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index 461e05a777..a1530249dc 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -116,17 +116,10 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m // Add user tags for newly created workspace if tags, ok := d.GetOk(Arg_UserTags); ok { if len(flex.FlattenSet(tags.(*schema.Set))) > 0 { - userTags := flex.FlattenSet(tags.(*schema.Set)) - gtClient, err := meta.(conns.ClientSession).GlobalTaggingAPI() - if err != nil { - log.Printf("[ERROR] Error getting global tagging client settings: %s", err) - return diag.FromErr(err) - } - _, err = gtClient.Tags().AttachTags(*controller.CRN, userTags) + oldList, newList := d.GetChange(Arg_UserTags) + err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, *controller.CRN, "", UserTagType) if err != nil { - log.Printf( - "[ERROR] The resource instance has failed updating user tags (%s) err: %s", d.Id(), err) - return diag.FromErr(err) + log.Printf("Error on creation of workspace (%s) user_tags: %s", *controller.CRN, err) } } } From 578ce1854b92c890ed4596153ce31fd0f0e8114f Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Fri, 27 Sep 2024 11:23:28 -0500 Subject: [PATCH 10/11] Simplify workspace update check --- ibm/service/power/resource_ibm_pi_workspace.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index a1530249dc..c9bfb33dbe 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "log" - "strings" "time" "github.com/IBM-Cloud/power-go-client/clients/instance" @@ -105,7 +104,7 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } - cloudInstanceID := strings.Split(*controller.CRN, ":")[7] + cloudInstanceID := *controller.GUID d.SetId(cloudInstanceID) _, err = waitForResourceWorkspaceCreate(ctx, client, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) @@ -238,8 +237,7 @@ func isIBMPIResourceDeleteRefreshFunc(client *instance.IBMPIWorkspacesClient, id func resourceIBMPIWorkspaceUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { if d.HasChange(Arg_UserTags) { - crn := d.Get(Attr_CRN) - if crn != "" { + if crn, ok := d.GetOk(Attr_CRN); ok { oldList, newList := d.GetChange(Arg_UserTags) err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, crn.(string), "", UserTagType) if err != nil { From 94692da21ea3df0b2d32d59b88e9bcbce89d3e1d Mon Sep 17 00:00:00 2001 From: Axel Ismirlian Date: Tue, 1 Oct 2024 08:33:13 -0500 Subject: [PATCH 11/11] Update testing for workspace resource --- ibm/service/power/resource_ibm_pi_workspace.go | 6 +++--- ibm/service/power/resource_ibm_pi_workspace_test.go | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ibm/service/power/resource_ibm_pi_workspace.go b/ibm/service/power/resource_ibm_pi_workspace.go index c9bfb33dbe..179bf09507 100644 --- a/ibm/service/power/resource_ibm_pi_workspace.go +++ b/ibm/service/power/resource_ibm_pi_workspace.go @@ -118,7 +118,7 @@ func resourceIBMPIWorkspaceCreate(ctx context.Context, d *schema.ResourceData, m oldList, newList := d.GetChange(Arg_UserTags) err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, *controller.CRN, "", UserTagType) if err != nil { - log.Printf("Error on creation of workspace (%s) user_tags: %s", *controller.CRN, err) + log.Printf("Error on creation of workspace (%s) pi_user_tags: %s", *controller.CRN, err) } } } @@ -166,7 +166,7 @@ func resourceIBMPIWorkspaceRead(ctx context.Context, d *schema.ResourceData, met d.Set(Arg_Name, controller.Name) tags, err := flex.GetGlobalTagsUsingCRN(meta, *controller.CRN, "", UserTagType) if err != nil { - log.Printf("Error on get of workspace (%s) user_tags: %s", cloudInstanceID, err) + log.Printf("Error on get of workspace (%s) pi_user_tags: %s", cloudInstanceID, err) } d.Set(Arg_UserTags, tags) @@ -241,7 +241,7 @@ func resourceIBMPIWorkspaceUpdate(ctx context.Context, d *schema.ResourceData, m oldList, newList := d.GetChange(Arg_UserTags) err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, crn.(string), "", UserTagType) if err != nil { - log.Printf("Error on update of workspace (%s) user_tags: %s", crn, err) + log.Printf("Error on update of workspace (%s) pi_user_tags: %s", crn, err) } } } diff --git a/ibm/service/power/resource_ibm_pi_workspace_test.go b/ibm/service/power/resource_ibm_pi_workspace_test.go index a9eac1d5ef..148a1337a9 100644 --- a/ibm/service/power/resource_ibm_pi_workspace_test.go +++ b/ibm/service/power/resource_ibm_pi_workspace_test.go @@ -47,6 +47,9 @@ func TestAccIBMPIWorkspaceUserTags(t *testing.T) { Check: resource.ComposeTestCheckFunc( testAccCheckIBMPIWorkspaceExists("ibm_pi_workspace.powervs_service_instance"), resource.TestCheckResourceAttrSet("ibm_pi_workspace.powervs_service_instance", "id"), + resource.TestCheckResourceAttr("ibm_pi_workspace.powervs_service_instance", "pi_user_tags.#", "2"), + resource.TestCheckTypeSetElemAttr("ibm_pi_workspace.powervs_service_instance", "pi_user_tags.*", "env:dev"), + resource.TestCheckTypeSetElemAttr("ibm_pi_workspace.powervs_service_instance", "pi_user_tags.*", "dataresidency:france"), ), }, },